gqlite 1.2.0 → 1.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. checksums.yaml +4 -4
  2. data/ext/gqliterb/.cargo/config.toml +2 -0
  3. data/ext/gqliterb/Cargo.lock +152 -135
  4. data/ext/gqliterb/Cargo.toml +4 -6
  5. data/ext/gqliterb/src/lib.rs +8 -2
  6. data/ext/gqliterb/vendor/gqlitedb/Cargo.lock +2115 -0
  7. data/ext/gqliterb/vendor/gqlitedb/Cargo.toml +138 -0
  8. data/ext/gqliterb/vendor/gqlitedb/askama.toml +3 -0
  9. data/ext/gqliterb/vendor/gqlitedb/benches/common/mod.rs +25 -0
  10. data/ext/gqliterb/vendor/gqlitedb/benches/common/pokec.rs +185 -0
  11. data/ext/gqliterb/vendor/gqlitedb/benches/pokec_divan.rs +137 -0
  12. data/ext/gqliterb/vendor/gqlitedb/benches/pokec_iai.rs +122 -0
  13. data/ext/gqliterb/vendor/gqlitedb/release.toml +7 -0
  14. data/ext/gqliterb/vendor/gqlitedb/src/aggregators/arithmetic.rs +96 -0
  15. data/ext/gqliterb/vendor/gqlitedb/src/aggregators/containers.rs +33 -0
  16. data/ext/gqliterb/vendor/gqlitedb/src/aggregators/count.rs +35 -0
  17. data/ext/gqliterb/vendor/gqlitedb/src/aggregators/stats.rs +168 -0
  18. data/ext/gqliterb/vendor/gqlitedb/src/aggregators.rs +74 -0
  19. data/ext/gqliterb/vendor/gqlitedb/src/capi.rs +259 -0
  20. data/ext/gqliterb/vendor/gqlitedb/src/compiler/expression_analyser.rs +431 -0
  21. data/ext/gqliterb/vendor/gqlitedb/src/compiler/variables_manager.rs +621 -0
  22. data/ext/gqliterb/vendor/gqlitedb/src/compiler.rs +1115 -0
  23. data/ext/gqliterb/vendor/gqlitedb/src/connection.rs +342 -0
  24. data/ext/gqliterb/vendor/gqlitedb/src/consts.rs +10 -0
  25. data/ext/gqliterb/vendor/gqlitedb/src/error.rs +613 -0
  26. data/ext/gqliterb/vendor/gqlitedb/src/functions/containers.rs +115 -0
  27. data/ext/gqliterb/vendor/gqlitedb/src/functions/edge.rs +20 -0
  28. data/ext/gqliterb/vendor/gqlitedb/src/functions/math.rs +44 -0
  29. data/ext/gqliterb/vendor/gqlitedb/src/functions/node.rs +16 -0
  30. data/ext/gqliterb/vendor/gqlitedb/src/functions/path.rs +80 -0
  31. data/ext/gqliterb/vendor/gqlitedb/src/functions/scalar.rs +86 -0
  32. data/ext/gqliterb/vendor/gqlitedb/src/functions/string.rs +28 -0
  33. data/ext/gqliterb/vendor/gqlitedb/src/functions/value.rs +99 -0
  34. data/ext/gqliterb/vendor/gqlitedb/src/functions.rs +410 -0
  35. data/ext/gqliterb/vendor/gqlitedb/src/graph.rs +283 -0
  36. data/ext/gqliterb/vendor/gqlitedb/src/interpreter/evaluators.rs +1776 -0
  37. data/ext/gqliterb/vendor/gqlitedb/src/interpreter/instructions.rs +267 -0
  38. data/ext/gqliterb/vendor/gqlitedb/src/interpreter/mod.rs +4 -0
  39. data/ext/gqliterb/vendor/gqlitedb/src/lib.rs +41 -0
  40. data/ext/gqliterb/vendor/gqlitedb/src/parser/ast.rs +611 -0
  41. data/ext/gqliterb/vendor/gqlitedb/src/parser/gql.pest +196 -0
  42. data/ext/gqliterb/vendor/gqlitedb/src/parser/parser.rs +1183 -0
  43. data/ext/gqliterb/vendor/gqlitedb/src/parser.rs +4 -0
  44. data/ext/gqliterb/vendor/gqlitedb/src/prelude.rs +8 -0
  45. data/ext/gqliterb/vendor/gqlitedb/src/serialize_with.rs +94 -0
  46. data/ext/gqliterb/vendor/gqlitedb/src/store/pgql.rs +121 -0
  47. data/ext/gqliterb/vendor/gqlitedb/src/store/redb.rs +1262 -0
  48. data/ext/gqliterb/vendor/gqlitedb/src/store/sqlite.rs +1026 -0
  49. data/ext/gqliterb/vendor/gqlitedb/src/store.rs +439 -0
  50. data/ext/gqliterb/vendor/gqlitedb/src/tests/compiler.rs +92 -0
  51. data/ext/gqliterb/vendor/gqlitedb/src/tests/evaluators.rs +227 -0
  52. data/ext/gqliterb/vendor/gqlitedb/src/tests/parser.rs +81 -0
  53. data/ext/gqliterb/vendor/gqlitedb/src/tests/store/redb.rs +46 -0
  54. data/ext/gqliterb/vendor/gqlitedb/src/tests/store/sqlite.rs +46 -0
  55. data/ext/gqliterb/vendor/gqlitedb/src/tests/store.rs +470 -0
  56. data/ext/gqliterb/vendor/gqlitedb/src/tests/templates/ast.rs +356 -0
  57. data/ext/gqliterb/vendor/gqlitedb/src/tests/templates/programs.rs +455 -0
  58. data/ext/gqliterb/vendor/gqlitedb/src/tests/templates.rs +2 -0
  59. data/ext/gqliterb/vendor/gqlitedb/src/tests.rs +39 -0
  60. data/ext/gqliterb/vendor/gqlitedb/src/utils.rs +28 -0
  61. data/ext/gqliterb/vendor/gqlitedb/src/value/compare.rs +212 -0
  62. data/ext/gqliterb/vendor/gqlitedb/src/value/contains.rs +47 -0
  63. data/ext/gqliterb/vendor/gqlitedb/src/value/value_map.rs +298 -0
  64. data/ext/gqliterb/vendor/gqlitedb/src/value.rs +609 -0
  65. data/ext/gqliterb/vendor/gqlitedb/src/value_table.rs +610 -0
  66. data/ext/gqliterb/vendor/gqlitedb/templates/sql/sqlite/call_stats.sql +22 -0
  67. data/ext/gqliterb/vendor/gqlitedb/templates/sql/sqlite/edge_count_for_node.sql +3 -0
  68. data/ext/gqliterb/vendor/gqlitedb/templates/sql/sqlite/edge_create.sql +6 -0
  69. data/ext/gqliterb/vendor/gqlitedb/templates/sql/sqlite/edge_delete.sql +1 -0
  70. data/ext/gqliterb/vendor/gqlitedb/templates/sql/sqlite/edge_delete_by_nodes.sql +2 -0
  71. data/ext/gqliterb/vendor/gqlitedb/templates/sql/sqlite/edge_select.sql +139 -0
  72. data/ext/gqliterb/vendor/gqlitedb/templates/sql/sqlite/edge_update.sql +4 -0
  73. data/ext/gqliterb/vendor/gqlitedb/templates/sql/sqlite/graph_create.sql +16 -0
  74. data/ext/gqliterb/vendor/gqlitedb/templates/sql/sqlite/graph_delete.sql +3 -0
  75. data/ext/gqliterb/vendor/gqlitedb/templates/sql/sqlite/metadata_create_table.sql +1 -0
  76. data/ext/gqliterb/vendor/gqlitedb/templates/sql/sqlite/metadata_get.sql +1 -0
  77. data/ext/gqliterb/vendor/gqlitedb/templates/sql/sqlite/metadata_set.sql +1 -0
  78. data/ext/gqliterb/vendor/gqlitedb/templates/sql/sqlite/node_create.sql +1 -0
  79. data/ext/gqliterb/vendor/gqlitedb/templates/sql/sqlite/node_delete.sql +1 -0
  80. data/ext/gqliterb/vendor/gqlitedb/templates/sql/sqlite/node_select.sql +42 -0
  81. data/ext/gqliterb/vendor/gqlitedb/templates/sql/sqlite/node_update.sql +4 -0
  82. data/ext/gqliterb/vendor/gqlitedb/templates/sql/sqlite/table_exists.sql +5 -0
  83. data/ext/gqliterb/vendor/gqlitedb/templates/sql/sqlite/upgrade_from_1_01.sql +2 -0
  84. data/ext/gqliterb/vendor/gqlitedb/templates/sql/sqlite/upgrade_graph_from_1_01.sql +65 -0
  85. metadata +82 -2
