@@ -61,6 +61,10 @@ double toDouble(string_view src);
61
61
KNN " KNN"
62
62
AS " AS"
63
63
EF_RUNTIME " EF_RUNTIME"
64
+ GEOUNIT_M " GEOUNIT_M"
65
+ GEOUNIT_KM " GEOUNIT_KM"
66
+ GEOUNIT_MI " GEOUNIT_MI"
67
+ GEOUNIT_FT " GEOUNIT_FT"
64
68
;
65
69
66
70
%token AND_OP
@@ -77,14 +81,13 @@ double toDouble(string_view src);
77
81
78
82
%token <std::string> DOUBLE " double"
79
83
%token <std::string> UINT32 " uint32"
80
- %nterm <double > generic_number
81
- %nterm <bool > opt_lparen
82
- %nterm <AstExpr> final_query filter search_expr search_unary_expr search_or_expr search_and_expr numeric_filter_expr
84
+ %nterm <AstExpr> final_query filter search_expr search_unary_expr search_or_expr search_and_expr bracket_filter_expr
83
85
%nterm <AstExpr> field_cond field_cond_expr field_unary_expr field_or_expr field_and_expr tag_list
84
86
%nterm <AstTagsNode::TagValueProxy> tag_list_element
85
87
86
88
%nterm <AstKnnNode> knn_query
87
89
%nterm <std::string> opt_knn_alias
90
+ %nterm <std::string> geounit
88
91
%nterm <std::optional<size_t >> opt_ef_runtime
89
92
90
93
%printer { yyo << $$; } <*>;
@@ -149,23 +152,55 @@ field_cond:
149
152
| STAR { $$ = AstStarFieldNode (); }
150
153
| NOT_OP field_cond { $$ = AstNegateNode (std::move ($2 )); }
151
154
| LPAREN field_cond_expr RPAREN { $$ = std::move ($2 ); }
152
- | LBRACKET numeric_filter_expr RBRACKET { $$ = std::move ($2 ); }
155
+ | LBRACKET bracket_filter_expr RBRACKET { $$ = std::move ($2 ); }
153
156
| LCURLBR tag_list RCURLBR { $$ = std::move ($2 ); }
154
157
| PREFIX { $$ = AstPrefixNode (std::move ($1 )); }
155
158
| SUFFIX { $$ = AstSuffixNode (std::move ($1 )); }
156
159
| INFIX { $$ = AstInfixNode (std::move ($1 )); }
157
160
158
- numeric_filter_expr:
159
- opt_lparen generic_number opt_lparen generic_number { $$ = AstRangeNode ($2 , $1 , $4 , $3 ); }
160
- | opt_lparen generic_number COMMA opt_lparen generic_number { $$ = AstRangeNode ($2 , $1 , $5 , $4 ); }
161
-
162
- generic_number:
163
- DOUBLE { $$ = toDouble ($1 ); }
164
- | UINT32 { $$ = toUint32 ($1 ); }
165
-
166
- opt_lparen:
167
- /* empty */ { $$ = false ; }
168
- | LPAREN { $$ = true ; }
161
+ bracket_filter_expr:
162
+ /* Numeric filter has form [(] UINT32|DOUBLE [COMMA] [(] UINT32|DOUBLE */
163
+ DOUBLE DOUBLE { $$ = AstRangeNode (toDouble ($1 ), false , toDouble ($2 ), false ); }
164
+ | LPAREN DOUBLE DOUBLE { $$ = AstRangeNode (toDouble ($2 ), true , toDouble ($3 ), false ); }
165
+ | DOUBLE LPAREN DOUBLE { $$ = AstRangeNode (toDouble ($1 ), false , toDouble ($3 ), true ); }
166
+ | LPAREN DOUBLE LPAREN DOUBLE { $$ = AstRangeNode (toDouble ($2 ), true , toDouble ($4 ), true ); }
167
+ | DOUBLE UINT32 { $$ = AstRangeNode (toDouble ($1 ), false , toUint32 ($2 ), false ); }
168
+ | LPAREN DOUBLE UINT32 { $$ = AstRangeNode (toDouble ($2 ), true , toUint32 ($3 ), false ); }
169
+ | DOUBLE LPAREN UINT32 { $$ = AstRangeNode (toDouble ($1 ), false , toUint32 ($3 ), true ); }
170
+ | LPAREN DOUBLE LPAREN UINT32 { $$ = AstRangeNode (toDouble ($2 ), true , toUint32 ($4 ), true ); }
171
+ | UINT32 DOUBLE { $$ = AstRangeNode (toUint32 ($1 ), false , toDouble ($2 ), false ); }
172
+ | LPAREN UINT32 DOUBLE { $$ = AstRangeNode (toUint32 ($2 ), true , toDouble ($3 ), false ); }
173
+ | UINT32 LPAREN DOUBLE { $$ = AstRangeNode (toUint32 ($1 ), false , toDouble ($3 ), true ); }
174
+ | LPAREN UINT32 LPAREN DOUBLE { $$ = AstRangeNode (toUint32 ($2 ), true , toDouble ($4 ), true ); }
175
+ | UINT32 UINT32 { $$ = AstRangeNode (toUint32 ($1 ), false , toUint32 ($2 ), false ); }
176
+ | LPAREN UINT32 UINT32 { $$ = AstRangeNode (toUint32 ($2 ), true , toUint32 ($3 ), false ); }
177
+ | UINT32 LPAREN UINT32 { $$ = AstRangeNode (toUint32 ($1 ), false , toUint32 ($3 ), true ); }
178
+ | LPAREN UINT32 LPAREN UINT32 { $$ = AstRangeNode (toUint32 ($2 ), true , toUint32 ($4 ), true ); }
179
+ | DOUBLE COMMA DOUBLE { $$ = AstRangeNode (toDouble ($1 ), false , toDouble ($3 ), false ); }
180
+ | DOUBLE COMMA UINT32 { $$ = AstRangeNode (toDouble ($1 ), false , toUint32 ($3 ), false ); }
181
+ | UINT32 COMMA DOUBLE { $$ = AstRangeNode (toUint32 ($1 ), false , toDouble ($3 ), false ); }
182
+ | UINT32 COMMA UINT32 { $$ = AstRangeNode (toUint32 ($1 ), false , toUint32 ($3 ), false ); }
183
+ | LPAREN DOUBLE COMMA DOUBLE { $$ = AstRangeNode (toDouble ($2 ), true , toDouble ($4 ), false ); }
184
+ | DOUBLE COMMA LPAREN DOUBLE { $$ = AstRangeNode (toDouble ($1 ), false , toDouble ($4 ), true ); }
185
+ | LPAREN DOUBLE COMMA LPAREN DOUBLE { $$ = AstRangeNode (toDouble ($2 ), true , toDouble ($5 ), true ); }
186
+ | LPAREN DOUBLE COMMA UINT32 { $$ = AstRangeNode (toDouble ($2 ), true , toUint32 ($4 ), false ); }
187
+ | DOUBLE COMMA LPAREN UINT32 { $$ = AstRangeNode (toDouble ($1 ), false , toUint32 ($4 ), true ); }
188
+ | LPAREN DOUBLE COMMA LPAREN UINT32 { $$ = AstRangeNode (toDouble ($2 ), true , toUint32 ($5 ), true ); }
189
+ | LPAREN UINT32 COMMA DOUBLE { $$ = AstRangeNode (toUint32 ($2 ), true , toDouble ($4 ), false ); }
190
+ | UINT32 COMMA LPAREN DOUBLE { $$ = AstRangeNode (toUint32 ($1 ), false , toDouble ($4 ), true ); }
191
+ | LPAREN UINT32 COMMA LPAREN DOUBLE { $$ = AstRangeNode (toUint32 ($2 ), true , toDouble ($5 ), true ); }
192
+ | LPAREN UINT32 COMMA UINT32 { $$ = AstRangeNode (toUint32 ($2 ), true , toUint32 ($4 ), false ); }
193
+ | UINT32 COMMA LPAREN UINT32 { $$ = AstRangeNode (toUint32 ($1 ), false , toUint32 ($4 ), true ); }
194
+ | LPAREN UINT32 COMMA LPAREN UINT32 { $$ = AstRangeNode (toUint32 ($2 ), true , toUint32 ($5 ), true ); }
195
+ /* GEO filter */
196
+ | DOUBLE DOUBLE UINT32 geounit { $$ = AstGeoNode (toDouble ($1 ), toDouble ($2 ), toUint32 ($3 ), std::move ($4 )); }
197
+ | DOUBLE DOUBLE DOUBLE geounit { $$ = AstGeoNode (toDouble ($1 ), toDouble ($2 ), toDouble ($3 ), std::move ($4 )); }
198
+
199
+ geounit:
200
+ GEOUNIT_M { $$ = " M" ; }
201
+ | GEOUNIT_KM { $$ = " KM" ; }
202
+ | GEOUNIT_MI { $$ = " MI" ; }
203
+ | GEOUNIT_FT { $$ = " FT" ; }
169
204
170
205
field_cond_expr:
171
206
field_unary_expr { $$ = std::move ($1 ); }
0 commit comments