gqlite 1.2.0 → 1.2.2

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 +133 -123
  4. data/ext/gqliterb/Cargo.toml +3 -6
  5. data/ext/gqliterb/src/lib.rs +2 -2
  6. data/ext/gqliterb/vendor/gqlitedb/Cargo.lock +2060 -0
  7. data/ext/gqliterb/vendor/gqlitedb/Cargo.toml +132 -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 +236 -0
  20. data/ext/gqliterb/vendor/gqlitedb/src/compiler/expression_analyser.rs +427 -0
  21. data/ext/gqliterb/vendor/gqlitedb/src/compiler/variables_manager.rs +620 -0
  22. data/ext/gqliterb/vendor/gqlitedb/src/compiler.rs +1106 -0
  23. data/ext/gqliterb/vendor/gqlitedb/src/connection.rs +208 -0
  24. data/ext/gqliterb/vendor/gqlitedb/src/consts.rs +10 -0
  25. data/ext/gqliterb/vendor/gqlitedb/src/error.rs +621 -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 +48 -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 +412 -0
  35. data/ext/gqliterb/vendor/gqlitedb/src/graph.rs +268 -0
  36. data/ext/gqliterb/vendor/gqlitedb/src/interpreter/evaluators.rs +1788 -0
  37. data/ext/gqliterb/vendor/gqlitedb/src/interpreter/instructions.rs +262 -0
  38. data/ext/gqliterb/vendor/gqlitedb/src/interpreter/mod.rs +4 -0
  39. data/ext/gqliterb/vendor/gqlitedb/src/lib.rs +42 -0
  40. data/ext/gqliterb/vendor/gqlitedb/src/parser/ast.rs +625 -0
  41. data/ext/gqliterb/vendor/gqlitedb/src/parser/gql.pest +191 -0
  42. data/ext/gqliterb/vendor/gqlitedb/src/parser/parser.rs +1153 -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 +1250 -0
  48. data/ext/gqliterb/vendor/gqlitedb/src/store/sqlite.rs +994 -0
  49. data/ext/gqliterb/vendor/gqlitedb/src/store.rs +432 -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 +39 -0
  54. data/ext/gqliterb/vendor/gqlitedb/src/tests/store/sqlite.rs +39 -0
  55. data/ext/gqliterb/vendor/gqlitedb/src/tests/store.rs +462 -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 +559 -0
  65. data/ext/gqliterb/vendor/gqlitedb/src/value_table.rs +616 -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,1153 @@
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::or => Ok(
201
+ ast::LogicalOr {
202
+ left: lhs?,
203
+ right: rhs?,
204
+ }
205
+ .into(),
206
+ ),
207
+ Rule::and => Ok(
208
+ ast::LogicalAnd {
209
+ left: lhs?,
210
+ right: rhs?,
211
+ }
212
+ .into(),
213
+ ),
214
+ Rule::xor => Ok(
215
+ ast::LogicalXor {
216
+ left: lhs?,
217
+ right: rhs?,
218
+ }
219
+ .into(),
220
+ ),
221
+ Rule::equal => Ok(
222
+ ast::RelationalEqual {
223
+ left: lhs?,
224
+ right: rhs?,
225
+ }
226
+ .into(),
227
+ ),
228
+ Rule::different => Ok(
229
+ ast::RelationalDifferent {
230
+ left: lhs?,
231
+ right: rhs?,
232
+ }
233
+ .into(),
234
+ ),
235
+ Rule::inferior => Ok(
236
+ ast::RelationalInferior {
237
+ left: lhs?,
238
+ right: rhs?,
239
+ }
240
+ .into(),
241
+ ),
242
+ Rule::superior => Ok(
243
+ ast::RelationalSuperior {
244
+ left: lhs?,
245
+ right: rhs?,
246
+ }
247
+ .into(),
248
+ ),
249
+ Rule::inferior_equal => Ok(
250
+ ast::RelationalInferiorEqual {
251
+ left: lhs?,
252
+ right: rhs?,
253
+ }
254
+ .into(),
255
+ ),
256
+ Rule::superior_equal => Ok(
257
+ ast::RelationalSuperiorEqual {
258
+ left: lhs?,
259
+ right: rhs?,
260
+ }
261
+ .into(),
262
+ ),
263
+ Rule::not_in => Ok(
264
+ ast::RelationalNotIn {
265
+ left: lhs?,
266
+ right: rhs?,
267
+ }
268
+ .into(),
269
+ ),
270
+ Rule::in_ => Ok(
271
+ ast::RelationalIn {
272
+ left: lhs?,
273
+ right: rhs?,
274
+ }
275
+ .into(),
276
+ ),
277
+ unknown_expression => Err(
278
+ error::InternalError::UnxpectedExpression(
279
+ "build_expression/map_postfix",
280
+ format!("{unknown_expression:?}"),
281
+ )
282
+ .into(),
283
+ ),
284
+ })
285
+ .parse(pairs)
286
+ }
287
+
288
+ fn build_expression_primary(&self, pair: pest::iterators::Pair<Rule>) -> Result<ast::Expression>
289
+ {
290
+ match pair.as_rule()
291
+ {
292
+ Rule::expression_term =>
293
+ {
294
+ let pair = pair.into_inner().try_next()?;
295
+ match pair.as_rule()
296
+ {
297
+ Rule::null_lit => Ok(ast::Expression::Value(ast::Value {
298
+ value: value::Value::Null,
299
+ })),
300
+ Rule::true_lit => Ok(ast::Expression::Value(ast::Value {
301
+ value: value::Value::Boolean(true),
302
+ })),
303
+ Rule::false_lit => Ok(ast::Expression::Value(ast::Value {
304
+ value: value::Value::Boolean(false),
305
+ })),
306
+ Rule::int => Ok(ast::Expression::Value(ast::Value {
307
+ value: {
308
+ value::Value::Integer(
309
+ i64::from_str(pair.as_str())
310
+ .map_err(|e| error::parse_int_error_to_compile_error(pair.as_str(), e))?,
311
+ )
312
+ },
313
+ })),
314
+ Rule::octa_int => Ok(ast::Expression::Value(ast::Value {
315
+ value: {
316
+ value::Value::Integer(
317
+ i64::from_str_radix(&remove_hex_prefix(pair.as_str()), 8)
318
+ .map_err(|e| error::parse_int_error_to_compile_error(pair.as_str(), e))?,
319
+ )
320
+ },
321
+ })),
322
+ Rule::hexa_int => Ok(ast::Expression::Value(ast::Value {
323
+ value: {
324
+ value::Value::Integer(
325
+ i64::from_str_radix(&remove_hex_prefix(pair.as_str()), 16)
326
+ .map_err(|e| error::parse_int_error_to_compile_error(pair.as_str(), e))?,
327
+ )
328
+ },
329
+ })),
330
+ Rule::num => Ok(ast::Expression::Value(ast::Value {
331
+ value: value::Value::Float(validate_float(pair.as_str().parse()?, pair.as_str())?),
332
+ })),
333
+ Rule::ident => Ok(ast::Expression::Variable(ast::Variable {
334
+ identifier: self.var_ids.from_name(pair.as_str()),
335
+ })),
336
+ Rule::parameter => Ok(ast::Expression::Parameter(ast::Parameter {
337
+ name: pair.as_str().to_string(),
338
+ })),
339
+ Rule::array => Ok(ast::Expression::Array(ast::Array {
340
+ array: pair
341
+ .into_inner()
342
+ .map(|pair| self.build_expression(pair.into_inner()))
343
+ .collect::<Result<Vec<ast::Expression>>>()?,
344
+ })),
345
+ Rule::map => self.build_map(pair),
346
+ Rule::string_literal => Ok(ast::Expression::Value(ast::Value {
347
+ value: value::Value::String(pair.into_inner().try_next()?.as_str().to_string()),
348
+ })),
349
+ Rule::function_call =>
350
+ {
351
+ let mut it = pair.into_inner();
352
+ let function_name = it
353
+ .next()
354
+ .ok_or_else(|| error::InternalError::MissingFunctionName)?
355
+ .as_str();
356
+ Ok(ast::Expression::FunctionCall(ast::FunctionCall {
357
+ name: function_name.to_string(),
358
+ arguments: it
359
+ .map(|pair| self.build_expression(pair.into_inner()))
360
+ .collect::<Result<_>>()?,
361
+ }))
362
+ }
363
+ Rule::count_star => Ok(ast::Expression::FunctionCall(ast::FunctionCall {
364
+ name: "count".into(),
365
+ arguments: vec![ast::Expression::Value(ast::Value { value: 0.into() })],
366
+ })),
367
+ Rule::parenthesised_expression =>
368
+ {
369
+ let mut it = pair.into_inner();
370
+ self.build_expression(it.try_next()?.into_inner())
371
+ }
372
+ Rule::label_check_expression =>
373
+ {
374
+ let it = pair.into_inner();
375
+ Ok(ast::Expression::FunctionCall(ast::FunctionCall {
376
+ name: "has_labels".into(),
377
+ arguments: it
378
+ .enumerate()
379
+ .map(|(i, pair)| {
380
+ if i == 0
381
+ {
382
+ ast::Expression::Variable(ast::Variable {
383
+ identifier: self.var_ids.from_name(pair.as_str()),
384
+ })
385
+ }
386
+ else
387
+ {
388
+ ast::Expression::Value(ast::Value {
389
+ value: value::Value::String(pair.as_str().into()),
390
+ })
391
+ }
392
+ })
393
+ .collect(),
394
+ }))
395
+ }
396
+ unknown_expression => Err(
397
+ error::InternalError::UnxpectedExpression(
398
+ "build_expression_term",
399
+ format!("{unknown_expression:?}"),
400
+ )
401
+ .into(),
402
+ ),
403
+ }
404
+ }
405
+ unknown_expression => Err(
406
+ error::InternalError::UnxpectedExpression(
407
+ "build_expression_term",
408
+ format!("{unknown_expression:?}"),
409
+ )
410
+ .into(),
411
+ ),
412
+ }
413
+ }
414
+
415
+ fn build_map(&self, pair: pest::iterators::Pair<Rule>) -> Result<ast::Expression>
416
+ {
417
+ match pair.as_rule()
418
+ {
419
+ Rule::map => Ok(ast::Expression::Map({
420
+ let map = pair
421
+ .into_inner()
422
+ .map(|k_v_pair| self.build_pair(k_v_pair))
423
+ .collect::<Result<_>>()?;
424
+ ast::Map { map }
425
+ })),
426
+ unknown_expression => Err(
427
+ error::InternalError::UnxpectedExpression("build_map", format!("{unknown_expression:?}"))
428
+ .into(),
429
+ ),
430
+ }
431
+ }
432
+
433
+ fn build_modifiers(&self, pair: pest::iterators::Pair<Rule>) -> Result<ast::Modifiers>
434
+ {
435
+ let mut skip = None;
436
+ let mut limit = None;
437
+ let mut order_by = None;
438
+ for subpair in pair.into_inner()
439
+ {
440
+ match subpair.as_rule()
441
+ {
442
+ Rule::limit =>
443
+ {
444
+ let mut subpair = subpair.into_inner();
445
+ subpair.try_next()?; // eat limit_kw
446
+
447
+ limit = Some(self.build_expression(subpair.try_next()?.into_inner())?)
448
+ }
449
+ Rule::skip =>
450
+ {
451
+ let mut subpair = subpair.into_inner();
452
+ subpair.try_next()?; // eat limit_kw
453
+
454
+ skip = Some(self.build_expression(subpair.try_next()?.into_inner())?)
455
+ }
456
+ Rule::order_by =>
457
+ {
458
+ let mut subpair = subpair.into_inner();
459
+ subpair.try_next()?; // eat order_by_kw
460
+
461
+ order_by = Some(ast::OrderBy {
462
+ expressions: subpair
463
+ .map(|r| match r.as_rule()
464
+ {
465
+ Rule::order_by_asc_expression => Ok(ast::OrderByExpression {
466
+ asc: true,
467
+ expression: self.build_expression(r.into_inner().try_next()?.into_inner())?,
468
+ }),
469
+ Rule::order_by_desc_expression => Ok(ast::OrderByExpression {
470
+ asc: false,
471
+ expression: self.build_expression(r.into_inner().try_next()?.into_inner())?,
472
+ }),
473
+ _ => Err::<_, crate::prelude::ErrorType>(
474
+ InternalError::UnexpectedPair {
475
+ context: "build_modifiers/order_by",
476
+ pair: format!("{:#?}", r),
477
+ }
478
+ .into(),
479
+ ),
480
+ })
481
+ .collect::<Result<_>>()?,
482
+ })
483
+ }
484
+ _ => Err(InternalError::UnexpectedPair {
485
+ context: "build_modifiers",
486
+ pair: format!("{:#?}", subpair),
487
+ })?,
488
+ }
489
+ }
490
+ Ok(ast::Modifiers {
491
+ skip,
492
+ limit,
493
+ order_by,
494
+ })
495
+ }
496
+
497
+ fn build_named_expression(
498
+ &self,
499
+ pair: pest::iterators::Pair<Rule>,
500
+ ) -> Result<ast::NamedExpression>
501
+ {
502
+ match pair.as_rule()
503
+ {
504
+ Rule::named_expression =>
505
+ {
506
+ let mut inner = pair.into_inner();
507
+ match inner.len()
508
+ {
509
+ 1 =>
510
+ {
511
+ let expr = inner.try_next()?;
512
+ Ok(ast::NamedExpression {
513
+ identifier: self.var_ids.from_name(expr.as_str().trim()),
514
+ expression: self.build_expression(expr.into_inner())?,
515
+ })
516
+ }
517
+ 2 => Ok({
518
+ let expression = self.build_expression(inner.try_next()?.into_inner())?;
519
+ let identifier = self.var_ids.from_name(inner.try_next()?.as_str());
520
+ ast::NamedExpression {
521
+ identifier,
522
+ expression,
523
+ }
524
+ }),
525
+ _ =>
526
+ {
527
+ panic!(
528
+ "Invalid number of terms in named expressions {}",
529
+ inner.len()
530
+ );
531
+ }
532
+ }
533
+ }
534
+ unknown_expression => Err(
535
+ error::InternalError::UnxpectedExpression(
536
+ "build_named_expressions",
537
+ format!("{unknown_expression:?}"),
538
+ )
539
+ .into(),
540
+ ),
541
+ }
542
+ }
543
+
544
+ fn build_labels(&self, pair: pest::iterators::Pair<Rule>) -> Result<ast::LabelExpression>
545
+ {
546
+ match pair.as_rule()
547
+ {
548
+ Rule::labels => self.build_labels(pair.into_inner().try_next()?),
549
+ Rule::label_alternative =>
550
+ {
551
+ let mut r = ast::LabelExpression::None;
552
+ let mut inner = pair.into_inner();
553
+ while let Some(next) = inner.next()
554
+ {
555
+ r = r.or(self.build_labels(next)?);
556
+ }
557
+ Ok(r)
558
+ }
559
+ Rule::label_inclusion =>
560
+ {
561
+ let mut r = ast::LabelExpression::None;
562
+ let mut inner = pair.into_inner();
563
+ while let Some(next) = inner.next()
564
+ {
565
+ r = r.and(self.build_labels(next)?);
566
+ }
567
+ Ok(r)
568
+ }
569
+ Rule::label_atom => Ok(ast::LabelExpression::String(pair.as_str().to_string())),
570
+ _ => Err(
571
+ InternalError::UnexpectedPair {
572
+ context: "build_labels",
573
+ pair: format!("{:#?}", pair),
574
+ }
575
+ .into(),
576
+ ),
577
+ }
578
+ }
579
+
580
+ fn build_node_pattern(&self, pair: pest::iterators::Pair<Rule>) -> Result<ast::NodePattern>
581
+ {
582
+ let it = pair.into_inner();
583
+ let mut variable = None;
584
+ let mut labels = ast::LabelExpression::None;
585
+ let mut properties = None;
586
+
587
+ for pair in it
588
+ {
589
+ match pair.as_rule()
590
+ {
591
+ Rule::ident =>
592
+ {
593
+ variable = Some(pair.as_str().to_string());
594
+ }
595
+ Rule::labels =>
596
+ {
597
+ labels = self.build_labels(pair)?;
598
+ }
599
+ Rule::map => properties = Some(self.build_map(pair)?),
600
+ unknown_expression =>
601
+ {
602
+ return Err(
603
+ error::InternalError::UnxpectedExpression(
604
+ "build_node_pattern",
605
+ format!("{unknown_expression:?}"),
606
+ )
607
+ .into(),
608
+ );
609
+ }
610
+ }
611
+ }
612
+ Ok(ast::NodePattern {
613
+ variable: self.var_ids.from_name_optional(variable),
614
+ labels,
615
+ properties,
616
+ })
617
+ }
618
+
619
+ fn build_edge_pattern(
620
+ &self,
621
+ source_node: ast::NodePattern,
622
+ edge_pair: pest::iterators::Pair<Rule>,
623
+ destination_node: ast::NodePattern,
624
+ allow_undirected_edge: bool,
625
+ ) -> Result<ast::EdgePattern>
626
+ {
627
+ let edge_rule = edge_pair.as_rule();
628
+ let it = edge_pair.into_inner().try_next()?.into_inner();
629
+ let mut variable = None;
630
+ let mut labels = ast::LabelExpression::None;
631
+ let mut properties = None;
632
+
633
+ for pair in it
634
+ {
635
+ match pair.as_rule()
636
+ {
637
+ Rule::ident =>
638
+ {
639
+ variable = Some(pair.as_str().to_string());
640
+ }
641
+ Rule::labels =>
642
+ {
643
+ labels = self.build_labels(pair)?;
644
+ }
645
+ Rule::map => properties = Some(self.build_map(pair)?),
646
+ unknown_expression =>
647
+ {
648
+ return Err(
649
+ error::InternalError::UnxpectedExpression(
650
+ "build_edge_pattern",
651
+ format!("{unknown_expression:?}"),
652
+ )
653
+ .into(),
654
+ );
655
+ }
656
+ }
657
+ }
658
+
659
+ match edge_rule
660
+ {
661
+ Rule::directed_edge_pattern => Ok(ast::EdgePattern {
662
+ variable: self.var_ids.from_name_optional(variable),
663
+ source: source_node,
664
+ destination: destination_node,
665
+ directivity: graph::EdgeDirectivity::Directed,
666
+ labels,
667
+ properties,
668
+ }),
669
+ Rule::reversed_edge_pattern => Ok(ast::EdgePattern {
670
+ variable: self.var_ids.from_name_optional(variable),
671
+ source: destination_node,
672
+ destination: source_node,
673
+ directivity: graph::EdgeDirectivity::Directed,
674
+ labels,
675
+ properties,
676
+ }),
677
+ Rule::undirected_edge_pattern =>
678
+ {
679
+ if !allow_undirected_edge
680
+ {
681
+ Err(CompileTimeError::RequiresDirectedRelationship {
682
+ context: "creation",
683
+ })?;
684
+ }
685
+ Ok(ast::EdgePattern {
686
+ variable: self.var_ids.from_name_optional(variable),
687
+ source: source_node,
688
+ destination: destination_node,
689
+ directivity: graph::EdgeDirectivity::Undirected,
690
+ labels,
691
+ properties,
692
+ })
693
+ }
694
+ unknown_expression => Err(
695
+ error::InternalError::UnxpectedExpression(
696
+ "build_pattern/edge_pattern",
697
+ format!("{unknown_expression:?}"),
698
+ )
699
+ .into(),
700
+ ),
701
+ }
702
+ }
703
+
704
+ fn build_patterns(
705
+ &self,
706
+ iterator: &mut pest::iterators::Pairs<Rule>,
707
+ allow_undirected_edge: bool,
708
+ ) -> Result<Vec<ast::Pattern>>
709
+ {
710
+ let mut vec = vec![];
711
+
712
+ for pair in iterator
713
+ {
714
+ vec.append(&mut self.build_pattern(pair, allow_undirected_edge)?);
715
+ }
716
+ Ok(vec)
717
+ }
718
+
719
+ fn build_pattern(
720
+ &self,
721
+ pair: pest::iterators::Pair<Rule>,
722
+ allow_undirected_edge: bool,
723
+ ) -> Result<Vec<ast::Pattern>>
724
+ {
725
+ let mut vec = vec![];
726
+
727
+ match pair.as_rule()
728
+ {
729
+ Rule::node_pattern =>
730
+ {
731
+ vec.push(ast::Pattern::Node(
732
+ self.build_node_pattern(pair.into_inner().try_next()?)?,
733
+ ));
734
+ }
735
+ Rule::edge_pattern =>
736
+ {
737
+ let mut it = pair.into_inner().peekable();
738
+ let mut source_node = self.build_node_pattern(it.try_next()?)?;
739
+
740
+ while let Some(next) = it.next()
741
+ {
742
+ let mut destination_node = self.build_node_pattern(it.try_next()?)?;
743
+
744
+ if it.peek().is_some() && destination_node.variable.is_none()
745
+ {
746
+ destination_node.variable = Some(self.var_ids.anonymous());
747
+ }
748
+
749
+ let edge_pattern = self.build_edge_pattern(
750
+ source_node,
751
+ next,
752
+ destination_node.clone(),
753
+ allow_undirected_edge,
754
+ )?;
755
+ vec.push(ast::Pattern::Edge(edge_pattern));
756
+ source_node = destination_node;
757
+ }
758
+ }
759
+ Rule::path_pattern =>
760
+ {
761
+ let mut it = pair.into_inner();
762
+ let variable = it.try_next()?.as_str().to_string();
763
+ let source_node = self.build_node_pattern(it.try_next()?)?;
764
+ let edge_it = it.try_next()?;
765
+ let destination_node = self.build_node_pattern(it.try_next()?)?;
766
+
767
+ let edge_pattern = self.build_edge_pattern(
768
+ source_node,
769
+ edge_it,
770
+ destination_node,
771
+ allow_undirected_edge,
772
+ )?;
773
+ vec.push(ast::Pattern::Path(ast::PathPattern {
774
+ variable: self.var_ids.from_name(variable),
775
+ edge: edge_pattern,
776
+ }));
777
+ }
778
+ unknown_expression =>
779
+ {
780
+ return Err(
781
+ error::InternalError::UnxpectedExpression(
782
+ "build_node_or_edge_vec",
783
+ format!("{unknown_expression:?}"),
784
+ )
785
+ .into(),
786
+ );
787
+ }
788
+ };
789
+ Ok(vec)
790
+ }
791
+
792
+ fn build_match(&self, pair: pest::iterators::Pair<Rule>, optional: bool)
793
+ -> Result<ast::Statement>
794
+ {
795
+ let inner = pair.into_inner();
796
+ let mut where_expression = None;
797
+ let mut patterns = vec![];
798
+ for pair in inner
799
+ {
800
+ match pair.as_rule()
801
+ {
802
+ Rule::where_modifier =>
803
+ {
804
+ where_expression =
805
+ Some(self.build_expression(pair.into_inner().try_next()?.into_inner())?)
806
+ }
807
+ _ => patterns.append(&mut self.build_pattern(pair, true)?),
808
+ }
809
+ }
810
+
811
+ Ok(ast::Statement::Match(ast::Match {
812
+ patterns,
813
+ where_expression,
814
+ optional,
815
+ }))
816
+ }
817
+
818
+ fn build_return_with_statement(
819
+ &self,
820
+ pairs: pest::iterators::Pairs<Rule>,
821
+ ) -> Result<(
822
+ bool,
823
+ Vec<ast::NamedExpression>,
824
+ ast::Modifiers,
825
+ Option<ast::Expression>,
826
+ )>
827
+ {
828
+ let mut all = false;
829
+ let mut expressions = vec![];
830
+ let mut modifiers = Default::default();
831
+ let mut where_expression = Default::default();
832
+
833
+ for sub_pair in pairs
834
+ {
835
+ match sub_pair.as_rule()
836
+ {
837
+ Rule::star => all = true,
838
+ Rule::named_expression => expressions.push(self.build_named_expression(sub_pair)?),
839
+ Rule::modifiers => modifiers = self.build_modifiers(sub_pair)?,
840
+ Rule::where_modifier =>
841
+ {
842
+ where_expression =
843
+ Some(self.build_expression(sub_pair.into_inner().try_next()?.into_inner())?)
844
+ }
845
+ _ => Err(InternalError::UnexpectedPair {
846
+ context: "build_ast_from_statement/with_statement",
847
+ pair: sub_pair.as_str().to_string(),
848
+ })?,
849
+ }
850
+ }
851
+ Ok((all, expressions, modifiers, where_expression))
852
+ }
853
+ fn build_ident(&self, iterator: &mut pest::iterators::Pairs<Rule>) -> Result<String>
854
+ {
855
+ let pair = iterator.next().ok_or_else(|| InternalError::MissingPair {
856
+ context: "build_ident",
857
+ })?;
858
+ match pair.as_rule()
859
+ {
860
+ Rule::ident => Ok(pair.as_str().to_string()),
861
+ _ => Err(
862
+ InternalError::UnexpectedPair {
863
+ context: "build_ident",
864
+ pair: pair.to_string(),
865
+ }
866
+ .into(),
867
+ ),
868
+ }
869
+ }
870
+ fn build_ast_from_statement(&self, pair: pest::iterators::Pair<Rule>) -> Result<ast::Statement>
871
+ {
872
+ match pair.as_rule()
873
+ {
874
+ Rule::create_graph_statement => Ok(ast::Statement::CreateGraph(ast::CreateGraph {
875
+ name: self.build_ident(&mut pair.into_inner())?,
876
+ })),
877
+ Rule::use_graph_statement => Ok(ast::Statement::UseGraph(ast::UseGraph {
878
+ name: self.build_ident(&mut pair.into_inner())?,
879
+ })),
880
+ Rule::create_statement => Ok(ast::Statement::Create(ast::Create {
881
+ patterns: self.build_patterns(&mut pair.into_inner(), false)?,
882
+ })),
883
+ Rule::match_statement => self.build_match(pair, false),
884
+ Rule::optional_match_statement => self.build_match(pair.into_inner().try_next()?, true),
885
+ Rule::return_statement =>
886
+ {
887
+ let (all, expressions, modifiers, where_expression) =
888
+ self.build_return_with_statement(pair.into_inner())?;
889
+
890
+ Ok(ast::Statement::Return(ast::Return {
891
+ all,
892
+ expressions,
893
+ modifiers,
894
+ where_expression,
895
+ }))
896
+ }
897
+ Rule::with_statement =>
898
+ {
899
+ let (all, expressions, modifiers, where_expression) =
900
+ self.build_return_with_statement(pair.into_inner())?;
901
+
902
+ Ok(ast::Statement::With(ast::With {
903
+ all,
904
+ expressions,
905
+ modifiers,
906
+ where_expression,
907
+ }))
908
+ }
909
+ Rule::unwind_statement =>
910
+ {
911
+ let pair = pair
912
+ .into_inner()
913
+ .next()
914
+ .ok_or_else(|| InternalError::MissingPair {
915
+ context: "build_ast_from_statement/unwind_statement",
916
+ })?;
917
+
918
+ let ne = match pair.as_rule()
919
+ {
920
+ Rule::named_expression => self.build_named_expression(pair),
921
+ _ => Err(
922
+ InternalError::UnexpectedPair {
923
+ context: "build_ast_from_statement/with_statement",
924
+ pair: pair.as_str().to_string(),
925
+ }
926
+ .into(),
927
+ ),
928
+ }?;
929
+ Ok(ast::Statement::Unwind(ast::Unwind {
930
+ identifier: ne.identifier,
931
+ expression: ne.expression,
932
+ }))
933
+ }
934
+ Rule::delete_statement | Rule::detach_delete_statement =>
935
+ {
936
+ let detach = match pair.as_rule()
937
+ {
938
+ Rule::delete_statement => false,
939
+ Rule::detach_delete_statement => true,
940
+ _ =>
941
+ {
942
+ return Err(
943
+ InternalError::UnexpectedPair {
944
+ context: "build_ast_from_statement/delete_statement",
945
+ pair: pair.to_string(),
946
+ }
947
+ .into(),
948
+ )
949
+ }
950
+ };
951
+
952
+ let pairs = pair.into_inner();
953
+
954
+ let expressions = pairs
955
+ .into_iter()
956
+ .map(|pair| self.build_expression(pair.into_inner()))
957
+ .collect::<Result<_>>()?;
958
+
959
+ Ok(ast::Statement::Delete(ast::Delete {
960
+ detach,
961
+ expressions,
962
+ }))
963
+ }
964
+ Rule::set_statement =>
965
+ {
966
+ let mut updates = Vec::<ast::OneUpdate>::new();
967
+ for pair in pair.into_inner()
968
+ {
969
+ match pair.as_rule()
970
+ {
971
+ Rule::set_eq_expression | Rule::set_add_expression =>
972
+ {
973
+ let add_property = pair.as_rule() == Rule::set_add_expression;
974
+
975
+ let mut pair = pair.into_inner();
976
+ let mut pair_left = pair.try_next()?.into_inner();
977
+ let target = self.var_ids.from_name(pair_left.try_next()?.as_str());
978
+ let path = pair_left.map(|el| el.as_str().to_string()).collect();
979
+ let expression = self.build_expression(pair.try_next()?.into_inner())?;
980
+ let update_property = ast::UpdateProperty {
981
+ target,
982
+ path,
983
+ expression,
984
+ };
985
+ if add_property
986
+ {
987
+ updates.push(ast::OneUpdate::AddProperty(update_property));
988
+ }
989
+ else
990
+ {
991
+ updates.push(ast::OneUpdate::SetProperty(update_property));
992
+ }
993
+ }
994
+ Rule::set_label_expression =>
995
+ {
996
+ let mut pair = pair.into_inner();
997
+ let target = self.var_ids.from_name(pair.try_next()?.as_str());
998
+ let labels = pair.map(|el| el.as_str().to_string()).collect();
999
+ updates.push(ast::OneUpdate::AddLabels(ast::AddRemoveLabels {
1000
+ target,
1001
+ labels,
1002
+ }));
1003
+ }
1004
+ unknown_expression => Err(error::InternalError::UnxpectedExpression(
1005
+ "build_ast_from_statement/set_statement",
1006
+ format!("{unknown_expression:?}"),
1007
+ ))?,
1008
+ }
1009
+ }
1010
+ Ok(ast::Statement::Update(ast::Update { updates }))
1011
+ }
1012
+ Rule::remove_statement =>
1013
+ {
1014
+ let mut updates = Vec::<ast::OneUpdate>::new();
1015
+ for pair in pair.into_inner()
1016
+ {
1017
+ match pair.as_rule()
1018
+ {
1019
+ Rule::remove_member_access =>
1020
+ {
1021
+ let mut pair = pair.into_inner();
1022
+ let target = self.var_ids.from_name(pair.try_next()?.as_str());
1023
+ let path = pair.map(|el| el.as_str().to_string()).collect();
1024
+ updates.push(ast::OneUpdate::RemoveProperty(ast::RemoveProperty {
1025
+ target,
1026
+ path,
1027
+ }));
1028
+ }
1029
+ Rule::set_label_expression =>
1030
+ {
1031
+ let mut pair = pair.into_inner();
1032
+ let target = self.var_ids.from_name(pair.try_next()?.as_str());
1033
+ let labels = pair.map(|el| el.as_str().to_string()).collect();
1034
+ updates.push(ast::OneUpdate::RemoveLabels(ast::AddRemoveLabels {
1035
+ target,
1036
+ labels,
1037
+ }));
1038
+ }
1039
+ unknown_expression => Err(error::InternalError::UnxpectedExpression(
1040
+ "build_ast_from_statement/remove_statement",
1041
+ format!("{unknown_expression:?}"),
1042
+ ))?,
1043
+ }
1044
+ }
1045
+ Ok(ast::Statement::Update(ast::Update { updates }))
1046
+ }
1047
+ Rule::call_statement =>
1048
+ {
1049
+ let name = pair
1050
+ .into_inner()
1051
+ .map(|pair| pair.as_str())
1052
+ .collect::<Vec<&str>>()
1053
+ .join(".");
1054
+ Ok(ast::Statement::Call(ast::Call {
1055
+ name: name,
1056
+ arguments: Default::default(),
1057
+ yield_: Default::default(),
1058
+ }))
1059
+ }
1060
+ unknown_expression => Err(
1061
+ error::InternalError::UnxpectedExpression(
1062
+ "build_ast_from_statement",
1063
+ format!("{unknown_expression:?}"),
1064
+ )
1065
+ .into(),
1066
+ ),
1067
+ }
1068
+ }
1069
+ }
1070
+
1071
+ pub(crate) fn parse(input: &str) -> Result<ast::Queries>
1072
+ {
1073
+ let pratt = PrattParser::new()
1074
+ .op(Op::infix(Rule::xor, Assoc::Left))
1075
+ .op(Op::infix(Rule::or, Assoc::Left))
1076
+ .op(Op::infix(Rule::and, Assoc::Left))
1077
+ .op(Op::infix(Rule::equal, Assoc::Left) | Op::infix(Rule::different, Assoc::Left))
1078
+ .op(
1079
+ Op::infix(Rule::inferior, Assoc::Left)
1080
+ | Op::infix(Rule::inferior_equal, Assoc::Left)
1081
+ | Op::infix(Rule::superior, Assoc::Left)
1082
+ | Op::infix(Rule::superior_equal, Assoc::Left),
1083
+ )
1084
+ .op(Op::infix(Rule::not_in, Assoc::Left) | Op::infix(Rule::in_, Assoc::Left))
1085
+ .op(Op::infix(Rule::addition, Assoc::Left) | Op::infix(Rule::subtraction, Assoc::Left))
1086
+ .op(
1087
+ Op::infix(Rule::multiplication, Assoc::Left)
1088
+ | Op::infix(Rule::division, Assoc::Left)
1089
+ | Op::infix(Rule::modulo, Assoc::Left),
1090
+ )
1091
+ .op(Op::prefix(Rule::not) | Op::prefix(Rule::negation))
1092
+ .op(
1093
+ Op::postfix(Rule::is_null)
1094
+ | Op::postfix(Rule::is_not_null)
1095
+ | Op::postfix(Rule::member_access)
1096
+ | Op::postfix(Rule::index_access)
1097
+ | Op::postfix(Rule::range_access)
1098
+ | Op::postfix(Rule::range_access_to),
1099
+ );
1100
+ let ast_builder = AstBuilder {
1101
+ pratt,
1102
+ var_ids: Default::default(),
1103
+ };
1104
+ let pairs = GQLParser::parse(Rule::queries, input)?;
1105
+ let mut queries = Vec::<ast::Statements>::new();
1106
+ if crate::consts::SHOW_PARSE_TREE
1107
+ {
1108
+ println!("pairs = {:#?}", pairs);
1109
+ }
1110
+ for q_pair in pairs
1111
+ {
1112
+ match q_pair.as_rule()
1113
+ {
1114
+ Rule::query =>
1115
+ {
1116
+ let mut stmts = ast::Statements::new();
1117
+
1118
+ for pair in q_pair.into_inner()
1119
+ {
1120
+ match pair.as_rule()
1121
+ {
1122
+ Rule::statement =>
1123
+ {
1124
+ stmts.push(ast_builder.build_ast_from_statement(pair.into_inner().try_next()?)?);
1125
+ }
1126
+ unknown_expression =>
1127
+ {
1128
+ Err(error::InternalError::UnxpectedExpression(
1129
+ "parse",
1130
+ format!("{unknown_expression:?}"),
1131
+ ))?;
1132
+ }
1133
+ }
1134
+ }
1135
+ queries.push(stmts);
1136
+ }
1137
+ Rule::EOI =>
1138
+ {}
1139
+ unknown_expression =>
1140
+ {
1141
+ Err(error::InternalError::UnxpectedExpression(
1142
+ "parse",
1143
+ format!("{unknown_expression:?}"),
1144
+ ))?;
1145
+ }
1146
+ }
1147
+ }
1148
+ if crate::consts::SHOW_AST
1149
+ {
1150
+ println!("ast = {:#?}", &queries);
1151
+ }
1152
+ Ok(queries)
1153
+ }