kanjidic: split grade/freq/jlpt into separate tables
All checks were successful
Build and test / build (push) Successful in 8m1s

This commit is contained in:
2026-04-09 14:10:51 +09:00
parent a222b2d9b8
commit d1a6f39cca
5 changed files with 57 additions and 7 deletions

View File

@@ -248,9 +248,6 @@ class Character extends SQLWritable {
@override
Map<String, Object?> get sqlValue => {
'literal': literal,
'grade': grade,
'strokeCount': strokeCount,
'frequency': frequency,
'jlpt': jlpt,
};
}

View File

@@ -15,6 +15,27 @@ Future<void> seedKANJIDICData(List<Character> characters, Database db) async {
// }
b.insert(KANJIDICTableNames.character, c.sqlValue);
if (c.grade != null) {
b.insert(KANJIDICTableNames.grade, {
'kanji': c.literal,
'grade': c.grade!,
});
}
if (c.frequency != null) {
b.insert(KANJIDICTableNames.frequency, {
'kanji': c.literal,
'frequency': c.frequency!,
});
}
if (c.jlpt != null) {
b.insert(KANJIDICTableNames.jlpt, {
'kanji': c.literal,
'jlpt': c.jlpt!,
});
}
for (final n in c.radicalName) {
assert(c.radical != null, 'Radical name without radical');
b.insert(

View File

@@ -8,10 +8,21 @@ import 'package:sqflite_common/sqflite.dart';
Future<List<Map<String, Object?>>> _charactersQuery(
DatabaseExecutor connection,
String kanji,
) => connection.query(
KANJIDICTableNames.character,
where: 'literal = ?',
whereArgs: [kanji],
) => connection.rawQuery(
'''
SELECT
"${KANJIDICTableNames.character}"."literal",
"${KANJIDICTableNames.character}"."strokeCount",
"${KANJIDICTableNames.grade}"."grade",
"${KANJIDICTableNames.jlpt}"."jlpt",
"${KANJIDICTableNames.frequency}"."frequency"
FROM "${KANJIDICTableNames.character}"
LEFT JOIN "${KANJIDICTableNames.grade}" ON "${KANJIDICTableNames.character}"."literal" = "${KANJIDICTableNames.grade}"."kanji"
LEFT JOIN "${KANJIDICTableNames.jlpt}" ON "${KANJIDICTableNames.character}"."literal" = "${KANJIDICTableNames.jlpt}"."kanji"
LEFT JOIN "${KANJIDICTableNames.frequency}" ON "${KANJIDICTableNames.character}"."literal" = "${KANJIDICTableNames.frequency}"."kanji"
WHERE "literal" = ?
''',
[kanji],
);
Future<List<Map<String, Object?>>> _codepointsQuery(

View File

@@ -1,6 +1,9 @@
abstract class KANJIDICTableNames {
static const String version = 'KANJIDIC_Version';
static const String character = 'KANJIDIC_Character';
static const String grade = 'KANJIDIC_Grade';
static const String frequency = 'KANJIDIC_Frequency';
static const String jlpt = 'KANJIDIC_JLPT';
static const String radicalName = 'KANJIDIC_RadicalName';
static const String codepoint = 'KANJIDIC_Codepoint';
static const String radical = 'KANJIDIC_Radical';
@@ -20,6 +23,9 @@ abstract class KANJIDICTableNames {
static Set<String> get allTables => {
version,
character,
grade,
frequency,
jlpt,
radicalName,
codepoint,
radical,

View File

@@ -19,6 +19,21 @@ CREATE TABLE "KANJIDIC_Character" (
"jlpt" INTEGER
) WITHOUT ROWID;
CREATE TABLE "KANJIDIC_Grade" (
"kanji" CHAR(1) NOT NULL PRIMARY KEY REFERENCES "KANJIDIC_Character"("literal"),
"grade" INTEGER NOT NULL CHECK ("grade" BETWEEN 1 AND 10)
) WITHOUT ROWID;
CREATE TABLE "KANJIDIC_Frequency" (
"kanji" CHAR(1) NOT NULL PRIMARY KEY REFERENCES "KANJIDIC_Character"("literal"),
"frequency" INTEGER NOT NULL
) WITHOUT ROWID;
CREATE TABLE "KANJIDIC_JLPT" (
"kanji" CHAR(1) NOT NULL PRIMARY KEY REFERENCES "KANJIDIC_Character"("literal"),
"jlpt" INTEGER NOT NULL CHECK ("jlpt" BETWEEN 1 AND 5)
) WITHOUT ROWID;
CREATE TABLE "KANJIDIC_Codepoint" (
"kanji" CHAR(1) NOT NULL REFERENCES "KANJIDIC_Character"("literal"),
"type" VARCHAR(6) NOT NULL CHECK ("type" IN ('jis208', 'jis212', 'jis213', 'ucs')),