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.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/ext/Cargo.toml +8 -8
  3. data/ext/db-index/Cargo.toml +2 -2
  4. data/ext/gqlitedb/Cargo.toml +0 -2
  5. data/ext/gqlitedb/src/aggregators.rs +28 -0
  6. data/ext/gqlitedb/src/compiler/expression_analyser.rs +33 -0
  7. data/ext/gqlitedb/src/compiler/variables_manager.rs +111 -11
  8. data/ext/gqlitedb/src/compiler.rs +506 -48
  9. data/ext/gqlitedb/src/connection.rs +14 -2
  10. data/ext/gqlitedb/src/consts.rs +1 -1
  11. data/ext/gqlitedb/src/error.rs +31 -0
  12. data/ext/gqlitedb/src/interpreter/evaluators.rs +153 -331
  13. data/ext/gqlitedb/src/interpreter/instructions.rs +77 -0
  14. data/ext/gqlitedb/src/interpreter/mod.rs +1 -0
  15. data/ext/gqlitedb/src/interpreter/path/bfs.rs +494 -0
  16. data/ext/gqlitedb/src/interpreter/path/dfs.rs +267 -0
  17. data/ext/gqlitedb/src/interpreter/path/group.rs +418 -0
  18. data/ext/gqlitedb/src/interpreter/path.rs +542 -0
  19. data/ext/gqlitedb/src/planner.rs +231 -6
  20. data/ext/gqlitedb/src/query_result.rs +19 -4
  21. data/ext/gqlitedb/src/store/redb.rs +1 -1
  22. data/ext/gqlitedb/src/tests/compiler.rs +2454 -1
  23. data/ext/gqlitedb/src/tests/connection/postgres.rs +22 -0
  24. data/ext/gqlitedb/src/tests/connection/redb.rs +24 -0
  25. data/ext/gqlitedb/src/tests/connection/sqlite.rs +16 -0
  26. data/ext/gqlitedb/src/tests/connection.rs +101 -0
  27. data/ext/gqlitedb/src/tests/evaluators.rs +2206 -1
  28. data/ext/gqlitedb/src/tests/parser.rs +1225 -0
  29. data/ext/gqlitedb/src/tests/planner.rs +433 -2
  30. data/ext/gqlitedb/src/tests/store/vector_index/postgres.rs +5 -5
  31. data/ext/gqlitedb/src/tests/store/vector_index/sqlite.rs +3 -1
  32. data/ext/gqlitedb/src/tests/templates/ast.rs +294 -1
  33. data/ext/gqlitedb/src/tests/templates/programs.rs +318 -0
  34. data/ext/gqliterb/Cargo.toml +0 -1
  35. data/ext/gqlparser/src/oc/ast.rs +72 -3
  36. data/ext/gqlparser/src/oc/error.rs +18 -0
  37. data/ext/gqlparser/src/oc/lexer.rs +157 -2
  38. data/ext/gqlparser/src/oc/parser/tests.rs +735 -29
  39. data/ext/gqlparser/src/oc/parser.rs +1312 -182
  40. data/ext/gqlparser/src/oc/string.rs +172 -0
  41. data/ext/gqlparser/src/oc.rs +1 -0
  42. data/ext/graphcore/src/value/value_map.rs +2 -2
  43. data/ext/graphcore/src/value.rs +13 -1
  44. metadata +6 -2
  45. 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
- recursive_range: None,
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,