gqlite 1.2.2 → 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 (104) 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}/release.toml +2 -2
  9. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/aggregators/arithmetic.rs +1 -0
  10. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/aggregators/stats.rs +27 -49
  11. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/aggregators.rs +7 -7
  12. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/capi.rs +34 -10
  13. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/compiler/expression_analyser.rs +10 -4
  14. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/compiler/variables_manager.rs +36 -39
  15. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/compiler.rs +46 -41
  16. data/ext/gqlitedb/src/connection.rs +300 -0
  17. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/error.rs +113 -50
  18. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/functions/containers.rs +21 -26
  19. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/functions/edge.rs +3 -3
  20. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/functions/math.rs +3 -3
  21. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/functions/node.rs +2 -2
  22. data/ext/gqlitedb/src/functions/path.rs +75 -0
  23. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/functions/scalar.rs +3 -3
  24. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/functions/string.rs +1 -1
  25. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/functions/value.rs +7 -7
  26. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/functions.rs +29 -31
  27. data/ext/gqlitedb/src/graph.rs +11 -0
  28. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/interpreter/evaluators.rs +178 -224
  29. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/interpreter/instructions.rs +8 -2
  30. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/lib.rs +9 -5
  31. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/parser/ast.rs +54 -76
  32. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/parser/gql.pest +9 -4
  33. data/ext/{gqliterb/vendor/gqlitedb/src/parser/parser.rs → gqlitedb/src/parser/parser_impl.rs} +86 -34
  34. data/ext/gqlitedb/src/parser.rs +4 -0
  35. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/prelude.rs +3 -2
  36. data/ext/gqlitedb/src/query_result.rs +88 -0
  37. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/store/redb.rs +260 -170
  38. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/store/sqlite.rs +157 -142
  39. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/store.rs +30 -23
  40. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/tests/evaluators.rs +41 -85
  41. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/tests/store/redb.rs +12 -5
  42. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/tests/store/sqlite.rs +12 -5
  43. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/tests/store.rs +106 -114
  44. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/tests/templates/ast.rs +29 -29
  45. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/tests/templates/programs.rs +4 -4
  46. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/value/compare.rs +13 -20
  47. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/value/contains.rs +2 -2
  48. data/ext/gqlitedb/src/value.rs +225 -0
  49. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/value_table.rs +22 -18
  50. data/ext/gqliterb/Cargo.toml +12 -34
  51. data/ext/gqliterb/src/lib.rs +67 -39
  52. data/ext/graphcore/Cargo.toml +19 -0
  53. data/ext/graphcore/README.MD +4 -0
  54. data/ext/graphcore/release.toml +1 -0
  55. data/ext/graphcore/src/error.rs +28 -0
  56. data/ext/{gqliterb/vendor/gqlitedb → graphcore}/src/graph.rs +146 -35
  57. data/ext/graphcore/src/lib.rs +16 -0
  58. data/ext/graphcore/src/prelude.rs +4 -0
  59. data/ext/{gqliterb/vendor/gqlitedb → graphcore}/src/serialize_with.rs +2 -2
  60. data/ext/graphcore/src/table.rs +272 -0
  61. data/ext/{gqliterb/vendor/gqlitedb → graphcore}/src/value/value_map.rs +44 -49
  62. data/ext/graphcore/src/value.rs +413 -0
  63. metadata +94 -83
  64. data/ext/gqliterb/.cargo/config.toml +0 -2
  65. data/ext/gqliterb/Cargo.lock +0 -1109
  66. data/ext/gqliterb/vendor/gqlitedb/Cargo.lock +0 -2060
  67. data/ext/gqliterb/vendor/gqlitedb/Cargo.toml +0 -132
  68. data/ext/gqliterb/vendor/gqlitedb/src/connection.rs +0 -208
  69. data/ext/gqliterb/vendor/gqlitedb/src/functions/path.rs +0 -48
  70. data/ext/gqliterb/vendor/gqlitedb/src/parser.rs +0 -4
  71. data/ext/gqliterb/vendor/gqlitedb/src/value.rs +0 -559
  72. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/askama.toml +0 -0
  73. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/benches/common/mod.rs +0 -0
  74. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/benches/pokec_divan.rs +0 -0
  75. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/benches/pokec_iai.rs +0 -0
  76. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/aggregators/containers.rs +0 -0
  77. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/aggregators/count.rs +0 -0
  78. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/consts.rs +0 -0
  79. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/interpreter/mod.rs +0 -0
  80. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/store/pgql.rs +0 -0
  81. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/tests/compiler.rs +0 -0
  82. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/tests/parser.rs +0 -0
  83. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/tests/templates.rs +0 -0
  84. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/tests.rs +0 -0
  85. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/utils.rs +0 -0
  86. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/templates/sql/sqlite/call_stats.sql +0 -0
  87. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/templates/sql/sqlite/edge_count_for_node.sql +0 -0
  88. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/templates/sql/sqlite/edge_create.sql +0 -0
  89. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/templates/sql/sqlite/edge_delete.sql +0 -0
  90. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/templates/sql/sqlite/edge_delete_by_nodes.sql +0 -0
  91. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/templates/sql/sqlite/edge_select.sql +0 -0
  92. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/templates/sql/sqlite/edge_update.sql +0 -0
  93. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/templates/sql/sqlite/graph_create.sql +0 -0
  94. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/templates/sql/sqlite/graph_delete.sql +0 -0
  95. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/templates/sql/sqlite/metadata_create_table.sql +0 -0
  96. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/templates/sql/sqlite/metadata_get.sql +0 -0
  97. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/templates/sql/sqlite/metadata_set.sql +0 -0
  98. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/templates/sql/sqlite/node_create.sql +0 -0
  99. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/templates/sql/sqlite/node_delete.sql +0 -0
  100. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/templates/sql/sqlite/node_select.sql +0 -0
  101. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/templates/sql/sqlite/node_update.sql +0 -0
  102. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/templates/sql/sqlite/table_exists.sql +0 -0
  103. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/templates/sql/sqlite/upgrade_from_1_01.sql +0 -0
  104. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/templates/sql/sqlite/upgrade_graph_from_1_01.sql +0 -0
