lib/search/radical_search: implement
This commit is contained in:
@@ -1,3 +0,0 @@
|
||||
class RadicalsSearchResult {
|
||||
// TODO: implement me
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
60
lib/search/radical_search.dart
Normal file
60
lib/search/radical_search.dart
Normal 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;
|
||||
}
|
||||
Reference in New Issue
Block a user