gqlite 1.2.2 → 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}/release.toml +2 -2
- 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 +34 -10
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/compiler/expression_analyser.rs +10 -4
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/compiler/variables_manager.rs +36 -39
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/compiler.rs +46 -41
- data/ext/gqlitedb/src/connection.rs +300 -0
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/error.rs +113 -50
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/functions/containers.rs +21 -26
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/functions/edge.rs +3 -3
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/functions/math.rs +3 -3
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/functions/node.rs +2 -2
- data/ext/gqlitedb/src/functions/path.rs +75 -0
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/functions/scalar.rs +3 -3
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/functions/string.rs +1 -1
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/functions/value.rs +7 -7
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/functions.rs +29 -31
- data/ext/gqlitedb/src/graph.rs +11 -0
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/interpreter/evaluators.rs +178 -224
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/interpreter/instructions.rs +8 -2
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/lib.rs +9 -5
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/parser/ast.rs +54 -76
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/parser/gql.pest +9 -4
- data/ext/{gqliterb/vendor/gqlitedb/src/parser/parser.rs → gqlitedb/src/parser/parser_impl.rs} +86 -34
- 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 +260 -170
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/store/sqlite.rs +157 -142
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/store.rs +30 -23
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/tests/evaluators.rs +41 -85
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/tests/store/redb.rs +12 -5
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/tests/store/sqlite.rs +12 -5
- data/ext/{gqliterb/vendor/gqlitedb → gqlitedb}/src/tests/store.rs +106 -114
- 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 +22 -18
- data/ext/gqliterb/Cargo.toml +12 -34
- data/ext/gqliterb/src/lib.rs +67 -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 +146 -35
- 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 -1109
- data/ext/gqliterb/vendor/gqlitedb/Cargo.lock +0 -2060
- data/ext/gqliterb/vendor/gqlitedb/Cargo.toml +0 -132
- data/ext/gqliterb/vendor/gqlitedb/src/connection.rs +0 -208
- data/ext/gqliterb/vendor/gqlitedb/src/functions/path.rs +0 -48
- data/ext/gqliterb/vendor/gqlitedb/src/parser.rs +0 -4
- data/ext/gqliterb/vendor/gqlitedb/src/value.rs +0 -559
- /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}/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/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/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
@@ -53,10 +53,10 @@ where
|
|
53
53
|
vec!["default".to_string(), "test_graph".to_string()]
|
54
54
|
);
|
55
55
|
|
56
|
-
//
|
56
|
+
// Drop graph
|
57
57
|
let mut tx = store.begin_write().unwrap();
|
58
58
|
store
|
59
|
-
.
|
59
|
+
.drop_graph(&mut tx, &"test_graph".to_string(), false)
|
60
60
|
.unwrap();
|
61
61
|
tx.close().unwrap();
|
62
62
|
|
@@ -81,11 +81,19 @@ where
|
|
81
81
|
vec!["default".to_string(), "test_graph".to_string()]
|
82
82
|
);
|
83
83
|
|
84
|
+
// Drop unexisting graph
|
84
85
|
let mut tx = store.begin_write().unwrap();
|
85
86
|
store
|
86
|
-
.
|
87
|
+
.drop_graph(&mut tx, &"unknown".to_string(), false)
|
87
88
|
.expect_err("Attempt at deleting unknown graph.");
|
88
89
|
drop(tx);
|
90
|
+
|
91
|
+
// Drop unexisting graph
|
92
|
+
let mut tx = store.begin_write().unwrap();
|
93
|
+
store
|
94
|
+
.drop_graph(&mut tx, &"unknown".to_string(), true)
|
95
|
+
.unwrap();
|
96
|
+
drop(tx);
|
89
97
|
}
|
90
98
|
|
91
99
|
fn test_select_nodes<TStore>(store: TStore)
|
@@ -94,16 +102,16 @@ where
|
|
94
102
|
{
|
95
103
|
// Add two nodes
|
96
104
|
let nodes = [
|
97
|
-
graph::Node
|
98
|
-
|
99
|
-
|
100
|
-
key
|
101
|
-
|
102
|
-
graph::Node
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
105
|
+
graph::Node::new(
|
106
|
+
graph::Key::default(),
|
107
|
+
graph::labels!("hello", "world"),
|
108
|
+
value::value_map!("key" => 42i64),
|
109
|
+
),
|
110
|
+
graph::Node::new(
|
111
|
+
graph::Key::default(),
|
112
|
+
graph::labels!("not"),
|
113
|
+
Default::default(),
|
114
|
+
),
|
107
115
|
];
|
108
116
|
|
109
117
|
check_stats(&store, None, 0, 0, 0, 0);
|
@@ -111,7 +119,7 @@ where
|
|
111
119
|
let mut tx = store.begin_write().unwrap();
|
112
120
|
|
113
121
|
store
|
114
|
-
.create_nodes(tx.borrow_mut(),
|
122
|
+
.create_nodes(tx.borrow_mut(), "default", nodes.iter())
|
115
123
|
.unwrap();
|
116
124
|
tx.close().unwrap();
|
117
125
|
check_stats(&store, None, 2, 0, 3, 1);
|
@@ -119,8 +127,8 @@ where
|
|
119
127
|
let selected_nodes = store
|
120
128
|
.select_nodes(
|
121
129
|
store.begin_read().unwrap().borrow_mut(),
|
122
|
-
|
123
|
-
store::SelectNodeQuery::select_keys([nodes[0].key]),
|
130
|
+
"default",
|
131
|
+
store::SelectNodeQuery::select_keys([nodes[0].key()]),
|
124
132
|
)
|
125
133
|
.unwrap();
|
126
134
|
|
@@ -130,7 +138,7 @@ where
|
|
130
138
|
let selected_nodes = store
|
131
139
|
.select_nodes(
|
132
140
|
store.begin_read().unwrap().borrow_mut(),
|
133
|
-
|
141
|
+
"default",
|
134
142
|
store::SelectNodeQuery::select_labels(["not".to_string()]),
|
135
143
|
)
|
136
144
|
.unwrap();
|
@@ -144,32 +152,28 @@ where
|
|
144
152
|
TStore: store::Store,
|
145
153
|
{
|
146
154
|
// Add a node
|
147
|
-
let node = graph::Node
|
148
|
-
|
149
|
-
|
150
|
-
key
|
151
|
-
|
155
|
+
let node = graph::Node::new(
|
156
|
+
graph::Key::default(),
|
157
|
+
graph::labels!("hello", "world"),
|
158
|
+
value::value_map!("key" => 42i64),
|
159
|
+
);
|
152
160
|
|
153
161
|
check_stats(&store, None, 0, 0, 0, 0);
|
154
162
|
|
155
163
|
let mut tx = store.begin_write().unwrap();
|
156
164
|
|
157
165
|
store
|
158
|
-
.create_nodes(
|
159
|
-
tx.borrow_mut(),
|
160
|
-
&"default".into(),
|
161
|
-
vec![node.clone()].iter(),
|
162
|
-
)
|
166
|
+
.create_nodes(tx.borrow_mut(), "default", vec![node.clone()].iter())
|
163
167
|
.unwrap();
|
164
168
|
tx.close().unwrap();
|
165
169
|
check_stats(&store, None, 1, 0, 2, 1);
|
166
170
|
|
167
171
|
// Modify node
|
168
|
-
let modified_node = graph::Node
|
169
|
-
|
170
|
-
|
171
|
-
key
|
172
|
-
|
172
|
+
let modified_node = graph::Node::new(
|
173
|
+
node.key().clone(),
|
174
|
+
graph::labels!("world"),
|
175
|
+
value::value_map!("key" => 12i64),
|
176
|
+
);
|
173
177
|
|
174
178
|
let mut tx = store.begin_write().unwrap();
|
175
179
|
store
|
@@ -181,7 +185,7 @@ where
|
|
181
185
|
let selected_nodes = store
|
182
186
|
.select_nodes(
|
183
187
|
store.begin_read().unwrap().borrow_mut(),
|
184
|
-
|
188
|
+
"default",
|
185
189
|
store::SelectNodeQuery::select_all(),
|
186
190
|
)
|
187
191
|
.unwrap();
|
@@ -193,8 +197,8 @@ where
|
|
193
197
|
store
|
194
198
|
.delete_nodes(
|
195
199
|
&mut tx,
|
196
|
-
|
197
|
-
store::SelectNodeQuery::select_keys([modified_node.key]),
|
200
|
+
"default",
|
201
|
+
store::SelectNodeQuery::select_keys([modified_node.key()]),
|
198
202
|
true,
|
199
203
|
)
|
200
204
|
.unwrap();
|
@@ -207,40 +211,40 @@ fn test_select_edges<TStore>(store: TStore)
|
|
207
211
|
where
|
208
212
|
TStore: store::Store,
|
209
213
|
{
|
210
|
-
let source_node = graph::Node
|
211
|
-
|
212
|
-
|
213
|
-
key
|
214
|
-
|
215
|
-
let destination_node = graph::Node
|
216
|
-
|
217
|
-
|
218
|
-
key
|
219
|
-
|
220
|
-
let edge = graph::
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
214
|
+
let source_node = graph::Node::new(
|
215
|
+
graph::Key::default(),
|
216
|
+
graph::labels!("hello"),
|
217
|
+
value::value_map!("key" => 42i64),
|
218
|
+
);
|
219
|
+
let destination_node = graph::Node::new(
|
220
|
+
graph::Key::default(),
|
221
|
+
graph::labels!("world"),
|
222
|
+
value::value_map!("key" => 12i64),
|
223
|
+
);
|
224
|
+
let edge = graph::SinglePath::new(
|
225
|
+
graph::Key::default(),
|
226
|
+
source_node.clone(),
|
227
|
+
vec!["!".into()],
|
228
|
+
value::value_map!("existence" => true),
|
229
|
+
destination_node.clone(),
|
230
|
+
);
|
227
231
|
|
228
232
|
check_stats(&store, None, 0, 0, 0, 0);
|
229
233
|
|
230
234
|
let mut tx = store.begin_write().unwrap();
|
231
235
|
store
|
232
|
-
.create_edges(tx.borrow_mut(),
|
236
|
+
.create_edges(tx.borrow_mut(), "default", [edge.clone()].iter())
|
233
237
|
.expect_err("expect missing node");
|
234
238
|
check_stats(&store, Some(&mut tx), 0, 0, 0, 0);
|
235
239
|
store
|
236
240
|
.create_nodes(
|
237
241
|
tx.borrow_mut(),
|
238
|
-
|
242
|
+
"default",
|
239
243
|
[source_node, destination_node].iter(),
|
240
244
|
)
|
241
245
|
.unwrap();
|
242
246
|
store
|
243
|
-
.create_edges(tx.borrow_mut(),
|
247
|
+
.create_edges(tx.borrow_mut(), "default", [edge.clone()].iter())
|
244
248
|
.unwrap();
|
245
249
|
tx.close().unwrap();
|
246
250
|
check_stats(&store, None, 2, 1, 2, 3);
|
@@ -248,20 +252,20 @@ where
|
|
248
252
|
let selected_edges = store
|
249
253
|
.select_edges(
|
250
254
|
store.begin_read().unwrap().borrow_mut(),
|
251
|
-
|
252
|
-
store::SelectEdgeQuery::select_keys([edge.key]),
|
255
|
+
"default",
|
256
|
+
store::SelectEdgeQuery::select_keys([edge.key()]),
|
253
257
|
graph::EdgeDirectivity::Directed,
|
254
258
|
)
|
255
259
|
.unwrap();
|
256
260
|
|
257
261
|
assert_eq!(1, selected_edges.len());
|
258
|
-
assert_eq!(edge, selected_edges[0].
|
262
|
+
assert_eq!(edge, selected_edges[0].path);
|
259
263
|
assert!(!selected_edges[0].reversed);
|
260
264
|
|
261
265
|
let selected_edges = store
|
262
266
|
.select_edges(
|
263
267
|
store.begin_read().unwrap().borrow_mut(),
|
264
|
-
|
268
|
+
"default",
|
265
269
|
store::SelectEdgeQuery::select_source_destination_labels_properties(
|
266
270
|
store::SelectNodeQuery::select_all(),
|
267
271
|
vec![],
|
@@ -273,13 +277,13 @@ where
|
|
273
277
|
.unwrap();
|
274
278
|
|
275
279
|
assert_eq!(1, selected_edges.len());
|
276
|
-
assert_eq!(edge, selected_edges[0].
|
280
|
+
assert_eq!(edge, selected_edges[0].path);
|
277
281
|
assert!(!selected_edges[0].reversed);
|
278
282
|
|
279
283
|
let selected_edges = store
|
280
284
|
.select_edges(
|
281
285
|
store.begin_read().unwrap().borrow_mut(),
|
282
|
-
|
286
|
+
"default",
|
283
287
|
store::SelectEdgeQuery::select_source_destination_labels_properties(
|
284
288
|
store::SelectNodeQuery::select_labels_properties(vec![], Default::default()),
|
285
289
|
vec![],
|
@@ -291,19 +295,19 @@ where
|
|
291
295
|
.unwrap();
|
292
296
|
|
293
297
|
assert_eq!(1, selected_edges.len());
|
294
|
-
assert_eq!(edge, selected_edges[0].
|
298
|
+
assert_eq!(edge, selected_edges[0].path);
|
295
299
|
assert!(!selected_edges[0].reversed);
|
296
300
|
|
297
301
|
// Check reverse direction
|
298
302
|
let selected_edges = store
|
299
303
|
.select_edges(
|
300
304
|
store.begin_read().unwrap().borrow_mut(),
|
301
|
-
|
305
|
+
"default",
|
302
306
|
store::SelectEdgeQuery::select_source_destination_labels_properties(
|
303
|
-
store::SelectNodeQuery::select_keys(vec![edge.destination.key]),
|
307
|
+
store::SelectNodeQuery::select_keys(vec![edge.destination().key()]),
|
304
308
|
vec![],
|
305
309
|
Default::default(),
|
306
|
-
store::SelectNodeQuery::select_keys(vec![edge.source.key]),
|
310
|
+
store::SelectNodeQuery::select_keys(vec![edge.source().key()]),
|
307
311
|
),
|
308
312
|
graph::EdgeDirectivity::Directed,
|
309
313
|
)
|
@@ -314,19 +318,19 @@ where
|
|
314
318
|
let selected_edges = store
|
315
319
|
.select_edges(
|
316
320
|
store.begin_read().unwrap().borrow_mut(),
|
317
|
-
|
321
|
+
"default",
|
318
322
|
store::SelectEdgeQuery::select_source_destination_labels_properties(
|
319
|
-
store::SelectNodeQuery::select_keys(vec![edge.destination.key]),
|
323
|
+
store::SelectNodeQuery::select_keys(vec![edge.destination().key()]),
|
320
324
|
vec![],
|
321
325
|
Default::default(),
|
322
|
-
store::SelectNodeQuery::select_keys(vec![edge.source.key]),
|
326
|
+
store::SelectNodeQuery::select_keys(vec![edge.source().key()]),
|
323
327
|
),
|
324
328
|
graph::EdgeDirectivity::Undirected,
|
325
329
|
)
|
326
330
|
.unwrap();
|
327
331
|
|
328
332
|
assert_eq!(1, selected_edges.len());
|
329
|
-
assert_eq!(edge, selected_edges[0].
|
333
|
+
assert_eq!(edge, selected_edges[0].path);
|
330
334
|
assert!(selected_edges[0].reversed);
|
331
335
|
}
|
332
336
|
|
@@ -334,65 +338,63 @@ fn test_update_edges<TStore>(store: TStore)
|
|
334
338
|
where
|
335
339
|
TStore: store::Store,
|
336
340
|
{
|
337
|
-
let source_node = graph::Node
|
338
|
-
|
339
|
-
|
340
|
-
key
|
341
|
-
|
342
|
-
let destination_node = graph::Node
|
343
|
-
|
344
|
-
|
345
|
-
key
|
346
|
-
|
347
|
-
let edge = graph::
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
341
|
+
let source_node = graph::Node::new(
|
342
|
+
graph::Key::default(),
|
343
|
+
graph::labels!("hello"),
|
344
|
+
value::value_map!("key" => 42i64),
|
345
|
+
);
|
346
|
+
let destination_node = graph::Node::new(
|
347
|
+
graph::Key::default(),
|
348
|
+
graph::labels!("world"),
|
349
|
+
value::value_map!("key" => 12i64),
|
350
|
+
);
|
351
|
+
let edge = graph::SinglePath::new(
|
352
|
+
graph::Key::default(),
|
353
|
+
source_node.clone(),
|
354
|
+
vec!["!".into()],
|
355
|
+
value::value_map!("existence" => true),
|
356
|
+
destination_node.clone(),
|
357
|
+
);
|
354
358
|
|
355
359
|
check_stats(&store, None, 0, 0, 0, 0);
|
356
360
|
|
357
361
|
// Insert edge in store
|
358
362
|
let mut tx = store.begin_write().unwrap();
|
359
363
|
store
|
360
|
-
.create_edges(tx.borrow_mut(),
|
364
|
+
.create_edges(tx.borrow_mut(), "default", [edge.clone()].iter())
|
361
365
|
.expect_err("expect missing node");
|
362
366
|
check_stats(&store, Some(&mut tx), 0, 0, 0, 0);
|
363
367
|
store
|
364
368
|
.create_nodes(
|
365
369
|
tx.borrow_mut(),
|
366
|
-
|
370
|
+
"default",
|
367
371
|
[source_node, destination_node].iter(),
|
368
372
|
)
|
369
373
|
.unwrap();
|
370
374
|
store
|
371
|
-
.create_edges(tx.borrow_mut(),
|
375
|
+
.create_edges(tx.borrow_mut(), "default", [edge.clone()].iter())
|
372
376
|
.unwrap();
|
373
377
|
tx.close().unwrap();
|
374
378
|
check_stats(&store, None, 2, 1, 2, 3);
|
375
379
|
|
376
380
|
// Modify edge
|
377
381
|
|
378
|
-
let modified_edge = graph::Edge
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
properties: value::map!("existence" => false),
|
384
|
-
};
|
382
|
+
let modified_edge = graph::Edge::new(
|
383
|
+
edge.key().clone(),
|
384
|
+
graph::labels!("?"),
|
385
|
+
value::value_map!("existence" => false),
|
386
|
+
);
|
385
387
|
|
386
388
|
let mut tx = store.begin_write().unwrap();
|
387
389
|
store
|
388
|
-
.update_edge(&mut tx,
|
390
|
+
.update_edge(&mut tx, "default", &modified_edge)
|
389
391
|
.unwrap();
|
390
392
|
tx.close().unwrap();
|
391
393
|
|
392
394
|
let selected_edges = store
|
393
395
|
.select_edges(
|
394
396
|
store.begin_read().unwrap().borrow_mut(),
|
395
|
-
|
397
|
+
"default",
|
396
398
|
store::SelectEdgeQuery::select_all(),
|
397
399
|
graph::EdgeDirectivity::Directed,
|
398
400
|
)
|
@@ -401,7 +403,7 @@ where
|
|
401
403
|
check_stats(&store, None, 2, 1, 2, 3);
|
402
404
|
|
403
405
|
assert_eq!(1, selected_edges.len());
|
404
|
-
assert_eq!(modified_edge, selected_edges[0].
|
406
|
+
assert_eq!(modified_edge, selected_edges[0].path.to_owned().into());
|
405
407
|
assert!(!selected_edges[0].reversed);
|
406
408
|
|
407
409
|
// Remove edge
|
@@ -410,7 +412,7 @@ where
|
|
410
412
|
store
|
411
413
|
.delete_edges(
|
412
414
|
&mut tx,
|
413
|
-
|
415
|
+
"default",
|
414
416
|
store::SelectEdgeQuery::select_all(),
|
415
417
|
graph::EdgeDirectivity::Directed,
|
416
418
|
)
|
@@ -421,7 +423,7 @@ where
|
|
421
423
|
let selected_edges = store
|
422
424
|
.select_edges(
|
423
425
|
store.begin_read().unwrap().borrow_mut(),
|
424
|
-
|
426
|
+
"default",
|
425
427
|
store::SelectEdgeQuery::select_all(),
|
426
428
|
graph::EdgeDirectivity::Directed,
|
427
429
|
)
|
@@ -432,30 +434,20 @@ where
|
|
432
434
|
// Add edge back, and remove one of the node
|
433
435
|
let mut tx = store.begin_write().unwrap();
|
434
436
|
store
|
435
|
-
.create_edges(tx.borrow_mut(),
|
437
|
+
.create_edges(tx.borrow_mut(), "default", [edge.clone()].iter())
|
436
438
|
.unwrap();
|
437
439
|
tx.close().unwrap();
|
438
440
|
check_stats(&store, None, 2, 1, 2, 3);
|
439
441
|
|
440
442
|
let mut tx = store.begin_write().unwrap();
|
441
443
|
store
|
442
|
-
.delete_nodes(
|
443
|
-
&mut tx,
|
444
|
-
&"default".into(),
|
445
|
-
SelectNodeQuery::select_all(),
|
446
|
-
false,
|
447
|
-
)
|
444
|
+
.delete_nodes(&mut tx, "default", SelectNodeQuery::select_all(), false)
|
448
445
|
.expect_err("should fails, nodes are still connected.");
|
449
446
|
tx.close().unwrap();
|
450
447
|
|
451
448
|
let mut tx = store.begin_write().unwrap();
|
452
449
|
store
|
453
|
-
.delete_nodes(
|
454
|
-
&mut tx,
|
455
|
-
&"default".into(),
|
456
|
-
SelectNodeQuery::select_all(),
|
457
|
-
true,
|
458
|
-
)
|
450
|
+
.delete_nodes(&mut tx, "default", SelectNodeQuery::select_all(), true)
|
459
451
|
.unwrap();
|
460
452
|
tx.close().unwrap();
|
461
453
|
check_stats(&store, None, 0, 0, 0, 0);
|
@@ -37,7 +37,7 @@ pub(crate) fn create_named_node() -> Statements
|
|
37
37
|
vec![
|
38
38
|
Create {
|
39
39
|
patterns: vec![Pattern::Node(NodePattern {
|
40
|
-
variable: Some(var_ids.
|
40
|
+
variable: Some(var_ids.create_variable_from_name("n")),
|
41
41
|
labels: LabelExpression::None,
|
42
42
|
properties: Some(
|
43
43
|
Map {
|
@@ -57,10 +57,10 @@ pub(crate) fn create_named_node() -> Statements
|
|
57
57
|
Return {
|
58
58
|
all: false,
|
59
59
|
expressions: vec![NamedExpression {
|
60
|
-
identifier: var_ids.
|
60
|
+
identifier: var_ids.create_variable_from_name("p"),
|
61
61
|
expression: MemberAccess {
|
62
62
|
left: Variable {
|
63
|
-
identifier: var_ids.
|
63
|
+
identifier: var_ids.create_variable_from_name("n"),
|
64
64
|
}
|
65
65
|
.into(),
|
66
66
|
path: vec!["name".into()],
|
@@ -85,7 +85,7 @@ pub(crate) fn create_named_node_double_return() -> Statements
|
|
85
85
|
vec![
|
86
86
|
Create {
|
87
87
|
patterns: vec![Pattern::Node(NodePattern {
|
88
|
-
variable: Some(var_ids.
|
88
|
+
variable: Some(var_ids.create_variable_from_name("n")),
|
89
89
|
labels: LabelExpression::None,
|
90
90
|
properties: Some(
|
91
91
|
Map {
|
@@ -109,10 +109,10 @@ pub(crate) fn create_named_node_double_return() -> Statements
|
|
109
109
|
all: false,
|
110
110
|
expressions: vec![
|
111
111
|
NamedExpression {
|
112
|
-
identifier: var_ids.
|
112
|
+
identifier: var_ids.create_variable_from_name("id"),
|
113
113
|
expression: MemberAccess {
|
114
114
|
left: Variable {
|
115
|
-
identifier: var_ids.
|
115
|
+
identifier: var_ids.create_variable_from_name("n"),
|
116
116
|
}
|
117
117
|
.into(),
|
118
118
|
path: vec!["id".into()],
|
@@ -120,10 +120,10 @@ pub(crate) fn create_named_node_double_return() -> Statements
|
|
120
120
|
.into(),
|
121
121
|
},
|
122
122
|
NamedExpression {
|
123
|
-
identifier: var_ids.
|
123
|
+
identifier: var_ids.create_variable_from_name("p"),
|
124
124
|
expression: MemberAccess {
|
125
125
|
left: Variable {
|
126
|
-
identifier: var_ids.
|
126
|
+
identifier: var_ids.create_variable_from_name("n"),
|
127
127
|
}
|
128
128
|
.into(),
|
129
129
|
path: vec!["name".into()],
|
@@ -151,11 +151,11 @@ pub(crate) fn double_with_return() -> Statements
|
|
151
151
|
all: false,
|
152
152
|
expressions: vec![
|
153
153
|
NamedExpression {
|
154
|
-
identifier: var_ids.
|
154
|
+
identifier: var_ids.create_variable_from_name("n"),
|
155
155
|
expression: Value { value: 1.into() }.into(),
|
156
156
|
},
|
157
157
|
NamedExpression {
|
158
|
-
identifier: var_ids.
|
158
|
+
identifier: var_ids.create_variable_from_name("m"),
|
159
159
|
expression: Value { value: 2.into() }.into(),
|
160
160
|
},
|
161
161
|
],
|
@@ -171,16 +171,16 @@ pub(crate) fn double_with_return() -> Statements
|
|
171
171
|
all: false,
|
172
172
|
expressions: vec![
|
173
173
|
NamedExpression {
|
174
|
-
identifier: var_ids.
|
174
|
+
identifier: var_ids.create_variable_from_name("a"),
|
175
175
|
expression: Variable {
|
176
|
-
identifier: var_ids.
|
176
|
+
identifier: var_ids.create_variable_from_name("n"),
|
177
177
|
}
|
178
178
|
.into(),
|
179
179
|
},
|
180
180
|
NamedExpression {
|
181
|
-
identifier: var_ids.
|
181
|
+
identifier: var_ids.create_variable_from_name("b"),
|
182
182
|
expression: Variable {
|
183
|
-
identifier: var_ids.
|
183
|
+
identifier: var_ids.create_variable_from_name("m"),
|
184
184
|
}
|
185
185
|
.into(),
|
186
186
|
},
|
@@ -193,7 +193,7 @@ pub(crate) fn double_with_return() -> Statements
|
|
193
193
|
where_expression: None,
|
194
194
|
}
|
195
195
|
.into(),
|
196
|
-
return_statement(var_ids.
|
196
|
+
return_statement(var_ids.create_variable_from_name("a")),
|
197
197
|
]
|
198
198
|
}
|
199
199
|
|
@@ -203,14 +203,14 @@ pub(crate) fn unwind() -> Statements
|
|
203
203
|
let var_ids = VariableIdentifiers::default();
|
204
204
|
vec![
|
205
205
|
Unwind {
|
206
|
-
identifier: var_ids.
|
206
|
+
identifier: var_ids.create_variable_from_name("i"),
|
207
207
|
expression: Array {
|
208
208
|
array: vec![Value { value: 0.into() }.into()],
|
209
209
|
}
|
210
210
|
.into(),
|
211
211
|
}
|
212
212
|
.into(),
|
213
|
-
return_statement(var_ids.
|
213
|
+
return_statement(var_ids.create_variable_from_name("i")),
|
214
214
|
]
|
215
215
|
}
|
216
216
|
|
@@ -223,12 +223,12 @@ pub(crate) fn match_loop() -> Statements
|
|
223
223
|
patterns: vec![Pattern::Edge(EdgePattern {
|
224
224
|
variable: None,
|
225
225
|
source: NodePattern {
|
226
|
-
variable: Some(var_ids.
|
226
|
+
variable: Some(var_ids.create_variable_from_name("n")),
|
227
227
|
labels: LabelExpression::None,
|
228
228
|
properties: None,
|
229
229
|
},
|
230
230
|
destination: NodePattern {
|
231
|
-
variable: Some(var_ids.
|
231
|
+
variable: Some(var_ids.create_variable_from_name("n")),
|
232
232
|
labels: LabelExpression::None,
|
233
233
|
properties: None,
|
234
234
|
},
|
@@ -240,7 +240,7 @@ pub(crate) fn match_loop() -> Statements
|
|
240
240
|
optional: false,
|
241
241
|
}
|
242
242
|
.into(),
|
243
|
-
return_statement(var_ids.
|
243
|
+
return_statement(var_ids.create_variable_from_name("n")),
|
244
244
|
]
|
245
245
|
}
|
246
246
|
|
@@ -251,7 +251,7 @@ pub(crate) fn optional_match() -> Statements
|
|
251
251
|
vec![
|
252
252
|
Match {
|
253
253
|
patterns: vec![Pattern::Node(NodePattern {
|
254
|
-
variable: Some(var_ids.
|
254
|
+
variable: Some(var_ids.create_variable_from_name("a")),
|
255
255
|
labels: LabelExpression::None,
|
256
256
|
properties: None,
|
257
257
|
})],
|
@@ -259,7 +259,7 @@ pub(crate) fn optional_match() -> Statements
|
|
259
259
|
optional: true,
|
260
260
|
}
|
261
261
|
.into(),
|
262
|
-
return_statement(var_ids.
|
262
|
+
return_statement(var_ids.create_variable_from_name("a")),
|
263
263
|
]
|
264
264
|
}
|
265
265
|
|
@@ -270,7 +270,7 @@ pub(crate) fn match_count() -> Statements
|
|
270
270
|
vec![
|
271
271
|
Match {
|
272
272
|
patterns: vec![Pattern::Node(NodePattern {
|
273
|
-
variable: Some(var_ids.
|
273
|
+
variable: Some(var_ids.create_variable_from_name("a")),
|
274
274
|
labels: LabelExpression::None,
|
275
275
|
properties: None,
|
276
276
|
})],
|
@@ -281,7 +281,7 @@ pub(crate) fn match_count() -> Statements
|
|
281
281
|
Return {
|
282
282
|
all: false,
|
283
283
|
expressions: vec![NamedExpression {
|
284
|
-
identifier: var_ids.
|
284
|
+
identifier: var_ids.create_variable_from_name("count(*)"),
|
285
285
|
expression: FunctionCall {
|
286
286
|
name: "count".into(),
|
287
287
|
arguments: vec![Value { value: 0.into() }.into()],
|
@@ -306,7 +306,7 @@ pub(crate) fn aggregation() -> Statements
|
|
306
306
|
vec![
|
307
307
|
Match {
|
308
308
|
patterns: vec![Pattern::Node(NodePattern {
|
309
|
-
variable: Some(var_ids.
|
309
|
+
variable: Some(var_ids.create_variable_from_name("n")),
|
310
310
|
labels: LabelExpression::None,
|
311
311
|
properties: None,
|
312
312
|
})],
|
@@ -318,10 +318,10 @@ pub(crate) fn aggregation() -> Statements
|
|
318
318
|
all: false,
|
319
319
|
expressions: vec![
|
320
320
|
NamedExpression {
|
321
|
-
identifier: var_ids.
|
321
|
+
identifier: var_ids.create_variable_from_name("n.name"),
|
322
322
|
expression: MemberAccess {
|
323
323
|
left: Variable {
|
324
|
-
identifier: var_ids.
|
324
|
+
identifier: var_ids.create_variable_from_name("n"),
|
325
325
|
}
|
326
326
|
.into(),
|
327
327
|
path: vec!["name".into()],
|
@@ -329,12 +329,12 @@ pub(crate) fn aggregation() -> Statements
|
|
329
329
|
.into(),
|
330
330
|
},
|
331
331
|
NamedExpression {
|
332
|
-
identifier: var_ids.
|
332
|
+
identifier: var_ids.create_variable_from_name("count(n.num)"),
|
333
333
|
expression: FunctionCall {
|
334
334
|
name: "count".into(),
|
335
335
|
arguments: vec![MemberAccess {
|
336
336
|
left: Variable {
|
337
|
-
identifier: var_ids.
|
337
|
+
identifier: var_ids.create_variable_from_name("n"),
|
338
338
|
}
|
339
339
|
.into(),
|
340
340
|
path: vec!["num".into()],
|