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.
- 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}/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 +10 -9
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/compiler/expression_analyser.rs +6 -4
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/compiler/variables_manager.rs +27 -31
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/compiler.rs +37 -41
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/connection.rs +42 -84
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/error.rs +105 -34
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/functions/containers.rs +21 -26
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/functions/edge.rs +2 -2
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/functions/math.rs +2 -2
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/functions/node.rs +1 -1
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/functions/path.rs +15 -20
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/functions/scalar.rs +2 -2
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/functions/value.rs +6 -6
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/functions.rs +20 -20
- data/ext/gqlitedb/src/graph.rs +11 -0
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/interpreter/evaluators.rs +160 -194
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/interpreter/instructions.rs +2 -1
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/lib.rs +9 -4
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/parser/ast.rs +44 -52
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/parser/gql.pest +1 -1
- data/ext/{gqliterb/vendor/gqlitedb/src/parser/parser.rs → gqlitedb/src/parser/parser_impl.rs} +50 -28
- 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 +226 -148
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/store/sqlite.rs +111 -128
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/store.rs +22 -22
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/tests/evaluators.rs +32 -76
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/tests/store.rs +95 -111
- 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 +15 -5
- data/ext/gqliterb/Cargo.toml +12 -35
- data/ext/gqliterb/src/lib.rs +60 -38
- 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 +134 -38
- 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 -1116
- data/ext/gqliterb/vendor/gqlitedb/Cargo.lock +0 -2115
- data/ext/gqliterb/vendor/gqlitedb/Cargo.toml +0 -138
- data/ext/gqliterb/vendor/gqlitedb/src/parser.rs +0 -4
- data/ext/gqliterb/vendor/gqlitedb/src/value.rs +0 -609
- /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}/release.toml +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/functions/string.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/store/redb.rs +0 -0
- /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/tests/store/sqlite.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
@@ -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
|
-
|
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
|
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
|
-
|
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
|
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
|
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.
|
85
|
+
name.map(|name| self.create_variable_from_name(name))
|
83
86
|
}
|
84
|
-
pub(crate) fn
|
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!
|
113
|
+
macro_rules! create_from_statement {
|
111
114
|
( $x:tt ) => {
|
112
|
-
impl
|
115
|
+
impl From<$x> for Statement
|
113
116
|
{
|
114
|
-
fn
|
117
|
+
fn from(v: $x) -> Statement
|
115
118
|
{
|
116
|
-
Statement::$x(
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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<
|
355
|
-
Or(Vec<
|
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
|
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
|
390
|
+
vec.push(self);
|
387
391
|
LabelExpression::And(vec)
|
388
392
|
}
|
389
|
-
_ => LabelExpression::And(vec![self
|
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
|
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
|
421
|
+
vec.push(self);
|
418
422
|
LabelExpression::Or(vec)
|
419
423
|
}
|
420
|
-
_ => LabelExpression::Or(vec![self
|
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
|
-
|
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
|
-
|
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!
|
451
|
+
macro_rules! create_from_expr {
|
460
452
|
( $x:tt ) => {
|
461
|
-
impl
|
453
|
+
impl From<$x> for Expression
|
462
454
|
{
|
463
|
-
fn
|
455
|
+
fn from(v: $x) -> Expression
|
464
456
|
{
|
465
|
-
Expression::$x(
|
457
|
+
Expression::$x(v)
|
466
458
|
}
|
467
459
|
}
|
468
460
|
};
|
469
461
|
}
|
470
462
|
|
471
|
-
macro_rules!
|
463
|
+
macro_rules! create_from_boxed_expr {
|
472
464
|
( $x:tt ) => {
|
473
|
-
impl
|
465
|
+
impl From<$x> for Expression
|
474
466
|
{
|
475
|
-
fn
|
467
|
+
fn from(v: $x) -> Expression
|
476
468
|
{
|
477
|
-
Expression::$x(Box::new(
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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 ~ ")-->(") }
|
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>
|
@@ -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.
|
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.
|
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.
|
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
|
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(
|
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 =>
|
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
|
575
|
-
|
576
|
+
let inner = pair.into_inner();
|
577
|
+
for next in inner
|
576
578
|
{
|
577
|
-
r = r.or(
|
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
|
585
|
-
|
586
|
+
let inner = pair.into_inner();
|
587
|
+
for next in inner
|
586
588
|
{
|
587
|
-
r = r.and(
|
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 =
|
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.
|
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 =
|
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.
|
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.
|
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.
|
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.
|
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.
|
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
|
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
|
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
|
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
|
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
|
1107
|
+
name,
|
1086
1108
|
arguments: Default::default(),
|
1087
1109
|
}))
|
1088
1110
|
}
|
@@ -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
|
+
}
|