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.
- checksums.yaml +4 -4
- data/ext/Cargo.toml +20 -0
- data/ext/gqlitedb/Cargo.toml +77 -0
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/benches/common/pokec.rs +30 -20
- data/ext/gqlitedb/gqlite_bench_data/README.MD +6 -0
- data/ext/gqlitedb/gqlite_bench_data/scripts/generate_smaller_pokec.rb +85 -0
- data/ext/gqlitedb/gqlite_bench_data/scripts/to_efficient_pokec.rb +34 -0
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/release.toml +2 -2
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/aggregators/arithmetic.rs +1 -0
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/aggregators/stats.rs +27 -49
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/aggregators.rs +7 -7
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/capi.rs +34 -10
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/compiler/expression_analyser.rs +10 -4
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/compiler/variables_manager.rs +36 -39
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/compiler.rs +46 -41
- data/ext/gqlitedb/src/connection.rs +300 -0
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/error.rs +113 -50
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/functions/containers.rs +21 -26
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/functions/edge.rs +3 -3
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/functions/math.rs +3 -3
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/functions/node.rs +2 -2
- data/ext/gqlitedb/src/functions/path.rs +75 -0
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/functions/scalar.rs +3 -3
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/functions/string.rs +1 -1
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/functions/value.rs +7 -7
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/functions.rs +29 -31
- data/ext/gqlitedb/src/graph.rs +11 -0
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/interpreter/evaluators.rs +178 -224
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/interpreter/instructions.rs +8 -2
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/lib.rs +9 -5
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/parser/ast.rs +54 -76
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/parser/gql.pest +9 -4
- data/ext/{gqliterb/vendor/gqlitedb/src/parser/parser.rs → gqlitedb/src/parser/parser_impl.rs} +86 -34
- data/ext/gqlitedb/src/parser.rs +4 -0
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/prelude.rs +3 -2
- data/ext/gqlitedb/src/query_result.rs +88 -0
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/store/redb.rs +260 -170
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/store/sqlite.rs +157 -142
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/store.rs +30 -23
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/tests/evaluators.rs +41 -85
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/tests/store/redb.rs +12 -5
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/tests/store/sqlite.rs +12 -5
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/tests/store.rs +106 -114
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/tests/templates/ast.rs +29 -29
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/tests/templates/programs.rs +4 -4
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/value/compare.rs +13 -20
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/value/contains.rs +2 -2
- data/ext/gqlitedb/src/value.rs +225 -0
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/value_table.rs +22 -18
- data/ext/gqliterb/Cargo.toml +12 -34
- data/ext/gqliterb/src/lib.rs +67 -39
- data/ext/graphcore/Cargo.toml +19 -0
- data/ext/graphcore/README.MD +4 -0
- data/ext/graphcore/release.toml +1 -0
- data/ext/graphcore/src/error.rs +28 -0
- data/ext/{gqliterb/vendor/gqlitedb → graphcore}/src/graph.rs +146 -35
- data/ext/graphcore/src/lib.rs +16 -0
- data/ext/graphcore/src/prelude.rs +4 -0
- data/ext/{gqliterb/vendor/gqlitedb → graphcore}/src/serialize_with.rs +2 -2
- data/ext/graphcore/src/table.rs +272 -0
- data/ext/{gqliterb/vendor/gqlitedb → graphcore}/src/value/value_map.rs +44 -49
- data/ext/graphcore/src/value.rs +413 -0
- metadata +94 -83
- data/ext/gqliterb/.cargo/config.toml +0 -2
- data/ext/gqliterb/Cargo.lock +0 -1109
- data/ext/gqliterb/vendor/gqlitedb/Cargo.lock +0 -2060
- data/ext/gqliterb/vendor/gqlitedb/Cargo.toml +0 -132
- data/ext/gqliterb/vendor/gqlitedb/src/connection.rs +0 -208
- data/ext/gqliterb/vendor/gqlitedb/src/functions/path.rs +0 -48
- data/ext/gqliterb/vendor/gqlitedb/src/parser.rs +0 -4
- data/ext/gqliterb/vendor/gqlitedb/src/value.rs +0 -559
- /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/askama.toml +0 -0
- /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/benches/common/mod.rs +0 -0
- /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/benches/pokec_divan.rs +0 -0
- /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/benches/pokec_iai.rs +0 -0
- /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/aggregators/containers.rs +0 -0
- /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/aggregators/count.rs +0 -0
- /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/consts.rs +0 -0
- /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/interpreter/mod.rs +0 -0
- /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/store/pgql.rs +0 -0
- /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/tests/compiler.rs +0 -0
- /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/tests/parser.rs +0 -0
- /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/tests/templates.rs +0 -0
- /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/tests.rs +0 -0
- /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/utils.rs +0 -0
- /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/templates/sql/sqlite/call_stats.sql +0 -0
- /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/templates/sql/sqlite/edge_count_for_node.sql +0 -0
- /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/templates/sql/sqlite/edge_create.sql +0 -0
- /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/templates/sql/sqlite/edge_delete.sql +0 -0
- /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/templates/sql/sqlite/edge_delete_by_nodes.sql +0 -0
- /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/templates/sql/sqlite/edge_select.sql +0 -0
- /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/templates/sql/sqlite/edge_update.sql +0 -0
- /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/templates/sql/sqlite/graph_create.sql +0 -0
- /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/templates/sql/sqlite/graph_delete.sql +0 -0
- /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/templates/sql/sqlite/metadata_create_table.sql +0 -0
- /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/templates/sql/sqlite/metadata_get.sql +0 -0
- /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/templates/sql/sqlite/metadata_set.sql +0 -0
- /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/templates/sql/sqlite/node_create.sql +0 -0
- /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/templates/sql/sqlite/node_delete.sql +0 -0
- /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/templates/sql/sqlite/node_select.sql +0 -0
- /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/templates/sql/sqlite/node_update.sql +0 -0
- /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/templates/sql/sqlite/table_exists.sql +0 -0
- /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/templates/sql/sqlite/upgrade_from_1_01.sql +0 -0
- /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/templates/sql/sqlite/upgrade_graph_from_1_01.sql +0 -0
data/ext/{gqliterb/vendor/gqlitedb/src/parser/parser.rs → gqlitedb/src/parser/parser_impl.rs}
RENAMED
@@ -19,7 +19,7 @@ trait TryNext: Iterator
|
|
19
19
|
}
|
20
20
|
}
|
21
21
|
|
22
|
-
fn remove_hex_prefix
|
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
|
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
|
-
|
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.
|
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::
|
364
|
-
|
365
|
-
|
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.
|
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.
|
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
|
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(
|
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 =>
|
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
|
553
|
-
|
576
|
+
let inner = pair.into_inner();
|
577
|
+
for next in inner
|
554
578
|
{
|
555
|
-
r = r.or(
|
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
|
563
|
-
|
586
|
+
let inner = pair.into_inner();
|
587
|
+
for next in inner
|
564
588
|
{
|
565
|
-
r = r.and(
|
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 =
|
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.
|
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 =
|
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.
|
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.
|
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.
|
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.
|
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.
|
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
|
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
|
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
|
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
|
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
|
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(
|
@@ -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,
|
5
|
-
|
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
|
+
}
|