gqlite 1.2.0 → 1.2.3

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 +152 -135
  4. data/ext/gqliterb/Cargo.toml +4 -6
  5. data/ext/gqliterb/src/lib.rs +8 -2
  6. data/ext/gqliterb/vendor/gqlitedb/Cargo.lock +2115 -0
  7. data/ext/gqliterb/vendor/gqlitedb/Cargo.toml +138 -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 +259 -0
  20. data/ext/gqliterb/vendor/gqlitedb/src/compiler/expression_analyser.rs +431 -0
  21. data/ext/gqliterb/vendor/gqlitedb/src/compiler/variables_manager.rs +621 -0
  22. data/ext/gqliterb/vendor/gqlitedb/src/compiler.rs +1115 -0
  23. data/ext/gqliterb/vendor/gqlitedb/src/connection.rs +342 -0
  24. data/ext/gqliterb/vendor/gqlitedb/src/consts.rs +10 -0
  25. data/ext/gqliterb/vendor/gqlitedb/src/error.rs +613 -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 +80 -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 +410 -0
  35. data/ext/gqliterb/vendor/gqlitedb/src/graph.rs +283 -0
  36. data/ext/gqliterb/vendor/gqlitedb/src/interpreter/evaluators.rs +1776 -0
  37. data/ext/gqliterb/vendor/gqlitedb/src/interpreter/instructions.rs +267 -0
  38. data/ext/gqliterb/vendor/gqlitedb/src/interpreter/mod.rs +4 -0
  39. data/ext/gqliterb/vendor/gqlitedb/src/lib.rs +41 -0
  40. data/ext/gqliterb/vendor/gqlitedb/src/parser/ast.rs +611 -0
  41. data/ext/gqliterb/vendor/gqlitedb/src/parser/gql.pest +196 -0
  42. data/ext/gqliterb/vendor/gqlitedb/src/parser/parser.rs +1183 -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 +1262 -0
  48. data/ext/gqliterb/vendor/gqlitedb/src/store/sqlite.rs +1026 -0
  49. data/ext/gqliterb/vendor/gqlitedb/src/store.rs +439 -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 +46 -0
  54. data/ext/gqliterb/vendor/gqlitedb/src/tests/store/sqlite.rs +46 -0
  55. data/ext/gqliterb/vendor/gqlitedb/src/tests/store.rs +470 -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 +609 -0
  65. data/ext/gqliterb/vendor/gqlitedb/src/value_table.rs +610 -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,470 @@
