2
2
import 'package:database_builder/database_builder.dart' ;
3
3
import 'package:isar/isar.dart' ;
4
4
5
+
6
+
5
7
/// Builds a search query for the JMDict database in ISAR
6
8
///
7
9
/// Searches in the given `isar` for entries with an id between `idRangeStart`
@@ -11,17 +13,18 @@ import 'package:isar/isar.dart';
11
13
/// * include ID in kanji / kana / meanings index to split load between isolates
12
14
QueryBuilder <JMdict , JMdict , QAfterLimit > buildJMDictQuery (
13
15
Isar isar, int idRangeStart, int idRangeEnd, int noIsolates,
14
- String query, String ? kanaizedQuery, List <String > filters, List <String > langs)
16
+ String query, String ? queryKana, String ? queryDeconjugated,
17
+ List <String > filters, List <String > langs)
15
18
{
16
19
17
20
// check if the search contains a wildcard
18
21
bool containsWildcard = query.contains (RegExp (r"\?|\*" ));
19
22
20
23
QueryBuilder <JMdict , JMdict , QFilterCondition > q;
21
24
if (! containsWildcard) {
22
- q = normalQuery (isar, idRangeStart, idRangeEnd, query, kanaizedQuery );
25
+ q = normalQuery (isar, idRangeStart, idRangeEnd, query, queryKana, queryDeconjugated );
23
26
} else {
24
- q = wildcardQuery (isar, idRangeStart, idRangeEnd, query, kanaizedQuery );
27
+ q = wildcardQuery (isar, idRangeStart, idRangeEnd, query, queryKana, queryDeconjugated );
25
28
}
26
29
27
30
return q
@@ -44,18 +47,22 @@ QueryBuilder<JMdict, JMdict, QAfterLimit> buildJMDictQuery(
44
47
// allow kanji / hiragana matches without wildcard
45
48
q.optional (! containsWildcard, (q) =>
46
49
q.group ((q) =>
47
- q.kanjiIndexesElementStartsWith (kanaizedQuery ?? query)
50
+ q.anyOf ([queryKana, query, queryDeconjugated].nonNulls, (q, element)
51
+ => q.kanjiIndexesElementStartsWith (element))
48
52
.or ()
49
- .hiraganasElementStartsWith (kanaizedQuery ?? query)
53
+ .anyOf ([queryKana, query, queryDeconjugated].nonNulls, (q, element)
54
+ => q.hiraganasElementStartsWith (element))
50
55
)
51
56
)
52
57
.or ()
53
58
// allow kanji / hiragana matches with wildcard
54
59
.optional (containsWildcard, (q) =>
55
- q.group ((q) =>
56
- q.kanjisElementMatches (kanaizedQuery ?? query)
60
+ q.group ((q) =>
61
+ q.anyOf ([queryKana, query, queryDeconjugated].nonNulls, (q, element)
62
+ => q.kanjisElementMatches (element))
57
63
.or ()
58
- .hiraganasElementMatches (kanaizedQuery ?? query)
64
+ .anyOf ([queryKana, query, queryDeconjugated].nonNulls, (q, element)
65
+ => q.hiraganasElementMatches (element))
59
66
)
60
67
)
61
68
.or ()
@@ -68,7 +75,7 @@ QueryBuilder<JMdict, JMdict, QAfterLimit> buildJMDictQuery(
68
75
.and ()
69
76
.group ((q) =>
70
77
q
71
- .optional (! containsWildcard, (q) =>
78
+ .optional (! containsWildcard, (q) =>
72
79
q.meaningsElement ((meaning) =>
73
80
meaning.attributesElementStartsWith (query)
74
81
)
@@ -90,32 +97,39 @@ QueryBuilder<JMdict, JMdict, QAfterLimit> buildJMDictQuery(
90
97
91
98
92
99
QueryBuilder <JMdict , JMdict , QFilterCondition > normalQuery (
93
- Isar isar, int idRangeStart, int idRangeEnd, String query, String ? kanaizedQuery){
100
+ Isar isar, int idRangeStart, int idRangeEnd,
101
+ String query, String ? queryKana, String ? queryDeconjugated){
94
102
95
103
return isar.jmdict.where ()
96
- .kanjiIndexesElementStartsWith (kanaizedQuery ?? query)
97
- .or ()
98
- .hiraganasElementStartsWith (kanaizedQuery ?? query)
99
- .or ()
100
- .meaningsIndexesElementStartsWith (query)
104
+ .anyOf ([query, queryKana, queryDeconjugated].nonNulls, (q, element)
105
+ => q.kanjiIndexesElementStartsWith (element))
106
+ .or ()
107
+ .anyOf ([query, queryKana, queryDeconjugated].nonNulls, (q, element)
108
+ => q.hiraganasElementStartsWith (element))
109
+ .or ()
110
+ .anyOf ([query].nonNulls, (q, element)
111
+ => q.meaningsIndexesElementStartsWith (element))
101
112
.filter ()
102
113
// limit this process to one chunk of size (entries.length / num_processes)
103
114
.idBetween (idRangeStart, idRangeEnd)
104
115
;
105
116
}
106
117
107
118
QueryBuilder <JMdict , JMdict , QAfterFilterCondition > wildcardQuery (
108
- Isar isar, int idRangeStart, int idRangeEnd, String query, String ? kanaizedQuery){
119
+ Isar isar, int idRangeStart, int idRangeEnd,
120
+ String query, String ? queryKana, String ? queryDeconjugated){
109
121
110
122
return isar.jmdict.where ()
111
123
.idBetween (idRangeStart, idRangeEnd)
112
124
.filter ()
113
-
114
- .kanjisElementMatches (kanaizedQuery ?? query )
125
+ . anyOf ([query, queryKana, queryDeconjugated].nonNulls, (q, element)
126
+ => q .kanjisElementMatches (element) )
115
127
.or ()
116
- .hiraganasElementMatches (kanaizedQuery ?? query)
128
+ .anyOf ([query, queryKana, queryDeconjugated].nonNulls, (q, element)
129
+ => q.hiraganasElementMatches (element))
117
130
.or ()
118
- .meaningsIndexesElementMatches (query)
131
+ .anyOf ([query].nonNulls, (q, element)
132
+ => q.meaningsIndexesElementMatches (element))
119
133
;
120
134
121
135
}
0 commit comments