gqlite 1.2.3 → 1.3.0

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 (102) hide show
  1. checksums.yaml +4 -4
  2. data/ext/Cargo.toml +20 -0
  3. data/ext/gqlitedb/Cargo.toml +77 -0
  4. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/benches/common/pokec.rs +30 -20
  5. data/ext/gqlitedb/gqlite_bench_data/README.MD +6 -0
  6. data/ext/gqlitedb/gqlite_bench_data/scripts/generate_smaller_pokec.rb +85 -0
  7. data/ext/gqlitedb/gqlite_bench_data/scripts/to_efficient_pokec.rb +34 -0
  8. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/aggregators/arithmetic.rs +1 -0
  9. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/aggregators/stats.rs +27 -49
  10. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/aggregators.rs +7 -7
  11. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/capi.rs +10 -9
  12. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/compiler/expression_analyser.rs +6 -4
  13. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/compiler/variables_manager.rs +27 -31
  14. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/compiler.rs +37 -41
  15. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/connection.rs +42 -84
  16. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/error.rs +105 -34
  17. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/functions/containers.rs +21 -26
  18. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/functions/edge.rs +2 -2
  19. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/functions/math.rs +2 -2
  20. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/functions/node.rs +1 -1
  21. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/functions/path.rs +15 -20
  22. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/functions/scalar.rs +2 -2
  23. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/functions/value.rs +6 -6
  24. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/functions.rs +20 -20
  25. data/ext/gqlitedb/src/graph.rs +11 -0
  26. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/interpreter/evaluators.rs +160 -194
  27. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/interpreter/instructions.rs +2 -1
  28. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/lib.rs +9 -4
  29. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/parser/ast.rs +44 -52
  30. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/parser/gql.pest +1 -1
  31. data/ext/{gqliterb/vendor/gqlitedb/src/parser/parser.rs → gqlitedb/src/parser/parser_impl.rs} +50 -28
  32. data/ext/gqlitedb/src/parser.rs +4 -0
  33. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/prelude.rs +3 -2
  34. data/ext/gqlitedb/src/query_result.rs +88 -0
  35. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/store/redb.rs +226 -148
  36. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/store/sqlite.rs +111 -128
  37. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/store.rs +22 -22
  38. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/tests/evaluators.rs +32 -76
  39. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/tests/store.rs +95 -111
  40. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/tests/templates/ast.rs +29 -29
  41. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/tests/templates/programs.rs +4 -4
  42. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/value/compare.rs +13 -20
  43. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/value/contains.rs +2 -2
  44. data/ext/gqlitedb/src/value.rs +225 -0
  45. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/value_table.rs +15 -5
  46. data/ext/gqliterb/Cargo.toml +12 -35
  47. data/ext/gqliterb/src/lib.rs +60 -38
  48. data/ext/graphcore/Cargo.toml +19 -0
  49. data/ext/graphcore/README.MD +4 -0
  50. data/ext/graphcore/release.toml +1 -0
  51. data/ext/graphcore/src/error.rs +28 -0
  52. data/ext/{gqliterb/vendor/gqlitedb → graphcore}/src/graph.rs +134 -38
  53. data/ext/graphcore/src/lib.rs +16 -0
  54. data/ext/graphcore/src/prelude.rs +4 -0
  55. data/ext/{gqliterb/vendor/gqlitedb → graphcore}/src/serialize_with.rs +2 -2
  56. data/ext/graphcore/src/table.rs +272 -0
  57. data/ext/{gqliterb/vendor/gqlitedb → graphcore}/src/value/value_map.rs +44 -49
  58. data/ext/graphcore/src/value.rs +413 -0
  59. metadata +94 -83
  60. data/ext/gqliterb/.cargo/config.toml +0 -2
  61. data/ext/gqliterb/Cargo.lock +0 -1116
  62. data/ext/gqliterb/vendor/gqlitedb/Cargo.lock +0 -2115
  63. data/ext/gqliterb/vendor/gqlitedb/Cargo.toml +0 -138
  64. data/ext/gqliterb/vendor/gqlitedb/src/parser.rs +0 -4
  65. data/ext/gqliterb/vendor/gqlitedb/src/value.rs +0 -609
  66. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/askama.toml +0 -0
  67. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/benches/common/mod.rs +0 -0
  68. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/benches/pokec_divan.rs +0 -0
  69. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/benches/pokec_iai.rs +0 -0
  70. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/release.toml +0 -0
  71. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/aggregators/containers.rs +0 -0
  72. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/aggregators/count.rs +0 -0
  73. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/consts.rs +0 -0
  74. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/functions/string.rs +0 -0
  75. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/interpreter/mod.rs +0 -0
  76. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/store/pgql.rs +0 -0
  77. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/tests/compiler.rs +0 -0
  78. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/tests/parser.rs +0 -0
  79. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/tests/store/redb.rs +0 -0
  80. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/tests/store/sqlite.rs +0 -0
  81. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/tests/templates.rs +0 -0
  82. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/tests.rs +0 -0
  83. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/utils.rs +0 -0
  84. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/templates/sql/sqlite/call_stats.sql +0 -0
  85. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/templates/sql/sqlite/edge_count_for_node.sql +0 -0
  86. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/templates/sql/sqlite/edge_create.sql +0 -0
  87. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/templates/sql/sqlite/edge_delete.sql +0 -0
  88. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/templates/sql/sqlite/edge_delete_by_nodes.sql +0 -0
  89. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/templates/sql/sqlite/edge_select.sql +0 -0
  90. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/templates/sql/sqlite/edge_update.sql +0 -0
  91. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/templates/sql/sqlite/graph_create.sql +0 -0
  92. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/templates/sql/sqlite/graph_delete.sql +0 -0
  93. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/templates/sql/sqlite/metadata_create_table.sql +0 -0
  94. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/templates/sql/sqlite/metadata_get.sql +0 -0
  95. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/templates/sql/sqlite/metadata_set.sql +0 -0
  96. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/templates/sql/sqlite/node_create.sql +0 -0
  97. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/templates/sql/sqlite/node_delete.sql +0 -0
  98. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/templates/sql/sqlite/node_select.sql +0 -0
  99. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/templates/sql/sqlite/node_update.sql +0 -0
  100. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/templates/sql/sqlite/table_exists.sql +0 -0
  101. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/templates/sql/sqlite/upgrade_from_1_01.sql +0 -0
  102. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/templates/sql/sqlite/upgrade_graph_from_1_01.sql +0 -0