1
+ use std::borrow::BorrowMut;
2
+
3
+ #[cfg(feature = "redb")]
4
+ mod redb;
5
+ #[cfg(feature = "sqlite")]
6
+ pub(crate) mod sqlite;
7
+
8
+ use crate::{
9
+ prelude::*,
10
+ store::{SelectNodeQuery, TransactionBoxable},
11
+ tests::check_stats,
12
+ };
13
+
14
+ fn test_graphs<TStore>(store: TStore)
15
+ where
16
+ TStore: store::Store,
17
+ {
18
+ assert_eq!(
19
+ store.graphs_list(&mut store.begin_read().unwrap()).unwrap(),
20
+ vec!["default"]
21
+ );
22
+
23
+ // Create test graph
24
+ let mut tx = store.begin_write().unwrap();
25
+ store
26
+ .create_graph(&mut tx, &"test_graph".to_string(), false)
27
+ .unwrap();
28
+ tx.close().unwrap();
29
+
30
+ // Check the list of graphs
31
+ let mut graphs = store.graphs_list(&mut store.begin_read().unwrap()).unwrap();
32
+ graphs.sort();
33
+ assert_eq!(
34
+ graphs,
35
+ vec!["default".to_string(), "test_graph".to_string()]
36
+ );
37
+
38
+ // Check creating the graph if it already exists
39
+ let mut tx = store.begin_write().unwrap();
40
+ store
41
+ .create_graph(&mut tx, &"test_graph".to_string(), false)
42
+ .expect_err("graph already exists");
43
+ store
44
+ .create_graph(&mut tx, &"test_graph".to_string(), true)
45
+ .unwrap();
46
+ tx.close().unwrap();
47
+
48
+ // Check that there are still only two graphs
49
+ let mut graphs = store.graphs_list(&mut store.begin_read().unwrap()).unwrap();
50
+ graphs.sort();
51
+ assert_eq!(
52
+ graphs,
53
+ vec!["default".to_string(), "test_graph".to_string()]
54
+ );
55
+
56
+ // Drop graph
57
+ let mut tx = store.begin_write().unwrap();
58
+ store
59
+ .drop_graph(&mut tx, &"test_graph".to_string(), false)
60
+ .unwrap();
61
+ tx.close().unwrap();
62
+
63
+ // And gone from list
64
+ assert_eq!(
65
+ store.graphs_list(&mut store.begin_read().unwrap()).unwrap(),
66
+ vec!["default".to_string()]
67
+ );
68
+
69
+ // Re-create test graph
70
+ let mut tx = store.begin_write().unwrap();
71
+ store
72
+ .create_graph(&mut tx, &"test_graph".to_string(), false)
73
+ .unwrap();
74
+ tx.close().unwrap();
75
+
76
+ // Check the list of graphs
77
+ let mut graphs = store.graphs_list(&mut store.begin_read().unwrap()).unwrap();
78
+ graphs.sort();
79
+ assert_eq!(
80
+ graphs,
81
+ vec!["default".to_string(), "test_graph".to_string()]
82
+ );
83
+
84
+ // Drop unexisting graph
85
+ let mut tx = store.begin_write().unwrap();
86
+ store
87
+ .drop_graph(&mut tx, &"unknown".to_string(), false)
88
+ .expect_err("Attempt at deleting unknown graph.");
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);
97
+ }
98
+
99
+ fn test_select_nodes<TStore>(store: TStore)
100
+ where
101
+ TStore: store::Store,
102
+ {
103
+ // Add two nodes
104
+ let nodes = [
105
+ graph::Node {
106
+ labels: graph::labels!("hello", "world"),
107
+ properties: value::map!("key" => 42i64),
108
+ key: graph::Key::default(),
109
+ },
110
+ graph::Node {
111
+ labels: graph::labels!("not"),
112
+ properties: Default::default(),
113
+ key: graph::Key::default(),
114
+ },
115
+ ];
116
+
117
+ check_stats(&store, None, 0, 0, 0, 0);
118
+
119
+ let mut tx = store.begin_write().unwrap();
120
+
121
+ store
122
+ .create_nodes(tx.borrow_mut(), &"default".into(), nodes.iter())
123
+ .unwrap();
124
+ tx.close().unwrap();
125
+ check_stats(&store, None, 2, 0, 3, 1);
126
+
127
+ let selected_nodes = store
128
+ .select_nodes(
129
+ store.begin_read().unwrap().borrow_mut(),
130
+ &"default".into(),
131
+ store::SelectNodeQuery::select_keys([nodes[0].key]),
132
+ )
133
+ .unwrap();
134
+
135
+ assert_eq!(selected_nodes.len(), 1);
136
+ assert_eq!(nodes[0], selected_nodes[0]);
137
+ // Add a single node with label
138
+ let selected_nodes = store
139
+ .select_nodes(
140
+ store.begin_read().unwrap().borrow_mut(),
141
+ &"default".into(),
142
+ store::SelectNodeQuery::select_labels(["not".to_string()]),
143
+ )
144
+ .unwrap();
145
+
146
+ assert_eq!(selected_nodes.len(), 1);
147
+ assert_eq!(nodes[1], selected_nodes[0]);
148
+ }
149
+
150
+ fn test_update_nodes<TStore>(store: TStore)
151
+ where
152
+ TStore: store::Store,
153
+ {
154
+ // Add a node
155
+ let node = graph::Node {
156
+ labels: graph::labels!("hello", "world"),
157
+ properties: value::map!("key" => 42i64),
158
+ key: graph::Key::default(),
159
+ };
160
+
161
+ check_stats(&store, None, 0, 0, 0, 0);
162
+
163
+ let mut tx = store.begin_write().unwrap();
164
+
165
+ store
166
+ .create_nodes(
167
+ tx.borrow_mut(),
168
+ &"default".into(),
169
+ vec![node.clone()].iter(),
170
+ )
171
+ .unwrap();
172
+ tx.close().unwrap();
173
+ check_stats(&store, None, 1, 0, 2, 1);
174
+
175
+ // Modify node
176
+ let modified_node = graph::Node {
177
+ labels: graph::labels!("world"),
178
+ properties: value::map!("key" => 12i64),
179
+ key: node.key.clone(),
180
+ };
181
+
182
+ let mut tx = store.begin_write().unwrap();
183
+ store
184
+ .update_node(&mut tx, &"default".to_string(), &modified_node)
185
+ .unwrap();
186
+ tx.close().unwrap();
187
+ check_stats(&store, None, 1, 0, 1, 1);
188
+
189
+ let selected_nodes = store
190
+ .select_nodes(
191
+ store.begin_read().unwrap().borrow_mut(),
192
+ &"default".into(),
193
+ store::SelectNodeQuery::select_all(),
194
+ )
195
+ .unwrap();
196
+
197
+ assert_eq!(selected_nodes.len(), 1);
198
+ assert_eq!(modified_node, selected_nodes[0]);
199
+
200
+ let mut tx = store.begin_write().unwrap();
201
+ store
202
+ .delete_nodes(
203
+ &mut tx,
204
+ &"default".into(),
205
+ store::SelectNodeQuery::select_keys([modified_node.key]),
206
+ true,
207
+ )
208
+ .unwrap();
209
+ tx.close().unwrap();
210
+
211
+ check_stats(&store, None, 0, 0, 0, 0);
212
+ }
213
+
214
+ fn test_select_edges<TStore>(store: TStore)
215
+ where
216
+ TStore: store::Store,
217
+ {
218
+ let source_node = graph::Node {
219
+ labels: graph::labels!("hello"),
220
+ properties: value::map!("key" => 42i64),
221
+ key: graph::Key::default(),
222
+ };
223
+ let destination_node = graph::Node {
224
+ labels: graph::labels!("world"),
225
+ properties: value::map!("key" => 12i64),
226
+ key: graph::Key::default(),
227
+ };
228
+ let edge = graph::Edge {
229
+ source: source_node.clone(),
230
+ destination: destination_node.clone(),
231
+ key: graph::Key::default(),
232
+ labels: vec!["!".into()],
233
+ properties: value::map!("existence" => true),
234
+ };
235
+
236
+ check_stats(&store, None, 0, 0, 0, 0);
237
+
238
+ let mut tx = store.begin_write().unwrap();
239
+ store
240
+ .create_edges(tx.borrow_mut(), &"default".into(), [edge.clone()].iter())
241
+ .expect_err("expect missing node");
242
+ check_stats(&store, Some(&mut tx), 0, 0, 0, 0);
243
+ store
244
+ .create_nodes(
245
+ tx.borrow_mut(),
246
+ &"default".into(),
247
+ [source_node, destination_node].iter(),
248
+ )
249
+ .unwrap();
250
+ store
251
+ .create_edges(tx.borrow_mut(), &"default".into(), [edge.clone()].iter())
252
+ .unwrap();
253
+ tx.close().unwrap();
254
+ check_stats(&store, None, 2, 1, 2, 3);
255
+
256
+ let selected_edges = store
257
+ .select_edges(
258
+ store.begin_read().unwrap().borrow_mut(),
259
+ &"default".into(),
260
+ store::SelectEdgeQuery::select_keys([edge.key]),
261
+ graph::EdgeDirectivity::Directed,
262
+ )
263
+ .unwrap();
264
+
265
+ assert_eq!(1, selected_edges.len());
266
+ assert_eq!(edge, selected_edges[0].edge);
267
+ assert!(!selected_edges[0].reversed);
268
+
269
+ let selected_edges = store
270
+ .select_edges(
271
+ store.begin_read().unwrap().borrow_mut(),
272
+ &"default".into(),
273
+ store::SelectEdgeQuery::select_source_destination_labels_properties(
274
+ store::SelectNodeQuery::select_all(),
275
+ vec![],
276
+ Default::default(),
277
+ store::SelectNodeQuery::select_all(),
278
+ ),
279
+ graph::EdgeDirectivity::Directed,
280
+ )
281
+ .unwrap();
282
+
283
+ assert_eq!(1, selected_edges.len());
284
+ assert_eq!(edge, selected_edges[0].edge);
285
+ assert!(!selected_edges[0].reversed);
286
+
287
+ let selected_edges = store
288
+ .select_edges(
289
+ store.begin_read().unwrap().borrow_mut(),
290
+ &"default".into(),
291
+ store::SelectEdgeQuery::select_source_destination_labels_properties(
292
+ store::SelectNodeQuery::select_labels_properties(vec![], Default::default()),
293
+ vec![],
294
+ Default::default(),
295
+ store::SelectNodeQuery::select_labels_properties(vec![], Default::default()),
296
+ ),
297
+ graph::EdgeDirectivity::Directed,
298
+ )
299
+ .unwrap();
300
+
301
+ assert_eq!(1, selected_edges.len());
302
+ assert_eq!(edge, selected_edges[0].edge);
303
+ assert!(!selected_edges[0].reversed);
304
+
305
+ // Check reverse direction
306
+ let selected_edges = store
307
+ .select_edges(
308
+ store.begin_read().unwrap().borrow_mut(),
309
+ &"default".into(),
310
+ store::SelectEdgeQuery::select_source_destination_labels_properties(
311
+ store::SelectNodeQuery::select_keys(vec![edge.destination.key]),
312
+ vec![],
313
+ Default::default(),
314
+ store::SelectNodeQuery::select_keys(vec![edge.source.key]),
315
+ ),
316
+ graph::EdgeDirectivity::Directed,
317
+ )
318
+ .unwrap();
319
+
320
+ assert_eq!(0, selected_edges.len());
321
+
322
+ let selected_edges = store
323
+ .select_edges(
324
+ store.begin_read().unwrap().borrow_mut(),
325
+ &"default".into(),
326
+ store::SelectEdgeQuery::select_source_destination_labels_properties(
327
+ store::SelectNodeQuery::select_keys(vec![edge.destination.key]),
328
+ vec![],
329
+ Default::default(),
330
+ store::SelectNodeQuery::select_keys(vec![edge.source.key]),
331
+ ),
332
+ graph::EdgeDirectivity::Undirected,
333
+ )
334
+ .unwrap();
335
+
336
+ assert_eq!(1, selected_edges.len());
337
+ assert_eq!(edge, selected_edges[0].edge);
338
+ assert!(selected_edges[0].reversed);
339
+ }
340
+
341
+ fn test_update_edges<TStore>(store: TStore)
342
+ where
343
+ TStore: store::Store,
344
+ {
345
+ let source_node = graph::Node {
346
+ labels: graph::labels!("hello"),
347
+ properties: value::map!("key" => 42i64),
348
+ key: graph::Key::default(),
349
+ };
350
+ let destination_node = graph::Node {
351
+ labels: graph::labels!("world"),
352
+ properties: value::map!("key" => 12i64),
353
+ key: graph::Key::default(),
354
+ };
355
+ let edge = graph::Edge {
356
+ source: source_node.clone(),
357
+ destination: destination_node.clone(),
358
+ key: graph::Key::default(),
359
+ labels: vec!["!".into()],
360
+ properties: value::map!("existence" => true),
361
+ };
362
+
363
+ check_stats(&store, None, 0, 0, 0, 0);
364
+
365
+ // Insert edge in store
366
+ let mut tx = store.begin_write().unwrap();
367
+ store
368
+ .create_edges(tx.borrow_mut(), &"default".into(), [edge.clone()].iter())
369
+ .expect_err("expect missing node");
370
+ check_stats(&store, Some(&mut tx), 0, 0, 0, 0);
371
+ store
372
+ .create_nodes(
373
+ tx.borrow_mut(),
374
+ &"default".into(),
375
+ [source_node, destination_node].iter(),
376
+ )
377
+ .unwrap();
378
+ store
379
+ .create_edges(tx.borrow_mut(), &"default".into(), [edge.clone()].iter())
380
+ .unwrap();
381
+ tx.close().unwrap();
382
+ check_stats(&store, None, 2, 1, 2, 3);
383
+
384
+ // Modify edge
385
+
386
+ let modified_edge = graph::Edge {
387
+ key: edge.key.clone(),
388
+ source: edge.source.clone(),
389
+ destination: edge.destination.clone(),
390
+ labels: vec!["?".into()],
391
+ properties: value::map!("existence" => false),
392
+ };
393
+
394
+ let mut tx = store.begin_write().unwrap();
395
+ store
396
+ .update_edge(&mut tx, &"default".into(), &modified_edge)
397
+ .unwrap();
398
+ tx.close().unwrap();
399
+
400
+ let selected_edges = store
401
+ .select_edges(
402
+ store.begin_read().unwrap().borrow_mut(),
403
+ &"default".into(),
404
+ store::SelectEdgeQuery::select_all(),
405
+ graph::EdgeDirectivity::Directed,
406
+ )
407
+ .unwrap();
408
+
409
+ check_stats(&store, None, 2, 1, 2, 3);
410
+
411
+ assert_eq!(1, selected_edges.len());
412
+ assert_eq!(modified_edge, selected_edges[0].edge);
413
+ assert!(!selected_edges[0].reversed);
414
+
415
+ // Remove edge
416
+
417
+ let mut tx = store.begin_write().unwrap();
418
+ store
419
+ .delete_edges(
420
+ &mut tx,
421
+ &"default".into(),
422
+ store::SelectEdgeQuery::select_all(),
423
+ graph::EdgeDirectivity::Directed,
424
+ )
425
+ .unwrap();
426
+ tx.close().unwrap();
427
+ check_stats(&store, None, 2, 0, 2, 2);
428
+
429
+ let selected_edges = store
430
+ .select_edges(
431
+ store.begin_read().unwrap().borrow_mut(),
432
+ &"default".into(),
433
+ store::SelectEdgeQuery::select_all(),
434
+ graph::EdgeDirectivity::Directed,
435
+ )
436
+ .unwrap();
437
+
438
+ assert_eq!(0, selected_edges.len());
439
+
440
+ // Add edge back, and remove one of the node
441
+ let mut tx = store.begin_write().unwrap();
442
+ store
443
+ .create_edges(tx.borrow_mut(), &"default".into(), [edge.clone()].iter())
444
+ .unwrap();
445
+ tx.close().unwrap();
446
+ check_stats(&store, None, 2, 1, 2, 3);
447
+
448
+ let mut tx = store.begin_write().unwrap();
449
+ store
450
+ .delete_nodes(
451
+ &mut tx,
452
+ &"default".into(),
453
+ SelectNodeQuery::select_all(),
454
+ false,
455
+ )
456
+ .expect_err("should fails, nodes are still connected.");
457
+ tx.close().unwrap();
458
+
459
+ let mut tx = store.begin_write().unwrap();
460
+ store
461
+ .delete_nodes(
462
+ &mut tx,
463
+ &"default".into(),
464
+ SelectNodeQuery::select_all(),
465
+ true,
466
+ )
467
+ .unwrap();
468
+ tx.close().unwrap();
469
+ check_stats(&store, None, 0, 0, 0, 0);
470
+ }