gqlite 1.2.0 → 1.2.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 (85) hide show
  1. checksums.yaml +4 -4
  2. data/ext/gqliterb/.cargo/config.toml +2 -0
  3. data/ext/gqliterb/Cargo.lock +133 -123
  4. data/ext/gqliterb/Cargo.toml +3 -6
  5. data/ext/gqliterb/src/lib.rs +2 -2
  6. data/ext/gqliterb/vendor/gqlitedb/Cargo.lock +2060 -0
  7. data/ext/gqliterb/vendor/gqlitedb/Cargo.toml +132 -0
  8. data/ext/gqliterb/vendor/gqlitedb/askama.toml +3 -0
  9. data/ext/gqliterb/vendor/gqlitedb/benches/common/mod.rs +25 -0
  10. data/ext/gqliterb/vendor/gqlitedb/benches/common/pokec.rs +185 -0
  11. data/ext/gqliterb/vendor/gqlitedb/benches/pokec_divan.rs +137 -0
  12. data/ext/gqliterb/vendor/gqlitedb/benches/pokec_iai.rs +122 -0
  13. data/ext/gqliterb/vendor/gqlitedb/release.toml +7 -0
  14. data/ext/gqliterb/vendor/gqlitedb/src/aggregators/arithmetic.rs +96 -0
  15. data/ext/gqliterb/vendor/gqlitedb/src/aggregators/containers.rs +33 -0
  16. data/ext/gqliterb/vendor/gqlitedb/src/aggregators/count.rs +35 -0
  17. data/ext/gqliterb/vendor/gqlitedb/src/aggregators/stats.rs +168 -0
  18. data/ext/gqliterb/vendor/gqlitedb/src/aggregators.rs +74 -0
  19. data/ext/gqliterb/vendor/gqlitedb/src/capi.rs +236 -0
  20. data/ext/gqliterb/vendor/gqlitedb/src/compiler/expression_analyser.rs +427 -0
  21. data/ext/gqliterb/vendor/gqlitedb/src/compiler/variables_manager.rs +620 -0
  22. data/ext/gqliterb/vendor/gqlitedb/src/compiler.rs +1106 -0
  23. data/ext/gqliterb/vendor/gqlitedb/src/connection.rs +208 -0
  24. data/ext/gqliterb/vendor/gqlitedb/src/consts.rs +10 -0
  25. data/ext/gqliterb/vendor/gqlitedb/src/error.rs +621 -0
  26. data/ext/gqliterb/vendor/gqlitedb/src/functions/containers.rs +115 -0
  27. data/ext/gqliterb/vendor/gqlitedb/src/functions/edge.rs +20 -0
  28. data/ext/gqliterb/vendor/gqlitedb/src/functions/math.rs +44 -0
  29. data/ext/gqliterb/vendor/gqlitedb/src/functions/node.rs +16 -0
  30. data/ext/gqliterb/vendor/gqlitedb/src/functions/path.rs +48 -0
  31. data/ext/gqliterb/vendor/gqlitedb/src/functions/scalar.rs +86 -0
  32. data/ext/gqliterb/vendor/gqlitedb/src/functions/string.rs +28 -0
  33. data/ext/gqliterb/vendor/gqlitedb/src/functions/value.rs +99 -0
  34. data/ext/gqliterb/vendor/gqlitedb/src/functions.rs +412 -0
  35. data/ext/gqliterb/vendor/gqlitedb/src/graph.rs +268 -0
  36. data/ext/gqliterb/vendor/gqlitedb/src/interpreter/evaluators.rs +1788 -0
  37. data/ext/gqliterb/vendor/gqlitedb/src/interpreter/instructions.rs +262 -0
  38. data/ext/gqliterb/vendor/gqlitedb/src/interpreter/mod.rs +4 -0
  39. data/ext/gqliterb/vendor/gqlitedb/src/lib.rs +42 -0
  40. data/ext/gqliterb/vendor/gqlitedb/src/parser/ast.rs +625 -0
  41. data/ext/gqliterb/vendor/gqlitedb/src/parser/gql.pest +191 -0
  42. data/ext/gqliterb/vendor/gqlitedb/src/parser/parser.rs +1153 -0
  43. data/ext/gqliterb/vendor/gqlitedb/src/parser.rs +4 -0
  44. data/ext/gqliterb/vendor/gqlitedb/src/prelude.rs +8 -0
  45. data/ext/gqliterb/vendor/gqlitedb/src/serialize_with.rs +94 -0
  46. data/ext/gqliterb/vendor/gqlitedb/src/store/pgql.rs +121 -0
  47. data/ext/gqliterb/vendor/gqlitedb/src/store/redb.rs +1250 -0
  48. data/ext/gqliterb/vendor/gqlitedb/src/store/sqlite.rs +994 -0
  49. data/ext/gqliterb/vendor/gqlitedb/src/store.rs +432 -0
  50. data/ext/gqliterb/vendor/gqlitedb/src/tests/compiler.rs +92 -0
  51. data/ext/gqliterb/vendor/gqlitedb/src/tests/evaluators.rs +227 -0
  52. data/ext/gqliterb/vendor/gqlitedb/src/tests/parser.rs +81 -0
  53. data/ext/gqliterb/vendor/gqlitedb/src/tests/store/redb.rs +39 -0
  54. data/ext/gqliterb/vendor/gqlitedb/src/tests/store/sqlite.rs +39 -0
  55. data/ext/gqliterb/vendor/gqlitedb/src/tests/store.rs +462 -0
  56. data/ext/gqliterb/vendor/gqlitedb/src/tests/templates/ast.rs +356 -0
  57. data/ext/gqliterb/vendor/gqlitedb/src/tests/templates/programs.rs +455 -0
  58. data/ext/gqliterb/vendor/gqlitedb/src/tests/templates.rs +2 -0
  59. data/ext/gqliterb/vendor/gqlitedb/src/tests.rs +39 -0
  60. data/ext/gqliterb/vendor/gqlitedb/src/utils.rs +28 -0
  61. data/ext/gqliterb/vendor/gqlitedb/src/value/compare.rs +212 -0
  62. data/ext/gqliterb/vendor/gqlitedb/src/value/contains.rs +47 -0
  63. data/ext/gqliterb/vendor/gqlitedb/src/value/value_map.rs +298 -0
  64. data/ext/gqliterb/vendor/gqlitedb/src/value.rs +559 -0
  65. data/ext/gqliterb/vendor/gqlitedb/src/value_table.rs +616 -0
  66. data/ext/gqliterb/vendor/gqlitedb/templates/sql/sqlite/call_stats.sql +22 -0
  67. data/ext/gqliterb/vendor/gqlitedb/templates/sql/sqlite/edge_count_for_node.sql +3 -0
  68. data/ext/gqliterb/vendor/gqlitedb/templates/sql/sqlite/edge_create.sql +6 -0
  69. data/ext/gqliterb/vendor/gqlitedb/templates/sql/sqlite/edge_delete.sql +1 -0
  70. data/ext/gqliterb/vendor/gqlitedb/templates/sql/sqlite/edge_delete_by_nodes.sql +2 -0
  71. data/ext/gqliterb/vendor/gqlitedb/templates/sql/sqlite/edge_select.sql +139 -0
  72. data/ext/gqliterb/vendor/gqlitedb/templates/sql/sqlite/edge_update.sql +4 -0
  73. data/ext/gqliterb/vendor/gqlitedb/templates/sql/sqlite/graph_create.sql +16 -0
  74. data/ext/gqliterb/vendor/gqlitedb/templates/sql/sqlite/graph_delete.sql +3 -0
  75. data/ext/gqliterb/vendor/gqlitedb/templates/sql/sqlite/metadata_create_table.sql +1 -0
  76. data/ext/gqliterb/vendor/gqlitedb/templates/sql/sqlite/metadata_get.sql +1 -0
  77. data/ext/gqliterb/vendor/gqlitedb/templates/sql/sqlite/metadata_set.sql +1 -0
  78. data/ext/gqliterb/vendor/gqlitedb/templates/sql/sqlite/node_create.sql +1 -0
  79. data/ext/gqliterb/vendor/gqlitedb/templates/sql/sqlite/node_delete.sql +1 -0
  80. data/ext/gqliterb/vendor/gqlitedb/templates/sql/sqlite/node_select.sql +42 -0
  81. data/ext/gqliterb/vendor/gqlitedb/templates/sql/sqlite/node_update.sql +4 -0
  82. data/ext/gqliterb/vendor/gqlitedb/templates/sql/sqlite/table_exists.sql +5 -0
  83. data/ext/gqliterb/vendor/gqlitedb/templates/sql/sqlite/upgrade_from_1_01.sql +2 -0
  84. data/ext/gqliterb/vendor/gqlitedb/templates/sql/sqlite/upgrade_graph_from_1_01.sql +65 -0
  85. metadata +82 -2
