diff --git a/lib/search.dart b/lib/search.dart index e2800f3..c312166 100644 --- a/lib/search.dart +++ b/lib/search.dart @@ -1,5 +1,6 @@ import 'package:jadb/models/word_search/word_search_result.dart'; import 'package:jadb/models/kanji_search/kanji_search_result.dart'; +import 'package:jadb/search/filter_kanji.dart'; import 'package:jadb/search/radical_search.dart'; import 'package:jadb/search/word_search/word_search.dart'; @@ -16,6 +17,13 @@ class JaDBConnection { Future searchKanji(String kanji) => searchKanjiWithDbConnection(this._connection, kanji); + /// Filter a list of characters, and return the ones that are listed in the kanji dictionary. + Future> filterKanji( + List kanji, { + bool deduplicate = false, + }) => + filterKanjiWithDbConnection(this._connection, kanji, deduplicate); + /// Search for a word in the database. Future?> searchWord( String word, { diff --git a/lib/search/filter_kanji.dart b/lib/search/filter_kanji.dart new file mode 100644 index 0000000..e06e6c9 --- /dev/null +++ b/lib/search/filter_kanji.dart @@ -0,0 +1,23 @@ +import 'package:jadb/_data_ingestion/kanjidic/table_names.dart'; +import 'package:sqflite_common/sqflite.dart'; + +Future> filterKanjiWithDbConnection( + DatabaseExecutor connection, + List kanji, + bool deduplicate, +) async { + final Set filteredKanji = await connection.rawQuery( + ''' + SELECT "literal" + FROM "${KANJIDICTableNames.character}" + WHERE "literal" IN (${kanji.map((_) => '?').join(',')}) + ''', + kanji, + ).then((value) => value.map((e) => e['literal'] as String).toSet()); + + if (deduplicate) { + return filteredKanji.toList(); + } else { + return kanji.where((k) => !filteredKanji.contains(k)).toList(); + } +}