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