@@ -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>
@@ -197,6 +197,13 @@ impl AstBuilder
197
197
  }
198
198
  .into(),
199
199
  ),
200
+ Rule::exponent => Ok(
201
+ ast::Exponent {
202
+ left: lhs?,
203
+ right: rhs?,
204
+ }
205
+ .into(),
206
+ ),
200
207
  Rule::or => Ok(
201
208
  ast::LogicalOr {
202
209
  left: lhs?,
@@ -331,7 +338,7 @@ impl AstBuilder
331
338
  value: value::Value::Float(validate_float(pair.as_str().parse()?, pair.as_str())?),
332
339
  })),
333
340
  Rule::ident => Ok(ast::Expression::Variable(ast::Variable {
334
- identifier: self.var_ids.from_name(pair.as_str()),
341
+ identifier: self.var_ids.create_variable_from_name(pair.as_str()),
335
342
  })),
336
343
  Rule::parameter => Ok(ast::Expression::Parameter(ast::Parameter {
337
344
  name: pair.as_str().to_string(),
@@ -360,10 +367,25 @@ impl AstBuilder
360
367
  .collect::<Result<_>>()?,
361
368
  }))
362
369
  }
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
- })),
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
+ }
367
389
  Rule::parenthesised_expression =>
368
390
  {
369
391
  let mut it = pair.into_inner();
@@ -380,7 +402,7 @@ impl AstBuilder
380
402
  if i == 0
381
403
  {
382
404
  ast::Expression::Variable(ast::Variable {
383
- identifier: self.var_ids.from_name(pair.as_str()),
405
+ identifier: self.var_ids.create_variable_from_name(pair.as_str()),
384
406
  })
385
407
  }
386
408
  else
@@ -510,13 +532,15 @@ impl AstBuilder
510
532
  {
511
533
  let expr = inner.try_next()?;
512
534
  Ok(ast::NamedExpression {
513
- identifier: self.var_ids.from_name(expr.as_str().trim()),
535
+ identifier: self.var_ids.create_variable_from_name(expr.as_str().trim()),
514
536
  expression: self.build_expression(expr.into_inner())?,
515
537
  })
516
538
  }
517
539
  2 => Ok({
518
540
  let expression = self.build_expression(inner.try_next()?.into_inner())?;
519
- 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());
520
544
  ast::NamedExpression {
521
545
  identifier,
522
546
  expression,
@@ -541,28 +565,28 @@ impl AstBuilder
541
565
  }
542
566
  }
543
567
 
544
- fn build_labels(&self, pair: pest::iterators::Pair<Rule>) -> Result<ast::LabelExpression>
568
+ fn build_labels(pair: pest::iterators::Pair<Rule>) -> Result<ast::LabelExpression>
545
569
  {
546
570
  match pair.as_rule()
547
571
  {
548
- Rule::labels => self.build_labels(pair.into_inner().try_next()?),
572
+ Rule::labels => Self::build_labels(pair.into_inner().try_next()?),
549
573
  Rule::label_alternative =>
550
574
  {
551
575
  let mut r = ast::LabelExpression::None;
552
- let mut inner = pair.into_inner();
553
- while let Some(next) = inner.next()
576
+ let inner = pair.into_inner();
577
+ for next in inner
554
578
  {
555
- r = r.or(self.build_labels(next)?);
579
+ r = r.or(Self::build_labels(next)?);
556
580
  }
557
581
  Ok(r)
558
582
  }
559
583
  Rule::label_inclusion =>
560
584
  {
561
585
  let mut r = ast::LabelExpression::None;
562
- let mut inner = pair.into_inner();
563
- while let Some(next) = inner.next()
586
+ let inner = pair.into_inner();
587
+ for next in inner
564
588
  {
565
- r = r.and(self.build_labels(next)?);
589
+ r = r.and(Self::build_labels(next)?);
566
590
  }
567
591
  Ok(r)
568
592
  }
@@ -594,9 +618,15 @@ impl AstBuilder
594
618
  }
595
619
  Rule::labels =>
596
620
  {
597
- labels = self.build_labels(pair)?;
621
+ labels = Self::build_labels(pair)?;
598
622
  }
599
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
+ }
600
630
  unknown_expression =>
601
631
  {
602
632
  return Err(
@@ -610,7 +640,7 @@ impl AstBuilder
610
640
  }
611
641
  }
612
642
  Ok(ast::NodePattern {
613
- variable: self.var_ids.from_name_optional(variable),
643
+ variable: self.var_ids.create_variable_from_name_optional(variable),
614
644
  labels,
615
645
  properties,
616
646
  })
@@ -640,9 +670,15 @@ impl AstBuilder
640
670
  }
