Database schema optimization - part 11

This commit is contained in:
mdecimus
2025-11-12 19:09:06 +01:00
parent 3e181ae467
commit 8bbcb999d1
40 changed files with 541 additions and 493 deletions

View File

@@ -378,15 +378,21 @@ impl ArchivedCalendarEvent {
.filter(|e| e.component_type.is_scheduling_object())
{
for entry in component.entries.iter() {
let (is_lang, field) = match entry.name {
ArchivedICalendarProperty::Summary => (true, CalendarSearchField::Title),
let (is_lang, is_keyword, field) = match entry.name {
ArchivedICalendarProperty::Summary => (true, false, CalendarSearchField::Title),
ArchivedICalendarProperty::Description => {
(true, CalendarSearchField::Description)
(true, false, CalendarSearchField::Description)
}
ArchivedICalendarProperty::Location => (false, CalendarSearchField::Location),
ArchivedICalendarProperty::Organizer => (false, CalendarSearchField::Owner),
ArchivedICalendarProperty::Attendee => (false, CalendarSearchField::Attendee),
ArchivedICalendarProperty::Uid => (false, CalendarSearchField::Uid),
ArchivedICalendarProperty::Location => {
(false, false, CalendarSearchField::Location)
}
ArchivedICalendarProperty::Organizer => {
(false, false, CalendarSearchField::Owner)
}
ArchivedICalendarProperty::Attendee => {
(false, false, CalendarSearchField::Attendee)
}
ArchivedICalendarProperty::Uid => (false, true, CalendarSearchField::Uid),
_ => continue,
};
let field = SearchField::Calendar(field);
@@ -406,7 +412,7 @@ impl ArchivedCalendarEvent {
_ => None,
}))
{
let value = value.strip_prefix("mailto:").unwrap_or(value);
let value = value.strip_prefix("mailto:").unwrap_or(value).trim();
let lang = if is_lang {
detector.detect(value, MIN_LANGUAGE_SCORE);
Language::Unknown
@@ -414,7 +420,11 @@ impl ArchivedCalendarEvent {
Language::None
};
document.index_text(field.clone(), value, lang);
if !is_keyword {
document.index_text(field.clone(), value, lang);
} else {
document.index_keyword(field.clone(), value);
}
}
}
}

View File

@@ -21,7 +21,7 @@ use store::{
IterateParams, U16_LEN, U32_LEN, U64_LEN, ValueKey,
roaring::RoaringBitmap,
write::{
Archive, BatchBuilder, IndexPropertyClass, TaskQueueClass, ValueClass,
Archive, BatchBuilder, IndexPropertyClass, TaskEpoch, TaskQueueClass, ValueClass,
key::{DeserializeBigEndian, KeySerializer},
now,
},
@@ -520,7 +520,7 @@ impl CalendarAlarm {
} => {
batch.set(
ValueClass::TaskQueue(TaskQueueClass::SendAlarm {
due: self.alarm_time as u64,
due: TaskEpoch::new(self.alarm_time as u64),
event_id: self.event_id,
alarm_id: self.alarm_id,
is_email_alert: true,
@@ -536,7 +536,7 @@ impl CalendarAlarm {
CalendarAlarmType::Display { recurrence_id } => {
batch.set(
ValueClass::TaskQueue(TaskQueueClass::SendAlarm {
due: self.alarm_time as u64,
due: TaskEpoch::new(self.alarm_time as u64),
event_id: self.event_id,
alarm_id: self.alarm_id,
is_email_alert: false,
@@ -551,7 +551,7 @@ impl CalendarAlarm {
pub fn delete_task(&self, batch: &mut BatchBuilder) {
batch.clear(ValueClass::TaskQueue(TaskQueueClass::SendAlarm {
due: self.alarm_time as u64,
due: TaskEpoch::new(self.alarm_time as u64),
event_id: self.event_id,
alarm_id: self.alarm_id,
is_email_alert: matches!(self.typ, CalendarAlarmType::Email { .. }),

View File

@@ -273,20 +273,20 @@ impl ArchivedContactCard {
let mut detector = LanguageDetector::new();
for entry in self.card.entries.iter() {
let (is_text, field) = match entry.name {
ArchivedVCardProperty::N => (false, ContactSearchField::Name),
ArchivedVCardProperty::Nickname => (false, ContactSearchField::Nickname),
ArchivedVCardProperty::Org => (false, ContactSearchField::Organization),
ArchivedVCardProperty::Email => (false, ContactSearchField::Email),
ArchivedVCardProperty::Tel => (false, ContactSearchField::Phone),
let (is_text, is_keyword, field) = match entry.name {
ArchivedVCardProperty::N => (false, false, ContactSearchField::Name),
ArchivedVCardProperty::Nickname => (false, false, ContactSearchField::Nickname),
ArchivedVCardProperty::Org => (false, false, ContactSearchField::Organization),
ArchivedVCardProperty::Email => (false, false, ContactSearchField::Email),
ArchivedVCardProperty::Tel => (false, false, ContactSearchField::Phone),
ArchivedVCardProperty::Impp | ArchivedVCardProperty::Socialprofile => {
(false, ContactSearchField::OnlineService)
(false, false, ContactSearchField::OnlineService)
}
ArchivedVCardProperty::Adr => (false, ContactSearchField::Address),
ArchivedVCardProperty::Note => (true, ContactSearchField::Note),
ArchivedVCardProperty::Kind => (false, ContactSearchField::Kind),
ArchivedVCardProperty::Uid => (false, ContactSearchField::Uid),
ArchivedVCardProperty::Member => (false, ContactSearchField::Member),
ArchivedVCardProperty::Adr => (false, false, ContactSearchField::Address),
ArchivedVCardProperty::Note => (true, false, ContactSearchField::Note),
ArchivedVCardProperty::Kind => (false, true, ContactSearchField::Kind),
ArchivedVCardProperty::Uid => (false, true, ContactSearchField::Uid),
ArchivedVCardProperty::Member => (false, false, ContactSearchField::Member),
_ => continue,
};
let field = SearchField::Contact(field);
@@ -295,28 +295,32 @@ impl ArchivedContactCard {
for value in entry.values.iter() {
match value {
ArchivedVCardValue::Text(v) => {
let lang = if is_text {
detector.detect(v.as_str(), MIN_LANGUAGE_SCORE);
Language::Unknown
} else {
Language::None
};
if !is_keyword {
let lang = if is_text {
detector.detect(v.as_str().trim(), MIN_LANGUAGE_SCORE);
Language::Unknown
} else {
Language::None
};
document.index_text(field.clone(), v, lang);
document.index_text(field.clone(), v, lang);
} else {
document.index_keyword(field.clone(), v.as_str());
}
}
ArchivedVCardValue::Kind(v) => {
document.index_text(field.clone(), v.as_str(), Language::None);
document.index_keyword(field.clone(), v.as_str());
}
ArchivedVCardValue::Component(v) => {
for item in v.iter() {
document.index_text(field.clone(), item, Language::None);
document.index_text(field.clone(), item.trim(), Language::None);
}
}
_ => (),
}
}
for param in entry.params.iter() {
/*for param in entry.params.iter() {
if let ArchivedVCardParameterValue::Text(value) = &param.value {
let lang = if is_text {
detector.detect(value.as_str(), MIN_LANGUAGE_SCORE);
@@ -326,7 +330,7 @@ impl ArchivedContactCard {
};
document.index_text(field.clone(), value, lang);
}
}
}*/
}
}

View File

@@ -16,7 +16,7 @@ use calcard::{
use common::PROD_ID;
use store::{
Serialize,
write::{Archiver, BatchBuilder, TaskQueueClass, ValueClass, now},
write::{Archiver, BatchBuilder, TaskEpoch, TaskQueueClass, ValueClass},
};
use trc::AddContext;
@@ -278,7 +278,7 @@ impl ItipMessages {
}
pub fn queue(self, batch: &mut BatchBuilder) -> trc::Result<()> {
let due = now();
let due = TaskEpoch::now().with_random_sequence_id();
batch.set(
ValueClass::TaskQueue(TaskQueueClass::SendImip {
due,