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,43 @@
1
+ # THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
2
+ #
3
+ # When uploading crates to the registry Cargo will automatically
4
+ # "normalize" Cargo.toml files for maximal compatibility
5
+ # with all versions of Cargo and also rewrite `path` dependencies
6
+ # to registry (e.g., crates.io) dependencies.
7
+ #
8
+ # If you are reading this file be aware that the original Cargo.toml
9
+ # will likely look very different (and much more reasonable).
10
+ # See Cargo.toml.orig for the original contents.
11
+
12
+ [package]
13
+ edition = "2021"
14
+ name = "gqliterb"
15
+ version = "0.5.2"
16
+ build = false
17
+ autolib = false
18
+ autobins = false
19
+ autoexamples = false
20
+ autotests = false
21
+ autobenches = false
22
+ description = "Crate with the Ruby bindings for GQLite."
23
+ homepage = "https://gqlite.org"
24
+ readme = false
25
+ license = "MIT"
26
+ repository = "https://gitlab.com/gqlite/gqlite"
27
+
28
+ [package.metadata.release]
29
+ release = false
30
+
31
+ [lib]
32
+ name = "gqliterb"
33
+ crate-type = ["cdylib"]
34
+ path = "src/lib.rs"
35
+
36
+ [dependencies.gqlitedb]
37
+ version = "0.5.2"
38
+
39
+ [dependencies.magnus]
40
+ version = "0.7"
41
+
42
+ [build-dependencies.rb-sys-env]
43
+ version = "0.2"
@@ -0,0 +1,4 @@
1
+ require "mkmf"
2
+ require "rb_sys/mkmf"
3
+
4
+ create_rust_makefile "gqliterb"
@@ -0,0 +1,260 @@
1
+ #![deny(warnings)]
2
+
3
+ use magnus::{
4
+ function, method,
5
+ prelude::*,
6
+ r_array,
7
+ r_hash::{self, ForEach},
8
+ scan_args,
9
+ value::Lazy,
10
+ Error, ExceptionClass, Integer, IntoValue, RModule, Ruby, Symbol,
11
+ };
12
+
13
+ static MODULE: Lazy<RModule> = Lazy::new(|ruby| ruby.define_module("GQLite").unwrap());
14
+
15
+ static ERROR: Lazy<ExceptionClass> = Lazy::new(|ruby| {
16
+ ruby
17
+ .get_inner(&MODULE)
18
+ .define_error("Error", ruby.exception_standard_error())
19
+ .unwrap()
20
+ });
21
+
22
+ fn from_rvalue(ruby: &Ruby, value: magnus::Value) -> Result<gqlitedb::Value, Error>
23
+ {
24
+ if value.is_nil()
25
+ {
26
+ Ok(gqlitedb::Value::Null)
27
+ }
28
+ else if value.is_kind_of(ruby.class_integer())
29
+ {
30
+ Ok(i64::try_convert(value)?.into())
31
+ }
32
+ else if value.is_kind_of(ruby.class_true_class())
33
+ {
34
+ Ok(true.into())
35
+ }
36
+ else if value.is_kind_of(ruby.class_false_class())
37
+ {
38
+ Ok(false.into())
39
+ }
40
+ else if value.is_kind_of(ruby.class_float())
41
+ {
42
+ Ok(f64::try_convert(value)?.into())
43
+ }
44
+ else if value.is_kind_of(ruby.class_string())
45
+ {
46
+ Ok(String::try_convert(value)?.into())
47
+ }
48
+ else if value.is_kind_of(ruby.class_hash())
49
+ {
50
+ Ok(from_rhash(ruby, r_hash::RHash::try_convert(value)?)?.into())
51
+ }
52
+ else if value.is_kind_of(ruby.class_array())
53
+ {
54
+ Ok(from_rarray(ruby, r_array::RArray::try_convert(value)?)?.into())
55
+ }
56
+ else
57
+ {
58
+ Err(Error::new(
59
+ ruby.get_inner(&ERROR),
60
+ format!(
61
+ "Cannot convert a value of type '{}' to a GQLite value.",
62
+ value.class()
63
+ ),
64
+ ))
65
+ }
66
+ }
67
+
68
+ fn from_rarray(ruby: &Ruby, array: r_array::RArray) -> Result<Vec<gqlitedb::Value>, Error>
69
+ {
70
+ array
71
+ .into_iter()
72
+ .map(|value| from_rvalue(ruby, value))
73
+ .collect()
74
+ }
75
+
76
+ fn from_rhash(ruby: &Ruby, hash: r_hash::RHash) -> Result<gqlitedb::ValueMap, Error>
77
+ {
78
+ let mut vmap = gqlitedb::ValueMap::new();
79
+ hash.foreach(|key: magnus::Value, value: magnus::Value| {
80
+ let key = if key.is_kind_of(ruby.class_symbol())
81
+ {
82
+ Symbol::try_convert(key)?.name()?.into()
83
+ }
84
+ else
85
+ {
86
+ String::try_convert(key)?
87
+ };
88
+
89
+ vmap.insert(key, from_rvalue(ruby, value)?);
90
+ Ok(ForEach::Continue)
91
+ })?;
92
+
93
+ Ok(vmap)
94
+ }
95
+
96
+ fn integer_from_u128(ruby: &Ruby, i: u128) -> Result<Integer, Error>
97
+ {
98
+ if i <= u64::MAX as u128
99
+ {
100
+ Ok(ruby.integer_from_u64(i as u64))
101
+ }
102
+ else
103
+ {
104
+ ruby.module_kernel().funcall("Integer", (i.to_string(),))
105
+ }
106
+ }
107
+
108
+ fn node_to_rhash(ruby: &Ruby, node: gqlitedb::Node) -> Result<magnus::Value, Error>
109
+ {
110
+ let r_hash = ruby.hash_new();
111
+ let (key, labels, properties) = node.unpack();
112
+ r_hash.aset("type", "node")?;
113
+ r_hash.aset("key", integer_from_u128(ruby, key.into())?)?;
114
+ r_hash.aset("labels", labels)?;
115
+ r_hash.aset("properties", to_rhash(ruby, properties)?)?;
116
+ Ok(r_hash.into_value())
117
+ }
118
+
119
+ fn edge_to_rhash(ruby: &Ruby, edge: gqlitedb::Edge) -> Result<magnus::Value, Error>
120
+ {
121
+ let r_hash = ruby.hash_new();
122
+ let (key, labels, properties) = edge.unpack();
123
+ r_hash.aset("type", "edge")?;
124
+ r_hash.aset("key", integer_from_u128(ruby, key.into())?)?;
125
+ r_hash.aset("labels", labels)?;
126
+ r_hash.aset("properties", to_rhash(ruby, properties)?)?;
127
+ Ok(r_hash.into_value())
128
+ }
129
+
130
+ fn path_to_rhash(ruby: &Ruby, path: gqlitedb::Path) -> Result<magnus::Value, Error>
131
+ {
132
+ let r_hash = ruby.hash_new();
133
+ let (key, source, labels, properties, destination) = path.unpack();
134
+ r_hash.aset("type", "path")?;
135
+ r_hash.aset("key", integer_from_u128(ruby, key.into())?)?;
136
+ r_hash.aset("labels", labels)?;
137
+ r_hash.aset("properties", to_rhash(ruby, properties)?)?;
138
+ r_hash.aset("source", node_to_rhash(ruby, source)?)?;
139
+ r_hash.aset("destination", node_to_rhash(ruby, destination)?)?;
140
+ Ok(r_hash.into_value())
141
+ }
142
+
143
+ fn to_rvalue(ruby: &Ruby, val: gqlitedb::Value) -> Result<magnus::Value, Error>
144
+ {
145
+ match val
146
+ {
147
+ gqlitedb::Value::Array(arr) => Ok(to_rarray(ruby, arr)?.into_value()),
148
+ gqlitedb::Value::Boolean(b) => Ok(b.into_value()),
149
+ gqlitedb::Value::Integer(i) => Ok(i.into_value()),
150
+ gqlitedb::Value::Float(f) => Ok(f.into_value()),
151
+ gqlitedb::Value::String(s) => Ok(s.into_value()),
152
+ gqlitedb::Value::Map(m) => Ok(to_rhash(ruby, m)?.into_value()),
153
+ gqlitedb::Value::Null => Ok(ruby.qnil().into_value()),
154
+ gqlitedb::Value::Edge(e) => Ok(edge_to_rhash(ruby, e)?),
155
+ gqlitedb::Value::Node(n) => Ok(node_to_rhash(ruby, n)?),
156
+ gqlitedb::Value::Path(p) => Ok(path_to_rhash(ruby, p)?),
157
+ }
158
+ }
159
+
160
+ fn to_rhash(ruby: &Ruby, map: gqlitedb::ValueMap) -> Result<r_hash::RHash, Error>
161
+ {
162
+ let r_hash = ruby.hash_new();
163
+ for (key, value) in map.into_iter()
164
+ {
165
+ r_hash.aset(key, to_rvalue(ruby, value)?)?;
166
+ }
167
+ Ok(r_hash)
168
+ }
169
+
170
+ fn to_rarray(ruby: &Ruby, arr: Vec<gqlitedb::Value>) -> Result<r_array::RArray, Error>
171
+ {
172
+ let r_arr = r_array::RArray::with_capacity(arr.len());
173
+
174
+ for value in arr.into_iter()
175
+ {
176
+ r_arr.push(to_rvalue(ruby, value)?)?;
177
+ }
178
+
179
+ Ok(r_arr)
180
+ }
181
+
182
+ fn map_err<T>(ruby: &Ruby, result: gqlitedb::Result<T>) -> Result<T, Error>
183
+ {
184
+ result.map_err(|e| Error::new(ruby.get_inner(&ERROR), format!("{}", e)))
185
+ }
186
+
187
+ #[magnus::wrap(class = "GQLite::Connection")]
188
+ struct Connection
189
+ {
190
+ dbhandle: gqlitedb::Connection,
191
+ }
192
+
193
+ impl Connection
194
+ {
195
+ fn new(ruby: &Ruby, args: &[magnus::Value]) -> Result<Self, Error>
196
+ {
197
+ let args = scan_args::scan_args::<(), (), (), (), _, ()>(args)?;
198
+
199
+ let options = from_rhash(ruby, args.keywords)?;
200
+
201
+ let filename: String = map_err(
202
+ ruby,
203
+ options
204
+ .get("filename".into())
205
+ .ok_or_else(|| Error::new(ruby.get_inner(&ERROR), "Missing filename."))?
206
+ .to_owned()
207
+ .try_into(),
208
+ )?;
209
+ let dbhandle = map_err(ruby, gqlitedb::Connection::open(filename, options))?;
210
+ Ok(Self { dbhandle })
211
+ }
212
+ fn execute_oc_query(
213
+ ruby: &Ruby,
214
+ rb_self: &Self,
215
+ args: &[magnus::Value],
216
+ ) -> Result<magnus::Value, Error>
217
+ {
218
+ let args = scan_args::scan_args::<_, (), (), (), _, ()>(args)?;
219
+ let (query,): (String,) = args.required;
220
+
221
+ let kw = scan_args::get_kwargs::<_, (), (Option<magnus::Value>,), ()>(
222
+ args.keywords,
223
+ &[],
224
+ &["bindings"],
225
+ )?;
226
+ let (bindings,) = kw.optional;
227
+
228
+ let bindings = bindings
229
+ .map(|bindings| {
230
+ if bindings.is_nil()
231
+ {
232
+ Ok(Default::default())
233
+ }
234
+ else
235
+ {
236
+ from_rhash(ruby, r_hash::RHash::try_convert(bindings)?)
237
+ }
238
+ })
239
+ .transpose()?
240
+ .unwrap_or_default();
241
+ let result = map_err(ruby, rb_self.dbhandle.execute_query(query, bindings))?;
242
+
243
+ to_rvalue(ruby, result)
244
+ }
245
+ }
246
+
247
+ #[magnus::init]
248
+ fn init(ruby: &Ruby) -> Result<(), Error>
249
+ {
250
+ Lazy::force(&ERROR, ruby);
251
+
252
+ let module = ruby.get_inner(&MODULE);
253
+ let class = module.define_class("Connection", ruby.class_object())?;
254
+ class.define_singleton_method("new", function!(Connection::new, -1))?;
255
+ class.define_method(
256
+ "execute_oc_query",
257
+ method!(Connection::execute_oc_query, -1),
258
+ )?;
259
+ Ok(())
260
+ }