@@ -1,6 +1,7 @@
1
1
  use crate::{prelude::*, value_table::ColId};
2
2
 
3
3
  #[derive(Debug)]
4
+ #[allow(clippy::large_enum_variant)]
4
5
  pub(crate) enum Instruction
5
6
  {
6
7
  CreateNodeLiteral
@@ -221,7 +222,7 @@ pub(crate) enum Block
221
222
  actions: Vec<CreateAction>,
222
223
  variables_size: VariablesSizes,
223
224
  },
224
- BlockMatch
225
+ Match
225
226
  {
226
227
  blocks: Vec<BlockMatch>,
227
228
  filter: Instructions,
@@ -8,6 +8,8 @@
8
8
 
9
9
  #![warn(missing_docs)]
10
10
  #![deny(warnings)]
11
+ #![allow(clippy::result_large_err)]
12
+ #![allow(clippy::unnecessary_lazy_evaluations)]
11
13
 
12
14
  mod aggregators;
13
15
  #[cfg(feature = "capi")]
@@ -21,7 +23,7 @@ mod graph;
21
23
  mod interpreter;
22
24
  mod parser;
23
25
  mod prelude;
24
- mod serialize_with;
26
+ mod query_result;
25
27
  mod store;
26
28
  mod utils;
27
29
  mod value;
@@ -31,11 +33,14 @@ mod value_table;
31
33
  pub(crate) mod tests;
32
34
 
33
35
  pub use {
34
- connection::Connection,
36
+ connection::{Backend, Connection},
35
37
  error::{CompileTimeError, Error, RunTimeError, StoreError},
36
- graph::{Edge, Node, Path},
37
- value::{Value, ValueMap, ValueTryIntoRef},
38
+ graph::{labels, Edge, Node, Path},
39
+ query_result::QueryResult,
40
+ value::{array, value_map, Value, ValueMap, ValueTryIntoRef},
38
41
  };
39
42
 
43
+ pub use graphcore::{table, Table};
44
+
40
45
  /// GQLite Result alias. Usable as a standard `Result<T, E>` or default to gqlite::Error with `Result<T>`
41
46
  pub type Result<T, E = error::export::Error> = std::result::Result<T, E>;
@@ -60,7 +60,7 @@ impl VariableIdentifiers
60
60
  .next_id
61
61
  .fetch_add(1, std::sync::atomic::Ordering::Relaxed)
62
62
  }
