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.
Files changed (99) hide show
  1. checksums.yaml +4 -4
  2. data/ext/Cargo.toml +21 -0
  3. data/ext/gqlitedb/Cargo.toml +77 -0
  4. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/benches/common/pokec.rs +30 -20
  5. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/aggregators/arithmetic.rs +1 -0
  6. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/aggregators/stats.rs +27 -49
  7. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/aggregators.rs +7 -7
  8. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/capi.rs +10 -9
  9. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/compiler/expression_analyser.rs +6 -4
  10. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/compiler/variables_manager.rs +27 -31
  11. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/compiler.rs +66 -59
  12. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/connection.rs +42 -84
  13. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/error.rs +105 -34
  14. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/functions/containers.rs +22 -27
  15. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/functions/edge.rs +2 -2
  16. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/functions/math.rs +2 -2
  17. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/functions/node.rs +1 -1
  18. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/functions/path.rs +16 -21
  19. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/functions/scalar.rs +25 -2
  20. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/functions/value.rs +6 -6
  21. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/functions.rs +28 -20
  22. data/ext/gqlitedb/src/graph.rs +11 -0
  23. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/interpreter/evaluators.rs +163 -200
  24. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/interpreter/instructions.rs +4 -3
  25. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/lib.rs +8 -5
  26. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/parser/ast.rs +44 -52
  27. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/parser/gql.pest +1 -1
  28. data/ext/{gqliterb/vendor/gqlitedb/src/parser/parser.rs → gqlitedb/src/parser/parser_impl.rs} +50 -28
  29. data/ext/gqlitedb/src/parser.rs +4 -0
  30. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/prelude.rs +3 -2
  31. data/ext/gqlitedb/src/query_result.rs +88 -0
  32. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/store/redb.rs +226 -148
  33. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/store/sqlite.rs +111 -128
  34. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/store.rs +22 -22
  35. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/tests/evaluators.rs +32 -76
  36. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/tests/store.rs +95 -111
  37. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/tests/templates/ast.rs +29 -29
  38. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/tests/templates/programs.rs +14 -14
  39. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/value/compare.rs +13 -20
  40. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/value/contains.rs +2 -2
  41. data/ext/gqlitedb/src/value.rs +225 -0
  42. data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/value_table.rs +15 -5
  43. data/ext/gqliterb/Cargo.toml +12 -35
  44. data/ext/gqliterb/src/lib.rs +59 -39
  45. data/ext/graphcore/Cargo.toml +19 -0
  46. data/ext/graphcore/README.MD +4 -0
  47. data/ext/graphcore/release.toml +1 -0
  48. data/ext/graphcore/src/error.rs +28 -0
  49. data/ext/{gqliterb/vendor/gqlitedb → graphcore}/src/graph.rs +134 -38
  50. data/ext/graphcore/src/lib.rs +15 -0
  51. data/ext/graphcore/src/prelude.rs +4 -0
  52. data/ext/{gqliterb/vendor/gqlitedb → graphcore}/src/serialize_with.rs +2 -2
  53. data/ext/graphcore/src/table.rs +272 -0
  54. data/ext/{gqliterb/vendor/gqlitedb → graphcore}/src/value/value_map.rs +44 -49
  55. data/ext/graphcore/src/value.rs +413 -0
  56. metadata +92 -88
  57. data/ext/gqliterb/.cargo/config.toml +0 -2
  58. data/ext/gqliterb/Cargo.lock +0 -1116
  59. data/ext/gqliterb/vendor/gqlitedb/Cargo.lock +0 -2115
  60. data/ext/gqliterb/vendor/gqlitedb/Cargo.toml +0 -138
  61. data/ext/gqliterb/vendor/gqlitedb/src/parser.rs +0 -4
  62. data/ext/gqliterb/vendor/gqlitedb/src/value.rs +0 -609
  63. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/askama.toml +0 -0
  64. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/benches/common/mod.rs +0 -0
  65. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/benches/pokec_divan.rs +0 -0
  66. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/benches/pokec_iai.rs +0 -0
  67. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/release.toml +0 -0
  68. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/aggregators/containers.rs +0 -0
  69. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/aggregators/count.rs +0 -0
  70. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/consts.rs +0 -0
  71. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/functions/string.rs +0 -0
  72. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/interpreter/mod.rs +0 -0
  73. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/store/pgql.rs +0 -0
  74. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/tests/compiler.rs +0 -0
  75. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/tests/parser.rs +0 -0
  76. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/tests/store/redb.rs +0 -0
  77. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/tests/store/sqlite.rs +0 -0
  78. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/tests/templates.rs +0 -0
  79. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/tests.rs +0 -0
  80. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/utils.rs +0 -0
  81. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/templates/sql/sqlite/call_stats.sql +0 -0
  82. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/templates/sql/sqlite/edge_count_for_node.sql +0 -0
  83. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/templates/sql/sqlite/edge_create.sql +0 -0
  84. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/templates/sql/sqlite/edge_delete.sql +0 -0
  85. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/templates/sql/sqlite/edge_delete_by_nodes.sql +0 -0
  86. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/templates/sql/sqlite/edge_select.sql +0 -0
  87. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/templates/sql/sqlite/edge_update.sql +0 -0
  88. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/templates/sql/sqlite/graph_create.sql +0 -0
  89. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/templates/sql/sqlite/graph_delete.sql +0 -0
  90. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/templates/sql/sqlite/metadata_create_table.sql +0 -0
  91. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/templates/sql/sqlite/metadata_get.sql +0 -0
  92. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/templates/sql/sqlite/metadata_set.sql +0 -0
  93. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/templates/sql/sqlite/node_create.sql +0 -0
  94. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/templates/sql/sqlite/node_delete.sql +0 -0
  95. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/templates/sql/sqlite/node_select.sql +0 -0
  96. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/templates/sql/sqlite/node_update.sql +0 -0
  97. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/templates/sql/sqlite/table_exists.sql +0 -0
  98. /data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/templates/sql/sqlite/upgrade_from_1_01.sql +0 -0
  99. /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
