search/radicals: deduplicate input radicals before search

This commit is contained in:
2026-02-24 15:08:19 +09:00
parent 48f50628a1
commit f57cc68ef3
+8 -4
View File
@@ -7,6 +7,8 @@ Future<List<String>> searchRemainingRadicalsWithDbConnection(
DatabaseExecutor connection, DatabaseExecutor connection,
List<String> radicals, List<String> radicals,
) async { ) async {
final distinctRadicals = radicals.toSet();
final queryResult = await connection.rawQuery( final queryResult = await connection.rawQuery(
''' '''
SELECT DISTINCT "radical" SELECT DISTINCT "radical"
@@ -14,12 +16,12 @@ Future<List<String>> searchRemainingRadicalsWithDbConnection(
WHERE "kanji" IN ( WHERE "kanji" IN (
SELECT "kanji" SELECT "kanji"
FROM "${RADKFILETableNames.radkfile}" FROM "${RADKFILETableNames.radkfile}"
WHERE "radical" IN (${List.filled(radicals.length, '?').join(',')}) WHERE "radical" IN (${List.filled(distinctRadicals.length, '?').join(',')})
GROUP BY "kanji" GROUP BY "kanji"
HAVING COUNT(DISTINCT "radical") = ? HAVING COUNT(DISTINCT "radical") = ?
) )
''', ''',
[...radicals, radicals.length], [...distinctRadicals, distinctRadicals.length],
); );
final remainingRadicals = queryResult final remainingRadicals = queryResult
@@ -33,15 +35,17 @@ Future<List<String>> searchKanjiByRadicalsWithDbConnection(
DatabaseExecutor connection, DatabaseExecutor connection,
List<String> radicals, List<String> radicals,
) async { ) async {
final distinctRadicals = radicals.toSet();
final queryResult = await connection.rawQuery( final queryResult = await connection.rawQuery(
''' '''
SELECT "kanji" SELECT "kanji"
FROM "${RADKFILETableNames.radkfile}" FROM "${RADKFILETableNames.radkfile}"
WHERE "radical" IN (${List.filled(radicals.length, '?').join(',')}) WHERE "radical" IN (${List.filled(distinctRadicals.length, '?').join(',')})
GROUP BY "kanji" GROUP BY "kanji"
HAVING COUNT(DISTINCT "radical") = ? HAVING COUNT(DISTINCT "radical") = ?
''', ''',
[...radicals, radicals.length], [...distinctRadicals, distinctRadicals.length],
); );
final kanji = queryResult.map((row) => row['kanji'] as String).toList(); final kanji = queryResult.map((row) => row['kanji'] as String).toList();