63
- pub(crate) fn from_name(&self, name: impl Into<String>) -> VariableIdentifier
63
+ pub(crate) fn create_variable_from_name(&self, name: impl Into<String>) -> VariableIdentifier
64
64
  {
65
65
  let name = name.into();
66
66
  match self.identifiers.borrow_mut().entry(name)
@@ -77,11 +77,14 @@ impl VariableIdentifiers
77
77
  }
78
78
  }
79
79
  }
80
- pub(crate) fn from_name_optional(&self, name: Option<String>) -> Option<VariableIdentifier>
80
+ pub(crate) fn create_variable_from_name_optional(
81
+ &self,
82
+ name: Option<String>,
83
+ ) -> Option<VariableIdentifier>
81
84
  {
82
- name.map(|name| self.from_name(name))
85
+ name.map(|name| self.create_variable_from_name(name))
83
86
  }
84
- pub(crate) fn anonymous(&self) -> VariableIdentifier
87
+ pub(crate) fn create_anonymous_variable(&self) -> VariableIdentifier
85
88
  {
86
89
  let id = self.next_id();
87
90
  VariableIdentifier {
@@ -107,13 +110,13 @@ pub(crate) enum Statement
107
110
  Update(Update),
108
111
  }
109
112
 
110
- macro_rules! create_into_statement {
113
+ macro_rules! create_from_statement {
111
114
  ( $x:tt ) => {
112
- impl Into<Statement> for $x
115
+ impl From<$x> for Statement
113
116
  {
114
- fn into(self) -> Statement
117
+ fn from(v: $x) -> Statement
115
118
  {
116
- Statement::$x(self)
119
+ Statement::$x(v)
117
120
  }
118
121
  }
119
122
  };
@@ -147,7 +150,7 @@ pub(crate) struct Create
147
150
  pub(crate) patterns: Vec<Pattern>,
148
151
  }
149
152
 
150
- create_into_statement! {Create}
153
+ create_from_statement! {Create}
151
154
 
152
155
  #[derive(Debug)]
153
156
  pub(crate) struct Match
@@ -157,7 +160,7 @@ pub(crate) struct Match
157
160
  pub(crate) optional: bool,
158
161
  }
159
162
 
160
- create_into_statement! {Match}
163
+ create_from_statement! {Match}
161
164
 
162
165
  #[derive(Debug)]
163
166
  pub(crate) struct Return
@@ -168,7 +171,7 @@ pub(crate) struct Return
168
171
  pub(crate) where_expression: Option<Expression>,
169
172
  }
170
173
 
171
- create_into_statement! {Return}
174
+ create_from_statement! {Return}
172
175
 
173
176
  #[derive(Debug)]
174
177
  pub(crate) struct With
@@ -179,7 +182,7 @@ pub(crate) struct With
179
182
  pub(crate) where_expression: Option<Expression>,
180
183
  }
181
184
 
182
- create_into_statement! {With}
185
+ create_from_statement! {With}
183
186
 
184
187
  #[derive(Debug)]
185
188
  pub(crate) struct Unwind
@@ -188,7 +191,7 @@ pub(crate) struct Unwind
188
191
  pub(crate) expression: Expression,
189
192
  }
190
193
 
191
- create_into_statement! {Unwind}
194
+ create_from_statement! {Unwind}
192
195
 
193
196
  #[derive(Debug)]
194
197
  pub(crate) struct Delete
@@ -263,6 +266,7 @@ pub(crate) struct Modifiers
263
266
  // Expressions
264
267
 
265
268
  #[derive(Debug, Clone, PartialEq)]
269
+ #[allow(clippy::large_enum_variant)]
266
270
  pub(crate) enum Expression
267
271
  {
268
272
  Array(Array),
@@ -351,8 +355,8 @@ pub(crate) enum LabelExpression
351
355
  {
352
356
  #[allow(dead_code)]
353
357
  Not(Box<LabelExpression>),
354
- And(Vec<Box<LabelExpression>>),
355
- Or(Vec<Box<LabelExpression>>),
358
+ And(Vec<LabelExpression>),
359
+ Or(Vec<LabelExpression>),
356
360
  String(String),
357
361
  None,
358
362
  }
@@ -374,7 +378,7 @@ impl LabelExpression
374
378
  }
375
379
  other =>
