From 419e038517c36056c314d8d71950b7202f2c928b Mon Sep 17 00:00:00 2001 From: Hampus Hammarlund Date: Tue, 3 Feb 2026 21:56:21 +0900 Subject: [PATCH 1/2] feat: add ability to add several items to a dictionary list at a time --- lib/src/dao/my_dictionary_lists_dao.dart | 27 ++++++++++++ test/dao/my_dictionary_lists_dao_test.dart | 48 +++++++++++++++++++++- 2 files changed, 74 insertions(+), 1 deletion(-) diff --git a/lib/src/dao/my_dictionary_lists_dao.dart b/lib/src/dao/my_dictionary_lists_dao.dart index 8f1352f..8dacec7 100644 --- a/lib/src/dao/my_dictionary_lists_dao.dart +++ b/lib/src/dao/my_dictionary_lists_dao.dart @@ -111,6 +111,33 @@ class MyDictionaryListsDao extends DatabaseAccessor }); } + Future addDictionaryItems( + MyDictionaryList dictionaryList, + List dictionaryItems, + ) async { + final items = dictionaryItems.map((item) { + final vocabId = item is Vocab ? item.id : 0; + final kanjiId = item is Kanji ? item.id : 0; + return MyDictionaryListItemsCompanion( + listId: Value(dictionaryList.id), + vocabId: Value(vocabId), + kanjiId: Value(kanjiId), + ); + }).toList(); + + await transaction(() async { + for (final item in items) { + await db + .into(db.myDictionaryListItems) + .insert(item, mode: InsertMode.insertOrIgnore); + } + + await (db.update(db.myDictionaryLists) + ..where((list) => list.id.equals(dictionaryList.id))) + .write(MyDictionaryListsCompanion(timestamp: Value(DateTime.now()))); + }); + } + Future removeDictionaryItem( MyDictionaryList dictionaryList, DictionaryItem dictionaryItem, diff --git a/test/dao/my_dictionary_lists_dao_test.dart b/test/dao/my_dictionary_lists_dao_test.dart index 2465dee..5cf0642 100644 --- a/test/dao/my_dictionary_lists_dao_test.dart +++ b/test/dao/my_dictionary_lists_dao_test.dart @@ -167,7 +167,7 @@ void main() { expect(newFlashcardSets[0].myDictionaryLists.length, 0); }); - test('Dictionary items', () async { + test('Dictionary item operations', () async { final dictionaryList1 = await database.myDictionaryListsDao.create('list1'); final dictionaryList2 = @@ -241,6 +241,52 @@ void main() { expect(list2Items.kanjiIds.length, 0); }); + test('addDictionaryItems', () async { + final dictionaryList = await database.myDictionaryListsDao.create('list'); + + // Get empty items + final emptyList1Items = await database.myDictionaryListsDao + .getDictionaryListItems(dictionaryList); + expect(emptyList1Items.vocabIds.length, 0); + expect(emptyList1Items.kanjiIds.length, 0); + + // Add items to dictionary list + await database.myDictionaryListsDao.addDictionaryItem( + dictionaryList, + await database.vocabsDao.get(1000220), + ); + await database.myDictionaryListsDao.addDictionaryItem( + dictionaryList, + await database.vocabsDao.get(1003430), + ); + + // Get newly added to list + var listItems = await database.myDictionaryListsDao + .getDictionaryListItems(dictionaryList); + expect(listItems.vocabIds.length, 2); + expect(listItems.vocabIds[0], 1003430); + expect(listItems.vocabIds[1], 1000220); + + // Add several items at once + await database.myDictionaryListsDao.addDictionaryItems( + dictionaryList, + [ + await database.vocabsDao.get(1000160), + await database.vocabsDao.get(1003430), + await database.vocabsDao.get(1001390), + ], + ); + + // Check new contents + listItems = await database.myDictionaryListsDao + .getDictionaryListItems(dictionaryList); + expect(listItems.vocabIds.length, 4); + expect(listItems.vocabIds[0], 1001390); + expect(listItems.vocabIds[1], 1000160); + expect(listItems.vocabIds[2], 1003430); + expect(listItems.vocabIds[3], 1000220); + }); + test('getContainingDictionaryItem', () async { final dictionaryList1 = await database.myDictionaryListsDao.create('list1'); From 7d5043d11c5c4eea214968cc587acce77e655375 Mon Sep 17 00:00:00 2001 From: Hampus Hammarlund Date: Wed, 4 Feb 2026 21:44:41 +0900 Subject: [PATCH 2/2] update generated files --- lib/src/dao/dictionary_infos_dao.g.dart | 9 +++++++++ lib/src/dao/flashcard_sets_dao.g.dart | 11 +++++++++++ lib/src/dao/kanjis_dao.g.dart | 13 +++++++++++++ lib/src/dao/my_dictionary_lists_dao.g.dart | 12 ++++++++++++ .../dao/predefined_dictionary_lists_dao.g.dart | 10 ++++++++++ lib/src/dao/proper_nouns_dao.g.dart | 8 ++++++++ lib/src/dao/radicals_dao.g.dart | 8 ++++++++ lib/src/dao/search_history_items_dao.g.dart | 10 ++++++++++ lib/src/dao/spaced_repetition_datas_dao.g.dart | 10 ++++++++++ .../dao/text_analysis_history_items_dao.g.dart | 10 ++++++++++ lib/src/dao/vocabs_dao.g.dart | 15 +++++++++++++++ 11 files changed, 116 insertions(+) diff --git a/lib/src/dao/dictionary_infos_dao.g.dart b/lib/src/dao/dictionary_infos_dao.g.dart index ad76bb2..3087d71 100644 --- a/lib/src/dao/dictionary_infos_dao.g.dart +++ b/lib/src/dao/dictionary_infos_dao.g.dart @@ -5,4 +5,13 @@ part of 'dictionary_infos_dao.dart'; // ignore_for_file: type=lint mixin _$DictionaryInfosDaoMixin on DatabaseAccessor { $DictionaryInfosTable get dictionaryInfos => attachedDatabase.dictionaryInfos; + DictionaryInfosDaoManager get managers => DictionaryInfosDaoManager(this); +} + +class DictionaryInfosDaoManager { + final _$DictionaryInfosDaoMixin _db; + DictionaryInfosDaoManager(this._db); + $$DictionaryInfosTableTableManager get dictionaryInfos => + $$DictionaryInfosTableTableManager( + _db.attachedDatabase, _db.dictionaryInfos); } diff --git a/lib/src/dao/flashcard_sets_dao.g.dart b/lib/src/dao/flashcard_sets_dao.g.dart index 7500af6..a3f6be2 100644 --- a/lib/src/dao/flashcard_sets_dao.g.dart +++ b/lib/src/dao/flashcard_sets_dao.g.dart @@ -7,4 +7,15 @@ mixin _$FlashcardSetsDaoMixin on DatabaseAccessor { $FlashcardSetsTable get flashcardSets => attachedDatabase.flashcardSets; $FlashcardSetReportsTable get flashcardSetReports => attachedDatabase.flashcardSetReports; + FlashcardSetsDaoManager get managers => FlashcardSetsDaoManager(this); +} + +class FlashcardSetsDaoManager { + final _$FlashcardSetsDaoMixin _db; + FlashcardSetsDaoManager(this._db); + $$FlashcardSetsTableTableManager get flashcardSets => + $$FlashcardSetsTableTableManager(_db.attachedDatabase, _db.flashcardSets); + $$FlashcardSetReportsTableTableManager get flashcardSetReports => + $$FlashcardSetReportsTableTableManager( + _db.attachedDatabase, _db.flashcardSetReports); } diff --git a/lib/src/dao/kanjis_dao.g.dart b/lib/src/dao/kanjis_dao.g.dart index ab15778..9d973f9 100644 --- a/lib/src/dao/kanjis_dao.g.dart +++ b/lib/src/dao/kanjis_dao.g.dart @@ -8,4 +8,17 @@ mixin _$KanjisDaoMixin on DatabaseAccessor { $KanjiReadingsTable get kanjiReadings => attachedDatabase.kanjiReadings; $SpacedRepetitionDatasTable get spacedRepetitionDatas => attachedDatabase.spacedRepetitionDatas; + KanjisDaoManager get managers => KanjisDaoManager(this); +} + +class KanjisDaoManager { + final _$KanjisDaoMixin _db; + KanjisDaoManager(this._db); + $$KanjisTableTableManager get kanjis => + $$KanjisTableTableManager(_db.attachedDatabase, _db.kanjis); + $$KanjiReadingsTableTableManager get kanjiReadings => + $$KanjiReadingsTableTableManager(_db.attachedDatabase, _db.kanjiReadings); + $$SpacedRepetitionDatasTableTableManager get spacedRepetitionDatas => + $$SpacedRepetitionDatasTableTableManager( + _db.attachedDatabase, _db.spacedRepetitionDatas); } diff --git a/lib/src/dao/my_dictionary_lists_dao.g.dart b/lib/src/dao/my_dictionary_lists_dao.g.dart index 6837942..b9ebd92 100644 --- a/lib/src/dao/my_dictionary_lists_dao.g.dart +++ b/lib/src/dao/my_dictionary_lists_dao.g.dart @@ -8,4 +8,16 @@ mixin _$MyDictionaryListsDaoMixin on DatabaseAccessor { attachedDatabase.myDictionaryLists; $MyDictionaryListItemsTable get myDictionaryListItems => attachedDatabase.myDictionaryListItems; + MyDictionaryListsDaoManager get managers => MyDictionaryListsDaoManager(this); +} + +class MyDictionaryListsDaoManager { + final _$MyDictionaryListsDaoMixin _db; + MyDictionaryListsDaoManager(this._db); + $$MyDictionaryListsTableTableManager get myDictionaryLists => + $$MyDictionaryListsTableTableManager( + _db.attachedDatabase, _db.myDictionaryLists); + $$MyDictionaryListItemsTableTableManager get myDictionaryListItems => + $$MyDictionaryListItemsTableTableManager( + _db.attachedDatabase, _db.myDictionaryListItems); } diff --git a/lib/src/dao/predefined_dictionary_lists_dao.g.dart b/lib/src/dao/predefined_dictionary_lists_dao.g.dart index eb3c1bf..e13d0a8 100644 --- a/lib/src/dao/predefined_dictionary_lists_dao.g.dart +++ b/lib/src/dao/predefined_dictionary_lists_dao.g.dart @@ -6,4 +6,14 @@ part of 'predefined_dictionary_lists_dao.dart'; mixin _$PredefinedDictionaryListsDaoMixin on DatabaseAccessor { $PredefinedDictionaryListsTable get predefinedDictionaryLists => attachedDatabase.predefinedDictionaryLists; + PredefinedDictionaryListsDaoManager get managers => + PredefinedDictionaryListsDaoManager(this); +} + +class PredefinedDictionaryListsDaoManager { + final _$PredefinedDictionaryListsDaoMixin _db; + PredefinedDictionaryListsDaoManager(this._db); + $$PredefinedDictionaryListsTableTableManager get predefinedDictionaryLists => + $$PredefinedDictionaryListsTableTableManager( + _db.attachedDatabase, _db.predefinedDictionaryLists); } diff --git a/lib/src/dao/proper_nouns_dao.g.dart b/lib/src/dao/proper_nouns_dao.g.dart index 518ed47..0f47e2f 100644 --- a/lib/src/dao/proper_nouns_dao.g.dart +++ b/lib/src/dao/proper_nouns_dao.g.dart @@ -5,4 +5,12 @@ part of 'proper_nouns_dao.dart'; // ignore_for_file: type=lint mixin _$ProperNounsDaoMixin on DatabaseAccessor { $ProperNounsTable get properNouns => attachedDatabase.properNouns; + ProperNounsDaoManager get managers => ProperNounsDaoManager(this); +} + +class ProperNounsDaoManager { + final _$ProperNounsDaoMixin _db; + ProperNounsDaoManager(this._db); + $$ProperNounsTableTableManager get properNouns => + $$ProperNounsTableTableManager(_db.attachedDatabase, _db.properNouns); } diff --git a/lib/src/dao/radicals_dao.g.dart b/lib/src/dao/radicals_dao.g.dart index 199bb77..141e0db 100644 --- a/lib/src/dao/radicals_dao.g.dart +++ b/lib/src/dao/radicals_dao.g.dart @@ -5,4 +5,12 @@ part of 'radicals_dao.dart'; // ignore_for_file: type=lint mixin _$RadicalsDaoMixin on DatabaseAccessor { $RadicalsTable get radicals => attachedDatabase.radicals; + RadicalsDaoManager get managers => RadicalsDaoManager(this); +} + +class RadicalsDaoManager { + final _$RadicalsDaoMixin _db; + RadicalsDaoManager(this._db); + $$RadicalsTableTableManager get radicals => + $$RadicalsTableTableManager(_db.attachedDatabase, _db.radicals); } diff --git a/lib/src/dao/search_history_items_dao.g.dart b/lib/src/dao/search_history_items_dao.g.dart index b4770fd..c729eeb 100644 --- a/lib/src/dao/search_history_items_dao.g.dart +++ b/lib/src/dao/search_history_items_dao.g.dart @@ -6,4 +6,14 @@ part of 'search_history_items_dao.dart'; mixin _$SearchHistoryItemsDaoMixin on DatabaseAccessor { $SearchHistoryItemsTable get searchHistoryItems => attachedDatabase.searchHistoryItems; + SearchHistoryItemsDaoManager get managers => + SearchHistoryItemsDaoManager(this); +} + +class SearchHistoryItemsDaoManager { + final _$SearchHistoryItemsDaoMixin _db; + SearchHistoryItemsDaoManager(this._db); + $$SearchHistoryItemsTableTableManager get searchHistoryItems => + $$SearchHistoryItemsTableTableManager( + _db.attachedDatabase, _db.searchHistoryItems); } diff --git a/lib/src/dao/spaced_repetition_datas_dao.g.dart b/lib/src/dao/spaced_repetition_datas_dao.g.dart index f6334ae..6f50892 100644 --- a/lib/src/dao/spaced_repetition_datas_dao.g.dart +++ b/lib/src/dao/spaced_repetition_datas_dao.g.dart @@ -6,4 +6,14 @@ part of 'spaced_repetition_datas_dao.dart'; mixin _$SpacedRepetitionDatasDaoMixin on DatabaseAccessor { $SpacedRepetitionDatasTable get spacedRepetitionDatas => attachedDatabase.spacedRepetitionDatas; + SpacedRepetitionDatasDaoManager get managers => + SpacedRepetitionDatasDaoManager(this); +} + +class SpacedRepetitionDatasDaoManager { + final _$SpacedRepetitionDatasDaoMixin _db; + SpacedRepetitionDatasDaoManager(this._db); + $$SpacedRepetitionDatasTableTableManager get spacedRepetitionDatas => + $$SpacedRepetitionDatasTableTableManager( + _db.attachedDatabase, _db.spacedRepetitionDatas); } diff --git a/lib/src/dao/text_analysis_history_items_dao.g.dart b/lib/src/dao/text_analysis_history_items_dao.g.dart index f7747f9..85b25ff 100644 --- a/lib/src/dao/text_analysis_history_items_dao.g.dart +++ b/lib/src/dao/text_analysis_history_items_dao.g.dart @@ -6,4 +6,14 @@ part of 'text_analysis_history_items_dao.dart'; mixin _$TextAnalysisHistoryItemsDaoMixin on DatabaseAccessor { $TextAnalysisHistoryItemsTable get textAnalysisHistoryItems => attachedDatabase.textAnalysisHistoryItems; + TextAnalysisHistoryItemsDaoManager get managers => + TextAnalysisHistoryItemsDaoManager(this); +} + +class TextAnalysisHistoryItemsDaoManager { + final _$TextAnalysisHistoryItemsDaoMixin _db; + TextAnalysisHistoryItemsDaoManager(this._db); + $$TextAnalysisHistoryItemsTableTableManager get textAnalysisHistoryItems => + $$TextAnalysisHistoryItemsTableTableManager( + _db.attachedDatabase, _db.textAnalysisHistoryItems); } diff --git a/lib/src/dao/vocabs_dao.g.dart b/lib/src/dao/vocabs_dao.g.dart index 8d02d69..b360a24 100644 --- a/lib/src/dao/vocabs_dao.g.dart +++ b/lib/src/dao/vocabs_dao.g.dart @@ -9,4 +9,19 @@ mixin _$VocabsDaoMixin on DatabaseAccessor { $VocabReadingsTable get vocabReadings => attachedDatabase.vocabReadings; $VocabDefinitionsTable get vocabDefinitions => attachedDatabase.vocabDefinitions; + VocabsDaoManager get managers => VocabsDaoManager(this); +} + +class VocabsDaoManager { + final _$VocabsDaoMixin _db; + VocabsDaoManager(this._db); + $$VocabsTableTableManager get vocabs => + $$VocabsTableTableManager(_db.attachedDatabase, _db.vocabs); + $$VocabWritingsTableTableManager get vocabWritings => + $$VocabWritingsTableTableManager(_db.attachedDatabase, _db.vocabWritings); + $$VocabReadingsTableTableManager get vocabReadings => + $$VocabReadingsTableTableManager(_db.attachedDatabase, _db.vocabReadings); + $$VocabDefinitionsTableTableManager get vocabDefinitions => + $$VocabDefinitionsTableTableManager( + _db.attachedDatabase, _db.vocabDefinitions); }