feat(P1): FTS5 virtual table for email search (replaces LIKE scan) (#41)

This commit was merged in pull request #41.
This commit is contained in:
Bot of Thomas Güttler
2026-05-14 10:01:42 +02:00
parent 64fdc53bbd
commit f0f81777b5
3 changed files with 102 additions and 21 deletions
+27 -2
View File
@@ -14,7 +14,7 @@ void main() {
group('Migration', () {
test('schemaVersion matches expected value', () async {
final db = AppDatabase(NativeDatabase.memory());
expect(db.schemaVersion, 25);
expect(db.schemaVersion, 26);
await db.close();
});
@@ -158,6 +158,19 @@ void main() {
]),
);
// v26: FTS5 virtual table and triggers exist.
final allTriggers = await db
.customSelect("SELECT name FROM sqlite_master WHERE type='trigger'")
.get();
final triggerNames =
allTriggers.map((r) => r.read<String>('name')).toSet();
expect(
triggerNames,
containsAll(['email_fts_ai', 'email_fts_au', 'email_fts_ad']),
);
// Verify FTS table was created and is queryable.
await db.customSelect('SELECT count(*) FROM email_fts').get();
await db.close();
if (dbFile.existsSync()) dbFile.deleteSync();
});
@@ -276,11 +289,23 @@ void main() {
expect(indexNames, contains('mailboxes_account_id'));
expect(indexNames, contains('threads_latest_date'));
// v26: FTS5 virtual table and triggers.
final allTriggers = await db
.customSelect("SELECT name FROM sqlite_master WHERE type='trigger'")
.get();
final triggerNames =
allTriggers.map((r) => r.read<String>('name')).toSet();
expect(
triggerNames,
containsAll(['email_fts_ai', 'email_fts_au', 'email_fts_ad']),
);
await db.customSelect('SELECT count(*) FROM email_fts').get();
await db.close();
if (dbFile.existsSync()) dbFile.deleteSync();
});
test('fresh install creates all tables at schemaVersion 25', () async {
test('fresh install creates all tables at schemaVersion 26', () async {
final db = AppDatabase(NativeDatabase.memory());
await db.select(db.accounts).get();