@@ -12,6 +12,19 @@ class SourcePosition {
12
12
int get length => end - start;
13
13
}
14
14
15
+ /// Provides an interface for generic query evaluation.
16
+ abstract class QueryEvaluator <R > {
17
+ R evalText (TextQuery query);
18
+ R evalPhrase (PhraseQuery query);
19
+ R evalScope (ScopeQuery query);
20
+ R evalCompare (CompareQuery query);
21
+ R evalRange (RangeQuery query);
22
+ R evalNot (NotQuery query);
23
+ R evalGroup (GroupQuery query);
24
+ R evalAnd (AndQuery query);
25
+ R evalOr (OrQuery query);
26
+ }
27
+
15
28
/// Base interface for queries.
16
29
abstract class Query {
17
30
const Query ({
@@ -35,6 +48,8 @@ abstract class Query {
35
48
///
36
49
/// If the [Query] cannot be cast to [R] it will throw an exception.
37
50
R cast <R extends Query >() => this as R ;
51
+
52
+ R eval <R >(QueryEvaluator <R > evaluator);
38
53
}
39
54
40
55
/// Text query to match [text] .
@@ -45,6 +60,9 @@ class TextQuery extends Query {
45
60
required super .position,
46
61
});
47
62
63
+ @override
64
+ R eval <R >(QueryEvaluator <R > evaluator) => evaluator.evalText (this );
65
+
48
66
@override
49
67
String toString ({bool debug = false }) => _debug (debug, text);
50
68
}
@@ -58,13 +76,16 @@ class PhraseQuery extends TextQuery {
58
76
required super .position,
59
77
});
60
78
79
+ @override
80
+ R eval <R >(QueryEvaluator <R > evaluator) => evaluator.evalPhrase (this );
81
+
61
82
@override
62
83
String toString ({bool debug = false }) =>
63
84
'"${children .map ((n ) => n .toString (debug : debug )).join (' ' )}"' ;
64
85
}
65
86
66
87
/// Scopes [child] [Query] to be applied only on the [field] .
67
- @Deprecated ('Use FieldScopeQuery instead.' )
88
+ @Deprecated ('Use ScopeQuery instead.' )
68
89
class FieldScope extends Query {
69
90
final TextQuery field;
70
91
final Query child;
@@ -75,22 +96,30 @@ class FieldScope extends Query {
75
96
required super .position,
76
97
});
77
98
99
+ @override
100
+ R eval <R >(QueryEvaluator <R > evaluator) => evaluator
101
+ .evalScope (ScopeQuery (field: field, child: child, position: position));
102
+
78
103
@override
79
104
String toString ({bool debug = false }) =>
80
105
'$field :${child .toString (debug : debug )}' ;
81
106
}
82
107
83
108
/// Scopes [child] [Query] to be applied only on the [field] .
84
109
// ignore: deprecated_member_use_from_same_package
85
- class FieldScopeQuery extends FieldScope {
86
- const FieldScopeQuery ({
110
+ class ScopeQuery extends FieldScope {
111
+ const ScopeQuery ({
87
112
required super .field,
88
113
required super .child,
89
114
required super .position,
90
115
});
116
+
117
+ @override
118
+ R eval <R >(QueryEvaluator <R > evaluator) => evaluator.evalScope (this );
91
119
}
92
120
93
121
/// Describes a [field] [operator] [text] tripled (e.g. year < 2000).
122
+ @Deprecated ('Use CompareQuery instead.' )
94
123
class FieldCompareQuery extends Query {
95
124
final TextQuery field;
96
125
final TextQuery operator ;
@@ -103,11 +132,29 @@ class FieldCompareQuery extends Query {
103
132
required super .position,
104
133
});
105
134
135
+ @override
136
+ R eval <R >(QueryEvaluator <R > evaluator) => evaluator.evalCompare (CompareQuery (
137
+ field: field, operator : operator , text: text, position: position));
138
+
106
139
@override
107
140
String toString ({bool debug = false }) =>
108
141
_debug (debug, '$field $operator $text ' );
109
142
}
110
143
144
+ /// Describes a [field] [operator] [text] tripled (e.g. year < 2000).
145
+ // ignore: deprecated_member_use_from_same_package
146
+ class CompareQuery extends FieldCompareQuery {
147
+ CompareQuery ({
148
+ required super .field,
149
+ required super .operator ,
150
+ required super .text,
151
+ required super .position,
152
+ });
153
+
154
+ @override
155
+ R eval <R >(QueryEvaluator <R > evaluator) => evaluator.evalCompare (this );
156
+ }
157
+
111
158
/// Describes a range query between [start] and [end] .
112
159
class RangeQuery extends Query {
113
160
final TextQuery start;
@@ -123,6 +170,9 @@ class RangeQuery extends Query {
123
170
this .endInclusive = true ,
124
171
});
125
172
173
+ @override
174
+ R eval <R >(QueryEvaluator <R > evaluator) => evaluator.evalRange (this );
175
+
126
176
@override
127
177
String toString ({bool debug = false }) => _debug (
128
178
debug,
@@ -142,6 +192,9 @@ class NotQuery extends Query {
142
192
required super .position,
143
193
});
144
194
195
+ @override
196
+ R eval <R >(QueryEvaluator <R > evaluator) => evaluator.evalNot (this );
197
+
145
198
@override
146
199
String toString ({bool debug = false }) => '-${child .toString (debug : debug )}' ;
147
200
}
@@ -154,6 +207,9 @@ class GroupQuery extends Query {
154
207
required super .position,
155
208
});
156
209
210
+ @override
211
+ R eval <R >(QueryEvaluator <R > evaluator) => evaluator.evalGroup (this );
212
+
157
213
@override
158
214
String toString ({bool debug = false }) => '(${child .toString (debug : debug )})' ;
159
215
}
@@ -167,6 +223,9 @@ class AndQuery extends Query {
167
223
required super .position,
168
224
});
169
225
226
+ @override
227
+ R eval <R >(QueryEvaluator <R > evaluator) => evaluator.evalAnd (this );
228
+
170
229
@override
171
230
String toString ({bool debug = false }) =>
172
231
'(${children .map ((n ) => n .toString (debug : debug )).join (' ' )})' ;
@@ -181,6 +240,9 @@ class OrQuery extends Query {
181
240
required super .position,
182
241
});
183
242
243
+ @override
244
+ R eval <R >(QueryEvaluator <R > evaluator) => evaluator.evalOr (this );
245
+
184
246
@override
185
247
String toString ({bool debug = false }) =>
186
248
'(${children .map ((n ) => n .toString (debug : debug )).join (' OR ' )})' ;
0 commit comments