- .map_or(false, |identifier| self.variables.contains_key(&identifier))
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(&identifier)
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(&name)
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(&var_id)
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(&var_id)
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(&var_id)
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() || !node.properties.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(&self, &self.function_manager).analyse(&props)?;
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(&var_id)
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(&self, &self.function_manager).analyse(&props)?;
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(&var_id)
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() || !node.properties.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(&var_id)
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() || !edge.properties.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(&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(&self, &self.function_manager)
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(&var_id)
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 != true)
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
- match &pattern
574
+ if let ast::Pattern::Node(n) = &pattern
574
575
  {
575
- ast::Pattern::Node(n) =>
576
+ if self.has_variable(&n.variable)
576
577
  {
577
- if self.has_variable(&n.variable)
578
- {
579
- return Err(
580
- CompileTimeError::VariableAlreadyBound {
581
- name: n.variable.clone().unwrap().name().clone(),
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(&expression)?;
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
- .get(0)
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: 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
- self.compile_labels_expression(&mut labels, &node.labels)?;
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 &label_expressions
349
+ match label_expressions
343
350
  {
344
- &ast::LabelExpression::And(expressions) =>
351
+ ast::LabelExpression::And(expressions) =>
345
352
  {
346
353
  for expr in expressions.iter()
347
354
  {
348
- self.compile_labels_expression(labels, &expr)?;
355
+ Self::compile_labels_expression(labels, expr)?;
349
356
  }
350
357
  Ok(())
351
358
  }
352
- &ast::LabelExpression::String(label) =>
359
+ ast::LabelExpression::String(label) =>
353
360
  {
354
361
  labels.push(label.to_owned());
355
362
  Ok(())
356
363
  }
357
- &ast::LabelExpression::None => Ok(()),
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 &label_expressions
381
+ match label_expressions
376
382
  {
377
- &ast::LabelExpression::And(expressions) =>
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
- self.compile_filter_labels(instructions, expr, has_label_function)?;
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
- &ast::LabelExpression::Or(expressions) =>
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
- self.compile_filter_labels(instructions, expr, has_label_function)?;
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
- &ast::LabelExpression::Not(expr) =>
419
+ ast::LabelExpression::Not(expr) =>
414
420
  {
415
- self.compile_filter_labels(instructions, expr, has_label_function)?;
421
+ Self::compile_filter_labels(instructions, expr, has_label_function)?;
416
422
  instructions.push(Instruction::NotUnaryOperator);
417
423
  Ok(())
418
424
  }
419
- &ast::LabelExpression::String(label) =>
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
- &ast::LabelExpression::None =>
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
- self.compile_labels_expression(&mut labels, &edge.labels)?;
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
- self.compile_labels_expression(&mut labels, &node.labels)?;
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
- self.compile_filter_labels(filter, &node.labels, &has_label_function)?;
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
- self.compile_labels_expression(&mut labels, &edge.labels)?;
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
- self.compile_filter_labels(&mut filter, &edge.labels, &has_label_function)?;
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: 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: &Vec<ast::NamedExpression>,
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(&e)?;
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(&modifiers)?;
782
- let variables_size = self.variables_size();
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((variables, filter, modifiers, variables_size))
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: &Vec<crate::parser::ast::Pattern>,
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: 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, &edge, is_single_match, &mut edge_variables)
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::BlockMatch {
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(&x)?;
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(&x, &mut instructions, &mut None)?;
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(&x, &mut instructions, &mut None)?;
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 (variables, filter, modifiers, variables_size) = compiler.compile_return_with(
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
- variables_size,
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 (variables, filter, modifiers, variables_size) = compiler.compile_return_with(
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: variables.into_iter().map(|(_, v)| v).collect(),
993
- filter,
994
- modifiers,
995
- variables_size,
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(&expr, &mut instructions, &mut None)?
1033
+ compiler.compile_expression(expr, &mut instructions, &mut None)?
1027
1034
  }
1028
1035
  _ => Err(CompileTimeError::InvalidDelete)?,
1029
1036
  }