From 2c6894aa82f2cb945aeba1571d7ea59e1d845b4d Mon Sep 17 00:00:00 2001 From: h7x4 Date: Wed, 10 Jun 2026 12:56:54 +0900 Subject: [PATCH] WIP --- benchmark/benchmark.dart | 7 ++++ benchmark/search/english_word_search.dart | 49 ++++++++++++++++++++++ benchmark/search/japanese_word_search.dart | 49 ++++++++++++++++++++++ flake.lock | 6 +-- flake.nix | 1 + lib/search/word_search/entry_id_query.dart | 4 +- pubspec.lock | 8 ++++ pubspec.yaml | 1 + 8 files changed, 119 insertions(+), 6 deletions(-) create mode 100644 benchmark/benchmark.dart create mode 100644 benchmark/search/english_word_search.dart create mode 100644 benchmark/search/japanese_word_search.dart diff --git a/benchmark/benchmark.dart b/benchmark/benchmark.dart new file mode 100644 index 0000000..71f3c3f --- /dev/null +++ b/benchmark/benchmark.dart @@ -0,0 +1,7 @@ +import './search/english_word_search.dart'; +import './search/japanese_word_search.dart'; + +Future main() async { + await EnglishWordSearchBenchmark.main(); + await JapaneseWordSearchBenchmark.main(); +} diff --git a/benchmark/search/english_word_search.dart b/benchmark/search/english_word_search.dart new file mode 100644 index 0000000..87f82ad --- /dev/null +++ b/benchmark/search/english_word_search.dart @@ -0,0 +1,49 @@ +import 'package:benchmark_harness/benchmark_harness.dart'; +import 'package:jadb/search.dart'; +import 'package:sqflite_common/sqlite_api.dart'; + +import '../../test/search/setup_database_connection.dart'; + +class EnglishWordSearchBenchmark extends AsyncBenchmarkBase { + Database? connection; + + static final List searchTerms = [ + 'kana', + 'kanji', + 'cute', + 'sushi', + 'ramen', + ]; + + EnglishWordSearchBenchmark() : super('EnglishWordSearchBenchmark'); + + static Future main() async { + print('Running EnglishWordSearchBenchmark...'); + await EnglishWordSearchBenchmark().report(); + print('Finished EnglishWordSearchBenchmark'); + } + + @override + Future setup() async { + connection = await setup_database_connection(); + } + + @override + Future run() async { + for (final term in searchTerms) { + final result = await connection!.jadbSearchWord(term); + assert( + result?.isNotEmpty ?? false, + 'Expected search results for term "$term"', + ); + } + } + + @override + Future teardown() async { + await connection?.close(); + } + + // @override + // Future exercise() => run(); +} diff --git a/benchmark/search/japanese_word_search.dart b/benchmark/search/japanese_word_search.dart new file mode 100644 index 0000000..2a035a8 --- /dev/null +++ b/benchmark/search/japanese_word_search.dart @@ -0,0 +1,49 @@ +import 'package:benchmark_harness/benchmark_harness.dart'; +import 'package:jadb/search.dart'; +import 'package:sqflite_common/sqlite_api.dart'; + +import '../../test/search/setup_database_connection.dart'; + +class JapaneseWordSearchBenchmark extends AsyncBenchmarkBase { + Database? connection; + + static final List searchTerms = [ + '仮名', + '漢字', + 'かわいい', + 'すし', + 'ラメン', + ]; + + JapaneseWordSearchBenchmark() : super('JapaneseWordSearchBenchmark'); + + static Future main() async { + print('Running JapaneseWordSearchBenchmark...'); + await JapaneseWordSearchBenchmark().report(); + print('Finished JapaneseWordSearchBenchmark'); + } + + @override + Future setup() async { + connection = await setup_database_connection(); + } + + @override + Future run() async { + for (final term in searchTerms) { + final result = await connection!.jadbSearchWord(term); + assert( + result?.isNotEmpty ?? false, + 'Expected search results for term "$term"', + ); + } + } + + @override + Future teardown() async { + await connection?.close(); + } + + // @override + // Future exercise() => run(); +} diff --git a/flake.lock b/flake.lock index 3cb02d4..a8fc6d7 100644 --- a/flake.lock +++ b/flake.lock @@ -3,7 +3,7 @@ "jmdict-src": { "flake": false, "locked": { - "narHash": "sha256-lh46uougUzBrRhhwa7cOb32j5Jt9/RjBUhlVjwVzsII=", + "narHash": "sha256-RQuZqSv5aqSKOpI3ajQAR5y/kobLTBOg1t2wOhZsr1g=", "type": "file", "url": "http://ftp.edrdg.org/pub/Nihongo/JMdict_e.gz" }, @@ -15,7 +15,7 @@ "jmdict-with-examples-src": { "flake": false, "locked": { - "narHash": "sha256-5oS2xDyetbuSM6ax3LUjYA3N60x+D3Hg41HEXGFMqLQ=", + "narHash": "sha256-11iYyz3Uf6QzM9l5DcSB+IdLaq+XOGe5zilVPc1GY14=", "type": "file", "url": "http://ftp.edrdg.org/pub/Nihongo/JMdict_e_examp.gz" }, @@ -27,7 +27,7 @@ "kanjidic2-src": { "flake": false, "locked": { - "narHash": "sha256-orSeQqSxhn9TtX3anYtbiMEm7nFkuomGnIKoVIUR2CM=", + "narHash": "sha256-tLQYQf0/C6yaW+QRq6/Uyy8rq+v3+yKLZXuznRnbkrQ=", "type": "file", "url": "https://www.edrdg.org/kanjidic/kanjidic2.xml.gz" }, diff --git a/flake.nix b/flake.nix index aabc887..47ac3f3 100644 --- a/flake.nix +++ b/flake.nix @@ -87,6 +87,7 @@ sqlfluff ]; env = { + LD_LIBRARY_PATH = "${pkgs.sqlite.out}/lib"; LIBSQLITE_PATH = "${pkgs.sqlite.out}/lib/libsqlite3.so"; JADB_PATH = "result/jadb.sqlite"; }; diff --git a/lib/search/word_search/entry_id_query.dart b/lib/search/word_search/entry_id_query.dart index b96ea65..2529ba8 100644 --- a/lib/search/word_search/entry_id_query.dart +++ b/lib/search/word_search/entry_id_query.dart @@ -211,11 +211,9 @@ Future> _queryEnglish( ORDER BY "score" DESC, "${JMdictTableNames.sense}"."entryId" ASC - LIMIT ? - OFFSET ? ''' .trim(), - [word, word, word, '%${word.replaceAll('%', '')}%', pageSize, offset], + [word, word, word, '%${word.replaceAll('%', '')}%'], ); return result diff --git a/pubspec.lock b/pubspec.lock index fdeb576..ce1121a 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -33,6 +33,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.13.0" + benchmark_harness: + dependency: "direct dev" + description: + name: benchmark_harness + sha256: a2d3c4c83cac0126bf38e41eaf7bd9ed4f6635f1ee1a0cbc6f79fa9736c62cbd + url: "https://pub.dev" + source: hosted + version: "2.4.0" boolean_selector: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index c2db3d1..8895506 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -18,6 +18,7 @@ dependencies: xml: ^6.5.0 dev_dependencies: + benchmark_harness: ^2.4.0 lints: ^6.0.0 test: ^1.25.15