From 8c05eff17331ea8f55d1a450f5e33f4515bb5f8a Mon Sep 17 00:00:00 2001 From: Fabian Freund Date: Mon, 29 Sep 2025 12:51:35 +0200 Subject: [PATCH] swith to bang composite key --- .../bangs/data/database/daos/bang.dart | 19 +- .../bangs/data/database/daos/sync.dart | 7 +- .../bangs/data/database/definitions.drift | 26 +- .../data/database/definitions.drift.dart | 856 +++++------------- .../features/bangs/data/models/bang_data.dart | 7 + .../features/bangs/data/models/bang_key.dart | 52 ++ .../bangs/data/services/data_source.dart | 11 +- .../bangs/data/services/data_source.g.dart | 2 +- .../bangs/domain/providers/bangs.dart | 9 +- .../bangs/domain/providers/bangs.g.dart | 14 +- .../bangs/domain/providers/search.dart | 3 +- .../bangs/domain/providers/search.g.dart | 2 +- .../bangs/domain/repositories/data.dart | 14 +- .../bangs/domain/repositories/data.g.dart | 2 +- .../presentation/screens/categories.dart | 3 +- .../bangs/presentation/screens/list.dart | 2 +- .../bangs/presentation/screens/search.dart | 2 +- .../presentation/widgets/site_search.dart | 2 +- .../domain/providers/tab_state.g.dart | 2 +- .../features/browser/domain/providers.dart | 5 +- .../features/browser/domain/providers.g.dart | 24 +- .../presentation/widgets/bang_chips.dart | 3 +- .../full_search_suggestions.dart | 2 +- .../presentation/pages/default_search.dart | 9 +- .../i_search_suggestion_provider.dart | 12 +- .../presentation/widgets/bang_icon.dart | 3 +- .../widgets/default_search_selector.dart | 9 +- .../user/data/models/general_settings.dart | 12 +- .../user/data/models/general_settings.g.dart | 19 +- 29 files changed, 433 insertions(+), 700 deletions(-) create mode 100644 app/lib/features/bangs/data/models/bang_key.dart diff --git a/app/lib/features/bangs/data/database/daos/bang.dart b/app/lib/features/bangs/data/database/daos/bang.dart index b6c94eb7..5fb00ab3 100644 --- a/app/lib/features/bangs/data/database/daos/bang.dart +++ b/app/lib/features/bangs/data/database/daos/bang.dart @@ -48,8 +48,12 @@ class BangDao extends DatabaseAccessor with $BangDaoMixin { ); } - SingleOrNullSelectable getBangData(String trigger) { - return select(db.bangDataView)..where((t) => t.trigger.equals(trigger)); + SingleOrNullSelectable getBangData( + BangGroup group, + String trigger, + ) { + return select(db.bangDataView) + ..where((t) => t.group.equalsValue(group) & t.trigger.equals(trigger)); } Selectable getBangDataList({ @@ -102,10 +106,11 @@ class BangDao extends DatabaseAccessor with $BangDaoMixin { return selectable; } - Future increaseBangFrequency(String trigger) { + Future increaseBangFrequency(BangGroup group, String trigger) { return db.bangFrequency.insertOne( BangFrequencyCompanion.insert( trigger: trigger, + group: group, frequency: 1, lastUsed: DateTime.now(), ), @@ -130,17 +135,23 @@ class BangDao extends DatabaseAccessor with $BangDaoMixin { } } - Future addSearchEntry(String trigger, String searchQuery) { + Future addSearchEntry( + BangGroup group, + String trigger, + String searchQuery, + ) { return db.bangHistory.insertOne( BangHistoryCompanion.insert( searchQuery: searchQuery, trigger: trigger, + group: group, searchDate: DateTime.now(), ), onConflict: DoUpdate( target: [db.bangHistory.searchQuery], (old) => BangHistoryCompanion( trigger: Value(trigger), + group: Value(group), searchDate: Value(DateTime.now()), ), ), diff --git a/app/lib/features/bangs/data/database/daos/sync.dart b/app/lib/features/bangs/data/database/daos/sync.dart index 82d67c07..ee9c6ca9 100644 --- a/app/lib/features/bangs/data/database/daos/sync.dart +++ b/app/lib/features/bangs/data/database/daos/sync.dart @@ -55,8 +55,9 @@ class SyncDao extends DatabaseAccessor with $SyncDaoMixin { }); } - Future deleteBangs(Iterable triggers) { - final statement = delete(db.bang)..where((t) => t.trigger.isIn(triggers)); + Future deleteBangs(BangGroup group, Iterable triggers) { + final statement = delete(db.bang) + ..where((t) => t.group.equalsValue(group) & t.trigger.isIn(triggers)); return statement.go(); } @@ -89,7 +90,7 @@ class SyncDao extends DatabaseAccessor with $SyncDaoMixin { .map((e) => remoteBangMap[e]!); await db.transaction(() async { - await deleteBangs(removedBangs); + await deleteBangs(group, removedBangs); await insertBangs(addedBangs); await replaceBangs(changedBangs); await upsertLastSyncOfGroup(group, syncTime); diff --git a/app/lib/features/bangs/data/database/definitions.drift b/app/lib/features/bangs/data/database/definitions.drift index e3881510..658a3f05 100644 --- a/app/lib/features/bangs/data/database/definitions.drift +++ b/app/lib/features/bangs/data/database/definitions.drift @@ -5,14 +5,15 @@ import 'package:weblibre/features/bangs/data/models/bang.dart'; import 'package:weblibre/features/bangs/data/models/search_history_entry.dart'; CREATE TABLE bang ( - "trigger" TEXT PRIMARY KEY NOT NULL, + "trigger" TEXT NOT NULL, "group" ENUM(BangGroup) NOT NULL, website_name TEXT NOT NULL, domain TEXT NOT NULL, url_template TEXT NOT NULL, category TEXT, sub_category TEXT, - format TEXT MAPPED BY `const BangFormatConverter()` + format TEXT MAPPED BY `const BangFormatConverter()`, + PRIMARY KEY ("trigger", "group") ) WITH Bang; CREATE TABLE bang_sync ( @@ -21,15 +22,20 @@ CREATE TABLE bang_sync ( ); CREATE TABLE bang_frequency ( - "trigger" TEXT PRIMARY KEY NOT NULL REFERENCES bang ("trigger") ON DELETE CASCADE, + "trigger" TEXT NOT NULL, + "group" ENUM(BangGroup) NOT NULL, frequency INTEGER NOT NULL, - last_used DATETIME NOT NULL + last_used DATETIME NOT NULL, + PRIMARY KEY ("trigger", "group"), + FOREIGN KEY ("trigger", "group") REFERENCES bang ("trigger", "group") ON DELETE CASCADE ); CREATE TABLE bang_history ( search_query TEXT UNIQUE NOT NULL, - "trigger" TEXT NOT NULL REFERENCES bang ("trigger"), - search_date DATETIME NOT NULL + "trigger" TEXT NOT NULL, + "group" ENUM(BangGroup) NOT NULL, + search_date DATETIME NOT NULL, + FOREIGN KEY ("trigger", "group") REFERENCES bang ("trigger", "group") ); CREATE VIRTUAL TABLE bang_fts @@ -48,7 +54,7 @@ CREATE VIEW bang_data_view WITH BangData AS FROM bang b LEFT JOIN - bang_frequency bf ON b."trigger" = bf."trigger"; + bang_frequency bf ON b."trigger" = bf."trigger" AND b."group" = bf."group"; -- Triggers to keep the FTS index up to date. CREATE TRIGGER bang_after_insert AFTER INSERT ON bang BEGIN @@ -90,7 +96,7 @@ queryBangs WITH BangData: INNER JOIN bang b ON b.rowid = fts.rowid LEFT JOIN - bang_frequency bf ON b."trigger" = bf."trigger" + bang_frequency bf ON b."trigger" = bf."trigger" AND b."group" = bf."group" CROSS JOIN weights ORDER BY @@ -114,7 +120,7 @@ queryBangsBasic WITH BangData: INNER JOIN bang b ON b.rowid = fts.rowid LEFT JOIN - bang_frequency bf ON b."trigger" = bf."trigger" + bang_frequency bf ON b."trigger" = bf."trigger" AND b."group" = bf."group" CROSS JOIN weights WHERE @@ -160,4 +166,4 @@ evictHistoryEntries: FROM bang_history ORDER BY search_date DESC LIMIT -1 OFFSET :limit - ); \ No newline at end of file + ); diff --git a/app/lib/features/bangs/data/database/definitions.drift.dart b/app/lib/features/bangs/data/database/definitions.drift.dart index d0388ea3..058e200c 100644 --- a/app/lib/features/bangs/data/database/definitions.drift.dart +++ b/app/lib/features/bangs/data/database/definitions.drift.dart @@ -37,73 +37,6 @@ typedef $BangTableUpdateCompanionBuilder = i0.Value rowid, }); -final class $BangTableReferences - extends i0.BaseReferences { - $BangTableReferences(super.$_db, super.$_table, super.$_typedResult); - - static i0.MultiTypedResultKey> - _bangFrequencyRefsTable(i0.GeneratedDatabase db) => - i0.MultiTypedResultKey.fromTable( - i6.ReadDatabaseContainer( - db, - ).resultSet('bang_frequency'), - aliasName: i0.$_aliasNameGenerator( - i6.ReadDatabaseContainer(db).resultSet('bang').trigger, - i6.ReadDatabaseContainer( - db, - ).resultSet('bang_frequency').trigger, - ), - ); - - i3.$BangFrequencyProcessedTableManager get bangFrequencyRefs { - final manager = i3 - .$BangFrequencyTableManager( - $_db, - i6.ReadDatabaseContainer( - $_db, - ).resultSet('bang_frequency'), - ) - .filter( - (f) => f.trigger.trigger.sqlEquals($_itemColumn('trigger')!), - ); - - final cache = $_typedResult.readTableOrNull(_bangFrequencyRefsTable($_db)); - return i0.ProcessedTableManager( - manager.$state.copyWith(prefetchedData: cache), - ); - } - - static i0.MultiTypedResultKey> - _bangHistoryRefsTable(i0.GeneratedDatabase db) => - i0.MultiTypedResultKey.fromTable( - i6.ReadDatabaseContainer(db).resultSet('bang_history'), - aliasName: i0.$_aliasNameGenerator( - i6.ReadDatabaseContainer(db).resultSet('bang').trigger, - i6.ReadDatabaseContainer( - db, - ).resultSet('bang_history').trigger, - ), - ); - - i3.$BangHistoryProcessedTableManager get bangHistoryRefs { - final manager = i3 - .$BangHistoryTableManager( - $_db, - i6.ReadDatabaseContainer( - $_db, - ).resultSet('bang_history'), - ) - .filter( - (f) => f.trigger.trigger.sqlEquals($_itemColumn('trigger')!), - ); - - final cache = $_typedResult.readTableOrNull(_bangHistoryRefsTable($_db)); - return i0.ProcessedTableManager( - manager.$state.copyWith(prefetchedData: cache), - ); - } -} - class $BangTableFilterComposer extends i0.Composer { $BangTableFilterComposer({ @@ -158,64 +91,6 @@ class $BangTableFilterComposer column: $table.format, builder: (column) => i0.ColumnWithTypeConverterFilters(column), ); - - i0.Expression bangFrequencyRefs( - i0.Expression Function(i3.$BangFrequencyFilterComposer f) f, - ) { - final i3.$BangFrequencyFilterComposer composer = $composerBuilder( - composer: this, - getCurrentColumn: (t) => t.trigger, - referencedTable: i6.ReadDatabaseContainer( - $db, - ).resultSet('bang_frequency'), - getReferencedColumn: (t) => t.trigger, - builder: - ( - joinBuilder, { - $addJoinBuilderToRootComposer, - $removeJoinBuilderFromRootComposer, - }) => i3.$BangFrequencyFilterComposer( - $db: $db, - $table: i6.ReadDatabaseContainer( - $db, - ).resultSet('bang_frequency'), - $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, - joinBuilder: joinBuilder, - $removeJoinBuilderFromRootComposer: - $removeJoinBuilderFromRootComposer, - ), - ); - return f(composer); - } - - i0.Expression bangHistoryRefs( - i0.Expression Function(i3.$BangHistoryFilterComposer f) f, - ) { - final i3.$BangHistoryFilterComposer composer = $composerBuilder( - composer: this, - getCurrentColumn: (t) => t.trigger, - referencedTable: i6.ReadDatabaseContainer( - $db, - ).resultSet('bang_history'), - getReferencedColumn: (t) => t.trigger, - builder: - ( - joinBuilder, { - $addJoinBuilderToRootComposer, - $removeJoinBuilderFromRootComposer, - }) => i3.$BangHistoryFilterComposer( - $db: $db, - $table: i6.ReadDatabaseContainer( - $db, - ).resultSet('bang_history'), - $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, - joinBuilder: joinBuilder, - $removeJoinBuilderFromRootComposer: - $removeJoinBuilderFromRootComposer, - ), - ); - return f(composer); - } } class $BangTableOrderingComposer @@ -306,64 +181,6 @@ class $BangTableAnnotationComposer i0.GeneratedColumnWithTypeConverter?, String> get format => $composableBuilder(column: $table.format, builder: (column) => column); - - i0.Expression bangFrequencyRefs( - i0.Expression Function(i3.$BangFrequencyAnnotationComposer a) f, - ) { - final i3.$BangFrequencyAnnotationComposer composer = $composerBuilder( - composer: this, - getCurrentColumn: (t) => t.trigger, - referencedTable: i6.ReadDatabaseContainer( - $db, - ).resultSet('bang_frequency'), - getReferencedColumn: (t) => t.trigger, - builder: - ( - joinBuilder, { - $addJoinBuilderToRootComposer, - $removeJoinBuilderFromRootComposer, - }) => i3.$BangFrequencyAnnotationComposer( - $db: $db, - $table: i6.ReadDatabaseContainer( - $db, - ).resultSet('bang_frequency'), - $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, - joinBuilder: joinBuilder, - $removeJoinBuilderFromRootComposer: - $removeJoinBuilderFromRootComposer, - ), - ); - return f(composer); - } - - i0.Expression bangHistoryRefs( - i0.Expression Function(i3.$BangHistoryAnnotationComposer a) f, - ) { - final i3.$BangHistoryAnnotationComposer composer = $composerBuilder( - composer: this, - getCurrentColumn: (t) => t.trigger, - referencedTable: i6.ReadDatabaseContainer( - $db, - ).resultSet('bang_history'), - getReferencedColumn: (t) => t.trigger, - builder: - ( - joinBuilder, { - $addJoinBuilderToRootComposer, - $removeJoinBuilderFromRootComposer, - }) => i3.$BangHistoryAnnotationComposer( - $db: $db, - $table: i6.ReadDatabaseContainer( - $db, - ).resultSet('bang_history'), - $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, - joinBuilder: joinBuilder, - $removeJoinBuilderFromRootComposer: - $removeJoinBuilderFromRootComposer, - ), - ); - return f(composer); - } } class $BangTableTableManager @@ -377,12 +194,12 @@ class $BangTableTableManager i3.$BangTableAnnotationComposer, $BangTableCreateCompanionBuilder, $BangTableUpdateCompanionBuilder, - (i1.Bang, i3.$BangTableReferences), + ( + i1.Bang, + i0.BaseReferences, + ), i1.Bang, - i0.PrefetchHooks Function({ - bool bangFrequencyRefs, - bool bangHistoryRefs, - }) + i0.PrefetchHooks Function() > { $BangTableTableManager(i0.GeneratedDatabase db, i3.BangTable table) : super( @@ -440,68 +257,9 @@ class $BangTableTableManager rowid: rowid, ), withReferenceMapper: (p0) => p0 - .map( - (e) => - (e.readTable(table), i3.$BangTableReferences(db, table, e)), - ) + .map((e) => (e.readTable(table), i0.BaseReferences(db, table, e))) .toList(), - prefetchHooksCallback: - ({bangFrequencyRefs = false, bangHistoryRefs = false}) { - return i0.PrefetchHooks( - db: db, - explicitlyWatchedTables: [ - if (bangFrequencyRefs) - i6.ReadDatabaseContainer( - db, - ).resultSet('bang_frequency'), - if (bangHistoryRefs) - i6.ReadDatabaseContainer( - db, - ).resultSet('bang_history'), - ], - addJoins: null, - getPrefetchedDataCallback: (items) async { - return [ - if (bangFrequencyRefs) - await i0.$_getPrefetchedData< - i1.Bang, - i3.BangTable, - i3.BangFrequencyData - >( - currentTable: table, - referencedTable: i3.$BangTableReferences - ._bangFrequencyRefsTable(db), - managerFromTypedResult: (p0) => i3 - .$BangTableReferences(db, table, p0) - .bangFrequencyRefs, - referencedItemsForCurrentItem: - (item, referencedItems) => referencedItems.where( - (e) => e.trigger == item.trigger, - ), - typedResults: items, - ), - if (bangHistoryRefs) - await i0.$_getPrefetchedData< - i1.Bang, - i3.BangTable, - i3.BangHistoryData - >( - currentTable: table, - referencedTable: i3.$BangTableReferences - ._bangHistoryRefsTable(db), - managerFromTypedResult: (p0) => i3 - .$BangTableReferences(db, table, p0) - .bangHistoryRefs, - referencedItemsForCurrentItem: - (item, referencedItems) => referencedItems.where( - (e) => e.trigger == item.trigger, - ), - typedResults: items, - ), - ]; - }, - ); - }, + prefetchHooksCallback: null, ), ); } @@ -516,9 +274,9 @@ typedef $BangTableProcessedTableManager = i3.$BangTableAnnotationComposer, $BangTableCreateCompanionBuilder, $BangTableUpdateCompanionBuilder, - (i1.Bang, i3.$BangTableReferences), + (i1.Bang, i0.BaseReferences), i1.Bang, - i0.PrefetchHooks Function({bool bangFrequencyRefs, bool bangHistoryRefs}) + i0.PrefetchHooks Function() >; typedef $BangSyncCreateCompanionBuilder = i3.BangSyncCompanion Function({ @@ -660,6 +418,7 @@ typedef $BangSyncProcessedTableManager = typedef $BangFrequencyCreateCompanionBuilder = i3.BangFrequencyCompanion Function({ required String trigger, + required i2.BangGroup group, required int frequency, required DateTime lastUsed, i0.Value rowid, @@ -667,51 +426,12 @@ typedef $BangFrequencyCreateCompanionBuilder = typedef $BangFrequencyUpdateCompanionBuilder = i3.BangFrequencyCompanion Function({ i0.Value trigger, + i0.Value group, i0.Value frequency, i0.Value lastUsed, i0.Value rowid, }); -final class $BangFrequencyReferences - extends - i0.BaseReferences< - i0.GeneratedDatabase, - i3.BangFrequency, - i3.BangFrequencyData - > { - $BangFrequencyReferences(super.$_db, super.$_table, super.$_typedResult); - - static i3.BangTable _triggerTable(i0.GeneratedDatabase db) => - i6.ReadDatabaseContainer(db) - .resultSet('bang') - .createAlias( - i0.$_aliasNameGenerator( - i6.ReadDatabaseContainer( - db, - ).resultSet('bang_frequency').trigger, - i6.ReadDatabaseContainer( - db, - ).resultSet('bang').trigger, - ), - ); - - i3.$BangTableProcessedTableManager get trigger { - final $_column = $_itemColumn('trigger')!; - - final manager = i3 - .$BangTableTableManager( - $_db, - i6.ReadDatabaseContainer($_db).resultSet('bang'), - ) - .filter((f) => f.trigger.sqlEquals($_column)); - final item = $_typedResult.readTableOrNull(_triggerTable($_db)); - if (item == null) return manager; - return i0.ProcessedTableManager( - manager.$state.copyWith(prefetchedData: [item]), - ); - } -} - class $BangFrequencyFilterComposer extends i0.Composer { $BangFrequencyFilterComposer({ @@ -721,6 +441,17 @@ class $BangFrequencyFilterComposer super.$addJoinBuilderToRootComposer, super.$removeJoinBuilderFromRootComposer, }); + i0.ColumnFilters get trigger => $composableBuilder( + column: $table.trigger, + builder: (column) => i0.ColumnFilters(column), + ); + + i0.ColumnWithTypeConverterFilters + get group => $composableBuilder( + column: $table.group, + builder: (column) => i0.ColumnWithTypeConverterFilters(column), + ); + i0.ColumnFilters get frequency => $composableBuilder( column: $table.frequency, builder: (column) => i0.ColumnFilters(column), @@ -730,33 +461,6 @@ class $BangFrequencyFilterComposer column: $table.lastUsed, builder: (column) => i0.ColumnFilters(column), ); - - i3.$BangTableFilterComposer get trigger { - final i3.$BangTableFilterComposer composer = $composerBuilder( - composer: this, - getCurrentColumn: (t) => t.trigger, - referencedTable: i6.ReadDatabaseContainer( - $db, - ).resultSet('bang'), - getReferencedColumn: (t) => t.trigger, - builder: - ( - joinBuilder, { - $addJoinBuilderToRootComposer, - $removeJoinBuilderFromRootComposer, - }) => i3.$BangTableFilterComposer( - $db: $db, - $table: i6.ReadDatabaseContainer( - $db, - ).resultSet('bang'), - $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, - joinBuilder: joinBuilder, - $removeJoinBuilderFromRootComposer: - $removeJoinBuilderFromRootComposer, - ), - ); - return composer; - } } class $BangFrequencyOrderingComposer @@ -768,6 +472,16 @@ class $BangFrequencyOrderingComposer super.$addJoinBuilderToRootComposer, super.$removeJoinBuilderFromRootComposer, }); + i0.ColumnOrderings get trigger => $composableBuilder( + column: $table.trigger, + builder: (column) => i0.ColumnOrderings(column), + ); + + i0.ColumnOrderings get group => $composableBuilder( + column: $table.group, + builder: (column) => i0.ColumnOrderings(column), + ); + i0.ColumnOrderings get frequency => $composableBuilder( column: $table.frequency, builder: (column) => i0.ColumnOrderings(column), @@ -777,33 +491,6 @@ class $BangFrequencyOrderingComposer column: $table.lastUsed, builder: (column) => i0.ColumnOrderings(column), ); - - i3.$BangTableOrderingComposer get trigger { - final i3.$BangTableOrderingComposer composer = $composerBuilder( - composer: this, - getCurrentColumn: (t) => t.trigger, - referencedTable: i6.ReadDatabaseContainer( - $db, - ).resultSet('bang'), - getReferencedColumn: (t) => t.trigger, - builder: - ( - joinBuilder, { - $addJoinBuilderToRootComposer, - $removeJoinBuilderFromRootComposer, - }) => i3.$BangTableOrderingComposer( - $db: $db, - $table: i6.ReadDatabaseContainer( - $db, - ).resultSet('bang'), - $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, - joinBuilder: joinBuilder, - $removeJoinBuilderFromRootComposer: - $removeJoinBuilderFromRootComposer, - ), - ); - return composer; - } } class $BangFrequencyAnnotationComposer @@ -815,38 +502,17 @@ class $BangFrequencyAnnotationComposer super.$addJoinBuilderToRootComposer, super.$removeJoinBuilderFromRootComposer, }); + i0.GeneratedColumn get trigger => + $composableBuilder(column: $table.trigger, builder: (column) => column); + + i0.GeneratedColumnWithTypeConverter get group => + $composableBuilder(column: $table.group, builder: (column) => column); + i0.GeneratedColumn get frequency => $composableBuilder(column: $table.frequency, builder: (column) => column); i0.GeneratedColumn get lastUsed => $composableBuilder(column: $table.lastUsed, builder: (column) => column); - - i3.$BangTableAnnotationComposer get trigger { - final i3.$BangTableAnnotationComposer composer = $composerBuilder( - composer: this, - getCurrentColumn: (t) => t.trigger, - referencedTable: i6.ReadDatabaseContainer( - $db, - ).resultSet('bang'), - getReferencedColumn: (t) => t.trigger, - builder: - ( - joinBuilder, { - $addJoinBuilderToRootComposer, - $removeJoinBuilderFromRootComposer, - }) => i3.$BangTableAnnotationComposer( - $db: $db, - $table: i6.ReadDatabaseContainer( - $db, - ).resultSet('bang'), - $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, - joinBuilder: joinBuilder, - $removeJoinBuilderFromRootComposer: - $removeJoinBuilderFromRootComposer, - ), - ); - return composer; - } } class $BangFrequencyTableManager @@ -860,9 +526,16 @@ class $BangFrequencyTableManager i3.$BangFrequencyAnnotationComposer, $BangFrequencyCreateCompanionBuilder, $BangFrequencyUpdateCompanionBuilder, - (i3.BangFrequencyData, i3.$BangFrequencyReferences), + ( + i3.BangFrequencyData, + i0.BaseReferences< + i0.GeneratedDatabase, + i3.BangFrequency, + i3.BangFrequencyData + >, + ), i3.BangFrequencyData, - i0.PrefetchHooks Function({bool trigger}) + i0.PrefetchHooks Function() > { $BangFrequencyTableManager(i0.GeneratedDatabase db, i3.BangFrequency table) : super( @@ -878,11 +551,13 @@ class $BangFrequencyTableManager updateCompanionCallback: ({ i0.Value trigger = const i0.Value.absent(), + i0.Value group = const i0.Value.absent(), i0.Value frequency = const i0.Value.absent(), i0.Value lastUsed = const i0.Value.absent(), i0.Value rowid = const i0.Value.absent(), }) => i3.BangFrequencyCompanion( trigger: trigger, + group: group, frequency: frequency, lastUsed: lastUsed, rowid: rowid, @@ -890,64 +565,21 @@ class $BangFrequencyTableManager createCompanionCallback: ({ required String trigger, + required i2.BangGroup group, required int frequency, required DateTime lastUsed, i0.Value rowid = const i0.Value.absent(), }) => i3.BangFrequencyCompanion.insert( trigger: trigger, + group: group, frequency: frequency, lastUsed: lastUsed, rowid: rowid, ), withReferenceMapper: (p0) => p0 - .map( - (e) => ( - e.readTable(table), - i3.$BangFrequencyReferences(db, table, e), - ), - ) + .map((e) => (e.readTable(table), i0.BaseReferences(db, table, e))) .toList(), - prefetchHooksCallback: ({trigger = false}) { - return i0.PrefetchHooks( - db: db, - explicitlyWatchedTables: [], - addJoins: - < - T extends i0.TableManagerState< - dynamic, - dynamic, - dynamic, - dynamic, - dynamic, - dynamic, - dynamic, - dynamic, - dynamic, - dynamic, - dynamic - > - >(state) { - if (trigger) { - state = - state.withJoin( - currentTable: table, - currentColumn: table.trigger, - referencedTable: i3.$BangFrequencyReferences - ._triggerTable(db), - referencedColumn: i3.$BangFrequencyReferences - ._triggerTable(db) - .trigger, - ) - as T; - } - - return state; - }, - getPrefetchedDataCallback: (items) async { - return []; - }, - ); - }, + prefetchHooksCallback: null, ), ); } @@ -962,14 +594,22 @@ typedef $BangFrequencyProcessedTableManager = i3.$BangFrequencyAnnotationComposer, $BangFrequencyCreateCompanionBuilder, $BangFrequencyUpdateCompanionBuilder, - (i3.BangFrequencyData, i3.$BangFrequencyReferences), + ( + i3.BangFrequencyData, + i0.BaseReferences< + i0.GeneratedDatabase, + i3.BangFrequency, + i3.BangFrequencyData + >, + ), i3.BangFrequencyData, - i0.PrefetchHooks Function({bool trigger}) + i0.PrefetchHooks Function() >; typedef $BangHistoryCreateCompanionBuilder = i3.BangHistoryCompanion Function({ required String searchQuery, required String trigger, + required i2.BangGroup group, required DateTime searchDate, i0.Value rowid, }); @@ -977,50 +617,11 @@ typedef $BangHistoryUpdateCompanionBuilder = i3.BangHistoryCompanion Function({ i0.Value searchQuery, i0.Value trigger, + i0.Value group, i0.Value searchDate, i0.Value rowid, }); -final class $BangHistoryReferences - extends - i0.BaseReferences< - i0.GeneratedDatabase, - i3.BangHistory, - i3.BangHistoryData - > { - $BangHistoryReferences(super.$_db, super.$_table, super.$_typedResult); - - static i3.BangTable _triggerTable(i0.GeneratedDatabase db) => - i6.ReadDatabaseContainer(db) - .resultSet('bang') - .createAlias( - i0.$_aliasNameGenerator( - i6.ReadDatabaseContainer( - db, - ).resultSet('bang_history').trigger, - i6.ReadDatabaseContainer( - db, - ).resultSet('bang').trigger, - ), - ); - - i3.$BangTableProcessedTableManager get trigger { - final $_column = $_itemColumn('trigger')!; - - final manager = i3 - .$BangTableTableManager( - $_db, - i6.ReadDatabaseContainer($_db).resultSet('bang'), - ) - .filter((f) => f.trigger.sqlEquals($_column)); - final item = $_typedResult.readTableOrNull(_triggerTable($_db)); - if (item == null) return manager; - return i0.ProcessedTableManager( - manager.$state.copyWith(prefetchedData: [item]), - ); - } -} - class $BangHistoryFilterComposer extends i0.Composer { $BangHistoryFilterComposer({ @@ -1035,37 +636,21 @@ class $BangHistoryFilterComposer builder: (column) => i0.ColumnFilters(column), ); + i0.ColumnFilters get trigger => $composableBuilder( + column: $table.trigger, + builder: (column) => i0.ColumnFilters(column), + ); + + i0.ColumnWithTypeConverterFilters + get group => $composableBuilder( + column: $table.group, + builder: (column) => i0.ColumnWithTypeConverterFilters(column), + ); + i0.ColumnFilters get searchDate => $composableBuilder( column: $table.searchDate, builder: (column) => i0.ColumnFilters(column), ); - - i3.$BangTableFilterComposer get trigger { - final i3.$BangTableFilterComposer composer = $composerBuilder( - composer: this, - getCurrentColumn: (t) => t.trigger, - referencedTable: i6.ReadDatabaseContainer( - $db, - ).resultSet('bang'), - getReferencedColumn: (t) => t.trigger, - builder: - ( - joinBuilder, { - $addJoinBuilderToRootComposer, - $removeJoinBuilderFromRootComposer, - }) => i3.$BangTableFilterComposer( - $db: $db, - $table: i6.ReadDatabaseContainer( - $db, - ).resultSet('bang'), - $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, - joinBuilder: joinBuilder, - $removeJoinBuilderFromRootComposer: - $removeJoinBuilderFromRootComposer, - ), - ); - return composer; - } } class $BangHistoryOrderingComposer @@ -1082,37 +667,20 @@ class $BangHistoryOrderingComposer builder: (column) => i0.ColumnOrderings(column), ); + i0.ColumnOrderings get trigger => $composableBuilder( + column: $table.trigger, + builder: (column) => i0.ColumnOrderings(column), + ); + + i0.ColumnOrderings get group => $composableBuilder( + column: $table.group, + builder: (column) => i0.ColumnOrderings(column), + ); + i0.ColumnOrderings get searchDate => $composableBuilder( column: $table.searchDate, builder: (column) => i0.ColumnOrderings(column), ); - - i3.$BangTableOrderingComposer get trigger { - final i3.$BangTableOrderingComposer composer = $composerBuilder( - composer: this, - getCurrentColumn: (t) => t.trigger, - referencedTable: i6.ReadDatabaseContainer( - $db, - ).resultSet('bang'), - getReferencedColumn: (t) => t.trigger, - builder: - ( - joinBuilder, { - $addJoinBuilderToRootComposer, - $removeJoinBuilderFromRootComposer, - }) => i3.$BangTableOrderingComposer( - $db: $db, - $table: i6.ReadDatabaseContainer( - $db, - ).resultSet('bang'), - $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, - joinBuilder: joinBuilder, - $removeJoinBuilderFromRootComposer: - $removeJoinBuilderFromRootComposer, - ), - ); - return composer; - } } class $BangHistoryAnnotationComposer @@ -1129,37 +697,16 @@ class $BangHistoryAnnotationComposer builder: (column) => column, ); + i0.GeneratedColumn get trigger => + $composableBuilder(column: $table.trigger, builder: (column) => column); + + i0.GeneratedColumnWithTypeConverter get group => + $composableBuilder(column: $table.group, builder: (column) => column); + i0.GeneratedColumn get searchDate => $composableBuilder( column: $table.searchDate, builder: (column) => column, ); - - i3.$BangTableAnnotationComposer get trigger { - final i3.$BangTableAnnotationComposer composer = $composerBuilder( - composer: this, - getCurrentColumn: (t) => t.trigger, - referencedTable: i6.ReadDatabaseContainer( - $db, - ).resultSet('bang'), - getReferencedColumn: (t) => t.trigger, - builder: - ( - joinBuilder, { - $addJoinBuilderToRootComposer, - $removeJoinBuilderFromRootComposer, - }) => i3.$BangTableAnnotationComposer( - $db: $db, - $table: i6.ReadDatabaseContainer( - $db, - ).resultSet('bang'), - $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, - joinBuilder: joinBuilder, - $removeJoinBuilderFromRootComposer: - $removeJoinBuilderFromRootComposer, - ), - ); - return composer; - } } class $BangHistoryTableManager @@ -1173,9 +720,16 @@ class $BangHistoryTableManager i3.$BangHistoryAnnotationComposer, $BangHistoryCreateCompanionBuilder, $BangHistoryUpdateCompanionBuilder, - (i3.BangHistoryData, i3.$BangHistoryReferences), + ( + i3.BangHistoryData, + i0.BaseReferences< + i0.GeneratedDatabase, + i3.BangHistory, + i3.BangHistoryData + >, + ), i3.BangHistoryData, - i0.PrefetchHooks Function({bool trigger}) + i0.PrefetchHooks Function() > { $BangHistoryTableManager(i0.GeneratedDatabase db, i3.BangHistory table) : super( @@ -1192,11 +746,13 @@ class $BangHistoryTableManager ({ i0.Value searchQuery = const i0.Value.absent(), i0.Value trigger = const i0.Value.absent(), + i0.Value group = const i0.Value.absent(), i0.Value searchDate = const i0.Value.absent(), i0.Value rowid = const i0.Value.absent(), }) => i3.BangHistoryCompanion( searchQuery: searchQuery, trigger: trigger, + group: group, searchDate: searchDate, rowid: rowid, ), @@ -1204,63 +760,20 @@ class $BangHistoryTableManager ({ required String searchQuery, required String trigger, + required i2.BangGroup group, required DateTime searchDate, i0.Value rowid = const i0.Value.absent(), }) => i3.BangHistoryCompanion.insert( searchQuery: searchQuery, trigger: trigger, + group: group, searchDate: searchDate, rowid: rowid, ), withReferenceMapper: (p0) => p0 - .map( - (e) => ( - e.readTable(table), - i3.$BangHistoryReferences(db, table, e), - ), - ) + .map((e) => (e.readTable(table), i0.BaseReferences(db, table, e))) .toList(), - prefetchHooksCallback: ({trigger = false}) { - return i0.PrefetchHooks( - db: db, - explicitlyWatchedTables: [], - addJoins: - < - T extends i0.TableManagerState< - dynamic, - dynamic, - dynamic, - dynamic, - dynamic, - dynamic, - dynamic, - dynamic, - dynamic, - dynamic, - dynamic - > - >(state) { - if (trigger) { - state = - state.withJoin( - currentTable: table, - currentColumn: table.trigger, - referencedTable: i3.$BangHistoryReferences - ._triggerTable(db), - referencedColumn: i3.$BangHistoryReferences - ._triggerTable(db) - .trigger, - ) - as T; - } - - return state; - }, - getPrefetchedDataCallback: (items) async { - return []; - }, - ); - }, + prefetchHooksCallback: null, ), ); } @@ -1275,9 +788,16 @@ typedef $BangHistoryProcessedTableManager = i3.$BangHistoryAnnotationComposer, $BangHistoryCreateCompanionBuilder, $BangHistoryUpdateCompanionBuilder, - (i3.BangHistoryData, i3.$BangHistoryReferences), + ( + i3.BangHistoryData, + i0.BaseReferences< + i0.GeneratedDatabase, + i3.BangHistory, + i3.BangHistoryData + >, + ), i3.BangHistoryData, - i0.PrefetchHooks Function({bool trigger}) + i0.PrefetchHooks Function() >; typedef $BangFtsCreateCompanionBuilder = i3.BangFtsCompanion Function({ @@ -1436,7 +956,7 @@ class BangTable extends i0.Table with i0.TableInfo { false, type: i0.DriftSqlType.string, requiredDuringInsert: true, - $customConstraints: 'PRIMARY KEY NOT NULL', + $customConstraints: 'NOT NULL', ); late final i0.GeneratedColumnWithTypeConverter group = i0.GeneratedColumn( @@ -1516,7 +1036,7 @@ class BangTable extends i0.Table with i0.TableInfo { String get actualTableName => $name; static const String $name = 'bang'; @override - Set get $primaryKey => {trigger}; + Set get $primaryKey => {trigger, group}; @override i1.Bang map(Map data, {String? tablePrefix}) { final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; @@ -1570,6 +1090,10 @@ class BangTable extends i0.Table with i0.TableInfo { static i0.TypeConverter?, String?> $converterformat = const i4.BangFormatConverter(); @override + List get customConstraints => const [ + 'PRIMARY KEY("trigger", "group")', + ]; + @override bool get dontWriteConstraints => true; } @@ -1907,9 +1431,17 @@ class BangFrequency extends i0.Table false, type: i0.DriftSqlType.string, requiredDuringInsert: true, - $customConstraints: - 'PRIMARY KEY NOT NULL REFERENCES bang("trigger")ON DELETE CASCADE', + $customConstraints: 'NOT NULL', ); + late final i0.GeneratedColumnWithTypeConverter group = + i0.GeneratedColumn( + 'group', + aliasedName, + false, + type: i0.DriftSqlType.int, + requiredDuringInsert: true, + $customConstraints: 'NOT NULL', + ).withConverter(i3.BangFrequency.$convertergroup); late final i0.GeneratedColumn frequency = i0.GeneratedColumn( 'frequency', aliasedName, @@ -1928,14 +1460,19 @@ class BangFrequency extends i0.Table $customConstraints: 'NOT NULL', ); @override - List get $columns => [trigger, frequency, lastUsed]; + List get $columns => [ + trigger, + group, + frequency, + lastUsed, + ]; @override String get aliasedName => _alias ?? actualTableName; @override String get actualTableName => $name; static const String $name = 'bang_frequency'; @override - Set get $primaryKey => {trigger}; + Set get $primaryKey => {trigger, group}; @override i3.BangFrequencyData map(Map data, {String? tablePrefix}) { final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; @@ -1944,6 +1481,12 @@ class BangFrequency extends i0.Table i0.DriftSqlType.string, data['${effectivePrefix}trigger'], )!, + group: i3.BangFrequency.$convertergroup.fromSql( + attachedDatabase.typeMapping.read( + i0.DriftSqlType.int, + data['${effectivePrefix}group'], + )!, + ), frequency: attachedDatabase.typeMapping.read( i0.DriftSqlType.int, data['${effectivePrefix}frequency'], @@ -1960,6 +1503,13 @@ class BangFrequency extends i0.Table return BangFrequency(attachedDatabase, alias); } + static i0.JsonTypeConverter2 $convertergroup = + const i0.EnumIndexConverter(i2.BangGroup.values); + @override + List get customConstraints => const [ + 'PRIMARY KEY("trigger", "group")', + 'FOREIGN KEY("trigger", "group")REFERENCES bang("trigger", "group")ON DELETE CASCADE', + ]; @override bool get dontWriteConstraints => true; } @@ -1967,10 +1517,12 @@ class BangFrequency extends i0.Table class BangFrequencyData extends i0.DataClass implements i0.Insertable { final String trigger; + final i2.BangGroup group; final int frequency; final DateTime lastUsed; const BangFrequencyData({ required this.trigger, + required this.group, required this.frequency, required this.lastUsed, }); @@ -1978,6 +1530,11 @@ class BangFrequencyData extends i0.DataClass Map toColumns(bool nullToAbsent) { final map = {}; map['trigger'] = i0.Variable(trigger); + { + map['group'] = i0.Variable( + i3.BangFrequency.$convertergroup.toSql(group), + ); + } map['frequency'] = i0.Variable(frequency); map['last_used'] = i0.Variable(lastUsed); return map; @@ -1990,6 +1547,9 @@ class BangFrequencyData extends i0.DataClass serializer ??= i0.driftRuntimeOptions.defaultSerializer; return BangFrequencyData( trigger: serializer.fromJson(json['trigger']), + group: i3.BangFrequency.$convertergroup.fromJson( + serializer.fromJson(json['group']), + ), frequency: serializer.fromJson(json['frequency']), lastUsed: serializer.fromJson(json['last_used']), ); @@ -1999,6 +1559,9 @@ class BangFrequencyData extends i0.DataClass serializer ??= i0.driftRuntimeOptions.defaultSerializer; return { 'trigger': serializer.toJson(trigger), + 'group': serializer.toJson( + i3.BangFrequency.$convertergroup.toJson(group), + ), 'frequency': serializer.toJson(frequency), 'last_used': serializer.toJson(lastUsed), }; @@ -2006,16 +1569,19 @@ class BangFrequencyData extends i0.DataClass i3.BangFrequencyData copyWith({ String? trigger, + i2.BangGroup? group, int? frequency, DateTime? lastUsed, }) => i3.BangFrequencyData( trigger: trigger ?? this.trigger, + group: group ?? this.group, frequency: frequency ?? this.frequency, lastUsed: lastUsed ?? this.lastUsed, ); BangFrequencyData copyWithCompanion(i3.BangFrequencyCompanion data) { return BangFrequencyData( trigger: data.trigger.present ? data.trigger.value : this.trigger, + group: data.group.present ? data.group.value : this.group, frequency: data.frequency.present ? data.frequency.value : this.frequency, lastUsed: data.lastUsed.present ? data.lastUsed.value : this.lastUsed, ); @@ -2025,6 +1591,7 @@ class BangFrequencyData extends i0.DataClass String toString() { return (StringBuffer('BangFrequencyData(') ..write('trigger: $trigger, ') + ..write('group: $group, ') ..write('frequency: $frequency, ') ..write('lastUsed: $lastUsed') ..write(')')) @@ -2032,43 +1599,50 @@ class BangFrequencyData extends i0.DataClass } @override - int get hashCode => Object.hash(trigger, frequency, lastUsed); + int get hashCode => Object.hash(trigger, group, frequency, lastUsed); @override bool operator ==(Object other) => identical(this, other) || (other is i3.BangFrequencyData && other.trigger == this.trigger && + other.group == this.group && other.frequency == this.frequency && other.lastUsed == this.lastUsed); } class BangFrequencyCompanion extends i0.UpdateCompanion { final i0.Value trigger; + final i0.Value group; final i0.Value frequency; final i0.Value lastUsed; final i0.Value rowid; const BangFrequencyCompanion({ this.trigger = const i0.Value.absent(), + this.group = const i0.Value.absent(), this.frequency = const i0.Value.absent(), this.lastUsed = const i0.Value.absent(), this.rowid = const i0.Value.absent(), }); BangFrequencyCompanion.insert({ required String trigger, + required i2.BangGroup group, required int frequency, required DateTime lastUsed, this.rowid = const i0.Value.absent(), }) : trigger = i0.Value(trigger), + group = i0.Value(group), frequency = i0.Value(frequency), lastUsed = i0.Value(lastUsed); static i0.Insertable custom({ i0.Expression? trigger, + i0.Expression? group, i0.Expression? frequency, i0.Expression? lastUsed, i0.Expression? rowid, }) { return i0.RawValuesInsertable({ if (trigger != null) 'trigger': trigger, + if (group != null) 'group': group, if (frequency != null) 'frequency': frequency, if (lastUsed != null) 'last_used': lastUsed, if (rowid != null) 'rowid': rowid, @@ -2077,12 +1651,14 @@ class BangFrequencyCompanion extends i0.UpdateCompanion { i3.BangFrequencyCompanion copyWith({ i0.Value? trigger, + i0.Value? group, i0.Value? frequency, i0.Value? lastUsed, i0.Value? rowid, }) { return i3.BangFrequencyCompanion( trigger: trigger ?? this.trigger, + group: group ?? this.group, frequency: frequency ?? this.frequency, lastUsed: lastUsed ?? this.lastUsed, rowid: rowid ?? this.rowid, @@ -2095,6 +1671,11 @@ class BangFrequencyCompanion extends i0.UpdateCompanion { if (trigger.present) { map['trigger'] = i0.Variable(trigger.value); } + if (group.present) { + map['group'] = i0.Variable( + i3.BangFrequency.$convertergroup.toSql(group.value), + ); + } if (frequency.present) { map['frequency'] = i0.Variable(frequency.value); } @@ -2111,6 +1692,7 @@ class BangFrequencyCompanion extends i0.UpdateCompanion { String toString() { return (StringBuffer('BangFrequencyCompanion(') ..write('trigger: $trigger, ') + ..write('group: $group, ') ..write('frequency: $frequency, ') ..write('lastUsed: $lastUsed, ') ..write('rowid: $rowid') @@ -2140,8 +1722,17 @@ class BangHistory extends i0.Table false, type: i0.DriftSqlType.string, requiredDuringInsert: true, - $customConstraints: 'NOT NULL REFERENCES bang("trigger")', + $customConstraints: 'NOT NULL', ); + late final i0.GeneratedColumnWithTypeConverter group = + i0.GeneratedColumn( + 'group', + aliasedName, + false, + type: i0.DriftSqlType.int, + requiredDuringInsert: true, + $customConstraints: 'NOT NULL', + ).withConverter(i3.BangHistory.$convertergroup); late final i0.GeneratedColumn searchDate = i0.GeneratedColumn( 'search_date', @@ -2152,7 +1743,12 @@ class BangHistory extends i0.Table $customConstraints: 'NOT NULL', ); @override - List get $columns => [searchQuery, trigger, searchDate]; + List get $columns => [ + searchQuery, + trigger, + group, + searchDate, + ]; @override String get aliasedName => _alias ?? actualTableName; @override @@ -2172,6 +1768,12 @@ class BangHistory extends i0.Table i0.DriftSqlType.string, data['${effectivePrefix}trigger'], )!, + group: i3.BangHistory.$convertergroup.fromSql( + attachedDatabase.typeMapping.read( + i0.DriftSqlType.int, + data['${effectivePrefix}group'], + )!, + ), searchDate: attachedDatabase.typeMapping.read( i0.DriftSqlType.dateTime, data['${effectivePrefix}search_date'], @@ -2184,6 +1786,12 @@ class BangHistory extends i0.Table return BangHistory(attachedDatabase, alias); } + static i0.JsonTypeConverter2 $convertergroup = + const i0.EnumIndexConverter(i2.BangGroup.values); + @override + List get customConstraints => const [ + 'FOREIGN KEY("trigger", "group")REFERENCES bang("trigger", "group")', + ]; @override bool get dontWriteConstraints => true; } @@ -2192,10 +1800,12 @@ class BangHistoryData extends i0.DataClass implements i0.Insertable { final String searchQuery; final String trigger; + final i2.BangGroup group; final DateTime searchDate; const BangHistoryData({ required this.searchQuery, required this.trigger, + required this.group, required this.searchDate, }); @override @@ -2203,6 +1813,11 @@ class BangHistoryData extends i0.DataClass final map = {}; map['search_query'] = i0.Variable(searchQuery); map['trigger'] = i0.Variable(trigger); + { + map['group'] = i0.Variable( + i3.BangHistory.$convertergroup.toSql(group), + ); + } map['search_date'] = i0.Variable(searchDate); return map; } @@ -2215,6 +1830,9 @@ class BangHistoryData extends i0.DataClass return BangHistoryData( searchQuery: serializer.fromJson(json['search_query']), trigger: serializer.fromJson(json['trigger']), + group: i3.BangHistory.$convertergroup.fromJson( + serializer.fromJson(json['group']), + ), searchDate: serializer.fromJson(json['search_date']), ); } @@ -2224,6 +1842,9 @@ class BangHistoryData extends i0.DataClass return { 'search_query': serializer.toJson(searchQuery), 'trigger': serializer.toJson(trigger), + 'group': serializer.toJson( + i3.BangHistory.$convertergroup.toJson(group), + ), 'search_date': serializer.toJson(searchDate), }; } @@ -2231,10 +1852,12 @@ class BangHistoryData extends i0.DataClass i3.BangHistoryData copyWith({ String? searchQuery, String? trigger, + i2.BangGroup? group, DateTime? searchDate, }) => i3.BangHistoryData( searchQuery: searchQuery ?? this.searchQuery, trigger: trigger ?? this.trigger, + group: group ?? this.group, searchDate: searchDate ?? this.searchDate, ); BangHistoryData copyWithCompanion(i3.BangHistoryCompanion data) { @@ -2243,6 +1866,7 @@ class BangHistoryData extends i0.DataClass ? data.searchQuery.value : this.searchQuery, trigger: data.trigger.present ? data.trigger.value : this.trigger, + group: data.group.present ? data.group.value : this.group, searchDate: data.searchDate.present ? data.searchDate.value : this.searchDate, @@ -2254,50 +1878,58 @@ class BangHistoryData extends i0.DataClass return (StringBuffer('BangHistoryData(') ..write('searchQuery: $searchQuery, ') ..write('trigger: $trigger, ') + ..write('group: $group, ') ..write('searchDate: $searchDate') ..write(')')) .toString(); } @override - int get hashCode => Object.hash(searchQuery, trigger, searchDate); + int get hashCode => Object.hash(searchQuery, trigger, group, searchDate); @override bool operator ==(Object other) => identical(this, other) || (other is i3.BangHistoryData && other.searchQuery == this.searchQuery && other.trigger == this.trigger && + other.group == this.group && other.searchDate == this.searchDate); } class BangHistoryCompanion extends i0.UpdateCompanion { final i0.Value searchQuery; final i0.Value trigger; + final i0.Value group; final i0.Value searchDate; final i0.Value rowid; const BangHistoryCompanion({ this.searchQuery = const i0.Value.absent(), this.trigger = const i0.Value.absent(), + this.group = const i0.Value.absent(), this.searchDate = const i0.Value.absent(), this.rowid = const i0.Value.absent(), }); BangHistoryCompanion.insert({ required String searchQuery, required String trigger, + required i2.BangGroup group, required DateTime searchDate, this.rowid = const i0.Value.absent(), }) : searchQuery = i0.Value(searchQuery), trigger = i0.Value(trigger), + group = i0.Value(group), searchDate = i0.Value(searchDate); static i0.Insertable custom({ i0.Expression? searchQuery, i0.Expression? trigger, + i0.Expression? group, i0.Expression? searchDate, i0.Expression? rowid, }) { return i0.RawValuesInsertable({ if (searchQuery != null) 'search_query': searchQuery, if (trigger != null) 'trigger': trigger, + if (group != null) 'group': group, if (searchDate != null) 'search_date': searchDate, if (rowid != null) 'rowid': rowid, }); @@ -2306,12 +1938,14 @@ class BangHistoryCompanion extends i0.UpdateCompanion { i3.BangHistoryCompanion copyWith({ i0.Value? searchQuery, i0.Value? trigger, + i0.Value? group, i0.Value? searchDate, i0.Value? rowid, }) { return i3.BangHistoryCompanion( searchQuery: searchQuery ?? this.searchQuery, trigger: trigger ?? this.trigger, + group: group ?? this.group, searchDate: searchDate ?? this.searchDate, rowid: rowid ?? this.rowid, ); @@ -2326,6 +1960,11 @@ class BangHistoryCompanion extends i0.UpdateCompanion { if (trigger.present) { map['trigger'] = i0.Variable(trigger.value); } + if (group.present) { + map['group'] = i0.Variable( + i3.BangHistory.$convertergroup.toSql(group.value), + ); + } if (searchDate.present) { map['search_date'] = i0.Variable(searchDate.value); } @@ -2340,6 +1979,7 @@ class BangHistoryCompanion extends i0.UpdateCompanion { return (StringBuffer('BangHistoryCompanion(') ..write('searchQuery: $searchQuery, ') ..write('trigger: $trigger, ') + ..write('group: $group, ') ..write('searchDate: $searchDate, ') ..write('rowid: $rowid') ..write(')')) @@ -2562,7 +2202,7 @@ class BangDataView extends i0.ViewInfo @override Map get createViewStatements => { i0.SqlDialect.sqlite: - 'CREATE VIEW bang_data_view AS SELECT b.*, bf.frequency, bf.last_used FROM bang AS b LEFT JOIN bang_frequency AS bf ON b."trigger" = bf."trigger"', + 'CREATE VIEW bang_data_view AS SELECT b.*, bf.frequency, bf.last_used FROM bang AS b LEFT JOIN bang_frequency AS bf ON b."trigger" = bf."trigger" AND b."group" = bf."group"', }; @override BangDataView get asDslTable => this; @@ -2713,7 +2353,7 @@ class DefinitionsDrift extends i6.ModularAccessor { i0.Selectable queryBangs({required String query}) { return customSelect( - 'WITH weights AS (SELECT 10.0 AS "trigger", 5.0 AS website_name) SELECT b.*, bf.frequency, bf.last_used, bm25(bang_fts, weights."trigger", weights.website_name) AS weighted_rank FROM bang_fts(?1)AS fts INNER JOIN bang AS b ON b."rowid" = fts."rowid" LEFT JOIN bang_frequency AS bf ON b."trigger" = bf."trigger" CROSS JOIN weights ORDER BY weighted_rank ASC, bf.frequency NULLS LAST', + 'WITH weights AS (SELECT 10.0 AS "trigger", 5.0 AS website_name) SELECT b.*, bf.frequency, bf.last_used, bm25(bang_fts, weights."trigger", weights.website_name) AS weighted_rank FROM bang_fts(?1)AS fts INNER JOIN bang AS b ON b."rowid" = fts."rowid" LEFT JOIN bang_frequency AS bf ON b."trigger" = bf."trigger" AND b."group" = bf."group" CROSS JOIN weights ORDER BY weighted_rank ASC, bf.frequency NULLS LAST', variables: [i0.Variable(query)], readsFrom: {bangFrequency, bangFts, bang}, ).map( @@ -2735,7 +2375,7 @@ class DefinitionsDrift extends i6.ModularAccessor { i0.Selectable queryBangsBasic({required String query}) { return customSelect( - 'WITH weights AS (SELECT 10.0 AS "trigger", 5.0 AS website_name) SELECT b.*, bf.frequency, bf.last_used, bm25(bang_fts, weights."trigger", weights.website_name) AS weighted_rank FROM bang_fts AS fts INNER JOIN bang AS b ON b."rowid" = fts."rowid" LEFT JOIN bang_frequency AS bf ON b."trigger" = bf."trigger" CROSS JOIN weights WHERE fts."trigger" LIKE ?1 OR fts.website_name LIKE ?1 ORDER BY weighted_rank ASC, bf.frequency NULLS LAST', + 'WITH weights AS (SELECT 10.0 AS "trigger", 5.0 AS website_name) SELECT b.*, bf.frequency, bf.last_used, bm25(bang_fts, weights."trigger", weights.website_name) AS weighted_rank FROM bang_fts AS fts INNER JOIN bang AS b ON b."rowid" = fts."rowid" LEFT JOIN bang_frequency AS bf ON b."trigger" = bf."trigger" AND b."group" = bf."group" CROSS JOIN weights WHERE fts."trigger" LIKE ?1 OR fts.website_name LIKE ?1 ORDER BY weighted_rank ASC, bf.frequency NULLS LAST', variables: [i0.Variable(query)], readsFrom: {bangFrequency, bangFts, bang}, ).map( diff --git a/app/lib/features/bangs/data/models/bang_data.dart b/app/lib/features/bangs/data/models/bang_data.dart index 1adc4aa4..3fc64536 100644 --- a/app/lib/features/bangs/data/models/bang_data.dart +++ b/app/lib/features/bangs/data/models/bang_data.dart @@ -19,6 +19,8 @@ */ import 'package:copy_with_extension/copy_with_extension.dart'; import 'package:weblibre/features/bangs/data/models/bang.dart'; +import 'package:weblibre/features/bangs/data/models/bang_group.dart'; +import 'package:weblibre/features/bangs/data/models/bang_key.dart'; import 'package:weblibre/features/geckoview/domain/entities/browser_icon.dart'; part 'bang_data.g.dart'; @@ -30,6 +32,9 @@ class BangData extends Bang { final BrowserIcon? icon; + @override + BangGroup get group => super.group!; + BangData({ required super.websiteName, required super.domain, @@ -43,6 +48,8 @@ class BangData extends Bang { this.icon, }) : frequency = frequency ?? 0; + BangKey toKey() => BangKey(group: group, trigger: trigger); + @override List get hashParameters => [ ...super.hashParameters, diff --git a/app/lib/features/bangs/data/models/bang_key.dart b/app/lib/features/bangs/data/models/bang_key.dart new file mode 100644 index 00000000..7ebb9b6b --- /dev/null +++ b/app/lib/features/bangs/data/models/bang_key.dart @@ -0,0 +1,52 @@ +import 'package:json_annotation/json_annotation.dart'; +import 'package:nullability/nullability.dart'; +import 'package:weblibre/features/bangs/data/models/bang_group.dart'; + +class BangKey { + final String trigger; + final BangGroup group; + + const BangKey({required this.group, required this.trigger}); + + @override + String toString() { + return '${group.name}::$trigger'; + } + + @override + bool operator ==(Object other) => + identical(this, other) || + other is BangKey && + runtimeType == other.runtimeType && + trigger == other.trigger && + group == other.group; + + @override + int get hashCode => Object.hash(trigger, group); + + static BangKey? tryFromString(String key) { + try { + final [group, trigger] = key.split('::'); + return BangKey( + group: BangGroup.values.firstWhere((g) => g.name == group), + trigger: trigger, + ); + } catch (_) { + return null; + } + } +} + +class BangKeyConverter implements JsonConverter { + const BangKeyConverter(); + + @override + BangKey? fromJson(String? json) { + return json.mapNotNull((json) => BangKey.tryFromString(json)); + } + + @override + String? toJson(BangKey? object) { + return object?.toString(); + } +} diff --git a/app/lib/features/bangs/data/services/data_source.dart b/app/lib/features/bangs/data/services/data_source.dart index f404cc6e..a8db1198 100644 --- a/app/lib/features/bangs/data/services/data_source.dart +++ b/app/lib/features/bangs/data/services/data_source.dart @@ -35,7 +35,7 @@ class BangDataSourceService extends _$BangDataSourceService { @override void build() {} - Future>> fetchRemoteBangs(Uri url, BangGroup? group) { + Future>> fetchRemoteBangs(Uri url, BangGroup group) { return Result.fromAsync(() async { return await compute((args) async { final client = http.Client(); @@ -51,13 +51,8 @@ class BangDataSourceService extends _$BangDataSourceService { } }, [url.toString()]).then( (json) => json.map((e) { - var bang = Bang.fromJson(e as Map); - - if (group != null) { - bang = bang.copyWith.group(group); - } - - return bang; + final bang = Bang.fromJson(e as Map); + return bang.copyWith.group(group); }).toList(), ); }, exceptionHandler: handleHttpError); diff --git a/app/lib/features/bangs/data/services/data_source.g.dart b/app/lib/features/bangs/data/services/data_source.g.dart index 21c0e9d6..7264430d 100644 --- a/app/lib/features/bangs/data/services/data_source.g.dart +++ b/app/lib/features/bangs/data/services/data_source.g.dart @@ -42,7 +42,7 @@ final class BangDataSourceServiceProvider } String _$bangDataSourceServiceHash() => - r'2ff811ece417ae498dacc04a2fa963cffb34c8a9'; + r'b1bd96bbd834de0f71af86d7f791d367d0a837be'; abstract class _$BangDataSourceService extends $Notifier { void build(); diff --git a/app/lib/features/bangs/domain/providers/bangs.dart b/app/lib/features/bangs/domain/providers/bangs.dart index 6e0c6d34..197cc04e 100644 --- a/app/lib/features/bangs/domain/providers/bangs.dart +++ b/app/lib/features/bangs/domain/providers/bangs.dart @@ -21,6 +21,7 @@ import 'package:riverpod/riverpod.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:weblibre/features/bangs/data/models/bang_data.dart'; import 'package:weblibre/features/bangs/data/models/bang_group.dart'; +import 'package:weblibre/features/bangs/data/models/bang_key.dart'; import 'package:weblibre/features/bangs/data/models/search_history_entry.dart'; import 'package:weblibre/features/bangs/domain/repositories/data.dart'; import 'package:weblibre/features/bangs/domain/repositories/sync.dart'; @@ -30,20 +31,20 @@ part 'bangs.g.dart'; @Riverpod(keepAlive: true) Stream defaultSearchBangData(Ref ref) { - final trigger = ref.watch( + final key = ref.watch( generalSettingsWithDefaultsProvider.select( (value) => value.defaultSearchProvider, ), ); final repository = ref.watch(bangDataRepositoryProvider.notifier); - return repository.watchBang(trigger); + return repository.watchBang(key); } @Riverpod() -Stream bangData(Ref ref, String trigger) { +Stream bangData(Ref ref, BangKey key) { final repository = ref.watch(bangDataRepositoryProvider.notifier); - return repository.watchBang(trigger); + return repository.watchBang(key); } @Riverpod() diff --git a/app/lib/features/bangs/domain/providers/bangs.g.dart b/app/lib/features/bangs/domain/providers/bangs.g.dart index 0f54ce4c..d980dd05 100644 --- a/app/lib/features/bangs/domain/providers/bangs.g.dart +++ b/app/lib/features/bangs/domain/providers/bangs.g.dart @@ -42,7 +42,7 @@ final class DefaultSearchBangDataProvider } String _$defaultSearchBangDataHash() => - r'5fa3f588b57a82dd8fffb2082e495108a242ef72'; + r'5f43b8989219cf3cb2f5ca65df351b6cb100427f'; @ProviderFor(bangData) const bangDataProvider = BangDataFamily._(); @@ -53,7 +53,7 @@ final class BangDataProvider with $FutureModifier, $StreamProvider { const BangDataProvider._({ required BangDataFamily super.from, - required String super.argument, + required BangKey super.argument, }) : super( retry: null, name: r'bangDataProvider', @@ -79,7 +79,7 @@ final class BangDataProvider @override Stream create(Ref ref) { - final argument = this.argument as String; + final argument = this.argument as BangKey; return bangData(ref, argument); } @@ -94,10 +94,10 @@ final class BangDataProvider } } -String _$bangDataHash() => r'b10d3a74e19d30fc372b9ecbf7146bccd9fdf83b'; +String _$bangDataHash() => r'bd9f5ec8b29aab74620a9b5a4246cb7e3b2fd377'; final class BangDataFamily extends $Family - with $FunctionalFamilyOverride, String> { + with $FunctionalFamilyOverride, BangKey> { const BangDataFamily._() : super( retry: null, @@ -107,8 +107,8 @@ final class BangDataFamily extends $Family isAutoDispose: true, ); - BangDataProvider call(String trigger) => - BangDataProvider._(argument: trigger, from: this); + BangDataProvider call(BangKey key) => + BangDataProvider._(argument: key, from: this); @override String toString() => r'bangDataProvider'; diff --git a/app/lib/features/bangs/domain/providers/search.dart b/app/lib/features/bangs/domain/providers/search.dart index c6f6ebff..7d7a58f8 100644 --- a/app/lib/features/bangs/domain/providers/search.dart +++ b/app/lib/features/bangs/domain/providers/search.dart @@ -34,8 +34,9 @@ class BangSearch extends _$BangSearch { Future triggerBangSearch(BangData bang, String searchQuery) async { final bangDataNotifier = ref.read(bangDataRepositoryProvider.notifier); - await bangDataNotifier.increaseFrequency(bang.trigger); + await bangDataNotifier.increaseFrequency(bang.group, bang.trigger); await bangDataNotifier.addSearchEntry( + bang.group, bang.trigger, searchQuery, maxEntryCount: 3, diff --git a/app/lib/features/bangs/domain/providers/search.g.dart b/app/lib/features/bangs/domain/providers/search.g.dart index d79760a6..1e1a0426 100644 --- a/app/lib/features/bangs/domain/providers/search.g.dart +++ b/app/lib/features/bangs/domain/providers/search.g.dart @@ -33,7 +33,7 @@ final class BangSearchProvider BangSearch create() => BangSearch(); } -String _$bangSearchHash() => r'6b7452d48698c01870c5c75f0c10cadaafc481c8'; +String _$bangSearchHash() => r'66080335f1677e6a4636c41dd5619de3828375e6'; abstract class _$BangSearch extends $StreamNotifier> { Stream> build(); diff --git a/app/lib/features/bangs/domain/repositories/data.dart b/app/lib/features/bangs/domain/repositories/data.dart index 7b85826a..12bb93e5 100644 --- a/app/lib/features/bangs/domain/repositories/data.dart +++ b/app/lib/features/bangs/domain/repositories/data.dart @@ -23,6 +23,7 @@ import 'package:drift/drift.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:weblibre/features/bangs/data/models/bang_data.dart'; import 'package:weblibre/features/bangs/data/models/bang_group.dart'; +import 'package:weblibre/features/bangs/data/models/bang_key.dart'; import 'package:weblibre/features/bangs/data/models/search_history_entry.dart'; import 'package:weblibre/features/bangs/data/providers.dart'; @@ -33,12 +34,12 @@ class BangDataRepository extends _$BangDataRepository { @override void build() {} - Stream watchBang(String? trigger) { - if (trigger != null) { + Stream watchBang(BangKey? key) { + if (key != null) { return ref .read(bangDatabaseProvider) .bangDao - .getBangData(trigger) + .getBangData(key.group, key.trigger) .watchSingleOrNull(); } else { return Stream.value(null); @@ -104,14 +105,15 @@ class BangDataRepository extends _$BangDataRepository { .watch(); } - Future increaseFrequency(String trigger) { + Future increaseFrequency(BangGroup group, String trigger) { return ref .read(bangDatabaseProvider) .bangDao - .increaseBangFrequency(trigger); + .increaseBangFrequency(group, trigger); } Future addSearchEntry( + BangGroup group, String trigger, String searchQuery, { required int maxEntryCount, @@ -119,7 +121,7 @@ class BangDataRepository extends _$BangDataRepository { final db = ref.read(bangDatabaseProvider); //Pack in a transaction to bundle rebuilds of watch() queries return db.transaction(() async { - await db.bangDao.addSearchEntry(trigger, searchQuery); + await db.bangDao.addSearchEntry(group, trigger, searchQuery); await db.definitionsDrift.evictHistoryEntries(limit: maxEntryCount); }); } diff --git a/app/lib/features/bangs/domain/repositories/data.g.dart b/app/lib/features/bangs/domain/repositories/data.g.dart index bc0b8618..0e00a75d 100644 --- a/app/lib/features/bangs/domain/repositories/data.g.dart +++ b/app/lib/features/bangs/domain/repositories/data.g.dart @@ -42,7 +42,7 @@ final class BangDataRepositoryProvider } String _$bangDataRepositoryHash() => - r'5e25ce123d4667a0b12316f5b771b6776c40f280'; + r'93f1338da86c693f524df377fe01d0ecf7f5ff80'; abstract class _$BangDataRepository extends $Notifier { void build(); diff --git a/app/lib/features/bangs/presentation/screens/categories.dart b/app/lib/features/bangs/presentation/screens/categories.dart index 5b9d1637..795dce1a 100644 --- a/app/lib/features/bangs/presentation/screens/categories.dart +++ b/app/lib/features/bangs/presentation/screens/categories.dart @@ -22,6 +22,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:weblibre/core/routing/routes.dart'; +import 'package:weblibre/features/bangs/data/models/bang_key.dart'; import 'package:weblibre/features/bangs/domain/providers/bangs.dart'; import 'package:weblibre/features/geckoview/features/browser/domain/providers.dart'; import 'package:weblibre/presentation/widgets/failure_widget.dart'; @@ -38,7 +39,7 @@ class BangCategoriesScreen extends HookConsumerWidget { actions: [ IconButton( onPressed: () async { - final trigger = await const BangSearchRoute().push( + final trigger = await const BangSearchRoute().push( context, ); diff --git a/app/lib/features/bangs/presentation/screens/list.dart b/app/lib/features/bangs/presentation/screens/list.dart index bce7ca3b..116b543b 100644 --- a/app/lib/features/bangs/presentation/screens/list.dart +++ b/app/lib/features/bangs/presentation/screens/list.dart @@ -60,7 +60,7 @@ class BangListScreen extends HookConsumerWidget { onTap: () { ref .read(selectedBangTriggerProvider().notifier) - .setTrigger(bang.trigger); + .setTrigger(bang.toKey()); final settings = ref.read( generalSettingsWithDefaultsProvider, diff --git a/app/lib/features/bangs/presentation/screens/search.dart b/app/lib/features/bangs/presentation/screens/search.dart index aeff5537..ab7c93da 100644 --- a/app/lib/features/bangs/presentation/screens/search.dart +++ b/app/lib/features/bangs/presentation/screens/search.dart @@ -90,7 +90,7 @@ class BangSearchScreen extends HookConsumerWidget { return BangDetails( bang, onTap: () { - context.pop(bang.trigger); + context.pop(bang.toKey()); }, ); }, diff --git a/app/lib/features/bangs/presentation/widgets/site_search.dart b/app/lib/features/bangs/presentation/widgets/site_search.dart index ad6e8c94..82a4f067 100644 --- a/app/lib/features/bangs/presentation/widgets/site_search.dart +++ b/app/lib/features/bangs/presentation/widgets/site_search.dart @@ -148,7 +148,7 @@ class SiteSearch extends HookConsumerWidget { ref .read(selectedBangTriggerProvider(domain: domain).notifier) - .setTrigger(bang.trigger); + .setTrigger(bang.toKey()); }, onDeleted: (bang) { if (ref.read(selectedBangTriggerProvider(domain: domain)) == diff --git a/app/lib/features/geckoview/domain/providers/tab_state.g.dart b/app/lib/features/geckoview/domain/providers/tab_state.g.dart index a046952d..ce3e8857 100644 --- a/app/lib/features/geckoview/domain/providers/tab_state.g.dart +++ b/app/lib/features/geckoview/domain/providers/tab_state.g.dart @@ -41,7 +41,7 @@ final class TabStatesProvider } } -String _$tabStatesHash() => r'37fbcd50318bb13358e123342b323723641d4f3f'; +String _$tabStatesHash() => r'f3835029261f0e2594c804d0555a0db37171ddab'; abstract class _$TabStates extends $Notifier> { Map build(); diff --git a/app/lib/features/geckoview/features/browser/domain/providers.dart b/app/lib/features/geckoview/features/browser/domain/providers.dart index 8995bbbe..56585a40 100644 --- a/app/lib/features/geckoview/features/browser/domain/providers.dart +++ b/app/lib/features/geckoview/features/browser/domain/providers.dart @@ -23,6 +23,7 @@ import 'package:nullability/nullability.dart'; import 'package:riverpod/riverpod.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:weblibre/features/bangs/data/models/bang_data.dart'; +import 'package:weblibre/features/bangs/data/models/bang_key.dart'; import 'package:weblibre/features/bangs/domain/repositories/data.dart'; import 'package:weblibre/features/geckoview/domain/entities/states/tab.dart'; import 'package:weblibre/features/geckoview/domain/providers/tab_list.dart'; @@ -40,7 +41,7 @@ part 'providers.g.dart'; class SelectedBangTrigger extends _$SelectedBangTrigger { // ignore: document_ignores api decision // ignore: use_setters_to_change_properties - void setTrigger(String trigger) { + void setTrigger(BangKey trigger) { state = trigger; } @@ -49,7 +50,7 @@ class SelectedBangTrigger extends _$SelectedBangTrigger { } @override - String? build({String? domain}) { + BangKey? build({String? domain}) { return null; } } diff --git a/app/lib/features/geckoview/features/browser/domain/providers.g.dart b/app/lib/features/geckoview/features/browser/domain/providers.g.dart index 57540a2d..d5924338 100644 --- a/app/lib/features/geckoview/features/browser/domain/providers.g.dart +++ b/app/lib/features/geckoview/features/browser/domain/providers.g.dart @@ -13,7 +13,7 @@ part of 'providers.dart'; const selectedBangTriggerProvider = SelectedBangTriggerFamily._(); final class SelectedBangTriggerProvider - extends $NotifierProvider { + extends $NotifierProvider { const SelectedBangTriggerProvider._({ required SelectedBangTriggerFamily super.from, required String? super.argument, @@ -40,10 +40,10 @@ final class SelectedBangTriggerProvider SelectedBangTrigger create() => SelectedBangTrigger(); /// {@macro riverpod.override_with_value} - Override overrideWithValue(String? value) { + Override overrideWithValue(BangKey? value) { return $ProviderOverride( origin: this, - providerOverride: $SyncValueProvider(value), + providerOverride: $SyncValueProvider(value), ); } @@ -59,15 +59,15 @@ final class SelectedBangTriggerProvider } String _$selectedBangTriggerHash() => - r'b0e12bc95e93d50d04f1c658230cea9f15ff0385'; + r'162d053d0207b8b98549adc453111111d8ff69d6'; final class SelectedBangTriggerFamily extends $Family with $ClassFamilyOverride< SelectedBangTrigger, - String?, - String?, - String?, + BangKey?, + BangKey?, + BangKey?, String? > { const SelectedBangTriggerFamily._() @@ -86,21 +86,21 @@ final class SelectedBangTriggerFamily extends $Family String toString() => r'selectedBangTriggerProvider'; } -abstract class _$SelectedBangTrigger extends $Notifier { +abstract class _$SelectedBangTrigger extends $Notifier { late final _$args = ref.$arg as String?; String? get domain => _$args; - String? build({String? domain}); + BangKey? build({String? domain}); @$mustCallSuper @override void runBuild() { final created = build(domain: _$args); - final ref = this.ref as $Ref; + final ref = this.ref as $Ref; final element = ref.element as $ClassProviderElement< - AnyNotifier, - String?, + AnyNotifier, + BangKey?, Object?, Object? >; diff --git a/app/lib/features/geckoview/features/search/presentation/widgets/bang_chips.dart b/app/lib/features/geckoview/features/search/presentation/widgets/bang_chips.dart index b120b4de..6f6ddfb5 100644 --- a/app/lib/features/geckoview/features/search/presentation/widgets/bang_chips.dart +++ b/app/lib/features/geckoview/features/search/presentation/widgets/bang_chips.dart @@ -22,6 +22,7 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:nullability/nullability.dart'; import 'package:weblibre/core/routing/routes.dart'; import 'package:weblibre/features/bangs/data/models/bang_data.dart'; +import 'package:weblibre/features/bangs/data/models/bang_key.dart'; import 'package:weblibre/features/bangs/domain/providers/search.dart'; import 'package:weblibre/features/geckoview/features/browser/domain/providers.dart'; import 'package:weblibre/presentation/hooks/listenable_callback.dart'; @@ -121,7 +122,7 @@ class BangChips extends HookConsumerWidget { searchText: (searchText.isEmpty) ? BangSearchRoute.emptySearchText : searchText!, - ).push(context); + ).push(context); if (trigger != null) { ref diff --git a/app/lib/features/geckoview/features/search/presentation/widgets/search_modules/full_search_suggestions.dart b/app/lib/features/geckoview/features/search/presentation/widgets/search_modules/full_search_suggestions.dart index d4917b3c..f071a81f 100644 --- a/app/lib/features/geckoview/features/search/presentation/widgets/search_modules/full_search_suggestions.dart +++ b/app/lib/features/geckoview/features/search/presentation/widgets/search_modules/full_search_suggestions.dart @@ -138,7 +138,7 @@ class FullSearchTermSuggestions extends HookConsumerWidget { ref .read(selectedBangTriggerProvider().notifier) - .setTrigger(bang.trigger); + .setTrigger(bang.toKey()); }, onDeleted: (bang) async { if (ref.read(selectedBangTriggerProvider()) == diff --git a/app/lib/features/onboarding/presentation/pages/default_search.dart b/app/lib/features/onboarding/presentation/pages/default_search.dart index 1e9e03ee..fd380307 100644 --- a/app/lib/features/onboarding/presentation/pages/default_search.dart +++ b/app/lib/features/onboarding/presentation/pages/default_search.dart @@ -22,6 +22,7 @@ import 'package:flutter_material_design_icons/flutter_material_design_icons.dart import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:nullability/nullability.dart'; import 'package:weblibre/core/routing/routes.dart'; +import 'package:weblibre/features/bangs/data/models/bang_key.dart'; import 'package:weblibre/features/bangs/domain/providers/bangs.dart'; import 'package:weblibre/features/search/domain/entities/abstract/i_search_suggestion_provider.dart'; import 'package:weblibre/features/settings/presentation/controllers/save_settings.dart'; @@ -50,12 +51,12 @@ class DefaultSearchPage extends HookConsumerWidget { ), ); - Future updateSearchProvider(String trigger) async { + Future updateSearchProvider(BangKey key) async { await ref .read(saveGeneralSettingsControllerProvider.notifier) .save( (currentSettings) => - currentSettings.copyWith.defaultSearchProvider(trigger), + currentSettings.copyWith.defaultSearchProvider(key), ); } @@ -101,7 +102,7 @@ class DefaultSearchPage extends HookConsumerWidget { selected: activeBang?.trigger == bang.trigger, onSelected: (selected) async { if (selected) { - await updateSearchProvider(bang.trigger); + await updateSearchProvider(bang.toKey()); } }, ), @@ -111,7 +112,7 @@ class DefaultSearchPage extends HookConsumerWidget { avatar: const Icon(Icons.search), onPressed: () async { final trigger = await const BangSearchRoute() - .push(context); + .push(context); if (trigger != null) { await updateSearchProvider(trigger); diff --git a/app/lib/features/search/domain/entities/abstract/i_search_suggestion_provider.dart b/app/lib/features/search/domain/entities/abstract/i_search_suggestion_provider.dart index 5d965534..4ac2e65f 100644 --- a/app/lib/features/search/domain/entities/abstract/i_search_suggestion_provider.dart +++ b/app/lib/features/search/domain/entities/abstract/i_search_suggestion_provider.dart @@ -18,16 +18,18 @@ * along with this program. If not, see . */ import 'package:exceptions/exceptions.dart'; +import 'package:weblibre/features/bangs/data/models/bang_group.dart'; +import 'package:weblibre/features/bangs/data/models/bang_key.dart'; enum SearchSuggestionProviders { none('Disabled', null), - brave('Brave', 'brave'), - ddg('DuckDuckGo', 'ddg'), - kagi('Kagi', 'kagi'), - qwant('Qwant', 'qwant'); + brave('Brave', BangKey(group: BangGroup.general, trigger: 'brave')), + ddg('DuckDuckGo', BangKey(group: BangGroup.general, trigger: 'ddg')), + kagi('Kagi', BangKey(group: BangGroup.kagi, trigger: 'kagi')), + qwant('Qwant', BangKey(group: BangGroup.general, trigger: 'qwant')); final String label; - final String? relatedBang; + final BangKey? relatedBang; const SearchSuggestionProviders(this.label, this.relatedBang); } diff --git a/app/lib/features/settings/presentation/widgets/bang_icon.dart b/app/lib/features/settings/presentation/widgets/bang_icon.dart index 8693adf7..647f7ea5 100644 --- a/app/lib/features/settings/presentation/widgets/bang_icon.dart +++ b/app/lib/features/settings/presentation/widgets/bang_icon.dart @@ -19,11 +19,12 @@ */ import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:weblibre/features/bangs/data/models/bang_key.dart'; import 'package:weblibre/features/bangs/domain/providers/bangs.dart'; import 'package:weblibre/presentation/widgets/url_icon.dart'; class BangIcon extends ConsumerWidget { - final String trigger; + final BangKey trigger; final double iconSize; const BangIcon({super.key, required this.trigger, this.iconSize = 20}); diff --git a/app/lib/features/settings/presentation/widgets/default_search_selector.dart b/app/lib/features/settings/presentation/widgets/default_search_selector.dart index 219582c1..9bfda748 100644 --- a/app/lib/features/settings/presentation/widgets/default_search_selector.dart +++ b/app/lib/features/settings/presentation/widgets/default_search_selector.dart @@ -20,6 +20,7 @@ import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:weblibre/core/routing/routes.dart'; +import 'package:weblibre/features/bangs/data/models/bang_key.dart'; import 'package:weblibre/features/bangs/domain/providers/bangs.dart'; import 'package:weblibre/features/settings/presentation/controllers/save_settings.dart'; import 'package:weblibre/features/user/data/models/general_settings.dart'; @@ -36,12 +37,12 @@ class DefaultSearchSelector extends HookConsumerWidget { ); final availableBangs = ref.watch(frequentBangListProvider); - Future updateSearchProvider(String trigger) async { + Future updateSearchProvider(BangKey key) async { await ref .read(saveGeneralSettingsControllerProvider.notifier) .save( (currentSettings) => - currentSettings.copyWith.defaultSearchProvider(trigger), + currentSettings.copyWith.defaultSearchProvider(key), ); } @@ -62,13 +63,13 @@ class DefaultSearchSelector extends HookConsumerWidget { availableItems: availableBangs, selectedItem: activeBang, onSelected: (bang) async { - await updateSearchProvider(bang.trigger); + await updateSearchProvider(bang.toKey()); }, ), ), IconButton( onPressed: () async { - final trigger = await const BangSearchRoute().push( + final trigger = await const BangSearchRoute().push( context, ); diff --git a/app/lib/features/user/data/models/general_settings.dart b/app/lib/features/user/data/models/general_settings.dart index 5e0fa23f..0cac201c 100644 --- a/app/lib/features/user/data/models/general_settings.dart +++ b/app/lib/features/user/data/models/general_settings.dart @@ -22,11 +22,16 @@ import 'package:fast_equatable/fast_equatable.dart'; import 'package:flutter/material.dart'; import 'package:json_annotation/json_annotation.dart'; import 'package:weblibre/core/routing/routes.dart'; +import 'package:weblibre/features/bangs/data/models/bang_group.dart'; +import 'package:weblibre/features/bangs/data/models/bang_key.dart'; import 'package:weblibre/features/search/domain/entities/abstract/i_search_suggestion_provider.dart'; part 'general_settings.g.dart'; -const _fallbackSearchProvider = 'wikipedia'; +final _fallbackSearchProvider = BangKey( + group: BangGroup.general, + trigger: 'wikipedia', +); const _fallbackAutocompleteProvider = SearchSuggestionProviders.none; enum TabBarSwipeAction { switchLastOpened, navigateOrderedTabs } @@ -54,7 +59,8 @@ class GeneralSettings with FastEquatable { final bool enableReadability; final bool enforceReadability; final Set? deleteBrowsingDataOnQuit; - final String defaultSearchProvider; + @BangKeyConverter() + final BangKey? defaultSearchProvider; final SearchSuggestionProviders defaultSearchSuggestionsProvider; final bool createChildTabsOption; final bool showExtensionShortcut; @@ -87,7 +93,7 @@ class GeneralSettings with FastEquatable { bool? enableReadability, bool? enforceReadability, this.deleteBrowsingDataOnQuit, - String? defaultSearchProvider, + BangKey? defaultSearchProvider, SearchSuggestionProviders? defaultSearchSuggestionsProvider, bool? createChildTabsOption, bool? showExtensionShortcut, diff --git a/app/lib/features/user/data/models/general_settings.g.dart b/app/lib/features/user/data/models/general_settings.g.dart index 54e93c42..e86f295b 100644 --- a/app/lib/features/user/data/models/general_settings.g.dart +++ b/app/lib/features/user/data/models/general_settings.g.dart @@ -17,7 +17,7 @@ abstract class _$GeneralSettingsCWProxy { Set? deleteBrowsingDataOnQuit, ); - GeneralSettings defaultSearchProvider(String defaultSearchProvider); + GeneralSettings defaultSearchProvider(BangKey? defaultSearchProvider); GeneralSettings defaultSearchSuggestionsProvider( SearchSuggestionProviders defaultSearchSuggestionsProvider, @@ -53,7 +53,7 @@ abstract class _$GeneralSettingsCWProxy { bool enableReadability, bool enforceReadability, Set? deleteBrowsingDataOnQuit, - String defaultSearchProvider, + BangKey? defaultSearchProvider, SearchSuggestionProviders defaultSearchSuggestionsProvider, bool createChildTabsOption, bool showExtensionShortcut, @@ -90,7 +90,7 @@ class _$GeneralSettingsCWProxyImpl implements _$GeneralSettingsCWProxy { ) => call(deleteBrowsingDataOnQuit: deleteBrowsingDataOnQuit); @override - GeneralSettings defaultSearchProvider(String defaultSearchProvider) => + GeneralSettings defaultSearchProvider(BangKey? defaultSearchProvider) => call(defaultSearchProvider: defaultSearchProvider); @override @@ -178,11 +178,10 @@ class _$GeneralSettingsCWProxyImpl implements _$GeneralSettingsCWProxy { // ignore: cast_nullable_to_non_nullable : deleteBrowsingDataOnQuit as Set?, defaultSearchProvider: - defaultSearchProvider == const $CopyWithPlaceholder() || - defaultSearchProvider == null + defaultSearchProvider == const $CopyWithPlaceholder() ? _value.defaultSearchProvider // ignore: cast_nullable_to_non_nullable - : defaultSearchProvider as String, + : defaultSearchProvider as BangKey?, defaultSearchSuggestionsProvider: defaultSearchSuggestionsProvider == const $CopyWithPlaceholder() || defaultSearchSuggestionsProvider == null @@ -261,7 +260,9 @@ GeneralSettings _$GeneralSettingsFromJson(Map json) => (json['deleteBrowsingDataOnQuit'] as List?) ?.map((e) => $enumDecode(_$DeleteBrowsingDataTypeEnumMap, e)) .toSet(), - defaultSearchProvider: json['defaultSearchProvider'] as String?, + defaultSearchProvider: const BangKeyConverter().fromJson( + json['defaultSearchProvider'] as String?, + ), defaultSearchSuggestionsProvider: $enumDecodeNullable( _$SearchSuggestionProvidersEnumMap, json['defaultSearchSuggestionsProvider'], @@ -298,7 +299,9 @@ Map _$GeneralSettingsToJson( 'deleteBrowsingDataOnQuit': instance.deleteBrowsingDataOnQuit ?.map((e) => _$DeleteBrowsingDataTypeEnumMap[e]!) .toList(), - 'defaultSearchProvider': instance.defaultSearchProvider, + 'defaultSearchProvider': const BangKeyConverter().toJson( + instance.defaultSearchProvider, + ), 'defaultSearchSuggestionsProvider': _$SearchSuggestionProvidersEnumMap[instance .defaultSearchSuggestionsProvider]!,