Database schema optimization - part 13

This commit is contained in:
mdecimus
2025-11-22 10:55:54 +02:00
parent dbe40829da
commit c7fc16d9a2
60 changed files with 2118 additions and 1249 deletions

View File

@@ -9,8 +9,8 @@ use super::{
ArchivedTimezone, Calendar, CalendarEvent, CalendarPreferences, DefaultAlert, Timezone,
};
use crate::calendar::{
ArchivedCalendarEventNotification, ArchivedEventPreferences, CalendarEventNotification,
EventPreferences,
ArchivedCalendarEventNotification, ArchivedChangedBy, ArchivedEventPreferences,
CalendarEventNotification, ChangedBy, EventPreferences,
};
use ahash::AHashSet;
use calcard::icalendar::{
@@ -23,6 +23,7 @@ use nlp::language::{
detect::{LanguageDetector, MIN_LANGUAGE_SCORE},
};
use store::{
U32_LEN,
search::{CalendarSearchField, IndexDocument, SearchField},
write::{IndexPropertyClass, SearchIndex, ValueClass},
xxhash_rust::xxh3,
@@ -40,9 +41,7 @@ impl IndexableObject for Calendar {
value: (&self.acls).into(),
},
IndexValue::Quota {
used: self.dead_properties.size() as u32
+ self.preferences.iter().map(|p| p.size()).sum::<usize>() as u32
+ self.name.len() as u32,
used: self.size() as u32,
},
IndexValue::LogContainer {
sync_collection: SyncCollection::Calendar,
@@ -64,9 +63,7 @@ impl IndexableObject for &ArchivedCalendar {
.into(),
},
IndexValue::Quota {
used: self.dead_properties.size() as u32
+ self.preferences.iter().map(|p| p.size()).sum::<usize>() as u32
+ self.name.len() as u32,
used: self.size() as u32,
},
IndexValue::LogContainer {
sync_collection: SyncCollection::Calendar,
@@ -97,11 +94,7 @@ impl IndexableObject for CalendarEvent {
value: self.data.event.uids().next().into(),
},
IndexValue::Quota {
used: self.dead_properties.size() as u32
+ self.display_name.as_ref().map_or(0, |n| n.len() as u32)
+ self.names.iter().map(|n| n.name.len() as u32).sum::<u32>()
+ self.preferences.iter().map(|p| p.size()).sum::<usize>() as u32
+ self.size,
used: self.size() as u32,
},
IndexValue::LogItem {
sync_collection: SyncCollection::Calendar,
@@ -127,11 +120,7 @@ impl IndexableObject for &ArchivedCalendarEvent {
value: self.data.event.uids().next().into(),
},
IndexValue::Quota {
used: self.dead_properties.size() as u32
+ self.display_name.as_ref().map_or(0, |n| n.len() as u32)
+ self.names.iter().map(|n| n.name.len() as u32).sum::<u32>()
+ self.preferences.iter().map(|p| p.size()).sum::<usize>() as u32
+ self.size,
used: self.size() as u32,
},
IndexValue::LogItem {
sync_collection: SyncCollection::Calendar,
@@ -151,7 +140,9 @@ impl IndexableAndSerializableObject for CalendarEvent {
impl IndexableObject for CalendarEventNotification {
fn index_values(&self) -> impl Iterator<Item = IndexValue<'_>> {
[
IndexValue::Quota { used: self.size },
IndexValue::Quota {
used: self.size() as u32,
},
IndexValue::Property {
field: ValueClass::IndexProperty(IndexPropertyClass::Integer {
property: CalendarNotificationField::CreatedToId.into(),
@@ -172,7 +163,7 @@ impl IndexableObject for &ArchivedCalendarEventNotification {
fn index_values(&self) -> impl Iterator<Item = IndexValue<'_>> {
[
IndexValue::Quota {
used: self.size.to_native(),
used: self.size() as u32,
},
IndexValue::Property {
field: ValueClass::IndexProperty(IndexPropertyClass::Integer {
@@ -201,6 +192,66 @@ impl IndexableAndSerializableObject for CalendarEventNotification {
}
}
impl Calendar {
pub fn size(&self) -> usize {
self.dead_properties.size()
+ self.preferences.iter().map(|p| p.size()).sum::<usize>()
+ self.name.len()
+ std::mem::size_of::<Calendar>()
}
}
impl ArchivedCalendar {
pub fn size(&self) -> usize {
self.dead_properties.size()
+ self.preferences.iter().map(|p| p.size()).sum::<usize>()
+ self.name.len()
+ std::mem::size_of::<Calendar>()
}
}
impl CalendarEvent {
pub fn size(&self) -> usize {
self.dead_properties.size()
+ self.display_name.as_ref().map_or(0, |n| n.len())
+ self.names.iter().map(|n| n.name.len()).sum::<usize>()
+ self.preferences.iter().map(|p| p.size()).sum::<usize>()
+ self.size as usize
+ std::mem::size_of::<CalendarEvent>()
}
}
impl ArchivedCalendarEvent {
pub fn size(&self) -> usize {
self.dead_properties.size()
+ self.display_name.as_ref().map_or(0, |n| n.len())
+ self.names.iter().map(|n| n.name.len()).sum::<usize>()
+ self.preferences.iter().map(|p| p.size()).sum::<usize>()
+ self.size.to_native() as usize
+ std::mem::size_of::<CalendarEvent>()
}
}
impl CalendarEventNotification {
pub fn size(&self) -> usize {
(match &self.changed_by {
ChangedBy::PrincipalId(_) => U32_LEN,
ChangedBy::CalendarAddress(v) => v.len(),
}) + std::mem::size_of::<CalendarEventNotification>()
+ self.size as usize
}
}
impl ArchivedCalendarEventNotification {
pub fn size(&self) -> usize {
(match &self.changed_by {
ArchivedChangedBy::PrincipalId(_) => U32_LEN,
ArchivedChangedBy::CalendarAddress(v) => v.len(),
}) + std::mem::size_of::<CalendarEventNotification>()
+ self.size.to_native() as usize
}
}
impl CalendarPreferences {
pub fn size(&self) -> usize {
self.name.len()

View File

@@ -8,10 +8,7 @@ use super::{AddressBook, ArchivedAddressBook, ArchivedContactCard, ContactCard};
use ahash::AHashSet;
use calcard::{
common::IanaString,
vcard::{
ArchivedVCardParameterValue, ArchivedVCardProperty, ArchivedVCardValue,
VCardParameterValue, VCardProperty,
},
vcard::{ArchivedVCardProperty, ArchivedVCardValue, VCardProperty},
};
use common::storage::index::{IndexValue, IndexableAndSerializableObject, IndexableObject};
use nlp::language::{
@@ -33,16 +30,7 @@ impl IndexableObject for AddressBook {
value: (&self.acls).into(),
},
IndexValue::Quota {
used: self.dead_properties.size() as u32
+ self
.preferences
.iter()
.map(|p| {
p.name.len() as u32
+ p.description.as_ref().map_or(0, |n| n.len() as u32)
})
.sum::<u32>()
+ self.name.len() as u32,
used: self.size() as u32,
},
IndexValue::LogContainer {
sync_collection: SyncCollection::AddressBook,
@@ -64,16 +52,7 @@ impl IndexableObject for &ArchivedAddressBook {
.into(),
},
IndexValue::Quota {
used: self.dead_properties.size() as u32
+ self
.preferences
.iter()
.map(|p| {
p.name.len() as u32
+ p.description.as_ref().map_or(0, |n| n.len() as u32)
})
.sum::<u32>()
+ self.name.len() as u32,
used: self.size() as u32,
},
IndexValue::LogContainer {
sync_collection: SyncCollection::AddressBook,
@@ -112,10 +91,7 @@ impl IndexableObject for ContactCard {
hash: self.hashes().fold(0, |acc, hash| acc ^ hash),
},
IndexValue::Quota {
used: self.dead_properties.size() as u32
+ self.display_name.as_ref().map_or(0, |n| n.len() as u32)
+ self.names.iter().map(|n| n.name.len() as u32).sum::<u32>()
+ self.size,
used: self.size() as u32,
},
IndexValue::LogItem {
sync_collection: SyncCollection::AddressBook,
@@ -149,10 +125,7 @@ impl IndexableObject for &ArchivedContactCard {
hash: self.hashes().fold(0, |acc, hash| acc ^ hash),
},
IndexValue::Quota {
used: self.dead_properties.size() as u32
+ self.display_name.as_ref().map_or(0, |n| n.len() as u32)
+ self.names.iter().map(|n| n.name.len() as u32).sum::<u32>()
+ self.size,
used: self.size() as u32,
},
IndexValue::LogItem {
sync_collection: SyncCollection::AddressBook,
@@ -169,7 +142,41 @@ impl IndexableAndSerializableObject for ContactCard {
}
}
impl AddressBook {
pub fn size(&self) -> usize {
self.dead_properties.size()
+ self
.preferences
.iter()
.map(|p| p.name.len() + p.description.as_ref().map_or(0, |n| n.len()))
.sum::<usize>()
+ self.name.len()
+ std::mem::size_of::<AddressBook>()
}
}
impl ArchivedAddressBook {
pub fn size(&self) -> usize {
self.dead_properties.size()
+ self
.preferences
.iter()
.map(|p| p.name.len() + p.description.as_ref().map_or(0, |n| n.len()))
.sum::<usize>()
+ self.name.len()
+ std::mem::size_of::<AddressBook>()
}
}
impl ContactCard {
pub fn size(&self) -> usize {
self.dead_properties.size()
+ self.display_name.as_ref().map_or(0, |n| n.len())
+ self.names.iter().map(|n| n.name.len()).sum::<usize>()
+ self.size as usize
+ std::mem::size_of::<ContactCard>()
}
pub fn hashes(&self) -> impl Iterator<Item = u64> {
self.card
.entries
@@ -193,15 +200,7 @@ impl ContactCard {
| VCardProperty::Tel
)
})
.flat_map(|e| {
e.values
.iter()
.filter_map(|v| v.as_text())
.chain(e.params.iter().filter_map(|p| match &p.value {
VCardParameterValue::Text(v) => Some(v.as_str()),
_ => None,
}))
})
.flat_map(|e| e.values.iter().filter_map(|v| v.as_text()))
.map(|v| xxh3::xxh3_64(v.as_bytes()))
}
@@ -215,6 +214,14 @@ impl ContactCard {
}
impl ArchivedContactCard {
pub fn size(&self) -> usize {
self.dead_properties.size()
+ self.display_name.as_ref().map_or(0, |n| n.len())
+ self.names.iter().map(|n| n.name.len()).sum::<usize>()
+ self.size.to_native() as usize
+ std::mem::size_of::<ContactCard>()
}
pub fn hashes(&self) -> impl Iterator<Item = u64> {
self.card
.entries
@@ -238,15 +245,7 @@ impl ArchivedContactCard {
| ArchivedVCardProperty::Tel
)
})
.flat_map(|e| {
e.values
.iter()
.filter_map(|v| v.as_text())
.chain(e.params.iter().filter_map(|p| match &p.value {
ArchivedVCardParameterValue::Text(v) => Some(v.as_str()),
_ => None,
}))
})
.flat_map(|e| e.values.iter().filter_map(|v| v.as_text()))
.map(|v| xxh3::xxh3_64(v.as_bytes()))
}
@@ -257,9 +256,7 @@ impl ArchivedContactCard {
.filter_map(|v| v.as_text().and_then(sanitize_email))
})
}
}
impl ArchivedContactCard {
pub fn index_document(
&self,
account_id: u32,

View File

@@ -20,7 +20,9 @@ impl IndexableObject for FileNode {
prefix: None,
sync_collection: SyncCollection::FileNode,
},
IndexValue::Quota { used: self.size() },
IndexValue::Quota {
used: self.size() as u32,
},
]);
if let Some(file) = &self.file {
@@ -50,7 +52,9 @@ impl IndexableObject for &ArchivedFileNode {
prefix: None,
sync_collection: SyncCollection::FileNode,
},
IndexValue::Quota { used: self.size() },
IndexValue::Quota {
used: self.size() as u32,
},
]);
if let Some(file) = self.file.as_ref() {
@@ -69,24 +73,25 @@ impl IndexableAndSerializableObject for FileNode {
}
}
pub trait NodeSize {
fn size(&self) -> u32;
}
impl NodeSize for ArchivedFileNode {
fn size(&self) -> u32 {
self.dead_properties.size() as u32
+ self.display_name.as_ref().map_or(0, |n| n.len() as u32)
+ self.name.len() as u32
+ self.file.as_ref().map_or(0, |f| u32::from(f.size))
impl FileNode {
pub fn size(&self) -> usize {
self.dead_properties.size()
+ self.display_name.as_ref().map_or(0, |n| n.len())
+ self.name.len()
+ self.file.as_ref().map_or(0, |f| f.size as usize)
+ std::mem::size_of::<FileNode>()
}
}
impl NodeSize for FileNode {
fn size(&self) -> u32 {
self.dead_properties.size() as u32
+ self.display_name.as_ref().map_or(0, |n| n.len() as u32)
+ self.name.len() as u32
+ self.file.as_ref().map_or(0, |f| f.size)
impl ArchivedFileNode {
pub fn size(&self) -> usize {
self.dead_properties.size()
+ self.display_name.as_ref().map_or(0, |n| n.len())
+ self.name.len()
+ self
.file
.as_ref()
.map_or(0, |f| f.size.to_native() as usize)
+ std::mem::size_of::<FileNode>()
}
}