@@ -116,9 +116,14 @@ namespace sql
116
116
return tv[0 ] == ' =' || tv[0 ] == ' !' || tv[0 ] == ' <' || tv[0 ] == ' >' ;
117
117
}
118
118
119
- constexpr bool islogical (std::string_view const & tv) noexcept
119
+ constexpr bool isor (std::string_view const & tv) noexcept
120
120
{
121
- return tv == " or" || tv == " OR" || tv == " and" || tv == " AND" ;
121
+ return tv == " or" || tv == " OR" ;
122
+ }
123
+
124
+ constexpr bool isand (std::string_view const & tv) noexcept
125
+ {
126
+ return tv == " and" || tv == " AND" ;
122
127
}
123
128
124
129
} // namespace
@@ -183,7 +188,7 @@ namespace sql
183
188
{
184
189
if constexpr (tokens_[Pos] == " (" )
185
190
{
186
- constexpr auto expr{ parse_logical <Pos + 1 , Row>() };
191
+ constexpr auto expr{ parse_or <Pos + 1 , Row>() };
187
192
188
193
return TreeNode<expr.pos + 1 , typename decltype (expr)::node>{};
189
194
}
@@ -242,41 +247,65 @@ namespace sql
242
247
if constexpr (tokens_[Pos] == " not" || tokens_[Pos] == " NOT" )
243
248
{
244
249
constexpr auto expr{ parse_comp<Pos + 1 , Row>() };
245
- constexpr cexpr::string<char , tokens_[Pos].length () + 1 > name{ tokens_[Pos] };
246
250
247
- return TreeNode<expr.pos , sql::operation<name , Row, typename decltype (expr)::node>>{};
251
+ return TreeNode<expr.pos , sql::operation<" NOT " , Row, typename decltype (expr)::node>>{};
248
252
}
249
253
else
250
254
{
251
255
return parse_comp<Pos, Row>();
252
256
}
253
257
}
254
258
255
- // recursively parse chained boolean operations
259
+ // recursively parse chained AND operations
256
260
template <typename Left, typename Row>
257
- static constexpr auto recurse_logical () noexcept
261
+ static constexpr auto recurse_and () noexcept
258
262
{
259
- if constexpr (!islogical (tokens_[Left::pos]))
263
+ if constexpr (!isand (tokens_[Left::pos]))
260
264
{
261
265
return Left{};
262
266
}
263
267
else
264
268
{
265
269
constexpr auto right{ parse_negation<Left::pos + 1 , Row>() };
266
- constexpr cexpr::string<char , tokens_[Left::pos].length () + 1 > name{ tokens_[Left::pos] };
267
- constexpr auto node{ sql::operation<name, Row, typename Left::node, typename decltype (right)::node>{} };
270
+ constexpr auto node{ sql::operation<" AND" , Row, typename Left::node, typename decltype (right)::node>{} };
268
271
269
- return recurse_logical <TreeNode<right.pos , std::remove_cvref_t <decltype (node)>>, Row>();
272
+ return recurse_and <TreeNode<right.pos , std::remove_cvref_t <decltype (node)>>, Row>();
270
273
}
271
274
}
272
275
273
- // descend further then attempt to parse boolean operations
276
+ // descend further then attempt to parse AND operations
274
277
template <std::size_t Pos, typename Row>
275
- static constexpr auto parse_logical () noexcept
278
+ static constexpr auto parse_and () noexcept
276
279
{
277
280
constexpr auto left{ parse_negation<Pos, Row>() };
278
281
279
- return recurse_logical<decltype (left), Row>();
282
+ return recurse_and<decltype (left), Row>();
283
+ }
284
+
285
+ // recursively parse chained OR operations
286
+ template <typename Left, typename Row>
287
+ static constexpr auto recurse_or () noexcept
288
+ {
289
+ if constexpr (!isor (tokens_[Left::pos]))
290
+ {
291
+ return Left{};
292
+ }
293
+ else
294
+ {
295
+ constexpr auto right{ parse_and<Left::pos + 1 , Row>() };
296
+ constexpr auto node{ sql::operation<" OR" , Row, typename Left::node, typename decltype (right)::node>{} };
297
+
298
+ return recurse_or<TreeNode<right.pos , std::remove_cvref_t <decltype (node)>>, Row>();
299
+ }
300
+ }
301
+
302
+ // descend further then attempt to parse OR operations
303
+ template <std::size_t Pos, typename Row>
304
+ static constexpr auto parse_or () noexcept
305
+ {
306
+ constexpr auto left{ parse_and<Pos, Row>() };
307
+
308
+ return recurse_or<decltype (left), Row>();
280
309
}
281
310
282
311
// find correct schema for terminal relation
@@ -338,7 +367,7 @@ namespace sql
338
367
339
368
if constexpr (root.pos + 1 < tokens_.count () && (tokens_[root.pos ] == " where" || tokens_[root.pos ] == " WHERE" ))
340
369
{
341
- constexpr auto predicate{ parse_logical <root.pos + 1 , std::remove_cvref_t <typename decltype (root)::node::output_type>>() };
370
+ constexpr auto predicate{ parse_or <root.pos + 1 , std::remove_cvref_t <typename decltype (root)::node::output_type>>() };
342
371
343
372
return ra::selection<typename decltype (predicate)::node, typename decltype (root)::node>{};
344
373
}
0 commit comments