@@ -0,0 +1,427 @@
1
+ use crate::{compiler::variables_manager::VariablesManager, parser::ast, prelude::*};
2
+
3
+ // __ __ _ _ _ _____
4
+ // \ \ / /_ _ _ __(_) __ _| |__ | | __|_ _| _ _ __ ___
5
+ // \ \ / / _` | '__| |/ _` | '_ \| |/ _ \| || | | | '_ \ / _ \
6
+ // \ V / (_| | | | | (_| | |_) | | __/| || |_| | |_) | __/
7
+ // \_/ \__,_|_| |_|\__,_|_.__/|_|\___||_| \__, | .__/ \___|
8
+ // |___/|_|
9
+
10
+ #[derive(Debug, PartialEq, Clone, Copy)]
11
+ pub(crate) enum ExpressionType
12
+ {
13
+ Array,
14
+ Map,
15
+ Node,
16
+ Edge,
17
+ Boolean,
18
+ Null,
19
+ Integer,
20
+ Float,
21
+ Path,
22
+ String,
23
+ Variant,
24
+ }
25
+
26
+ // _ _ _ _
27
+ // __ ____ _| (_) __| | __ _| |_ ___ _ __ ___
28
+ // \ \ / / _` | | |/ _` |/ _` | __/ _ \| '__/ __|
29
+ // \ V / (_| | | | (_| | (_| | || (_) | | \__ \
30
+ // \_/ \__,_|_|_|\__,_|\__,_|\__\___/|_| |___/
31
+ //
32
+
33
+ mod validators
34
+ {
35
+ use crate::{error, Result};
36
+
37
+ use super::{ExpressionInfo, ExpressionType};
38
+
39
+ pub(super) fn any(x: ExpressionInfo) -> Result<ExpressionInfo>
40
+ {
41
+ Ok(x)
42
+ }
43
+ pub(super) fn boolean_or_null(x: ExpressionInfo) -> Result<ExpressionInfo>
44
+ {
45
+ match x.expression_type
46
+ {
47
+ ExpressionType::Boolean | ExpressionType::Null | ExpressionType::Variant => Ok(x),
48
+ _ => Err(error::CompileTimeError::InvalidArgumentType.into()),
49
+ }
50
+ }
51
+ pub(super) fn array(x: ExpressionInfo) -> Result<ExpressionInfo>
52
+ {
53
+ match x.expression_type
54
+ {
55
+ ExpressionType::Array | ExpressionType::Variant => Ok(x),
56
+ _ => Err(error::CompileTimeError::InvalidArgumentType.into()),
57
+ }
58
+ }
59
+ pub(super) fn array_or_map(x: ExpressionInfo) -> Result<ExpressionInfo>
60
+ {
61
+ match x.expression_type
62
+ {
63
+ ExpressionType::Array | ExpressionType::Map | ExpressionType::Variant => Ok(x),
64
+ _ => Err(error::CompileTimeError::InvalidArgumentType.into()),
65
+ }
66
+ }
67
+ pub(super) fn map_or_edge_or_node_or_null(x: ExpressionInfo) -> Result<ExpressionInfo>
68
+ {
69
+ match x.expression_type
70
+ {
71
+ ExpressionType::Map
72
+ | ExpressionType::Edge
73
+ | ExpressionType::Node
74
+ | ExpressionType::Variant
75
+ | ExpressionType::Null => Ok(x),
76
+ _ => Err(error::CompileTimeError::InvalidArgumentType.into()),
77
+ }
78
+ }
79
+
80
+ pub(super) fn integer_or_null(x: ExpressionInfo) -> Result<ExpressionInfo>
81
+ {
82
+ match x.expression_type
83
+ {
84
+ ExpressionType::Integer | ExpressionType::Null | ExpressionType::Variant => Ok(x),
85
+ _ => Err(error::CompileTimeError::InvalidArgumentType.into()),
86
+ }
87
+ }
88
+ pub(super) fn string_or_null(x: ExpressionInfo) -> Result<ExpressionInfo>
89
+ {
90
+ match x.expression_type
91
+ {
92
+ ExpressionType::String | ExpressionType::Null | ExpressionType::Variant => Ok(x),
93
+ _ => Err(error::CompileTimeError::InvalidArgumentType.into()),
94
+ }
95
+ }
96
+ pub(super) fn integer_or_string_or_null(x: ExpressionInfo) -> Result<ExpressionInfo>
97
+ {
98
+ match x.expression_type
99
+ {
100
+ ExpressionType::Integer
101
+ | ExpressionType::String
102
+ | ExpressionType::Null
103
+ | ExpressionType::Variant => Ok(x),
104
+ _ => Err(error::CompileTimeError::InvalidArgumentType.into()),
105
+ }
106
+ }
107
+ }
108
+
109
+ // _____ _ _ _
110
+ // | ____|_ ___ __ _ __ ___ ___ ___(_) ___ _ __ / \ _ __ __ _| |_ _ ___ ___ _ __
111
+ // | _| \ \/ / '_ \| '__/ _ \/ __/ __| |/ _ \| '_ \ / _ \ | '_ \ / _` | | | | / __|/ _ \ '__|
112
+ // | |___ > <| |_) | | | __/\__ \__ \ | (_) | | | |/ ___ \| | | | (_| | | |_| \__ \ __/ |
113
+ // |_____/_/\_\ .__/|_| \___||___/___/_|\___/|_| |_/_/ \_\_| |_|\__,_|_|\__, |___/\___|_|
114
+ // |_| |___/
115
+
116
+ trait ExpressionAnalyser
117
+ {
118
+ fn analyse<'b>(self, analyser: &Analyser<'b>) -> Result<Vec<ExpressionInfo>>;
119
+ }
120
+
121
+ impl<'a, T, VT> ExpressionAnalyser for (T, VT)
122
+ where
123
+ T: Iterator<Item = &'a ast::Expression>,
124
+ VT: Fn(ExpressionInfo) -> Result<ExpressionInfo>,
125
+ {
126
+ fn analyse<'b>(self, analyser: &Analyser<'b>) -> Result<Vec<ExpressionInfo>>
127
+ {
128
+ let mut rv: Vec<ExpressionInfo> = Default::default();
129
+ for x in self.0
130
+ {
131
+ rv.push(self.1(analyser.analyse(x)?)?);
132
+ }
133
+ Ok(rv)
134
+ }
135
+ }
136
+
137
+ impl<'a, VT> ExpressionAnalyser for (&'a ast::Expression, VT)
138
+ where
139
+ VT: Fn(ExpressionInfo) -> Result<ExpressionInfo>,
140
+ {
141
+ fn analyse<'b>(self, analyser: &Analyser<'b>) -> Result<Vec<ExpressionInfo>>
142
+ {
143
+ Ok(vec![self.1(analyser.analyse(self.0)?)?])
144
+ }
145
+ }
146
+
147
+ impl<'a, VT0, VT1> ExpressionAnalyser for ((&'a ast::Expression, &'a ast::Expression), (VT0, VT1))
148
+ where
149
+ VT0: Fn(ExpressionInfo) -> Result<ExpressionInfo>,
150
+ VT1: Fn(ExpressionInfo) -> Result<ExpressionInfo>,
151
+ {
152
+ fn analyse<'b>(self, analyser: &Analyser<'b>) -> Result<Vec<ExpressionInfo>>
153
+ {
154
+ Ok(vec![
155
+ self.1 .0(analyser.analyse(self.0 .0)?)?,
156
+ self.1 .1(analyser.analyse(self.0 .1)?)?,
157
+ ])
158
+ }
159
+ }
160
+
161
+ // _____ _ ___ __
162
+ // | ____|_ ___ __ _ __ ___ ___ ___(_) ___ _ __ |_ _|_ __ / _| ___
163
+ // | _| \ \/ / '_ \| '__/ _ \/ __/ __| |/ _ \| '_ \ | || '_ \| |_ / _ \
164
+ // | |___ > <| |_) | | | __/\__ \__ \ | (_) | | | || || | | | _| (_) |
165
+ // |_____/_/\_\ .__/|_| \___||___/___/_|\___/|_| |_|___|_| |_|_| \___/
166
+ // |_|
167
+
168
+ #[derive(Debug)]
169
+ pub(crate) struct ExpressionInfo
170
+ {
171
+ pub(crate) expression_type: ExpressionType,
172
+ pub(crate) constant: bool,
173
+ pub(crate) aggregation_result: bool,
174
+ }
175
+
176
+ impl ExpressionInfo
177
+ {
178
+ fn new(expression_type: ExpressionType, constant: bool, aggregation_result: bool) -> Self
179
+ {
180
+ Self {
181
+ expression_type,
182
+ constant,
183
+ aggregation_result,
184
+ }
185
+ }
186
+ fn new_type(expression_type: ExpressionType, dependents: impl Into<Vec<ExpressionInfo>>) -> Self
187
+ {
188
+ let dependents = dependents.into();
189
+ Self {
190
+ expression_type,
191
+ constant: dependents.iter().all(|x| x.constant == true),
192
+ aggregation_result: dependents.into_iter().any(|x| x.aggregation_result == true),
193
+ }
194
+ }
195
+ }
196
+
197
+ // _ _
198
+ // / \ _ __ __ _| |_ _ ___ ___ _ __
199
+ // / _ \ | '_ \ / _` | | | | / __|/ _ \ '__|
200
+ // / ___ \| | | | (_| | | |_| \__ \ __/ |
201
+ // /_/ \_\_| |_|\__,_|_|\__, |___/\___|_|
202
+ // |___/
203
+
204
+ pub(crate) struct Analyser<'b>
205
+ {
206
+ pub(crate) variables_manager: &'b VariablesManager,
207
+ pub(crate) functions_manager: &'b functions::Manager,
208
+ }
209
+
210
+ impl<'b> Analyser<'b>
211
+ {
212
+ pub(crate) fn new(
213
+ variables_manager: &'b VariablesManager,
214
+ functions_manager: &'b functions::Manager,
215
+ ) -> Self
216
+ {
217
+ Self {
218
+ variables_manager,
219
+ functions_manager,
220
+ }
221
+ }
222
+ fn analyses_in<'a>(
223
+ &self,
224
+ left_expr: &'a ast::Expression,
225
+ right_expr: &'a ast::Expression,
226
+ ) -> Result<Vec<ExpressionInfo>>
227
+ {
228
+ let mut left_expr = self.analyse(left_expr)?;
229
+ let right_expr = self.analyse(right_expr)?;
230
+ let right_expr = validators::array_or_map(right_expr)?;
231
+
232
+ if right_expr.expression_type == ExpressionType::Map
233
+ {
234
+ left_expr = validators::string_or_null(left_expr)?;
235
+ }
236
+
237
+ Ok(vec![left_expr, right_expr])
238
+ }
239
+ pub(crate) fn analyse(&self, expression: &ast::Expression) -> Result<ExpressionInfo>
240
+ {
241
+ match expression
242
+ {
243
+ ast::Expression::Array(arr) => Ok(ExpressionInfo::new_type(
244
+ ExpressionType::Array,
245
+ (arr.array.iter(), validators::any).analyse(self)?,
246
+ )),
247
+ ast::Expression::FunctionCall(call) =>
248
+ {
249
+ let arguments = (call.arguments.iter(), validators::any).analyse(self)?;
250
+ Ok(ExpressionInfo::new(
251
+ self.functions_manager.validate_arguments(
252
+ &call.name,
253
+ arguments.iter().map(|x| x.expression_type).collect(),
254
+ )?,
255
+ self.functions_manager.is_deterministic(&call.name)?
256
+ && arguments.iter().all(|x| x.constant == true),
257
+ self.functions_manager.is_aggregate(&call.name)?,
258
+ ))
259
+ }
260
+ ast::Expression::IsNull(isn) => Ok(ExpressionInfo::new_type(
261
+ ExpressionType::Boolean,
262
+ ([&isn.value].into_iter(), validators::any).analyse(self)?,
263
+ )),
264
+ ast::Expression::IsNotNull(isn) => Ok(ExpressionInfo::new_type(
265
+ ExpressionType::Boolean,
266
+ ([&isn.value].into_iter(), validators::any).analyse(self)?,
267
+ )),
268
+ ast::Expression::Negation(ln) => Ok(ExpressionInfo::new_type(
269
+ ExpressionType::Variant,
270
+ ([&ln.value].into_iter(), validators::any).analyse(self)?,
271
+ )),
272
+ ast::Expression::LogicalNegation(ln) => Ok(ExpressionInfo::new_type(
273
+ ExpressionType::Boolean,
274
+ ([&ln.value].into_iter(), validators::boolean_or_null).analyse(self)?,
275
+ )),
276
+ ast::Expression::LogicalAnd(rd) => Ok(ExpressionInfo::new_type(
277
+ ExpressionType::Boolean,
278
+ (
279
+ [&rd.left, &rd.right].into_iter(),
280
+ validators::boolean_or_null,
281
+ )
282
+ .analyse(self)?,
283
+ )),
284
+ ast::Expression::LogicalOr(rd) => Ok(ExpressionInfo::new_type(
285
+ ExpressionType::Boolean,
286
+ (
287
+ [&rd.left, &rd.right].into_iter(),
288
+ validators::boolean_or_null,
289
+ )
290
+ .analyse(self)?,
291
+ )),
292
+ ast::Expression::LogicalXor(rd) => Ok(ExpressionInfo::new_type(
293
+ ExpressionType::Boolean,
294
+ (
295
+ [&rd.left, &rd.right].into_iter(),
296
+ validators::boolean_or_null,
297
+ )
298
+ .analyse(self)?,
299
+ )),
300
+ ast::Expression::RelationalEqual(rd) => Ok(ExpressionInfo::new_type(
301
+ ExpressionType::Boolean,
302
+ ([&rd.left, &rd.right].into_iter(), validators::any).analyse(self)?,
303
+ )),
304
+ ast::Expression::RelationalDifferent(rd) => Ok(ExpressionInfo::new_type(
305
+ ExpressionType::Boolean,
306
+ ([&rd.left, &rd.right].into_iter(), validators::any).analyse(self)?,
307
+ )),
308
+ ast::Expression::RelationalInferior(rd) => Ok(ExpressionInfo::new_type(
309
+ ExpressionType::Boolean,
310
+ ([&rd.left, &rd.right].into_iter(), validators::any).analyse(self)?,
311
+ )),
312
+ ast::Expression::RelationalSuperior(rd) => Ok(ExpressionInfo::new_type(
313
+ ExpressionType::Boolean,
314
+ ([&rd.left, &rd.right].into_iter(), validators::any).analyse(self)?,
315
+ )),
316
+ ast::Expression::RelationalInferiorEqual(rd) => Ok(ExpressionInfo::new_type(
317
+ ExpressionType::Boolean,
318
+ ([&rd.left, &rd.right].into_iter(), validators::any).analyse(self)?,
319
+ )),
320
+ ast::Expression::RelationalSuperiorEqual(rd) => Ok(ExpressionInfo::new_type(
321
+ ExpressionType::Boolean,
322
+ ([&rd.left, &rd.right].into_iter(), validators::any).analyse(self)?,
323
+ )),
324
+ ast::Expression::RelationalIn(ri) => Ok(ExpressionInfo::new_type(
325
+ ExpressionType::Boolean,
326
+ self.analyses_in(&ri.left, &ri.right)?,
327
+ )),
328
+ ast::Expression::RelationalNotIn(ri) => Ok(ExpressionInfo::new_type(
329
+ ExpressionType::Boolean,
330
+ self.analyses_in(&ri.left, &ri.right)?,
331
+ )),
332
+ ast::Expression::Addition(ri) => Ok(ExpressionInfo::new_type(
333
+ ExpressionType::Variant,
334
+ ([&ri.left, &ri.right].into_iter(), validators::any).analyse(self)?,
335
+ )),
336
+ ast::Expression::Multiplication(ri) => Ok(ExpressionInfo::new_type(
337
+ ExpressionType::Variant,
338
+ ([&ri.left, &ri.right].into_iter(), validators::any).analyse(self)?,
339
+ )),
340
+ ast::Expression::Subtraction(ri) => Ok(ExpressionInfo::new_type(
341
+ ExpressionType::Variant,
342
+ ([&ri.left, &ri.right].into_iter(), validators::any).analyse(self)?,
343
+ )),
344
+ ast::Expression::Division(ri) => Ok(ExpressionInfo::new_type(
345
+ ExpressionType::Variant,
346
+ ([&ri.left, &ri.right].into_iter(), validators::any).analyse(self)?,
347
+ )),
348
+ ast::Expression::Modulo(ri) => Ok(ExpressionInfo::new_type(
349
+ ExpressionType::Variant,
350
+ ([&ri.left, &ri.right].into_iter(), validators::any).analyse(self)?,
351
+ )),
352
+ ast::Expression::Map(map) => Ok(ExpressionInfo::new_type(
353
+ ExpressionType::Map,
354
+ (map.map.iter().map(|(_, v)| v), validators::any).analyse(self)?,
355
+ )),
356
+ ast::Expression::MemberAccess(ma) => Ok(ExpressionInfo::new_type(
357
+ ExpressionType::Variant,
358
+ [validators::map_or_edge_or_node_or_null(
359
+ self.analyse(&ma.left)?,
360
+ )?],
361
+ )),
362
+ ast::Expression::IndexAccess(ia) => Ok({
363
+ let left = self.analyse(&ia.left)?;
364
+ let index = self.analyse(&ia.index)?;
365
+
366
+ match left.expression_type
367
+ {
368
+ ExpressionType::Array => ExpressionInfo::new_type(
369
+ ExpressionType::Variant,
370
+ [left, validators::integer_or_null(index)?],
371
+ ),
372
+ ExpressionType::Map | ExpressionType::Edge | ExpressionType::Node =>
373
+ {
374
+ ExpressionInfo::new_type(
375
+ ExpressionType::Variant,
376
+ [left, validators::string_or_null(index)?],
377
+ )
378
+ }
379
+ ExpressionType::Null => ExpressionInfo::new_type(ExpressionType::Null, [left, index]),
380
+ ExpressionType::Variant => ExpressionInfo::new_type(
381
+ ExpressionType::Variant,
382
+ [left, validators::integer_or_string_or_null(index)?],
383
+ ),
384
+ _ => Err(crate::error::CompileTimeError::InvalidArgumentType)?,
385
+ }
386
+ }),
387
+ ast::Expression::RangeAccess(ia) => Ok({
388
+ let mut dependents = vec![validators::array(self.analyse(&ia.left)?)?];
389
+ if let Some(start) = &ia.start
390
+ {
391
+ dependents.push(validators::integer_or_null(self.analyse(start)?)?);
392
+ }
393
+ if let Some(end) = &ia.end
394
+ {
395
+ dependents.push(validators::integer_or_null(self.analyse(end)?)?);
396
+ }
397
+ ExpressionInfo::new_type(ExpressionType::Variant, dependents)
398
+ }),
399
+ ast::Expression::Parameter(_) =>
400
+ {
401
+ Ok(ExpressionInfo::new(ExpressionType::Variant, true, false))
402
+ }
403
+ ast::Expression::Value(val) => Ok(ExpressionInfo::new(
404
+ match val.value
405
+ {
406
+ value::Value::Array(_) => ExpressionType::Array,
407
+ value::Value::Boolean(_) => ExpressionType::Boolean,
408
+ value::Value::Edge(_) => ExpressionType::Edge,
409
+ value::Value::Node(_) => ExpressionType::Node,
410
+ value::Value::Float(_) => ExpressionType::Float,
411
+ value::Value::Integer(_) => ExpressionType::Integer,
412
+ value::Value::Null => ExpressionType::Null,
413
+ value::Value::Map(_) => ExpressionType::Map,
414
+ value::Value::Path(_) => ExpressionType::Path,
415
+ value::Value::String(_) => ExpressionType::String,
416
+ },
417
+ true,
418
+ false,
419
+ )),
420
+ ast::Expression::Variable(var) => Ok(ExpressionInfo::new(
421
+ self.variables_manager.expression_type(&var.identifier)?,
422
+ false,
423
+ false,
424
+ )),
425
+ }
426
+ }
427
+ }