gqlite 1.2.3 → 1.3.1
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 +21 -0
- data/ext/gqlitedb/Cargo.toml +77 -0
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/benches/common/pokec.rs +30 -20
- 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 +66 -59
- 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 +22 -27
- 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 +16 -21
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/functions/scalar.rs +25 -2
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/functions/value.rs +6 -6
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/functions.rs +28 -20
- data/ext/gqlitedb/src/graph.rs +11 -0
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/interpreter/evaluators.rs +163 -200
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/interpreter/instructions.rs +4 -3
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/lib.rs +8 -5
- 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 +14 -14
- 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 +59 -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 +134 -38
- data/ext/graphcore/src/lib.rs +15 -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 +92 -88
- 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
|
@@ -20,6 +20,7 @@ fn unknown_variable_error(name: &ast::VariableIdentifier) -> ErrorType
|
|
|
20
20
|
// \_/ \__,_|_| |_|\__,_|_.__/|_|\___|
|
|
21
21
|
|
|
22
22
|
#[derive(Debug, Clone)]
|
|
23
|
+
#[allow(clippy::large_enum_variant)]
|
|
23
24
|
pub(crate) enum VariableContent
|
|
24
25
|
{
|
|
25
26
|
Node(ast::NodePattern),
|
|
@@ -137,14 +138,14 @@ impl VariablesManager
|
|
|
137
138
|
{
|
|
138
139
|
identifier
|
|
139
140
|
.as_ref()
|
|
140
|
-
.
|
|
141
|
+
.is_some_and(|identifier| self.variables.contains_key(identifier))
|
|
141
142
|
}
|
|
142
143
|
/// Get the index of the variable in the row of variables
|
|
143
144
|
pub(crate) fn get_variable_index(&self, identifier: &ast::VariableIdentifier) -> Result<usize>
|
|
144
145
|
{
|
|
145
146
|
self
|
|
146
147
|
.variables
|
|
147
|
-
.get(
|
|
148
|
+
.get(identifier)
|
|
148
149
|
.ok_or_else(|| unknown_variable_error(identifier))
|
|
149
150
|
.map(|x| x.col_id)
|
|
150
151
|
}
|
|
@@ -175,7 +176,7 @@ impl VariablesManager
|
|
|
175
176
|
var_id.as_ref().map_or(Ok(false), |name| {
|
|
176
177
|
self
|
|
177
178
|
.variables
|
|
178
|
-
.get(
|
|
179
|
+
.get(name)
|
|
179
180
|
.ok_or_else(|| unknown_variable_error(name))
|
|
180
181
|
.map(|x| x.is_set)
|
|
181
182
|
})
|
|
@@ -190,7 +191,7 @@ impl VariablesManager
|
|
|
190
191
|
{
|
|
191
192
|
self
|
|
192
193
|
.variables
|
|
193
|
-
.get_mut(
|
|
194
|
+
.get_mut(var_id)
|
|
194
195
|
.ok_or_else(|| unknown_variable_error(var_id))
|
|
195
196
|
.map(|x| x.is_set = true)
|
|
196
197
|
}
|
|
@@ -205,7 +206,7 @@ impl VariablesManager
|
|
|
205
206
|
expression_type: ExpressionType,
|
|
206
207
|
) -> Result<()>
|
|
207
208
|
{
|
|
208
|
-
if self.variables.contains_key(
|
|
209
|
+
if self.variables.contains_key(var_id)
|
|
209
210
|
{
|
|
210
211
|
Err(
|
|
211
212
|
CompileTimeError::VariableAlreadyBound {
|
|
@@ -228,7 +229,7 @@ impl VariablesManager
|
|
|
228
229
|
{
|
|
229
230
|
if let Some(var_id) = &node.variable
|
|
230
231
|
{
|
|
231
|
-
if let Some(var) = self.variables.get(
|
|
232
|
+
if let Some(var) = self.variables.get(var_id)
|
|
232
233
|
{
|
|
233
234
|
match var.variable_type
|
|
234
235
|
{
|
|
@@ -236,7 +237,7 @@ impl VariablesManager
|
|
|
236
237
|
{
|
|
237
238
|
VariableContent::Node(var_node) =>
|
|
238
239
|
{
|
|
239
|
-
if (!node.labels.is_none() ||
|
|
240
|
+
if (!node.labels.is_none() || node.properties.is_some())
|
|
240
241
|
&& (node.labels != var_node.labels || node.properties != var_node.properties)
|
|
241
242
|
{
|
|
242
243
|
Err(
|
|
@@ -271,7 +272,7 @@ impl VariablesManager
|
|
|
271
272
|
{
|
|
272
273
|
if let Some(props) = &node.properties
|
|
273
274
|
{
|
|
274
|
-
expression_analyser::Analyser::new(
|
|
275
|
+
expression_analyser::Analyser::new(self, &self.function_manager).analyse(props)?;
|
|
275
276
|
}
|
|
276
277
|
self.variables.insert(
|
|
277
278
|
var_id.clone(),
|
|
@@ -291,7 +292,7 @@ impl VariablesManager
|
|
|
291
292
|
self.validate_node(&edge.destination)?;
|
|
292
293
|
if let Some(var_id) = &edge.variable
|
|
293
294
|
{
|
|
294
|
-
if let Some(var) = self.variables.get(
|
|
295
|
+
if let Some(var) = self.variables.get(var_id)
|
|
295
296
|
{
|
|
296
297
|
match var.content
|
|
297
298
|
{
|
|
@@ -313,7 +314,7 @@ impl VariablesManager
|
|
|
313
314
|
{
|
|
314
315
|
if let Some(props) = &edge.properties
|
|
315
316
|
{
|
|
316
|
-
expression_analyser::Analyser::new(
|
|
317
|
+
expression_analyser::Analyser::new(self, &self.function_manager).analyse(props)?;
|
|
317
318
|
}
|
|
318
319
|
self.variables.insert(
|
|
319
320
|
var_id.clone(),
|
|
@@ -333,7 +334,7 @@ impl VariablesManager
|
|
|
333
334
|
{
|
|
334
335
|
if let Some(var_id) = &node.variable
|
|
335
336
|
{
|
|
336
|
-
if let Some(var) = self.variables.get(
|
|
337
|
+
if let Some(var) = self.variables.get(var_id)
|
|
337
338
|
{
|
|
338
339
|
match var.variable_type
|
|
339
340
|
{
|
|
@@ -341,7 +342,7 @@ impl VariablesManager
|
|
|
341
342
|
{
|
|
342
343
|
VariableContent::Node(var_node) =>
|
|
343
344
|
{
|
|
344
|
-
if (!node.labels.is_none() ||
|
|
345
|
+
if (!node.labels.is_none() || node.properties.is_some())
|
|
345
346
|
&& (node.labels != var_node.labels || node.properties != var_node.properties)
|
|
346
347
|
{
|
|
347
348
|
Err(
|
|
@@ -388,7 +389,7 @@ impl VariablesManager
|
|
|
388
389
|
{
|
|
389
390
|
if let Some(var_id) = &edge.variable
|
|
390
391
|
{
|
|
391
|
-
if let Some(var) = self.variables.get(
|
|
392
|
+
if let Some(var) = self.variables.get(var_id)
|
|
392
393
|
{
|
|
393
394
|
match var.variable_type
|
|
394
395
|
{
|
|
@@ -396,7 +397,7 @@ impl VariablesManager
|
|
|
396
397
|
{
|
|
397
398
|
VariableContent::Edge(var_edge) =>
|
|
398
399
|
{
|
|
399
|
-
if (!edge.labels.is_none() ||
|
|
400
|
+
if (!edge.labels.is_none() || edge.properties.is_some())
|
|
400
401
|
&& (var_edge.labels != edge.labels || var_edge.properties != edge.properties)
|
|
401
402
|
{
|
|
402
403
|
Err(
|
|
@@ -474,7 +475,7 @@ impl VariablesManager
|
|
|
474
475
|
{
|
|
475
476
|
self.validate_node(&edge.destination)?;
|
|
476
477
|
}
|
|
477
|
-
if is_create || !self.is_valid_existing_edge(
|
|
478
|
+
if is_create || !self.is_valid_existing_edge(edge)?
|
|
478
479
|
{
|
|
479
480
|
self.validate_edge(edge)?;
|
|
480
481
|
}
|
|
@@ -507,7 +508,7 @@ impl VariablesManager
|
|
|
507
508
|
named_expression: &ast::NamedExpression,
|
|
508
509
|
) -> Result<usize>
|
|
509
510
|
{
|
|
510
|
-
let expression_info = expression_analyser::Analyser::new(
|
|
511
|
+
let expression_info = expression_analyser::Analyser::new(self, &self.function_manager)
|
|
511
512
|
.analyse(&named_expression.expression)?;
|
|
512
513
|
let col_id = self
|
|
513
514
|
.variables
|
|
@@ -529,7 +530,7 @@ impl VariablesManager
|
|
|
529
530
|
{
|
|
530
531
|
let mut var = self
|
|
531
532
|
.variables
|
|
532
|
-
.remove(
|
|
533
|
+
.remove(var_id)
|
|
533
534
|
.ok_or_else(|| unknown_variable_error(var_id))?;
|
|
534
535
|
var.col_id = col_id;
|
|
535
536
|
new_variables.insert(var_id.clone(), var.mark_set());
|
|
@@ -539,7 +540,7 @@ impl VariablesManager
|
|
|
539
540
|
}
|
|
540
541
|
pub(crate) fn analyse(&mut self, statement: &ast::Statement) -> Result<()>
|
|
541
542
|
{
|
|
542
|
-
if self.variables.iter().any(|(_, var)| var.is_set
|
|
543
|
+
if self.variables.iter().any(|(_, var)| !var.is_set)
|
|
543
544
|
{
|
|
544
545
|
return Err(
|
|
545
546
|
InternalError::NotAllVariablesAreSet {
|
|
@@ -570,22 +571,17 @@ impl VariablesManager
|
|
|
570
571
|
{
|
|
571
572
|
for pattern in create.patterns.iter()
|
|
572
573
|
{
|
|
573
|
-
|
|
574
|
+
if let ast::Pattern::Node(n) = &pattern
|
|
574
575
|
{
|
|
575
|
-
|
|
576
|
+
if self.has_variable(&n.variable)
|
|
576
577
|
{
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
.into(),
|
|
584
|
-
);
|
|
585
|
-
}
|
|
578
|
+
return Err(
|
|
579
|
+
CompileTimeError::VariableAlreadyBound {
|
|
580
|
+
name: n.variable.clone().unwrap().name().clone(),
|
|
581
|
+
}
|
|
582
|
+
.into(),
|
|
583
|
+
);
|
|
586
584
|
}
|
|
587
|
-
_ =>
|
|
588
|
-
{}
|
|
589
585
|
}
|
|
590
586
|
self.analyse_pattern(pattern, true)?;
|
|
591
587
|
}
|
|
@@ -19,6 +19,14 @@ macro_rules! compile_binary_op {
|
|
|
19
19
|
};
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
+
struct CompiledReturnWith
|
|
23
|
+
{
|
|
24
|
+
variables: Vec<(String, RWExpression)>,
|
|
25
|
+
filter: Instructions,
|
|
26
|
+
modifiers: Modifiers,
|
|
27
|
+
variables_sizes: VariablesSizes,
|
|
28
|
+
}
|
|
29
|
+
|
|
22
30
|
struct Compiler
|
|
23
31
|
{
|
|
24
32
|
function_manager: functions::Manager,
|
|
@@ -52,7 +60,7 @@ impl Compiler
|
|
|
52
60
|
) -> Result<()>
|
|
53
61
|
{
|
|
54
62
|
expression_analyser::Analyser::new(&self.variables_manager, &self.function_manager)
|
|
55
|
-
.analyse(
|
|
63
|
+
.analyse(expression)?;
|
|
56
64
|
|
|
57
65
|
let expr = match expression
|
|
58
66
|
{
|
|
@@ -83,7 +91,7 @@ impl Compiler
|
|
|
83
91
|
self.compile_expression(
|
|
84
92
|
function_call
|
|
85
93
|
.arguments
|
|
86
|
-
.
|
|
94
|
+
.first()
|
|
87
95
|
.ok_or(error::InternalError::MissingAggregationArgument)?,
|
|
88
96
|
&mut argument_instructions,
|
|
89
97
|
aggregations,
|
|
@@ -141,7 +149,7 @@ impl Compiler
|
|
|
141
149
|
self.compile_expression(v, instructions, aggregations)?;
|
|
142
150
|
keys.push(k.to_owned());
|
|
143
151
|
}
|
|
144
|
-
Instruction::CreateMap { keys
|
|
152
|
+
Instruction::CreateMap { keys }
|
|
145
153
|
}
|
|
146
154
|
ast::Expression::MemberAccess(member_access) =>
|
|
147
155
|
{
|
|
@@ -328,33 +336,32 @@ impl Compiler
|
|
|
328
336
|
.mark_variables_as_set(&node.variable)?;
|
|
329
337
|
self.compile_optional_expression(&node.properties, instructions)?;
|
|
330
338
|
let mut labels = Default::default();
|
|
331
|
-
|
|
339
|
+
Self::compile_labels_expression(&mut labels, &node.labels)?;
|
|
332
340
|
instructions.push(Instruction::CreateNodeLiteral { labels });
|
|
333
341
|
Ok(())
|
|
334
342
|
}
|
|
335
343
|
|
|
336
344
|
fn compile_labels_expression(
|
|
337
|
-
&mut self,
|
|
338
345
|
labels: &mut Vec<String>,
|
|
339
346
|
label_expressions: &ast::LabelExpression,
|
|
340
347
|
) -> Result<()>
|
|
341
348
|
{
|
|
342
|
-
match
|
|
349
|
+
match label_expressions
|
|
343
350
|
{
|
|
344
|
-
|
|
351
|
+
ast::LabelExpression::And(expressions) =>
|
|
345
352
|
{
|
|
346
353
|
for expr in expressions.iter()
|
|
347
354
|
{
|
|
348
|
-
|
|
355
|
+
Self::compile_labels_expression(labels, expr)?;
|
|
349
356
|
}
|
|
350
357
|
Ok(())
|
|
351
358
|
}
|
|
352
|
-
|
|
359
|
+
ast::LabelExpression::String(label) =>
|
|
353
360
|
{
|
|
354
361
|
labels.push(label.to_owned());
|
|
355
362
|
Ok(())
|
|
356
363
|
}
|
|
357
|
-
|
|
364
|
+
ast::LabelExpression::None => Ok(()),
|
|
358
365
|
_ => Err(
|
|
359
366
|
InternalError::InvalidCreateLabels {
|
|
360
367
|
context: "compile_create_labels",
|
|
@@ -366,21 +373,20 @@ impl Compiler
|
|
|
366
373
|
|
|
367
374
|
// Assume top of the stack contains an edge or node
|
|
368
375
|
fn compile_filter_labels(
|
|
369
|
-
&mut self,
|
|
370
376
|
instructions: &mut Instructions,
|
|
371
377
|
label_expressions: &ast::LabelExpression,
|
|
372
378
|
has_label_function: &functions::Function,
|
|
373
379
|
) -> Result<()>
|
|
374
380
|
{
|
|
375
|
-
match
|
|
381
|
+
match label_expressions
|
|
376
382
|
{
|
|
377
|
-
|
|
383
|
+
ast::LabelExpression::And(expressions) =>
|
|
378
384
|
{
|
|
379
385
|
instructions.push(Instruction::Push { value: true.into() });
|
|
380
386
|
instructions.push(Instruction::Swap);
|
|
381
387
|
for expr in expressions.iter()
|
|
382
388
|
{
|
|
383
|
-
|
|
389
|
+
Self::compile_filter_labels(instructions, expr, has_label_function)?;
|
|
384
390
|
// stack contains (a: bool) (b: labels) (c: bool)
|
|
385
391
|
instructions.push(Instruction::InverseRot3);
|
|
386
392
|
// stack contains (c: bool) (a: bool) (b: labels)
|
|
@@ -391,7 +397,7 @@ impl Compiler
|
|
|
391
397
|
}
|
|
392
398
|
Ok(())
|
|
393
399
|
}
|
|
394
|
-
|
|
400
|
+
ast::LabelExpression::Or(expressions) =>
|
|
395
401
|
{
|
|
396
402
|
instructions.push(Instruction::Push {
|
|
397
403
|
value: false.into(),
|
|
@@ -399,7 +405,7 @@ impl Compiler
|
|
|
399
405
|
instructions.push(Instruction::Swap);
|
|
400
406
|
for expr in expressions.iter()
|
|
401
407
|
{
|
|
402
|
-
|
|
408
|
+
Self::compile_filter_labels(instructions, expr, has_label_function)?;
|
|
403
409
|
// stack contains (a: bool) (b: labels) (c: bool)
|
|
404
410
|
instructions.push(Instruction::InverseRot3);
|
|
405
411
|
// stack contains (c: bool) (a: bool) (b: labels)
|
|
@@ -410,13 +416,13 @@ impl Compiler
|
|
|
410
416
|
}
|
|
411
417
|
Ok(())
|
|
412
418
|
}
|
|
413
|
-
|
|
419
|
+
ast::LabelExpression::Not(expr) =>
|
|
414
420
|
{
|
|
415
|
-
|
|
421
|
+
Self::compile_filter_labels(instructions, expr, has_label_function)?;
|
|
416
422
|
instructions.push(Instruction::NotUnaryOperator);
|
|
417
423
|
Ok(())
|
|
418
424
|
}
|
|
419
|
-
|
|
425
|
+
ast::LabelExpression::String(label) =>
|
|
420
426
|
{
|
|
421
427
|
instructions.push(Instruction::Duplicate);
|
|
422
428
|
instructions.push(Instruction::Push {
|
|
@@ -428,7 +434,7 @@ impl Compiler
|
|
|
428
434
|
});
|
|
429
435
|
Ok(())
|
|
430
436
|
}
|
|
431
|
-
|
|
437
|
+
ast::LabelExpression::None =>
|
|
432
438
|
{
|
|
433
439
|
instructions.push(Instruction::Push { value: true.into() });
|
|
434
440
|
Ok(())
|
|
@@ -436,10 +442,7 @@ impl Compiler
|
|
|
436
442
|
}
|
|
437
443
|
}
|
|
438
444
|
|
|
439
|
-
fn compile_create_patterns(
|
|
440
|
-
&mut self,
|
|
441
|
-
patterns: &Vec<crate::parser::ast::Pattern>,
|
|
442
|
-
) -> Result<Block>
|
|
445
|
+
fn compile_create_patterns(&mut self, patterns: &[crate::parser::ast::Pattern]) -> Result<Block>
|
|
443
446
|
{
|
|
444
447
|
let actions = patterns.iter().map(|c| {
|
|
445
448
|
let mut instructions = Instructions::new();
|
|
@@ -505,7 +508,7 @@ impl Compiler
|
|
|
505
508
|
Err(CompileTimeError::NoSingleRelationshipType)?;
|
|
506
509
|
}
|
|
507
510
|
let mut labels = Default::default();
|
|
508
|
-
|
|
511
|
+
Self::compile_labels_expression(&mut labels, &edge.labels)?;
|
|
509
512
|
instructions.push(Instruction::CreateEdgeLiteral { labels });
|
|
510
513
|
}
|
|
511
514
|
crate::parser::ast::Pattern::Path(_) =>
|
|
@@ -538,7 +541,7 @@ impl Compiler
|
|
|
538
541
|
let mut labels = Default::default();
|
|
539
542
|
if node.labels.is_all_inclusive()
|
|
540
543
|
{
|
|
541
|
-
|
|
544
|
+
Self::compile_labels_expression(&mut labels, &node.labels)?;
|
|
542
545
|
}
|
|
543
546
|
else
|
|
544
547
|
{
|
|
@@ -555,7 +558,7 @@ impl Compiler
|
|
|
555
558
|
let has_label_function = self
|
|
556
559
|
.function_manager
|
|
557
560
|
.get_function::<CompileTimeError>("has_label")?;
|
|
558
|
-
|
|
561
|
+
Self::compile_filter_labels(filter, &node.labels, &has_label_function)?;
|
|
559
562
|
filter.push(Instruction::Rot3);
|
|
560
563
|
filter.push(Instruction::AndBinaryOperator);
|
|
561
564
|
filter.push(Instruction::Swap);
|
|
@@ -634,14 +637,14 @@ impl Compiler
|
|
|
634
637
|
let mut labels = Default::default();
|
|
635
638
|
if edge.labels.is_all_inclusive()
|
|
636
639
|
{
|
|
637
|
-
|
|
640
|
+
Self::compile_labels_expression(&mut labels, &edge.labels)?;
|
|
638
641
|
}
|
|
639
642
|
else
|
|
640
643
|
{
|
|
641
644
|
let has_label_function = self
|
|
642
645
|
.function_manager
|
|
643
646
|
.get_function::<CompileTimeError>("has_label")?;
|
|
644
|
-
|
|
647
|
+
Self::compile_filter_labels(&mut filter, &edge.labels, &has_label_function)?;
|
|
645
648
|
filter.push(Instruction::Rot3);
|
|
646
649
|
filter.push(Instruction::AndBinaryOperator);
|
|
647
650
|
filter.push(Instruction::Swap);
|
|
@@ -690,7 +693,7 @@ impl Compiler
|
|
|
690
693
|
.mark_variables_as_set(&path_variable)?;
|
|
691
694
|
// Create block
|
|
692
695
|
Ok(BlockMatch::MatchEdge {
|
|
693
|
-
instructions
|
|
696
|
+
instructions,
|
|
694
697
|
left_variable: self
|
|
695
698
|
.variables_manager
|
|
696
699
|
.get_variable_index_option(&source_variable)?,
|
|
@@ -709,15 +712,10 @@ impl Compiler
|
|
|
709
712
|
fn compile_return_with(
|
|
710
713
|
&mut self,
|
|
711
714
|
all: bool,
|
|
712
|
-
expressions: &
|
|
715
|
+
expressions: &[ast::NamedExpression],
|
|
713
716
|
where_expression: &Option<ast::Expression>,
|
|
714
717
|
modifiers: &ast::Modifiers,
|
|
715
|
-
) -> Result<
|
|
716
|
-
Vec<(String, RWExpression)>,
|
|
717
|
-
Instructions,
|
|
718
|
-
Modifiers,
|
|
719
|
-
VariablesSizes,
|
|
720
|
-
)>
|
|
718
|
+
) -> Result<CompiledReturnWith>
|
|
721
719
|
{
|
|
722
720
|
let mut variables = Vec::<(ast::VariableIdentifier, RWExpression)>::new();
|
|
723
721
|
let mut filter = Default::default();
|
|
@@ -755,7 +753,7 @@ impl Compiler
|
|
|
755
753
|
.into(),
|
|
756
754
|
);
|
|
757
755
|
}
|
|
758
|
-
let col_id = self.variables_manager.analyse_named_expression(
|
|
756
|
+
let col_id = self.variables_manager.analyse_named_expression(e)?;
|
|
759
757
|
variables.push((
|
|
760
758
|
e.identifier.clone(),
|
|
761
759
|
RWExpression {
|
|
@@ -778,8 +776,8 @@ impl Compiler
|
|
|
778
776
|
self.compile_expression(where_expression, &mut filter, &mut None)?;
|
|
779
777
|
}
|
|
780
778
|
|
|
781
|
-
let modifiers = self.compile_modifiers(
|
|
782
|
-
let
|
|
779
|
+
let modifiers = self.compile_modifiers(modifiers)?;
|
|
780
|
+
let variables_sizes = self.variables_size();
|
|
783
781
|
self
|
|
784
782
|
.variables_manager
|
|
785
783
|
.keep_variables(variables.iter().map(|(n, _)| n))?;
|
|
@@ -788,12 +786,17 @@ impl Compiler
|
|
|
788
786
|
.into_iter()
|
|
789
787
|
.map(|(var_id, e)| (var_id.take_name(), e))
|
|
790
788
|
.collect();
|
|
791
|
-
Ok(
|
|
789
|
+
Ok(CompiledReturnWith {
|
|
790
|
+
variables,
|
|
791
|
+
filter,
|
|
792
|
+
modifiers,
|
|
793
|
+
variables_sizes,
|
|
794
|
+
})
|
|
792
795
|
}
|
|
793
796
|
|
|
794
797
|
fn compile_match_patterns(
|
|
795
798
|
&mut self,
|
|
796
|
-
patterns: &
|
|
799
|
+
patterns: &[crate::parser::ast::Pattern],
|
|
797
800
|
where_expression: &Option<crate::parser::ast::Expression>,
|
|
798
801
|
optional: bool,
|
|
799
802
|
) -> Result<Block>
|
|
@@ -811,7 +814,7 @@ impl Compiler
|
|
|
811
814
|
.variables_manager
|
|
812
815
|
.mark_variables_as_set(&node.variable)?;
|
|
813
816
|
Ok(BlockMatch::MatchNode {
|
|
814
|
-
instructions
|
|
817
|
+
instructions,
|
|
815
818
|
variable: self
|
|
816
819
|
.variables_manager
|
|
817
820
|
.get_variable_index_option(&node.variable)?,
|
|
@@ -820,7 +823,7 @@ impl Compiler
|
|
|
820
823
|
}
|
|
821
824
|
crate::parser::ast::Pattern::Edge(edge) =>
|
|
822
825
|
{
|
|
823
|
-
self.compile_match_edge(None,
|
|
826
|
+
self.compile_match_edge(None, edge, is_single_match, &mut edge_variables)
|
|
824
827
|
}
|
|
825
828
|
crate::parser::ast::Pattern::Path(path) => self.compile_match_edge(
|
|
826
829
|
Some(path.variable.to_owned()),
|
|
@@ -841,7 +844,7 @@ impl Compiler
|
|
|
841
844
|
}
|
|
842
845
|
self.compile_expression(where_expression, &mut filter, &mut None)?;
|
|
843
846
|
}
|
|
844
|
-
Ok(Block::
|
|
847
|
+
Ok(Block::Match {
|
|
845
848
|
blocks,
|
|
846
849
|
filter,
|
|
847
850
|
optional,
|
|
@@ -852,7 +855,7 @@ impl Compiler
|
|
|
852
855
|
fn check_for_constant_integer_expression(&mut self, x: &ast::Expression) -> Result<()>
|
|
853
856
|
{
|
|
854
857
|
let ei = expression_analyser::Analyser::new(&self.variables_manager, &self.function_manager)
|
|
855
|
-
.analyse(
|
|
858
|
+
.analyse(x)?;
|
|
856
859
|
if !ei.constant
|
|
857
860
|
{
|
|
858
861
|
Err(error::CompileTimeError::NonConstantExpression.into())
|
|
@@ -879,7 +882,7 @@ impl Compiler
|
|
|
879
882
|
.map(|x| {
|
|
880
883
|
self.check_for_constant_integer_expression(x)?;
|
|
881
884
|
let mut instructions = Instructions::new();
|
|
882
|
-
self.compile_expression(
|
|
885
|
+
self.compile_expression(x, &mut instructions, &mut None)?;
|
|
883
886
|
Ok::<_, ErrorType>(instructions)
|
|
884
887
|
})
|
|
885
888
|
.transpose()?;
|
|
@@ -889,7 +892,7 @@ impl Compiler
|
|
|
889
892
|
.map(|x| {
|
|
890
893
|
self.check_for_constant_integer_expression(x)?;
|
|
891
894
|
let mut instructions = Instructions::new();
|
|
892
|
-
self.compile_expression(
|
|
895
|
+
self.compile_expression(x, &mut instructions, &mut None)?;
|
|
893
896
|
Ok::<_, ErrorType>(instructions)
|
|
894
897
|
})
|
|
895
898
|
.transpose()?;
|
|
@@ -955,17 +958,17 @@ pub(crate) fn compile(
|
|
|
955
958
|
),
|
|
956
959
|
ast::Statement::Return(return_statement) =>
|
|
957
960
|
{
|
|
958
|
-
let
|
|
961
|
+
let compiled_return_with = compiler.compile_return_with(
|
|
959
962
|
return_statement.all,
|
|
960
963
|
&return_statement.expressions,
|
|
961
964
|
&return_statement.where_expression,
|
|
962
965
|
&return_statement.modifiers,
|
|
963
966
|
)?;
|
|
964
967
|
Ok(Block::Return {
|
|
965
|
-
variables,
|
|
966
|
-
filter,
|
|
967
|
-
modifiers,
|
|
968
|
-
|
|
968
|
+
variables: compiled_return_with.variables,
|
|
969
|
+
filter: compiled_return_with.filter,
|
|
970
|
+
modifiers: compiled_return_with.modifiers,
|
|
971
|
+
variables_sizes: compiled_return_with.variables_sizes,
|
|
969
972
|
})
|
|
970
973
|
}
|
|
971
974
|
ast::Statement::Call(call) =>
|
|
@@ -982,17 +985,21 @@ pub(crate) fn compile(
|
|
|
982
985
|
}
|
|
983
986
|
ast::Statement::With(with) =>
|
|
984
987
|
{
|
|
985
|
-
let
|
|
988
|
+
let compiled_return_with = compiler.compile_return_with(
|
|
986
989
|
with.all,
|
|
987
990
|
&with.expressions,
|
|
988
991
|
&with.where_expression,
|
|
989
992
|
&with.modifiers,
|
|
990
993
|
)?;
|
|
991
994
|
Ok(Block::With {
|
|
992
|
-
variables:
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
|
|
995
|
+
variables: compiled_return_with
|
|
996
|
+
.variables
|
|
997
|
+
.into_iter()
|
|
998
|
+
.map(|(_, v)| v)
|
|
999
|
+
.collect(),
|
|
1000
|
+
filter: compiled_return_with.filter,
|
|
1001
|
+
modifiers: compiled_return_with.modifiers,
|
|
1002
|
+
variables_sizes: compiled_return_with.variables_sizes,
|
|
996
1003
|
})
|
|
997
1004
|
}
|
|
998
1005
|
ast::Statement::Unwind(unwind) =>
|
|
@@ -1023,7 +1030,7 @@ pub(crate) fn compile(
|
|
|
1023
1030
|
| expression_analyser::ExpressionType::Edge
|
|
1024
1031
|
| expression_analyser::ExpressionType::Variant =>
|
|
1025
1032
|
{
|
|
1026
|
-
compiler.compile_expression(
|
|
1033
|
+
compiler.compile_expression(expr, &mut instructions, &mut None)?
|
|
1027
1034
|
}
|
|
1028
1035
|
_ => Err(CompileTimeError::InvalidDelete)?,
|
|
1029
1036
|
}
|