376
380
  {
377
- vec.push(other.boxed());
381
+ vec.push(other);
378
382
  LabelExpression::And(vec)
379
383
  }
380
384
  },
@@ -383,10 +387,10 @@ impl LabelExpression
383
387
  LabelExpression::None => self,
384
388
  LabelExpression::And(mut vec) =>
385
389
  {
386
- vec.push(self.boxed());
390
+ vec.push(self);
387
391
  LabelExpression::And(vec)
388
392
  }
389
- _ => LabelExpression::And(vec![self.boxed(), rhs.boxed()]),
393
+ _ => LabelExpression::And(vec![self, rhs]),
390
394
  },
391
395
  }
392
396
  }
@@ -405,7 +409,7 @@ impl LabelExpression
405
409
  }
406
410
  other =>
407
411
  {
408
- vec.push(other.boxed());
412
+ vec.push(other);
409
413
  LabelExpression::Or(vec)
410
414
  }
411
415
  },
@@ -414,17 +418,13 @@ impl LabelExpression
414
418
  LabelExpression::None => self,
415
419
  LabelExpression::Or(mut vec) =>
416
420
  {
417
- vec.push(self.boxed());
421
+ vec.push(self);
418
422
  LabelExpression::Or(vec)
419
423
  }
420
- _ => LabelExpression::Or(vec![self.boxed(), rhs.boxed()]),
424
+ _ => LabelExpression::Or(vec![self, rhs]),
421
425
  },
422
426
  }
423
427
  }
424
- pub(crate) fn boxed(self) -> Box<LabelExpression>
425
- {
426
- Box::new(self)
427
- }
428
428
  pub(crate) fn is_all_inclusive(&self) -> bool
429
429
  {
430
430
  match self
@@ -438,43 +438,35 @@ impl LabelExpression
438
438
  }
439
439
  pub(crate) fn is_none(&self) -> bool
440
440
  {
441
- match self
442
- {
443
- LabelExpression::None => true,
444
- _ => false,
445
- }
441
+ matches!(self, LabelExpression::None)
446
442
  }
447
443
  pub(crate) fn is_string(&self) -> bool
448
444
  {
449
- match self
450
- {
451
- LabelExpression::String(_) => true,
452
- _ => false,
453
- }
445
+ matches!(self, LabelExpression::String(_))
454
446
  }
455
447
  }
456
448
 
457
449
  // Expressions
458
450
 
459
- macro_rules! create_into_expr {
451
+ macro_rules! create_from_expr {
460
452
  ( $x:tt ) => {
461
- impl Into<Expression> for $x
453
+ impl From<$x> for Expression
462
454
  {
463
- fn into(self) -> Expression
455
+ fn from(v: $x) -> Expression
464
456
  {
465
- Expression::$x(self)
457
+ Expression::$x(v)
466
458
  }
467
459
  }
468
460
  };
469
461
  }
470
462
 
471
- macro_rules! create_into_boxed_expr {
463
+ macro_rules! create_from_boxed_expr {
472
464
  ( $x:tt ) => {
473
- impl Into<Expression> for $x
465
+ impl From<$x> for Expression
474
466
  {
475
- fn into(self) -> Expression
467
+ fn from(v: $x) -> Expression
476
468
  {
477
- Expression::$x(Box::new(self))
469
+ Expression::$x(Box::new(v))
478
470
  }
479
471
  }
480
472
  };
@@ -499,7 +491,7 @@ pub(crate) struct Variable
499
491
  pub(crate) identifier: VariableIdentifier,
500
492
  }
501
493
 
502
- create_into_expr! {Variable}
494
+ create_from_expr! {Variable}
503
495
 
504
496
  #[derive(Debug, Clone, PartialEq)]
505
497
  pub(crate) struct MemberAccess
@@ -508,7 +500,7 @@ pub(crate) struct MemberAccess
508
500
  pub(crate) path: Vec<String>,
509
501
  }
510
502
 
511
- create_into_boxed_expr! {MemberAccess}
503
+ create_from_boxed_expr! {MemberAccess}
512
504
 
513
505
  #[derive(Debug, Clone, PartialEq)]
514
506
  pub(crate) struct IndexAccess
@@ -517,7 +509,7 @@ pub(crate) struct IndexAccess
517
509
  pub(crate) index: Expression,
518
510
  }
519
511
 
520
- create_into_boxed_expr! {IndexAccess}
512
+ create_from_boxed_expr! {IndexAccess}
521
513
 
