Database schema optimization - part 13
This commit is contained in:
@@ -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()
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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>()
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user