641
671
  Rule::labels =>
642
672
  {
643
- labels = self.build_labels(pair)?;
673
+ labels = Self::build_labels(pair)?;
644
674
  }
645
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
+ }
646
682
  unknown_expression =>
647
683
  {
648
684
  return Err(
@@ -659,7 +695,7 @@ impl AstBuilder
659
695
  match edge_rule
660
696
  {
661
697
  Rule::directed_edge_pattern => Ok(ast::EdgePattern {
662
- variable: self.var_ids.from_name_optional(variable),
698
+ variable: self.var_ids.create_variable_from_name_optional(variable),
663
699
  source: source_node,
664
700
  destination: destination_node,
665
701
  directivity: graph::EdgeDirectivity::Directed,
@@ -667,7 +703,7 @@ impl AstBuilder
667
703
  properties,
668
704
  }),
669
705
  Rule::reversed_edge_pattern => Ok(ast::EdgePattern {
670
- variable: self.var_ids.from_name_optional(variable),
706
+ variable: self.var_ids.create_variable_from_name_optional(variable),
671
707
  source: destination_node,
672
708
  destination: source_node,
673
709
  directivity: graph::EdgeDirectivity::Directed,
@@ -683,7 +719,7 @@ impl AstBuilder
683
719
  })?;
684
720
  }
685
721
  Ok(ast::EdgePattern {
686
- variable: self.var_ids.from_name_optional(variable),
722
+ variable: self.var_ids.create_variable_from_name_optional(variable),
687
723
  source: source_node,
688
724
  destination: destination_node,
689
725
  directivity: graph::EdgeDirectivity::Undirected,
@@ -743,7 +779,7 @@ impl AstBuilder
743
779
 
744
780
  if it.peek().is_some() && destination_node.variable.is_none()
745
781
  {
746
- destination_node.variable = Some(self.var_ids.anonymous());
782
+ destination_node.variable = Some(self.var_ids.create_anonymous_variable());
747
783
  }
748
784
 
749
785
  let edge_pattern = self.build_edge_pattern(
@@ -771,7 +807,7 @@ impl AstBuilder
771
807
  allow_undirected_edge,
772
808
  )?;
773
809
  vec.push(ast::Pattern::Path(ast::PathPattern {
774
- variable: self.var_ids.from_name(variable),
810
+ variable: self.var_ids.create_variable_from_name(variable),
775
811
  edge: edge_pattern,
776
812
  }));
777
813
  }
@@ -874,6 +910,14 @@ impl AstBuilder
874
910
  Rule::create_graph_statement => Ok(ast::Statement::CreateGraph(ast::CreateGraph {
875
911
  name: self.build_ident(&mut pair.into_inner())?,
876
912
  })),
913
+ Rule::drop_graph_statement => Ok(ast::Statement::DropGraph(ast::DropGraph {
914
+ name: self.build_ident(&mut pair.into_inner())?,
915
+ if_exists: false,
916
+ })),
917
+ Rule::drop_graph_if_exists_statement => Ok(ast::Statement::DropGraph(ast::DropGraph {
918
+ name: self.build_ident(&mut pair.into_inner())?,
919
+ if_exists: true,
920
+ })),
877
921
  Rule::use_graph_statement => Ok(ast::Statement::UseGraph(ast::UseGraph {
878
922
  name: self.build_ident(&mut pair.into_inner())?,
879
923
  })),
@@ -974,7 +1018,9 @@ impl AstBuilder
974
1018
 
975
1019
  let mut pair = pair.into_inner();
976
1020
  let mut pair_left = pair.try_next()?.into_inner();
977
- 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());
978
1024
  let path = pair_left.map(|el| el.as_str().to_string()).collect();
979
1025
  let expression = self.build_expression(pair.try_next()?.into_inner())?;
980
1026
  let update_property = ast::UpdateProperty {
@@ -994,7 +1040,9 @@ impl AstBuilder
994
1040
  Rule::set_label_expression =>
995
1041
  {
996
1042
  let mut pair = pair.into_inner();
997
- 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());
998
1046
  let labels = pair.map(|el| el.as_str().to_string()).collect();
999
1047
  updates.push(ast::OneUpdate::AddLabels(ast::AddRemoveLabels {
1000
1048
  target,
@@ -1019,7 +1067,9 @@ impl AstBuilder
1019
1067
  Rule::remove_member_access =>
1020
1068
  {
1021
1069
  let mut pair = pair.into_inner();
1022
- 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());
1023
1073
  let path = pair.map(|el| el.as_str().to_string()).collect();
1024
1074
  updates.push(ast::OneUpdate::RemoveProperty(ast::RemoveProperty {
1025
1075
  target,
@@ -1029,7 +1079,9 @@ impl AstBuilder
1029
1079
  Rule::set_label_expression =>
1030
1080
  {
1031
1081
  let mut pair = pair.into_inner();
1032
- 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());
1033
1085
  let labels = pair.map(|el| el.as_str().to_string()).collect();
1034
1086
  updates.push(ast::OneUpdate::RemoveLabels(ast::AddRemoveLabels {
1035
1087
  target,
@@ -1052,9 +1104,8 @@ impl AstBuilder
1052
1104
  .collect::<Vec<&str>>()
1053
1105
  .join(".");
1054
1106
  Ok(ast::Statement::Call(ast::Call {
1055
- name: name,
1107
+ name,
1056
1108
  arguments: Default::default(),
1057
- yield_: Default::default(),
1058
1109
  }))
1059
1110
  }
1060
1111
  unknown_expression => Err(
@@ -1086,7 +1137,8 @@ pub(crate) fn parse(input: &str) -> Result<ast::Queries>
1086
1137
  .op(
1087
1138
  Op::infix(Rule::multiplication, Assoc::Left)
1088
1139
  | Op::infix(Rule::division, Assoc::Left)
1089
- | Op::infix(Rule::modulo, Assoc::Left),
1140
+ | Op::infix(Rule::modulo, Assoc::Left)
1141
+ | Op::infix(Rule::exponent, Assoc::Left),
1090
1142
  )
1091
1143
  .op(Op::prefix(Rule::not) | Op::prefix(Rule::negation))
1092
1144
  .op(
@@ -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
+ }