522
514
  #[derive(Debug, Clone, PartialEq)]
523
515
  pub(crate) struct RangeAccess
@@ -534,7 +526,7 @@ pub(crate) struct FunctionCall
534
526
  pub(crate) arguments: Vec<Expression>,
535
527
  }
536
528
 
537
- create_into_expr! {FunctionCall}
529
+ create_from_expr! {FunctionCall}
538
530
 
539
531
  macro_rules! create_binary_op {
540
532
  ( $x:tt ) => {
@@ -545,7 +537,7 @@ macro_rules! create_binary_op {
545
537
  pub(crate) right: Expression,
546
538
  }
547
539
 
548
- create_into_boxed_expr! { $x }
540
+ create_from_boxed_expr! { $x }
549
541
  };
550
542
  }
551
543
 
@@ -575,7 +567,7 @@ macro_rules! create_unary_op {
575
567
  {
576
568
  pub(crate) value: Expression,
577
569
  }
578
- create_into_boxed_expr! { $x }
570
+ create_from_boxed_expr! { $x }
579
571
  };
580
572
  }
581
573
 
@@ -592,7 +584,7 @@ pub(crate) struct Value
592
584
  pub(crate) value: crate::value::Value,
593
585
  }
594
586
 
595
- create_into_expr! {Value}
587
+ create_from_expr! {Value}
596
588
 
597
589
  #[derive(Debug, Clone, PartialEq)]
598
590
  pub(crate) struct Map
@@ -600,7 +592,7 @@ pub(crate) struct Map
600
592
  pub(crate) map: Vec<(String, Expression)>,
601
593
  }
602
594
 
603
- create_into_expr! {Map}
595
+ create_from_expr! {Map}
604
596
 
605
597
  #[derive(Debug, Clone, PartialEq)]
606
598
  pub(crate) struct Array
@@ -608,4 +600,4 @@ pub(crate) struct Array
608
600
  pub(crate) array: Vec<Expression>,
609
601
  }
610
602
 
611
- create_into_expr! {Array}
603
+ create_from_expr! {Array}
@@ -29,7 +29,7 @@ nothing = { nothing_ident? }
29
29
  // fragments
30
30
 
31
31
  labels = { ":" ~ label_expression }
32
- pattern = { ident? ~ labels? ~ map? }
32
+ pattern = { ident? ~ labels? ~ (map | parameter)? }
33
33
  node_pattern = { "(" ~ pattern ~ ")" }
34
34
 
35
35
  directed_edge_pattern = { (")-[" ~ pattern ~ "]->(") | (nothing ~ ")-->(") }
@@ -19,7 +19,7 @@ trait TryNext: Iterator
19
19
  }
20
20
  }
21
21
 
22
- fn remove_hex_prefix<'a>(string: &'a str) -> String
22
+ fn remove_hex_prefix(string: &str) -> String
23
23
  {
24
24
  if &string[0..1] == "-"
25
25
  {
@@ -31,7 +31,7 @@ fn remove_hex_prefix<'a>(string: &'a str) -> String
31
31
  }
32
32
  }
33
33
 
34
- fn validate_float<'a>(value: f64, text: &'a str) -> Result<f64>
34
+ fn validate_float(value: f64, text: &str) -> Result<f64>
35
35
  {
36
36
  if value.is_finite()
37
37
  {
@@ -67,7 +67,7 @@ impl AstBuilder
67
67
  let mut it = pair.into_inner();
68
68
  let k = it.try_next()?;
69
69
  let v = self.build_expression(it.try_next()?.into_inner())?;
70
- return Ok((k.as_str().to_string(), v));
70
+ Ok((k.as_str().to_string(), v))
71
71
  }
72
72
 
73
73
  fn build_expression(&self, pairs: pest::iterators::Pairs<Rule>) -> Result<ast::Expression>
@@ -338,7 +338,7 @@ impl AstBuilder
338
338
  value: value::Value::Float(validate_float(pair.as_str().parse()?, pair.as_str())?),
339
339
  })),
340
340
  Rule::ident => Ok(ast::Expression::Variable(ast::Variable {
341
- identifier: self.var_ids.from_name(pair.as_str()),
341
+ identifier: self.var_ids.create_variable_from_name(pair.as_str()),
342
342
  })),