@@ -0,0 +1,1183 @@
1
+ use std::str::FromStr;
2
+
3
+ use pest::{
4
+ pratt_parser::{Assoc, Op, PrattParser},
5
+ Parser,
6
+ };
7
+ use pest_derive::Parser;
8
+
9
+ use crate::prelude::*;
10
+ use parser::ast;
11
+
12
+ trait TryNext: Iterator
13
+ {
14
+ fn try_next(&mut self) -> Result<Self::Item>
15
+ {
16
+ self
17
+ .next()
18
+ .ok_or_else(|| error::InternalError::MissingElementIterator.into())
19
+ }
20
+ }
21
+
22
+ fn remove_hex_prefix<'a>(string: &'a str) -> String
23
+ {
24
+ if &string[0..1] == "-"
25
+ {
26
+ format!("-{}", &string[3..])
27
+ }
28
+ else
29
+ {
30
+ string[2..].into()
31
+ }
32
+ }
33
+
34
+ fn validate_float<'a>(value: f64, text: &'a str) -> Result<f64>
35
+ {
36
+ if value.is_finite()
37
+ {
38
+ Ok(value)
39
+ }
40
+ else
41
+ {
42
+ Err(
43
+ CompileTimeError::FloatingPointOverflow {
44
+ text: text.to_owned(),
45
+ }
46
+ .into(),
47
+ )
48
+ }
49
+ }
50
+
51
+ impl<T: Iterator> TryNext for T {}
52
+
53
+ #[derive(Parser)]
54
+ #[grammar = "parser/gql.pest"]
55
+ pub(crate) struct GQLParser;
56
+
57
+ pub(crate) struct AstBuilder
58
+ {
59
+ pratt: PrattParser<Rule>,
60
+ var_ids: ast::VariableIdentifiers,
61
+ }
62
+
63
+ impl AstBuilder
64
+ {
65
+ fn build_pair(&self, pair: pest::iterators::Pair<Rule>) -> Result<(String, ast::Expression)>
66
+ {
67
+ let mut it = pair.into_inner();
68
+ let k = it.try_next()?;
69
+ let v = self.build_expression(it.try_next()?.into_inner())?;
70
+ return Ok((k.as_str().to_string(), v));
71
+ }
72
+
73
+ fn build_expression(&self, pairs: pest::iterators::Pairs<Rule>) -> Result<ast::Expression>
74
+ {
75
+ self
76
+ .pratt
77
+ .map_primary(|primary| self.build_expression_primary(primary))
78
+ .map_prefix(|op, rhs| match op.as_rule()
79
+ {
80
+ Rule::negation => Ok(ast::Negation { value: rhs? }.into()),
81
+ Rule::not => Ok(ast::LogicalNegation { value: rhs? }.into()),
82
+ unknown_expression => Err(
83
+ error::InternalError::UnxpectedExpression(
84
+ "build_expression/map_prefix",
85
+ format!("{unknown_expression:?}"),
86
+ )
87
+ .into(),
88
+ ),
89
+ })
90
+ .map_postfix(|lhs, op| match op.as_rule()
91
+ {
92
+ Rule::is_null => Ok(ast::IsNull { value: lhs? }.into()),
93
+ Rule::is_not_null => Ok(ast::IsNotNull { value: lhs? }.into()),
94
+ Rule::member_access =>
95
+ {
96
+ let it = op.into_inner();
97
+ Ok(ast::Expression::MemberAccess(Box::new(ast::MemberAccess {
98
+ left: lhs?,
99
+ path: it
100
+ .map(|el| match el.as_rule()
101
+ {
102
+ Rule::ident => el.as_str().to_string(),
103
+ Rule::string_literal => el.into_inner().as_str().to_string(),
104
+ _ => todo!(),
105
+ })
106
+ .collect(),
107
+ })))
108
+ }
109
+ Rule::index_access =>
110
+ {
111
+ let mut it = op.into_inner();
112
+
113
+ Ok(ast::Expression::IndexAccess(Box::new(ast::IndexAccess {
114
+ left: lhs?,
115
+ index: it
116
+ .next()
117
+ .map(|el| self.build_expression(el.into_inner()))
118
+ .unwrap()?,
119
+ })))
120
+ }
121
+ Rule::range_access =>
122
+ {
123
+ let mut it = op.into_inner();
124
+ let start = Some(
125
+ it.next()
126
+ .map(|el| self.build_expression(el.into_inner()))
127
+ .unwrap()?,
128
+ );
129
+ let end = it
130
+ .next()
131
+ .map(|el| self.build_expression(el.into_inner()))
132
+ .transpose()?;
133
+
134
+ Ok(ast::Expression::RangeAccess(Box::new(ast::RangeAccess {
135
+ left: lhs?,
136
+ start,
137
+ end,
138
+ })))
139
+ }
140
+ Rule::range_access_to =>
141
+ {
142
+ let mut it = op.into_inner();
143
+ let end = Some(
144
+ it.next()
145
+ .map(|el| self.build_expression(el.into_inner()))
146
+ .unwrap()?,
147
+ );
148
+
149
+ Ok(ast::Expression::RangeAccess(Box::new(ast::RangeAccess {
150
+ left: lhs?,
151
+ start: None,
152
+ end,
153
+ })))
154
+ }
155
+ unknown_expression => Err(
156
+ error::InternalError::UnxpectedExpression(
157
+ "build_expression/map_postfix",
158
+ format!("{unknown_expression:?}"),
159
+ )
160
+ .into(),
161
+ ),
162
+ })
163
+ .map_infix(|lhs, op, rhs| match op.as_rule()
164
+ {
165
+ Rule::addition => Ok(
166
+ ast::Addition {
167
+ left: lhs?,
168
+ right: rhs?,
169
+ }
170
+ .into(),
171
+ ),
172
+ Rule::subtraction => Ok(
173
+ ast::Subtraction {
174
+ left: lhs?,
175
+ right: rhs?,
176
+ }
177
+ .into(),
178
+ ),
179
+ Rule::multiplication => Ok(
180
+ ast::Multiplication {
181
+ left: lhs?,
182
+ right: rhs?,
183
+ }
184
+ .into(),
185
+ ),
186
+ Rule::division => Ok(
187
+ ast::Division {
188
+ left: lhs?,
189
+ right: rhs?,
190
+ }
191
+ .into(),
192
+ ),
193
+ Rule::modulo => Ok(
194
+ ast::Modulo {
195
+ left: lhs?,
196
+ right: rhs?,
197
+ }
198
+ .into(),
199
+ ),
200
+ Rule::exponent => Ok(
201
+ ast::Exponent {
202
+ left: lhs?,
203
+ right: rhs?,
204
+ }
205
+ .into(),
206
+ ),
207
+ Rule::or => Ok(
208
+ ast::LogicalOr {
209
+ left: lhs?,
210
+ right: rhs?,
211
+ }
212
+ .into(),
213
+ ),
214
+ Rule::and => Ok(
215
+ ast::LogicalAnd {
216
+ left: lhs?,
217
+ right: rhs?,
218
+ }
219
+ .into(),
220
+ ),
221
+ Rule::xor => Ok(
222
+ ast::LogicalXor {
223
+ left: lhs?,
224
+ right: rhs?,
225
+ }
226
+ .into(),
227
+ ),
228
+ Rule::equal => Ok(
229
+ ast::RelationalEqual {
230
+ left: lhs?,
231
+ right: rhs?,
232
+ }
233
+ .into(),
234
+ ),
235
+ Rule::different => Ok(
236
+ ast::RelationalDifferent {
237
+ left: lhs?,
238
+ right: rhs?,
239
+ }
240
+ .into(),
241
+ ),
242
+ Rule::inferior => Ok(
243
+ ast::RelationalInferior {
244
+ left: lhs?,
245
+ right: rhs?,
246
+ }
247
+ .into(),
248
+ ),
249
+ Rule::superior => Ok(
250
+ ast::RelationalSuperior {
251
+ left: lhs?,
252
+ right: rhs?,
253
+ }
254
+ .into(),
255
+ ),
256
+ Rule::inferior_equal => Ok(
257
+ ast::RelationalInferiorEqual {
258
+ left: lhs?,
259
+ right: rhs?,
260
+ }
261
+ .into(),
262
+ ),
263
+ Rule::superior_equal => Ok(
264
+ ast::RelationalSuperiorEqual {
265
+ left: lhs?,
266
+ right: rhs?,
267
+ }
268
+ .into(),
269
+ ),
270
+ Rule::not_in => Ok(
271
+ ast::RelationalNotIn {
272
+ left: lhs?,
273
+ right: rhs?,
274
+ }
275
+ .into(),
276
+ ),
277
+ Rule::in_ => Ok(
278
+ ast::RelationalIn {
279
+ left: lhs?,
280
+ right: rhs?,
281
+ }
282
+ .into(),
283
+ ),
284
+ unknown_expression => Err(
285
+ error::InternalError::UnxpectedExpression(
286
+ "build_expression/map_postfix",
287
+ format!("{unknown_expression:?}"),
288
+ )
289
+ .into(),
290
+ ),
291
+ })
292
+ .parse(pairs)
293
+ }
294
+
295
+ fn build_expression_primary(&self, pair: pest::iterators::Pair<Rule>) -> Result<ast::Expression>
296
+ {
297
+ match pair.as_rule()
298
+ {
299
+ Rule::expression_term =>
300
+ {
301
+ let pair = pair.into_inner().try_next()?;
302
+ match pair.as_rule()
303
+ {
304
+ Rule::null_lit => Ok(ast::Expression::Value(ast::Value {
305
+ value: value::Value::Null,
306
+ })),
307
+ Rule::true_lit => Ok(ast::Expression::Value(ast::Value {
308
+ value: value::Value::Boolean(true),
309
+ })),
310
+ Rule::false_lit => Ok(ast::Expression::Value(ast::Value {
311
+ value: value::Value::Boolean(false),
312
+ })),
313
+ Rule::int => Ok(ast::Expression::Value(ast::Value {
314
+ value: {
315
+ value::Value::Integer(
316
+ i64::from_str(pair.as_str())
317
+ .map_err(|e| error::parse_int_error_to_compile_error(pair.as_str(), e))?,
318
+ )
319
+ },
320
+ })),
321
+ Rule::octa_int => Ok(ast::Expression::Value(ast::Value {
322
+ value: {
323
+ value::Value::Integer(
324
+ i64::from_str_radix(&remove_hex_prefix(pair.as_str()), 8)
325
+ .map_err(|e| error::parse_int_error_to_compile_error(pair.as_str(), e))?,
326
+ )
327
+ },
328
+ })),
329
+ Rule::hexa_int => Ok(ast::Expression::Value(ast::Value {
330
+ value: {
331
+ value::Value::Integer(
332
+ i64::from_str_radix(&remove_hex_prefix(pair.as_str()), 16)
333
+ .map_err(|e| error::parse_int_error_to_compile_error(pair.as_str(), e))?,
334
+ )
335
+ },
336
+ })),
337
+ Rule::num => Ok(ast::Expression::Value(ast::Value {
338
+ value: value::Value::Float(validate_float(pair.as_str().parse()?, pair.as_str())?),
339
+ })),
340
+ Rule::ident => Ok(ast::Expression::Variable(ast::Variable {
341
+ identifier: self.var_ids.from_name(pair.as_str()),
342
+ })),
343
+ Rule::parameter => Ok(ast::Expression::Parameter(ast::Parameter {
344
+ name: pair.as_str().to_string(),
345
+ })),
346
+ Rule::array => Ok(ast::Expression::Array(ast::Array {
347
+ array: pair
348
+ .into_inner()
349
+ .map(|pair| self.build_expression(pair.into_inner()))
350
+ .collect::<Result<Vec<ast::Expression>>>()?,
351
+ })),
352
+ Rule::map => self.build_map(pair),
353
+ Rule::string_literal => Ok(ast::Expression::Value(ast::Value {
354
+ value: value::Value::String(pair.into_inner().try_next()?.as_str().to_string()),
355
+ })),
356
+ Rule::function_call =>
357
+ {
358
+ let mut it = pair.into_inner();
359
+ let function_name = it
360
+ .next()
361
+ .ok_or_else(|| error::InternalError::MissingFunctionName)?
362
+ .as_str();
363
+ Ok(ast::Expression::FunctionCall(ast::FunctionCall {
364
+ name: function_name.to_string(),
365
+ arguments: it
366
+ .map(|pair| self.build_expression(pair.into_inner()))
367
+ .collect::<Result<_>>()?,
368
+ }))
369
+ }
370
+ Rule::function_star =>
371
+ {
372
+ let mut it = pair.into_inner();
373
+ let function_name = it
374
+ .next()
375
+ .ok_or_else(|| error::InternalError::MissingFunctionName)?
376
+ .as_str();
377
+ if function_name.to_lowercase() != "count"
378
+ {
379
+ Err(error::CompileTimeError::UnknownFunction {
380
+ name: function_name.to_owned(),
381
+ })?;
382
+ }
383
+
384
+ Ok(ast::Expression::FunctionCall(ast::FunctionCall {
385
+ name: "count".into(),
386
+ arguments: vec![ast::Expression::Value(ast::Value { value: 0.into() })],
387
+ }))
388
+ }
389
+ Rule::parenthesised_expression =>
390
+ {
391
+ let mut it = pair.into_inner();
392
+ self.build_expression(it.try_next()?.into_inner())
393
+ }
394
+ Rule::label_check_expression =>
395
+ {
396
+ let it = pair.into_inner();
397
+ Ok(ast::Expression::FunctionCall(ast::FunctionCall {
398
+ name: "has_labels".into(),
399
+ arguments: it
400
+ .enumerate()
401
+ .map(|(i, pair)| {
402
+ if i == 0
403
+ {
404
+ ast::Expression::Variable(ast::Variable {
405
+ identifier: self.var_ids.from_name(pair.as_str()),
406
+ })
407
+ }
408
+ else
409
+ {
410
+ ast::Expression::Value(ast::Value {
411
+ value: value::Value::String(pair.as_str().into()),
412
+ })
413
+ }
414
+ })
415
+ .collect(),
416
+ }))
417
+ }
418
+ unknown_expression => Err(
419
+ error::InternalError::UnxpectedExpression(
420
+ "build_expression_term",
421
+ format!("{unknown_expression:?}"),
422
+ )
423
+ .into(),
424
+ ),
425
+ }
426
+ }
427
+ unknown_expression => Err(
428
+ error::InternalError::UnxpectedExpression(
429
+ "build_expression_term",
430
+ format!("{unknown_expression:?}"),
431
+ )
432
+ .into(),
433
+ ),
434
+ }
435
+ }
436
+
437
+ fn build_map(&self, pair: pest::iterators::Pair<Rule>) -> Result<ast::Expression>
438
+ {
439
+ match pair.as_rule()
440
+ {
441
+ Rule::map => Ok(ast::Expression::Map({
442
+ let map = pair
443
+ .into_inner()
444
+ .map(|k_v_pair| self.build_pair(k_v_pair))
445
+ .collect::<Result<_>>()?;
446
+ ast::Map { map }
447
+ })),
448
+ unknown_expression => Err(
449
+ error::InternalError::UnxpectedExpression("build_map", format!("{unknown_expression:?}"))
450
+ .into(),
451
+ ),
452
+ }
453
+ }
454
+
455
+ fn build_modifiers(&self, pair: pest::iterators::Pair<Rule>) -> Result<ast::Modifiers>
456
+ {
457
+ let mut skip = None;
458
+ let mut limit = None;
459
+ let mut order_by = None;
460
+ for subpair in pair.into_inner()
461
+ {
462
+ match subpair.as_rule()
463
+ {
464
+ Rule::limit =>
465
+ {
466
+ let mut subpair = subpair.into_inner();
467
+ subpair.try_next()?; // eat limit_kw
468
+
469
+ limit = Some(self.build_expression(subpair.try_next()?.into_inner())?)
470
+ }
471
+ Rule::skip =>
472
+ {
473
+ let mut subpair = subpair.into_inner();
474
+ subpair.try_next()?; // eat limit_kw
475
+
476
+ skip = Some(self.build_expression(subpair.try_next()?.into_inner())?)
477
+ }
478
+ Rule::order_by =>
479
+ {
480
+ let mut subpair = subpair.into_inner();
481
+ subpair.try_next()?; // eat order_by_kw
482
+
483
+ order_by = Some(ast::OrderBy {
484
+ expressions: subpair
485
+ .map(|r| match r.as_rule()
486
+ {
487
+ Rule::order_by_asc_expression => Ok(ast::OrderByExpression {
488
+ asc: true,
489
+ expression: self.build_expression(r.into_inner().try_next()?.into_inner())?,
490
+ }),
491
+ Rule::order_by_desc_expression => Ok(ast::OrderByExpression {
492
+ asc: false,
493
+ expression: self.build_expression(r.into_inner().try_next()?.into_inner())?,
494
+ }),
495
+ _ => Err::<_, crate::prelude::ErrorType>(
496
+ InternalError::UnexpectedPair {
497
+ context: "build_modifiers/order_by",
498
+ pair: format!("{:#?}", r),
499
+ }
500
+ .into(),
501
+ ),
502
+ })
503
+ .collect::<Result<_>>()?,
504
+ })
505
+ }
506
+ _ => Err(InternalError::UnexpectedPair {
507
+ context: "build_modifiers",
508
+ pair: format!("{:#?}", subpair),
509
+ })?,
510
+ }
511
+ }
512
+ Ok(ast::Modifiers {
513
+ skip,
514
+ limit,
515
+ order_by,
516
+ })
517
+ }
518
+
519
+ fn build_named_expression(
520
+ &self,
521
+ pair: pest::iterators::Pair<Rule>,
522
+ ) -> Result<ast::NamedExpression>
523
+ {
524
+ match pair.as_rule()
525
+ {
526
+ Rule::named_expression =>
527
+ {
528
+ let mut inner = pair.into_inner();
529
+ match inner.len()
530
+ {
531
+ 1 =>
532
+ {
533
+ let expr = inner.try_next()?;
534
+ Ok(ast::NamedExpression {
535
+ identifier: self.var_ids.from_name(expr.as_str().trim()),
536
+ expression: self.build_expression(expr.into_inner())?,
537
+ })
538
+ }
539
+ 2 => Ok({
540
+ let expression = self.build_expression(inner.try_next()?.into_inner())?;
541
+ let identifier = self.var_ids.from_name(inner.try_next()?.as_str());
542
+ ast::NamedExpression {
543
+ identifier,
544
+ expression,
545
+ }
546
+ }),
547
+ _ =>
548
+ {
549
+ panic!(
550
+ "Invalid number of terms in named expressions {}",
551
+ inner.len()
552
+ );
553
+ }
554
+ }
555
+ }
556
+ unknown_expression => Err(
557
+ error::InternalError::UnxpectedExpression(
558
+ "build_named_expressions",
559
+ format!("{unknown_expression:?}"),
560
+ )
561
+ .into(),
562
+ ),
563
+ }
564
+ }
565
+
566
+ fn build_labels(&self, pair: pest::iterators::Pair<Rule>) -> Result<ast::LabelExpression>
567
+ {
568
+ match pair.as_rule()
569
+ {
570
+ Rule::labels => self.build_labels(pair.into_inner().try_next()?),
571
+ Rule::label_alternative =>
572
+ {
573
+ let mut r = ast::LabelExpression::None;
574
+ let mut inner = pair.into_inner();
575
+ while let Some(next) = inner.next()
576
+ {
577
+ r = r.or(self.build_labels(next)?);
578
+ }
579
+ Ok(r)
580
+ }
581
+ Rule::label_inclusion =>
582
+ {
583
+ let mut r = ast::LabelExpression::None;
584
+ let mut inner = pair.into_inner();
585
+ while let Some(next) = inner.next()
586
+ {
587
+ r = r.and(self.build_labels(next)?);
588
+ }
589
+ Ok(r)
590
+ }
591
+ Rule::label_atom => Ok(ast::LabelExpression::String(pair.as_str().to_string())),
592
+ _ => Err(
593
+ InternalError::UnexpectedPair {
594
+ context: "build_labels",
595
+ pair: format!("{:#?}", pair),
596
+ }
597
+ .into(),
598
+ ),
599
+ }
600
+ }
601
+
602
+ fn build_node_pattern(&self, pair: pest::iterators::Pair<Rule>) -> Result<ast::NodePattern>
603
+ {
604
+ let it = pair.into_inner();
605
+ let mut variable = None;
606
+ let mut labels = ast::LabelExpression::None;
607
+ let mut properties = None;
608
+
609
+ for pair in it
610
+ {
611
+ match pair.as_rule()
612
+ {
613
+ Rule::ident =>
614
+ {
615
+ variable = Some(pair.as_str().to_string());
616
+ }
617
+ Rule::labels =>
618
+ {
619
+ labels = self.build_labels(pair)?;
620
+ }
621
+ Rule::map => properties = Some(self.build_map(pair)?),
622
+ unknown_expression =>
623
+ {
624
+ return Err(
625
+ error::InternalError::UnxpectedExpression(
626
+ "build_node_pattern",
627
+ format!("{unknown_expression:?}"),
628
+ )
629
+ .into(),
630
+ );
631
+ }
632
+ }
633
+ }
634
+ Ok(ast::NodePattern {
635
+ variable: self.var_ids.from_name_optional(variable),
636
+ labels,
637
+ properties,
638
+ })
639
+ }
640
+
641
+ fn build_edge_pattern(
642
+ &self,
643
+ source_node: ast::NodePattern,
644
+ edge_pair: pest::iterators::Pair<Rule>,
645
+ destination_node: ast::NodePattern,
646
+ allow_undirected_edge: bool,
647
+ ) -> Result<ast::EdgePattern>
648
+ {
649
+ let edge_rule = edge_pair.as_rule();
650
+ let it = edge_pair.into_inner().try_next()?.into_inner();
651
+ let mut variable = None;
652
+ let mut labels = ast::LabelExpression::None;
653
+ let mut properties = None;
654
+
655
+ for pair in it
656
+ {
657
+ match pair.as_rule()
658
+ {
659
+ Rule::ident =>
660
+ {
661
+ variable = Some(pair.as_str().to_string());
662
+ }
663
+ Rule::labels =>
664
+ {
665
+ labels = self.build_labels(pair)?;
666
+ }
667
+ Rule::map => properties = Some(self.build_map(pair)?),
668
+ unknown_expression =>
669
+ {
670
+ return Err(
671
+ error::InternalError::UnxpectedExpression(
672
+ "build_edge_pattern",
673
+ format!("{unknown_expression:?}"),
674
+ )
675
+ .into(),
676
+ );
677
+ }
678
+ }
679
+ }
680
+
681
+ match edge_rule
682
+ {
683
+ Rule::directed_edge_pattern => Ok(ast::EdgePattern {
684
+ variable: self.var_ids.from_name_optional(variable),
685
+ source: source_node,
686
+ destination: destination_node,
687
+ directivity: graph::EdgeDirectivity::Directed,
688
+ labels,
689
+ properties,
690
+ }),
691
+ Rule::reversed_edge_pattern => Ok(ast::EdgePattern {
692
+ variable: self.var_ids.from_name_optional(variable),
693
+ source: destination_node,
694
+ destination: source_node,
695
+ directivity: graph::EdgeDirectivity::Directed,
696
+ labels,
697
+ properties,
698
+ }),
699
+ Rule::undirected_edge_pattern =>
700
+ {
701
+ if !allow_undirected_edge
702
+ {
703
+ Err(CompileTimeError::RequiresDirectedRelationship {
704
+ context: "creation",
705
+ })?;
706
+ }
707
+ Ok(ast::EdgePattern {
708
+ variable: self.var_ids.from_name_optional(variable),
709
+ source: source_node,
710
+ destination: destination_node,
711
+ directivity: graph::EdgeDirectivity::Undirected,
712
+ labels,
713
+ properties,
714
+ })
715
+ }
716
+ unknown_expression => Err(
717
+ error::InternalError::UnxpectedExpression(
718
+ "build_pattern/edge_pattern",
719
+ format!("{unknown_expression:?}"),
720
+ )
721
+ .into(),
722
+ ),
723
+ }
724
+ }
725
+
726
+ fn build_patterns(
727
+ &self,
728
+ iterator: &mut pest::iterators::Pairs<Rule>,
729
+ allow_undirected_edge: bool,
730
+ ) -> Result<Vec<ast::Pattern>>
731
+ {
732
+ let mut vec = vec![];
733
+
734
+ for pair in iterator
735
+ {
736
+ vec.append(&mut self.build_pattern(pair, allow_undirected_edge)?);
737
+ }
738
+ Ok(vec)
739
+ }
740
+
741
+ fn build_pattern(
742
+ &self,
743
+ pair: pest::iterators::Pair<Rule>,
744
+ allow_undirected_edge: bool,
745
+ ) -> Result<Vec<ast::Pattern>>
746
+ {
747
+ let mut vec = vec![];
748
+
749
+ match pair.as_rule()
750
+ {
751
+ Rule::node_pattern =>
752
+ {
753
+ vec.push(ast::Pattern::Node(
754
+ self.build_node_pattern(pair.into_inner().try_next()?)?,
755
+ ));
756
+ }
757
+ Rule::edge_pattern =>
758
+ {
759
+ let mut it = pair.into_inner().peekable();
760
+ let mut source_node = self.build_node_pattern(it.try_next()?)?;
761
+
762
+ while let Some(next) = it.next()
763
+ {
764
+ let mut destination_node = self.build_node_pattern(it.try_next()?)?;
765
+
766
+ if it.peek().is_some() && destination_node.variable.is_none()
767
+ {
768
+ destination_node.variable = Some(self.var_ids.anonymous());
769
+ }
770
+
771
+ let edge_pattern = self.build_edge_pattern(
772
+ source_node,
773
+ next,
774
+ destination_node.clone(),
775
+ allow_undirected_edge,
776
+ )?;
777
+ vec.push(ast::Pattern::Edge(edge_pattern));
778
+ source_node = destination_node;
779
+ }
780
+ }
781
+ Rule::path_pattern =>
782
+ {
783
+ let mut it = pair.into_inner();
784
+ let variable = it.try_next()?.as_str().to_string();
785
+ let source_node = self.build_node_pattern(it.try_next()?)?;
786
+ let edge_it = it.try_next()?;
787
+ let destination_node = self.build_node_pattern(it.try_next()?)?;
788
+
789
+ let edge_pattern = self.build_edge_pattern(
790
+ source_node,
791
+ edge_it,
792
+ destination_node,
793
+ allow_undirected_edge,
794
+ )?;
795
+ vec.push(ast::Pattern::Path(ast::PathPattern {
796
+ variable: self.var_ids.from_name(variable),
797
+ edge: edge_pattern,
798
+ }));
799
+ }
800
+ unknown_expression =>
801
+ {
802
+ return Err(
803
+ error::InternalError::UnxpectedExpression(
804
+ "build_node_or_edge_vec",
805
+ format!("{unknown_expression:?}"),
806
+ )
807
+ .into(),
808
+ );
809
+ }
810
+ };
811
+ Ok(vec)
812
+ }
813
+
814
+ fn build_match(&self, pair: pest::iterators::Pair<Rule>, optional: bool)
815
+ -> Result<ast::Statement>
816
+ {
817
+ let inner = pair.into_inner();
818
+ let mut where_expression = None;
819
+ let mut patterns = vec![];
820
+ for pair in inner
821
+ {
822
+ match pair.as_rule()
823
+ {
824
+ Rule::where_modifier =>
825
+ {
826
+ where_expression =
827
+ Some(self.build_expression(pair.into_inner().try_next()?.into_inner())?)
828
+ }
829
+ _ => patterns.append(&mut self.build_pattern(pair, true)?),
830
+ }
831
+ }
832
+
833
+ Ok(ast::Statement::Match(ast::Match {
834
+ patterns,
835
+ where_expression,
836
+ optional,
837
+ }))
838
+ }
839
+
840
+ fn build_return_with_statement(
841
+ &self,
842
+ pairs: pest::iterators::Pairs<Rule>,
843
+ ) -> Result<(
844
+ bool,
845
+ Vec<ast::NamedExpression>,
846
+ ast::Modifiers,
847
+ Option<ast::Expression>,
848
+ )>
849
+ {
850
+ let mut all = false;
851
+ let mut expressions = vec![];
852
+ let mut modifiers = Default::default();
853
+ let mut where_expression = Default::default();
854
+
855
+ for sub_pair in pairs
856
+ {
857
+ match sub_pair.as_rule()
858
+ {
859
+ Rule::star => all = true,
860
+ Rule::named_expression => expressions.push(self.build_named_expression(sub_pair)?),
861
+ Rule::modifiers => modifiers = self.build_modifiers(sub_pair)?,
862
+ Rule::where_modifier =>
863
+ {
864
+ where_expression =
865
+ Some(self.build_expression(sub_pair.into_inner().try_next()?.into_inner())?)
866
+ }
867
+ _ => Err(InternalError::UnexpectedPair {
868
+ context: "build_ast_from_statement/with_statement",
869
+ pair: sub_pair.as_str().to_string(),
870
+ })?,
871
+ }
872
+ }
873
+ Ok((all, expressions, modifiers, where_expression))
874
+ }
875
+ fn build_ident(&self, iterator: &mut pest::iterators::Pairs<Rule>) -> Result<String>
876
+ {
877
+ let pair = iterator.next().ok_or_else(|| InternalError::MissingPair {
878
+ context: "build_ident",
879
+ })?;
880
+ match pair.as_rule()
881
+ {
882
+ Rule::ident => Ok(pair.as_str().to_string()),
883
+ _ => Err(
884
+ InternalError::UnexpectedPair {
885
+ context: "build_ident",
886
+ pair: pair.to_string(),
887
+ }
888
+ .into(),
889
+ ),
890
+ }
891
+ }
892
+ fn build_ast_from_statement(&self, pair: pest::iterators::Pair<Rule>) -> Result<ast::Statement>
893
+ {
894
+ match pair.as_rule()
895
+ {
896
+ Rule::create_graph_statement => Ok(ast::Statement::CreateGraph(ast::CreateGraph {
897
+ name: self.build_ident(&mut pair.into_inner())?,
898
+ })),
899
+ Rule::drop_graph_statement => Ok(ast::Statement::DropGraph(ast::DropGraph {
900
+ name: self.build_ident(&mut pair.into_inner())?,
901
+ if_exists: false,
902
+ })),
903
+ Rule::drop_graph_if_exists_statement => Ok(ast::Statement::DropGraph(ast::DropGraph {
904
+ name: self.build_ident(&mut pair.into_inner())?,
905
+ if_exists: true,
906
+ })),
907
+ Rule::use_graph_statement => Ok(ast::Statement::UseGraph(ast::UseGraph {
908
+ name: self.build_ident(&mut pair.into_inner())?,
909
+ })),
910
+ Rule::create_statement => Ok(ast::Statement::Create(ast::Create {
911
+ patterns: self.build_patterns(&mut pair.into_inner(), false)?,
912
+ })),
913
+ Rule::match_statement => self.build_match(pair, false),
914
+ Rule::optional_match_statement => self.build_match(pair.into_inner().try_next()?, true),
915
+ Rule::return_statement =>
916
+ {
917
+ let (all, expressions, modifiers, where_expression) =
918
+ self.build_return_with_statement(pair.into_inner())?;
919
+
920
+ Ok(ast::Statement::Return(ast::Return {
921
+ all,
922
+ expressions,
923
+ modifiers,
924
+ where_expression,
925
+ }))
926
+ }
927
+ Rule::with_statement =>
928
+ {
929
+ let (all, expressions, modifiers, where_expression) =
930
+ self.build_return_with_statement(pair.into_inner())?;
931
+
932
+ Ok(ast::Statement::With(ast::With {
933
+ all,
934
+ expressions,
935
+ modifiers,
936
+ where_expression,
937
+ }))
938
+ }
939
+ Rule::unwind_statement =>
940
+ {
941
+ let pair = pair
942
+ .into_inner()
943
+ .next()
944
+ .ok_or_else(|| InternalError::MissingPair {
945
+ context: "build_ast_from_statement/unwind_statement",
946
+ })?;
947
+
948
+ let ne = match pair.as_rule()
949
+ {
950
+ Rule::named_expression => self.build_named_expression(pair),
951
+ _ => Err(
952
+ InternalError::UnexpectedPair {
953
+ context: "build_ast_from_statement/with_statement",
954
+ pair: pair.as_str().to_string(),
955
+ }
956
+ .into(),
957
+ ),
958
+ }?;
959
+ Ok(ast::Statement::Unwind(ast::Unwind {
960
+ identifier: ne.identifier,
961
+ expression: ne.expression,
962
+ }))
963
+ }
964
+ Rule::delete_statement | Rule::detach_delete_statement =>
965
+ {
966
+ let detach = match pair.as_rule()
967
+ {
968
+ Rule::delete_statement => false,
969
+ Rule::detach_delete_statement => true,
970
+ _ =>
971
+ {
972
+ return Err(
973
+ InternalError::UnexpectedPair {
974
+ context: "build_ast_from_statement/delete_statement",
975
+ pair: pair.to_string(),
976
+ }
977
+ .into(),
978
+ )
979
+ }
980
+ };
981
+
982
+ let pairs = pair.into_inner();
983
+
984
+ let expressions = pairs
985
+ .into_iter()
986
+ .map(|pair| self.build_expression(pair.into_inner()))
987
+ .collect::<Result<_>>()?;
988
+
989
+ Ok(ast::Statement::Delete(ast::Delete {
990
+ detach,
991
+ expressions,
992
+ }))
993
+ }
994
+ Rule::set_statement =>
995
+ {
996
+ let mut updates = Vec::<ast::OneUpdate>::new();
997
+ for pair in pair.into_inner()
998
+ {
999
+ match pair.as_rule()
1000
+ {
1001
+ Rule::set_eq_expression | Rule::set_add_expression =>
1002
+ {
1003
+ let add_property = pair.as_rule() == Rule::set_add_expression;
1004
+
1005
+ let mut pair = pair.into_inner();
1006
+ let mut pair_left = pair.try_next()?.into_inner();
1007
+ let target = self.var_ids.from_name(pair_left.try_next()?.as_str());
1008
+ let path = pair_left.map(|el| el.as_str().to_string()).collect();
1009
+ let expression = self.build_expression(pair.try_next()?.into_inner())?;
1010
+ let update_property = ast::UpdateProperty {
1011
+ target,
1012
+ path,
1013
+ expression,
1014
+ };
1015
+ if add_property
1016
+ {
1017
+ updates.push(ast::OneUpdate::AddProperty(update_property));
1018
+ }
1019
+ else
1020
+ {
1021
+ updates.push(ast::OneUpdate::SetProperty(update_property));
1022
+ }
1023
+ }
1024
+ Rule::set_label_expression =>
1025
+ {
1026
+ let mut pair = pair.into_inner();
1027
+ let target = self.var_ids.from_name(pair.try_next()?.as_str());
1028
+ let labels = pair.map(|el| el.as_str().to_string()).collect();
1029
+ updates.push(ast::OneUpdate::AddLabels(ast::AddRemoveLabels {
1030
+ target,
1031
+ labels,
1032
+ }));
1033
+ }
1034
+ unknown_expression => Err(error::InternalError::UnxpectedExpression(
1035
+ "build_ast_from_statement/set_statement",
1036
+ format!("{unknown_expression:?}"),
1037
+ ))?,
1038
+ }
1039
+ }
1040
+ Ok(ast::Statement::Update(ast::Update { updates }))
1041
+ }
1042
+ Rule::remove_statement =>
1043
+ {
1044
+ let mut updates = Vec::<ast::OneUpdate>::new();
1045
+ for pair in pair.into_inner()
1046
+ {
1047
+ match pair.as_rule()
1048
+ {
1049
+ Rule::remove_member_access =>
1050
+ {
1051
+ let mut pair = pair.into_inner();
1052
+ let target = self.var_ids.from_name(pair.try_next()?.as_str());
1053
+ let path = pair.map(|el| el.as_str().to_string()).collect();
1054
+ updates.push(ast::OneUpdate::RemoveProperty(ast::RemoveProperty {
1055
+ target,
1056
+ path,
1057
+ }));
1058
+ }
1059
+ Rule::set_label_expression =>
1060
+ {
1061
+ let mut pair = pair.into_inner();
1062
+ let target = self.var_ids.from_name(pair.try_next()?.as_str());
1063
+ let labels = pair.map(|el| el.as_str().to_string()).collect();
1064
+ updates.push(ast::OneUpdate::RemoveLabels(ast::AddRemoveLabels {
1065
+ target,
1066
+ labels,
1067
+ }));
1068
+ }
1069
+ unknown_expression => Err(error::InternalError::UnxpectedExpression(
1070
+ "build_ast_from_statement/remove_statement",
1071
+ format!("{unknown_expression:?}"),
1072
+ ))?,
1073
+ }
1074
+ }
1075
+ Ok(ast::Statement::Update(ast::Update { updates }))
1076
+ }
1077
+ Rule::call_statement =>
1078
+ {
1079
+ let name = pair
1080
+ .into_inner()
1081
+ .map(|pair| pair.as_str())
1082
+ .collect::<Vec<&str>>()
1083
+ .join(".");
1084
+ Ok(ast::Statement::Call(ast::Call {
1085
+ name: name,
1086
+ arguments: Default::default(),
1087
+ }))
1088
+ }
1089
+ unknown_expression => Err(
1090
+ error::InternalError::UnxpectedExpression(
1091
+ "build_ast_from_statement",
1092
+ format!("{unknown_expression:?}"),
1093
+ )
1094
+ .into(),
1095
+ ),
1096
+ }
1097
+ }
1098
+ }
1099
+
1100
+ pub(crate) fn parse(input: &str) -> Result<ast::Queries>
1101
+ {
1102
+ let pratt = PrattParser::new()
1103
+ .op(Op::infix(Rule::xor, Assoc::Left))
1104
+ .op(Op::infix(Rule::or, Assoc::Left))
1105
+ .op(Op::infix(Rule::and, Assoc::Left))
1106
+ .op(Op::infix(Rule::equal, Assoc::Left) | Op::infix(Rule::different, Assoc::Left))
1107
+ .op(
1108
+ Op::infix(Rule::inferior, Assoc::Left)
1109
+ | Op::infix(Rule::inferior_equal, Assoc::Left)
1110
+ | Op::infix(Rule::superior, Assoc::Left)
1111
+ | Op::infix(Rule::superior_equal, Assoc::Left),
1112
+ )
1113
+ .op(Op::infix(Rule::not_in, Assoc::Left) | Op::infix(Rule::in_, Assoc::Left))
1114
+ .op(Op::infix(Rule::addition, Assoc::Left) | Op::infix(Rule::subtraction, Assoc::Left))
1115
+ .op(
1116
+ Op::infix(Rule::multiplication, Assoc::Left)
1117
+ | Op::infix(Rule::division, Assoc::Left)
1118
+ | Op::infix(Rule::modulo, Assoc::Left)
1119
+ | Op::infix(Rule::exponent, Assoc::Left),
1120
+ )
1121
+ .op(Op::prefix(Rule::not) | Op::prefix(Rule::negation))
1122
+ .op(
1123
+ Op::postfix(Rule::is_null)
1124
+ | Op::postfix(Rule::is_not_null)
1125
+ | Op::postfix(Rule::member_access)
1126
+ | Op::postfix(Rule::index_access)
1127
+ | Op::postfix(Rule::range_access)
1128
+ | Op::postfix(Rule::range_access_to),
1129
+ );
1130
+ let ast_builder = AstBuilder {
1131
+ pratt,
1132
+ var_ids: Default::default(),
1133
+ };
1134
+ let pairs = GQLParser::parse(Rule::queries, input)?;
1135
+ let mut queries = Vec::<ast::Statements>::new();
1136
+ if crate::consts::SHOW_PARSE_TREE
1137
+ {
1138
+ println!("pairs = {:#?}", pairs);
1139
+ }
1140
+ for q_pair in pairs
1141
+ {
1142
+ match q_pair.as_rule()
1143
+ {
1144
+ Rule::query =>
1145
+ {
1146
+ let mut stmts = ast::Statements::new();
1147
+
1148
+ for pair in q_pair.into_inner()
1149
+ {
1150
+ match pair.as_rule()
1151
+ {
1152
+ Rule::statement =>
1153
+ {
1154
+ stmts.push(ast_builder.build_ast_from_statement(pair.into_inner().try_next()?)?);
1155
+ }
1156
+ unknown_expression =>
1157
+ {
1158
+ Err(error::InternalError::UnxpectedExpression(
1159
+ "parse",
1160
+ format!("{unknown_expression:?}"),
1161
+ ))?;
1162
+ }
1163
+ }
1164
+ }
1165
+ queries.push(stmts);
1166
+ }
1167
+ Rule::EOI =>
1168
+ {}
1169
+ unknown_expression =>
1170
+ {
1171
+ Err(error::InternalError::UnxpectedExpression(
1172
+ "parse",
1173
+ format!("{unknown_expression:?}"),
1174
+ ))?;
1175
+ }
1176
+ }
1177
+ }
1178
+ if crate::consts::SHOW_AST
1179
+ {
1180
+ println!("ast = {:#?}", &queries);
1181
+ }
1182
+ Ok(queries)
1183
+ }