lib/search/radical_search: implement

This commit is contained in:
2025-05-19 16:40:35 +02:00
parent e0ffd89ff4
commit 501d3a089e
3 changed files with 67 additions and 10 deletions

View File

@@ -1,3 +0,0 @@
class RadicalsSearchResult {
// TODO: implement me
}

View File

@@ -1,6 +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/models/radkfile/radicals_search_result.dart';
import 'package:jadb/search/radical_search.dart';
import 'package:jadb/search/word_search/word_search.dart';
import 'package:jadb/search/kanji_search.dart';
@@ -15,15 +15,15 @@ class JaDBConnection {
Future<KanjiSearchResult?> searchKanji(String kanji) =>
searchKanjiWithDbConnection(this._connection, kanji);
Future<RadicalsSearchResult> searchKanjiByRadicals(
List<String> radicals,
) async {
throw UnimplementedError();
}
Future<List<WordSearchResult>?> searchWord(String word) =>
searchWordWithDbConnection(this._connection, word);
Future<int?> searchWordCount(String word) =>
searchWordCountWithDbConnection(this._connection, word);
Future<List<String>> searchRemainingRadicals(List<String> radicals) =>
searchRemainingRadicalsWithDbConnection(this._connection, radicals);
Future<List<String>> searchKanjiByRadicals(List<String> radicals) =>
searchKanjiByRadicalsWithDbConnection(this._connection, radicals);
}

View File

@@ -0,0 +1,60 @@
import 'package:sqflite_common/sqlite_api.dart';
// TODO: validate that the list of radicals all are valid radicals
/// Given a list of radicals, search which kanji contains all
/// of the radicals, find their other radicals, and return those.
/// This is used to figure out which remaining combinations of radicals
/// the user can search for without getting zero results.
Future<List<String>> searchRemainingRadicalsWithDbConnection(
DatabaseExecutor connection,
List<String> radicals,
) async {
final queryResult = await connection.rawQuery(
'''
SELECT DISTINCT radical
FROM RADKFILE
WHERE kanji IN (
SELECT kanji
FROM RADKFILE
WHERE radical IN (${List.filled(radicals.length, '?').join(',')})
GROUP BY kanji
HAVING COUNT(DISTINCT radical) = ?
)
''',
[
...radicals,
radicals.length,
],
);
final remainingRadicals =
queryResult.map((row) => row['radical'] as String).toList();
return remainingRadicals;
}
/// Given a list of radicals, search which kanji contains all
/// of the radicals, and return those.
Future<List<String>> searchKanjiByRadicalsWithDbConnection(
DatabaseExecutor connection,
List<String> radicals,
) async {
final queryResult = await connection.rawQuery(
'''
SELECT kanji
FROM RADKFILE
WHERE radical IN (${List.filled(radicals.length, '?').join(',')})
GROUP BY kanji
HAVING COUNT(DISTINCT radical) = ?
''',
[
...radicals,
radicals.length,
],
);
final kanji = queryResult.map((row) => row['kanji'] as String).toList();
return kanji;
}