gqlite 1.8.0 → 1.8.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.
- checksums.yaml +4 -4
- data/ext/Cargo.toml +8 -8
- data/ext/db-index/Cargo.toml +2 -2
- data/ext/gqlitedb/Cargo.toml +0 -2
- data/ext/gqlitedb/src/aggregators.rs +28 -0
- data/ext/gqlitedb/src/compiler/expression_analyser.rs +33 -0
- data/ext/gqlitedb/src/compiler/variables_manager.rs +111 -11
- data/ext/gqlitedb/src/compiler.rs +506 -48
- data/ext/gqlitedb/src/connection.rs +14 -2
- data/ext/gqlitedb/src/consts.rs +1 -1
- data/ext/gqlitedb/src/error.rs +31 -0
- data/ext/gqlitedb/src/interpreter/evaluators.rs +153 -331
- data/ext/gqlitedb/src/interpreter/instructions.rs +77 -0
- data/ext/gqlitedb/src/interpreter/mod.rs +1 -0
- data/ext/gqlitedb/src/interpreter/path/bfs.rs +494 -0
- data/ext/gqlitedb/src/interpreter/path/dfs.rs +267 -0
- data/ext/gqlitedb/src/interpreter/path/group.rs +418 -0
- data/ext/gqlitedb/src/interpreter/path.rs +542 -0
- data/ext/gqlitedb/src/planner.rs +231 -6
- data/ext/gqlitedb/src/query_result.rs +19 -4
- data/ext/gqlitedb/src/store/redb.rs +1 -1
- data/ext/gqlitedb/src/tests/compiler.rs +2454 -1
- data/ext/gqlitedb/src/tests/connection/postgres.rs +22 -0
- data/ext/gqlitedb/src/tests/connection/redb.rs +24 -0
- data/ext/gqlitedb/src/tests/connection/sqlite.rs +16 -0
- data/ext/gqlitedb/src/tests/connection.rs +101 -0
- data/ext/gqlitedb/src/tests/evaluators.rs +2206 -1
- data/ext/gqlitedb/src/tests/parser.rs +1225 -0
- data/ext/gqlitedb/src/tests/planner.rs +433 -2
- data/ext/gqlitedb/src/tests/store/vector_index/postgres.rs +5 -5
- data/ext/gqlitedb/src/tests/store/vector_index/sqlite.rs +3 -1
- data/ext/gqlitedb/src/tests/templates/ast.rs +294 -1
- data/ext/gqlitedb/src/tests/templates/programs.rs +318 -0
- data/ext/gqliterb/Cargo.toml +0 -1
- data/ext/gqlparser/src/oc/ast.rs +72 -3
- data/ext/gqlparser/src/oc/error.rs +18 -0
- data/ext/gqlparser/src/oc/lexer.rs +157 -2
- data/ext/gqlparser/src/oc/parser/tests.rs +735 -29
- data/ext/gqlparser/src/oc/parser.rs +1312 -182
- data/ext/gqlparser/src/oc/string.rs +172 -0
- data/ext/gqlparser/src/oc.rs +1 -0
- data/ext/graphcore/src/value/value_map.rs +2 -2
- data/ext/graphcore/src/value.rs +13 -1
- metadata +6 -2
- data/ext/gqlitedb/src/parser/gql.pest +0 -198
|
@@ -9,6 +9,7 @@ fn return_statement(var_id: VariableIdentifier) -> Statement
|
|
|
9
9
|
expression: Variable { identifier: var_id }.into(),
|
|
10
10
|
}],
|
|
11
11
|
modifiers: Modifiers {
|
|
12
|
+
distinct: false,
|
|
12
13
|
skip: None,
|
|
13
14
|
limit: None,
|
|
14
15
|
order_by: None,
|
|
@@ -26,6 +27,8 @@ pub(crate) fn simple_create_node() -> Statements
|
|
|
26
27
|
variable: None,
|
|
27
28
|
labels: LabelExpression::None,
|
|
28
29
|
properties: None,
|
|
30
|
+
|
|
31
|
+
predicate: None,
|
|
29
32
|
})],
|
|
30
33
|
}
|
|
31
34
|
.into(),
|
|
@@ -53,6 +56,8 @@ pub(crate) fn create_named_node() -> Statements
|
|
|
53
56
|
}
|
|
54
57
|
.into(),
|
|
55
58
|
),
|
|
59
|
+
|
|
60
|
+
predicate: None,
|
|
56
61
|
})],
|
|
57
62
|
}
|
|
58
63
|
.into(),
|
|
@@ -70,6 +75,7 @@ pub(crate) fn create_named_node() -> Statements
|
|
|
70
75
|
.into(),
|
|
71
76
|
}],
|
|
72
77
|
modifiers: Modifiers {
|
|
78
|
+
distinct: false,
|
|
73
79
|
skip: None,
|
|
74
80
|
limit: None,
|
|
75
81
|
order_by: None,
|
|
@@ -104,6 +110,8 @@ pub(crate) fn create_named_node_double_return() -> Statements
|
|
|
104
110
|
}
|
|
105
111
|
.into(),
|
|
106
112
|
),
|
|
113
|
+
|
|
114
|
+
predicate: None,
|
|
107
115
|
})],
|
|
108
116
|
}
|
|
109
117
|
.into(),
|
|
@@ -134,6 +142,7 @@ pub(crate) fn create_named_node_double_return() -> Statements
|
|
|
134
142
|
},
|
|
135
143
|
],
|
|
136
144
|
modifiers: Modifiers {
|
|
145
|
+
distinct: false,
|
|
137
146
|
skip: None,
|
|
138
147
|
limit: None,
|
|
139
148
|
order_by: None,
|
|
@@ -162,6 +171,7 @@ pub(crate) fn double_with_return() -> Statements
|
|
|
162
171
|
},
|
|
163
172
|
],
|
|
164
173
|
modifiers: Modifiers {
|
|
174
|
+
distinct: false,
|
|
165
175
|
skip: None,
|
|
166
176
|
limit: None,
|
|
167
177
|
order_by: None,
|
|
@@ -188,6 +198,7 @@ pub(crate) fn double_with_return() -> Statements
|
|
|
188
198
|
},
|
|
189
199
|
],
|
|
190
200
|
modifiers: Modifiers {
|
|
201
|
+
distinct: false,
|
|
191
202
|
skip: None,
|
|
192
203
|
limit: None,
|
|
193
204
|
order_by: None,
|
|
@@ -228,16 +239,19 @@ pub(crate) fn match_loop() -> Statements
|
|
|
228
239
|
variable: Some(var_ids.create_variable_from_name("n")),
|
|
229
240
|
labels: LabelExpression::None,
|
|
230
241
|
properties: None,
|
|
242
|
+
predicate: None,
|
|
231
243
|
},
|
|
232
244
|
destination: NodePattern {
|
|
233
245
|
variable: Some(var_ids.create_variable_from_name("n")),
|
|
234
246
|
labels: LabelExpression::None,
|
|
235
247
|
properties: None,
|
|
248
|
+
predicate: None,
|
|
236
249
|
},
|
|
237
250
|
labels: LabelExpression::None,
|
|
238
251
|
properties: None,
|
|
239
252
|
directivity: graphcore::EdgeDirectivity::Directed,
|
|
240
|
-
|
|
253
|
+
|
|
254
|
+
predicate: None,
|
|
241
255
|
})],
|
|
242
256
|
where_expression: None,
|
|
243
257
|
optional: false,
|
|
@@ -258,6 +272,8 @@ pub(crate) fn optional_match() -> Statements
|
|
|
258
272
|
variable: Some(var_ids.create_variable_from_name("a")),
|
|
259
273
|
labels: LabelExpression::None,
|
|
260
274
|
properties: None,
|
|
275
|
+
|
|
276
|
+
predicate: None,
|
|
261
277
|
})],
|
|
262
278
|
where_expression: None,
|
|
263
279
|
optional: true,
|
|
@@ -278,6 +294,8 @@ pub(crate) fn match_count() -> Statements
|
|
|
278
294
|
variable: Some(var_ids.create_variable_from_name("a")),
|
|
279
295
|
labels: LabelExpression::None,
|
|
280
296
|
properties: None,
|
|
297
|
+
|
|
298
|
+
predicate: None,
|
|
281
299
|
})],
|
|
282
300
|
where_expression: None,
|
|
283
301
|
optional: false,
|
|
@@ -291,10 +309,12 @@ pub(crate) fn match_count() -> Statements
|
|
|
291
309
|
expression: FunctionCall {
|
|
292
310
|
name: "count".into(),
|
|
293
311
|
arguments: vec![Value { value: 0.into() }.into()],
|
|
312
|
+
distinct: false,
|
|
294
313
|
}
|
|
295
314
|
.into(),
|
|
296
315
|
}],
|
|
297
316
|
modifiers: Modifiers {
|
|
317
|
+
distinct: false,
|
|
298
318
|
skip: None,
|
|
299
319
|
limit: None,
|
|
300
320
|
order_by: None,
|
|
@@ -315,6 +335,8 @@ pub(crate) fn aggregation() -> Statements
|
|
|
315
335
|
variable: Some(var_ids.create_variable_from_name("n")),
|
|
316
336
|
labels: LabelExpression::None,
|
|
317
337
|
properties: None,
|
|
338
|
+
|
|
339
|
+
predicate: None,
|
|
318
340
|
})],
|
|
319
341
|
where_expression: None,
|
|
320
342
|
optional: false,
|
|
@@ -349,11 +371,13 @@ pub(crate) fn aggregation() -> Statements
|
|
|
349
371
|
}
|
|
350
372
|
.into(),
|
|
351
373
|
],
|
|
374
|
+
distinct: false,
|
|
352
375
|
}
|
|
353
376
|
.into(),
|
|
354
377
|
},
|
|
355
378
|
],
|
|
356
379
|
modifiers: Modifiers {
|
|
380
|
+
distinct: false,
|
|
357
381
|
skip: None,
|
|
358
382
|
limit: None,
|
|
359
383
|
order_by: None,
|
|
@@ -391,6 +415,8 @@ pub(crate) fn match_with_vector_search(index_name: &str) -> Statements
|
|
|
391
415
|
variable: Some(n.clone()),
|
|
392
416
|
labels: LabelExpression::String("Doc".to_string()),
|
|
393
417
|
properties: None,
|
|
418
|
+
|
|
419
|
+
predicate: None,
|
|
394
420
|
})],
|
|
395
421
|
where_expression: None,
|
|
396
422
|
optional: false,
|
|
@@ -421,6 +447,273 @@ pub(crate) fn match_with_vector_search(index_name: &str) -> Statements
|
|
|
421
447
|
.into(),
|
|
422
448
|
}],
|
|
423
449
|
modifiers: Modifiers {
|
|
450
|
+
distinct: false,
|
|
451
|
+
skip: None,
|
|
452
|
+
limit: None,
|
|
453
|
+
order_by: None,
|
|
454
|
+
},
|
|
455
|
+
where_expression: None,
|
|
456
|
+
}
|
|
457
|
+
.into(),
|
|
458
|
+
]
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
/// AST for `MATCH (a) ((n)-[:R]->(m)){1,3} (b) RETURN a, b`
|
|
462
|
+
/// AST for `MATCH (a) ((n)-[:R]->(m)){1,3} (b) RETURN a, b`
|
|
463
|
+
pub(crate) fn group_single_edge_range() -> Statements
|
|
464
|
+
{
|
|
465
|
+
let var_ids = VariableIdentifiers::default();
|
|
466
|
+
let a = var_ids.create_variable_from_name("a");
|
|
467
|
+
let n = var_ids.create_variable_from_name("n");
|
|
468
|
+
let m = var_ids.create_variable_from_name("m");
|
|
469
|
+
let b = var_ids.create_variable_from_name("b");
|
|
470
|
+
let edge_anon = var_ids.create_variable_from_name("anonymous_4");
|
|
471
|
+
vec![
|
|
472
|
+
Match {
|
|
473
|
+
patterns: vec![Pattern::QuantifiedPath(QuantifiedPathPattern {
|
|
474
|
+
variable: None,
|
|
475
|
+
source: NodePattern {
|
|
476
|
+
variable: Some(a.clone()),
|
|
477
|
+
labels: LabelExpression::None,
|
|
478
|
+
properties: None,
|
|
479
|
+
predicate: None,
|
|
480
|
+
},
|
|
481
|
+
group: vec![Pattern::Edge(EdgePattern {
|
|
482
|
+
variable: Some(edge_anon),
|
|
483
|
+
source: NodePattern {
|
|
484
|
+
variable: Some(n),
|
|
485
|
+
labels: LabelExpression::None,
|
|
486
|
+
properties: None,
|
|
487
|
+
predicate: None,
|
|
488
|
+
},
|
|
489
|
+
destination: NodePattern {
|
|
490
|
+
variable: Some(m),
|
|
491
|
+
labels: LabelExpression::None,
|
|
492
|
+
properties: None,
|
|
493
|
+
predicate: None,
|
|
494
|
+
},
|
|
495
|
+
directivity: graphcore::EdgeDirectivity::Directed,
|
|
496
|
+
labels: LabelExpression::String("R".to_string()),
|
|
497
|
+
properties: None,
|
|
498
|
+
predicate: None,
|
|
499
|
+
})],
|
|
500
|
+
group_where: None,
|
|
501
|
+
path_where: None,
|
|
502
|
+
quantifier: Some(1..3),
|
|
503
|
+
destination: NodePattern {
|
|
504
|
+
variable: Some(b.clone()),
|
|
505
|
+
labels: LabelExpression::None,
|
|
506
|
+
properties: None,
|
|
507
|
+
predicate: None,
|
|
508
|
+
},
|
|
509
|
+
selector: PathSelector::All,
|
|
510
|
+
})],
|
|
511
|
+
where_expression: None,
|
|
512
|
+
optional: false,
|
|
513
|
+
search: None,
|
|
514
|
+
}
|
|
515
|
+
.into(),
|
|
516
|
+
Return {
|
|
517
|
+
all: false,
|
|
518
|
+
expressions: vec![
|
|
519
|
+
NamedExpression {
|
|
520
|
+
identifier: a.clone(),
|
|
521
|
+
expression: Variable { identifier: a }.into(),
|
|
522
|
+
},
|
|
523
|
+
NamedExpression {
|
|
524
|
+
identifier: b.clone(),
|
|
525
|
+
expression: Variable { identifier: b }.into(),
|
|
526
|
+
},
|
|
527
|
+
],
|
|
528
|
+
modifiers: Modifiers {
|
|
529
|
+
distinct: false,
|
|
530
|
+
skip: None,
|
|
531
|
+
limit: None,
|
|
532
|
+
order_by: None,
|
|
533
|
+
},
|
|
534
|
+
where_expression: None,
|
|
535
|
+
}
|
|
536
|
+
.into(),
|
|
537
|
+
]
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
/// AST for `MATCH (a) ((n)-[:R1]->(x)-[:R2]->(m)){1,3} (b) RETURN a, b`
|
|
541
|
+
pub(crate) fn group_two_edges_range() -> Statements
|
|
542
|
+
{
|
|
543
|
+
let var_ids = VariableIdentifiers::default();
|
|
544
|
+
let a = var_ids.create_variable_from_name("a");
|
|
545
|
+
let n = var_ids.create_variable_from_name("n");
|
|
546
|
+
let x = var_ids.create_variable_from_name("x");
|
|
547
|
+
let m = var_ids.create_variable_from_name("m");
|
|
548
|
+
let b = var_ids.create_variable_from_name("b");
|
|
549
|
+
let edge1_anon = var_ids.create_variable_from_name("anonymous_5");
|
|
550
|
+
let edge2_anon = var_ids.create_variable_from_name("anonymous_6");
|
|
551
|
+
vec![
|
|
552
|
+
Match {
|
|
553
|
+
patterns: vec![Pattern::QuantifiedPath(QuantifiedPathPattern {
|
|
554
|
+
variable: None,
|
|
555
|
+
source: NodePattern {
|
|
556
|
+
variable: Some(a.clone()),
|
|
557
|
+
labels: LabelExpression::None,
|
|
558
|
+
properties: None,
|
|
559
|
+
predicate: None,
|
|
560
|
+
},
|
|
561
|
+
group: vec![
|
|
562
|
+
Pattern::Edge(EdgePattern {
|
|
563
|
+
variable: Some(edge1_anon),
|
|
564
|
+
source: NodePattern {
|
|
565
|
+
variable: Some(n),
|
|
566
|
+
labels: LabelExpression::None,
|
|
567
|
+
properties: None,
|
|
568
|
+
predicate: None,
|
|
569
|
+
},
|
|
570
|
+
destination: NodePattern {
|
|
571
|
+
variable: Some(x.clone()),
|
|
572
|
+
labels: LabelExpression::None,
|
|
573
|
+
properties: None,
|
|
574
|
+
predicate: None,
|
|
575
|
+
},
|
|
576
|
+
directivity: graphcore::EdgeDirectivity::Directed,
|
|
577
|
+
labels: LabelExpression::String("R1".to_string()),
|
|
578
|
+
properties: None,
|
|
579
|
+
predicate: None,
|
|
580
|
+
}),
|
|
581
|
+
Pattern::Edge(EdgePattern {
|
|
582
|
+
variable: Some(edge2_anon),
|
|
583
|
+
source: NodePattern {
|
|
584
|
+
variable: Some(x),
|
|
585
|
+
labels: LabelExpression::None,
|
|
586
|
+
properties: None,
|
|
587
|
+
predicate: None,
|
|
588
|
+
},
|
|
589
|
+
destination: NodePattern {
|
|
590
|
+
variable: Some(m),
|
|
591
|
+
labels: LabelExpression::None,
|
|
592
|
+
properties: None,
|
|
593
|
+
predicate: None,
|
|
594
|
+
},
|
|
595
|
+
directivity: graphcore::EdgeDirectivity::Directed,
|
|
596
|
+
labels: LabelExpression::String("R2".to_string()),
|
|
597
|
+
properties: None,
|
|
598
|
+
predicate: None,
|
|
599
|
+
}),
|
|
600
|
+
],
|
|
601
|
+
group_where: None,
|
|
602
|
+
path_where: None,
|
|
603
|
+
quantifier: Some(1..3),
|
|
604
|
+
destination: NodePattern {
|
|
605
|
+
variable: Some(b.clone()),
|
|
606
|
+
labels: LabelExpression::None,
|
|
607
|
+
properties: None,
|
|
608
|
+
predicate: None,
|
|
609
|
+
},
|
|
610
|
+
selector: PathSelector::All,
|
|
611
|
+
})],
|
|
612
|
+
where_expression: None,
|
|
613
|
+
optional: false,
|
|
614
|
+
search: None,
|
|
615
|
+
}
|
|
616
|
+
.into(),
|
|
617
|
+
Return {
|
|
618
|
+
all: false,
|
|
619
|
+
expressions: vec![
|
|
620
|
+
NamedExpression {
|
|
621
|
+
identifier: a.clone(),
|
|
622
|
+
expression: Variable { identifier: a }.into(),
|
|
623
|
+
},
|
|
624
|
+
NamedExpression {
|
|
625
|
+
identifier: b.clone(),
|
|
626
|
+
expression: Variable { identifier: b }.into(),
|
|
627
|
+
},
|
|
628
|
+
],
|
|
629
|
+
modifiers: Modifiers {
|
|
630
|
+
distinct: false,
|
|
631
|
+
skip: None,
|
|
632
|
+
limit: None,
|
|
633
|
+
order_by: None,
|
|
634
|
+
},
|
|
635
|
+
where_expression: None,
|
|
636
|
+
}
|
|
637
|
+
.into(),
|
|
638
|
+
]
|
|
639
|
+
}
|
|
640
|
+
|
|
641
|
+
/// AST for `MATCH p = SHORTEST 1 (a)-[:R]-+(b) RETURN a, b, length(p)`
|
|
642
|
+
pub(crate) fn shortest_single_edge_full_return() -> Statements
|
|
643
|
+
{
|
|
644
|
+
let var_ids = VariableIdentifiers::default();
|
|
645
|
+
let a = var_ids.create_variable_from_name("a");
|
|
646
|
+
let b = var_ids.create_variable_from_name("b");
|
|
647
|
+
let edge_anon = var_ids.create_variable_from_name("anonymous_2");
|
|
648
|
+
let p = var_ids.create_variable_from_name("p");
|
|
649
|
+
vec![
|
|
650
|
+
Match {
|
|
651
|
+
patterns: vec![Pattern::QuantifiedPath(QuantifiedPathPattern {
|
|
652
|
+
variable: Some(p.clone()),
|
|
653
|
+
source: NodePattern {
|
|
654
|
+
variable: Some(a.clone()),
|
|
655
|
+
labels: LabelExpression::None,
|
|
656
|
+
properties: None,
|
|
657
|
+
predicate: None,
|
|
658
|
+
},
|
|
659
|
+
group: vec![Pattern::Edge(EdgePattern {
|
|
660
|
+
variable: Some(edge_anon),
|
|
661
|
+
source: NodePattern {
|
|
662
|
+
variable: Some(a.clone()),
|
|
663
|
+
labels: LabelExpression::None,
|
|
664
|
+
properties: None,
|
|
665
|
+
predicate: None,
|
|
666
|
+
},
|
|
667
|
+
destination: NodePattern {
|
|
668
|
+
variable: Some(b.clone()),
|
|
669
|
+
labels: LabelExpression::None,
|
|
670
|
+
properties: None,
|
|
671
|
+
predicate: None,
|
|
672
|
+
},
|
|
673
|
+
directivity: graphcore::EdgeDirectivity::Undirected,
|
|
674
|
+
labels: LabelExpression::String("R".to_string()),
|
|
675
|
+
properties: None,
|
|
676
|
+
predicate: None,
|
|
677
|
+
})],
|
|
678
|
+
group_where: None,
|
|
679
|
+
path_where: None,
|
|
680
|
+
quantifier: Some(1..usize::MAX),
|
|
681
|
+
destination: NodePattern {
|
|
682
|
+
variable: Some(b.clone()),
|
|
683
|
+
labels: LabelExpression::None,
|
|
684
|
+
properties: None,
|
|
685
|
+
predicate: None,
|
|
686
|
+
},
|
|
687
|
+
selector: PathSelector::Shortest(Value { value: 1.into() }.into()),
|
|
688
|
+
})],
|
|
689
|
+
where_expression: None,
|
|
690
|
+
optional: false,
|
|
691
|
+
search: None,
|
|
692
|
+
}
|
|
693
|
+
.into(),
|
|
694
|
+
Return {
|
|
695
|
+
all: false,
|
|
696
|
+
expressions: vec![
|
|
697
|
+
NamedExpression {
|
|
698
|
+
identifier: a.clone(),
|
|
699
|
+
expression: Variable { identifier: a }.into(),
|
|
700
|
+
},
|
|
701
|
+
NamedExpression {
|
|
702
|
+
identifier: b.clone(),
|
|
703
|
+
expression: Variable { identifier: b }.into(),
|
|
704
|
+
},
|
|
705
|
+
NamedExpression {
|
|
706
|
+
identifier: var_ids.create_variable_from_name("length(p)"),
|
|
707
|
+
expression: FunctionCall {
|
|
708
|
+
name: "length".into(),
|
|
709
|
+
arguments: vec![Variable { identifier: p }.into()],
|
|
710
|
+
distinct: false,
|
|
711
|
+
}
|
|
712
|
+
.into(),
|
|
713
|
+
},
|
|
714
|
+
],
|
|
715
|
+
modifiers: Modifiers {
|
|
716
|
+
distinct: false,
|
|
424
717
|
skip: None,
|
|
425
718
|
limit: None,
|
|
426
719
|
order_by: None,
|