343
343
  Rule::parameter => Ok(ast::Expression::Parameter(ast::Parameter {
344
344
  name: pair.as_str().to_string(),
@@ -402,7 +402,7 @@ impl AstBuilder
402
402
  if i == 0
403
403
  {
404
404
  ast::Expression::Variable(ast::Variable {
405
- identifier: self.var_ids.from_name(pair.as_str()),
405
+ identifier: self.var_ids.create_variable_from_name(pair.as_str()),
406
406
  })
407
407
  }
408
408
  else
@@ -532,13 +532,15 @@ impl AstBuilder
532
532
  {
533
533
  let expr = inner.try_next()?;
534
534
  Ok(ast::NamedExpression {
535
- identifier: self.var_ids.from_name(expr.as_str().trim()),
535
+ identifier: self.var_ids.create_variable_from_name(expr.as_str().trim()),
536
536
  expression: self.build_expression(expr.into_inner())?,
537
537
  })
538
538
  }
539
539
  2 => Ok({
540
540
  let expression = self.build_expression(inner.try_next()?.into_inner())?;
541
- let identifier = self.var_ids.from_name(inner.try_next()?.as_str());
541
+ let identifier = self
542
+ .var_ids
543
+ .create_variable_from_name(inner.try_next()?.as_str());
542
544
  ast::NamedExpression {
543
545
  identifier,
544
546
  expression,
@@ -563,28 +565,28 @@ impl AstBuilder
563
565
  }
564
566
  }
565
567
 
566
- fn build_labels(&self, pair: pest::iterators::Pair<Rule>) -> Result<ast::LabelExpression>
568
+ fn build_labels(pair: pest::iterators::Pair<Rule>) -> Result<ast::LabelExpression>
567
569
  {
568
570
  match pair.as_rule()
569
571
  {
570
- Rule::labels => self.build_labels(pair.into_inner().try_next()?),
572
+ Rule::labels => Self::build_labels(pair.into_inner().try_next()?),
571
573
  Rule::label_alternative =>
572
574
  {
573
575
  let mut r = ast::LabelExpression::None;
574
- let mut inner = pair.into_inner();
575
- while let Some(next) = inner.next()
576
+ let inner = pair.into_inner();
577
+ for next in inner
576
578
  {
577
- r = r.or(self.build_labels(next)?);
579
+ r = r.or(Self::build_labels(next)?);
578
580
  }
579
581
  Ok(r)
580
582
  }
581
583
  Rule::label_inclusion =>
582
584
  {
583
585
  let mut r = ast::LabelExpression::None;
584
- let mut inner = pair.into_inner();
585
- while let Some(next) = inner.next()
586
+ let inner = pair.into_inner();
587
+ for next in inner
586
588
  {
587
- r = r.and(self.build_labels(next)?);
589
+ r = r.and(Self::build_labels(next)?);
588
590
  }
589
591
  Ok(r)
590
592
  }
@@ -616,9 +618,15 @@ impl AstBuilder
616
618
  }
617
619
  Rule::labels =>
618
620
  {
619
- labels = self.build_labels(pair)?;
621
+ labels = Self::build_labels(pair)?;
620
622
  }
621
623
  Rule::map => properties = Some(self.build_map(pair)?),
624
+ Rule::parameter =>
625
+ {
626
+ properties = Some(ast::Expression::Parameter(ast::Parameter {
627
+ name: pair.as_str().to_string(),
628
+ }))
629
+ }
622
630
  unknown_expression =>
623
631
  {
624
632
  return Err(
@@ -632,7 +640,7 @@ impl AstBuilder
632
640
  }
633
641
  }
634
642
  Ok(ast::NodePattern {
635
- variable: self.var_ids.from_name_optional(variable),
643
+ variable: self.var_ids.create_variable_from_name_optional(variable),
636
644
  labels,
637
645
  properties,
638
646
  })
@@ -662,9 +670,15 @@ impl AstBuilder
662
670
  }
663
671
  Rule::labels =>
664
672
  {
665
- labels = self.build_labels(pair)?;
673
+ labels = Self::build_labels(pair)?;
666
674
  }
667
675
  Rule::map => properties = Some(self.build_map(pair)?),
676
+ Rule::parameter =>
677
+ {
678
+ properties = Some(ast::Expression::Parameter(ast::Parameter {
679
+ name: pair.as_str().to_string(),
680
+ }))
681
+ }
668
682
  unknown_expression =>
669
683
  {
670
684
  return Err(
@@ -681,7 +695,7 @@ impl AstBuilder
681
695
  match edge_rule
682
696
  {
683
697
  Rule::directed_edge_pattern => Ok(ast::EdgePattern {
684
- variable: self.var_ids.from_name_optional(variable),
698
+ variable: self.var_ids.create_variable_from_name_optional(variable),
685
699
  source: source_node,
686
700
  destination: destination_node,
687
701
  directivity: graph::EdgeDirectivity::Directed,
@@ -689,7 +703,7 @@ impl AstBuilder
689
703
  properties,
690
704
  }),
691
705
  Rule::reversed_edge_pattern => Ok(ast::EdgePattern {
692
- variable: self.var_ids.from_name_optional(variable),
706
+ variable: self.var_ids.create_variable_from_name_optional(variable),
693
707
  source: destination_node,
694
708
  destination: source_node,
695
709
  directivity: graph::EdgeDirectivity::Directed,
@@ -705,7 +719,7 @@ impl AstBuilder
705
719
  })?;
706
720
  }
707
721
  Ok(ast::EdgePattern {
708
- variable: self.var_ids.from_name_optional(variable),
722
+ variable: self.var_ids.create_variable_from_name_optional(variable),
709
723
  source: source_node,
710
724
  destination: destination_node,
711
725
  directivity: graph::EdgeDirectivity::Undirected,
@@ -765,7 +779,7 @@ impl AstBuilder
765
779
 
766
780
  if it.peek().is_some() && destination_node.variable.is_none()
767
781
  {
768
- destination_node.variable = Some(self.var_ids.anonymous());
782
+ destination_node.variable = Some(self.var_ids.create_anonymous_variable());
769
783
  }
770
784
 
771
785
  let edge_pattern = self.build_edge_pattern(
@@ -793,7 +807,7 @@ impl AstBuilder
793
807
  allow_undirected_edge,
794
808
  )?;
795
809
  vec.push(ast::Pattern::Path(ast::PathPattern {
796
- variable: self.var_ids.from_name(variable),
810
+ variable: self.var_ids.create_variable_from_name(variable),
797
811
  edge: edge_pattern,
798
812
  }));
799
813
  }
@@ -1004,7 +1018,9 @@ impl AstBuilder
1004
1018
 
1005
1019
  let mut pair = pair.into_inner();
1006
1020
  let mut pair_left = pair.try_next()?.into_inner();
1007
- let target = self.var_ids.from_name(pair_left.try_next()?.as_str());
1021
+ let target = self
1022
+ .var_ids
1023
+ .create_variable_from_name(pair_left.try_next()?.as_str());
1008
1024
  let path = pair_left.map(|el| el.as_str().to_string()).collect();
1009
1025
  let expression = self.build_expression(pair.try_next()?.into_inner())?;
1010
1026
  let update_property = ast::UpdateProperty {
@@ -1024,7 +1040,9 @@ impl AstBuilder
1024
1040
  Rule::set_label_expression =>
1025
1041
  {
1026
1042
  let mut pair = pair.into_inner();
1027
- let target = self.var_ids.from_name(pair.try_next()?.as_str());
1043
+ let target = self
1044
+ .var_ids
1045
+ .create_variable_from_name(pair.try_next()?.as_str());
1028
1046
  let labels = pair.map(|el| el.as_str().to_string()).collect();
1029
1047
  updates.push(ast::OneUpdate::AddLabels(ast::AddRemoveLabels {
1030
1048
  target,
@@ -1049,7 +1067,9 @@ impl AstBuilder
1049
1067
  Rule::remove_member_access =>
1050
1068
  {
1051
1069
  let mut pair = pair.into_inner();
1052
- let target = self.var_ids.from_name(pair.try_next()?.as_str());
1070
+ let target = self
1071
+ .var_ids
1072
+ .create_variable_from_name(pair.try_next()?.as_str());
1053
1073
  let path = pair.map(|el| el.as_str().to_string()).collect();
1054
1074
  updates.push(ast::OneUpdate::RemoveProperty(ast::RemoveProperty {
1055
1075
  target,
@@ -1059,7 +1079,9 @@ impl AstBuilder
1059
1079
  Rule::set_label_expression =>
1060
1080
  {
1061
1081
  let mut pair = pair.into_inner();
1062
- let target = self.var_ids.from_name(pair.try_next()?.as_str());
1082
+ let target = self
1083
+ .var_ids
1084
+ .create_variable_from_name(pair.try_next()?.as_str());
1063
1085
  let labels = pair.map(|el| el.as_str().to_string()).collect();
1064
1086
  updates.push(ast::OneUpdate::RemoveLabels(ast::AddRemoveLabels {
1065
1087
  target,
@@ -1082,7 +1104,7 @@ impl AstBuilder
1082
1104
  .collect::<Vec<&str>>()
1083
1105
  .join(".");
1084
1106
  Ok(ast::Statement::Call(ast::Call {
1085
- name: name,
1107
+ name,
1086
1108
  arguments: Default::default(),
1087
1109
  }))
1088
1110
  }
@@ -0,0 +1,4 @@
1
+ pub(crate) mod ast;
2
+ pub(crate) mod parser_impl;
3
+
4
+ pub(crate) use parser_impl::parse;
@@ -1,8 +1,9 @@
1
1
  pub(crate) use crate::{
2
2
  aggregators, compiler, consts,
3
3
  error::{self, CompileTimeError, InternalError, RunTimeError, StoreError},
4
- functions, graph, interpreter, parser, serialize_with, store, utils, value, value_table, Error,
5
- Result,
4
+ functions, graph, interpreter, parser, query_result, store, utils, value,
5
+ value::ValueExt as _,
6
+ value_table, Error, Result,
6
7
  };
7
8
 
8
9
  pub(crate) use error::export::Error as ErrorType;
@@ -0,0 +1,88 @@
1
+ use graphcore::value_map;
2
+ use itertools::Itertools as _;
3
+
4
+ use crate::error::InternalError;
5
+
6
+ /// Hold the result of executing a query.
7
+ #[derive(Debug, PartialEq, Clone)]
8
+ #[allow(clippy::large_enum_variant)]
9
+ pub enum QueryResult
10
+ {
11
+ /// No results are returned by the query
12
+ Empty,
13
+ /// A table is returned by the query
14
+ Table(graphcore::Table),
15
+ /// Many tables are returned by the query. Happpen if multiple queries are executed at the same time.
16
+ Array(Vec<QueryResult>),
17
+ /// A value is returned
18
+ Value(graphcore::Value),
19
+ }
20
+
21
+ impl QueryResult
22
+ {
23
+ /// Convert this query result into a value.
24
+ pub fn into_value(self) -> graphcore::Value
25
+ {
26
+ match self {
27
+ QueryResult::Empty => graphcore::Value::Null,
28
+ QueryResult::Value(v) => v,
29
+ QueryResult::Table(t) => t.into(),
30
+ QueryResult::Array(qr) => value_map!("type" => "results", "results" => qr.into_iter().map(|x| x.into_value()).collect::<Vec<graphcore::Value>>()).into()
31
+ }
32
+ }
33
+ /// Try convert into table
34
+ pub fn try_into_table(self) -> Result<graphcore::Table, InternalError>
35
+ {
36
+ self.try_into()
37
+ }
38
+ }
39
+
40
+ impl From<graphcore::Value> for QueryResult
41
+ {
42
+ fn from(value: graphcore::Value) -> Self
43
+ {
44
+ QueryResult::Value(value)
45
+ }
46
+ }
47
+
48
+ impl From<graphcore::Table> for QueryResult
49
+ {
50
+ fn from(table: graphcore::Table) -> Self
51
+ {
52
+ QueryResult::Table(table)
53
+ }
54
+ }
55
+
56
+ impl TryInto<graphcore::Table> for QueryResult
57
+ {
58
+ type Error = InternalError;
59
+ fn try_into(self) -> Result<graphcore::Table, Self::Error>
60
+ {
61
+ match self
62
+ {
63
+ QueryResult::Table(tbl) => Ok(tbl),
64
+ _ => Err(InternalError::InvalidQueryResultCast),
65
+ }
66
+ }
67
+ }
68
+
69
+ impl std::fmt::Display for QueryResult
70
+ {
71
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result
72
+ {
73
+ match self
74
+ {
75
+ QueryResult::Empty => write!(f, "empty"),
76
+ QueryResult::Value(v) => write!(f, "{}", v),
77
+ QueryResult::Array(arr) => write!(f, "[{}]", arr.iter().map(|x| x.to_string()).join(", ")),
78
+ QueryResult::Table(t) => write!(
79
+ f,
80
+ "[{};{}]",
81
+ t.headers().join(", "),
82
+ t.row_iter()
83
+ .map(|x| x.iter().map(|x| x.to_string()).join(", "))
84
+ .join(";")
85
+ ),
86
+ }
87
+ }
88
+ }