arangorb 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,170 @@
1
+ # === DATABASE ===
2
+
3
+ class ArangoDB < ArangoS
4
+ def initialize(database: @@database)
5
+ if database.is_a?(String)
6
+ @database = database
7
+ else
8
+ raise "database should be a String, not a #{database.class}"
9
+ end
10
+ end
11
+
12
+ attr_reader :database
13
+
14
+ # === GET ===
15
+
16
+ def self.info
17
+ result = get("/_api/database/current")
18
+ @@verbose ? result : result["error"] ? result["errorMessage"] : result["result"]
19
+ end
20
+
21
+ # === POST ===
22
+
23
+ def create(username: nil, passwd: nil, users: nil)
24
+ body = {
25
+ "name" => @database,
26
+ "username" => username,
27
+ "passwd" => passwd,
28
+ "users" => users
29
+ }
30
+ body = body.delete_if{|k,v| v.nil?}.to_json
31
+ new_DB = { :body => body }
32
+ result = self.class.post("/_api/database", new_DB)
33
+ @@verbose ? result : result["error"] ? result["errorMessage"] : ArangoDB.new(database: @database)
34
+ end
35
+
36
+ # === DELETE ===
37
+
38
+ def destroy
39
+ result = self.class.delete("/_api/database/#{@database}")
40
+ @@verbose ? result : result["error"] ? result["errorMessage"] : result["result"]
41
+ end
42
+
43
+ # === LISTS ===
44
+
45
+ def self.databases(user: nil)
46
+ result = user.nil? ? get("/_api/database") : get("/_api/database/#{user}")
47
+ @@verbose ? result : result["error"] ? result["errorMessage"] : result["result"].map{|x| ArangoDB.new(database: x)}
48
+ end
49
+
50
+ def collections(excludeSystem: true)
51
+ query = { "excludeSystem": excludeSystem }.delete_if{|k,v| v.nil?}
52
+ new_Document = { :query => query }
53
+ result = self.class.get("/_db/#{@database}/_api/collection", new_Document)
54
+ if @@verbose
55
+ return result
56
+ else
57
+ if result["error"]
58
+ return result["errorMessage"]
59
+ else
60
+ return result["result"].map{|x| ArangoC.new(database: @database, collection: x["name"])}
61
+ end
62
+ end
63
+ end
64
+
65
+ def graphs
66
+ result = self.class.get("/_db/#{@database}/_api/gharial")
67
+ if @@verbose
68
+ return result
69
+ else
70
+ if result["error"]
71
+ return result["errorMessage"]
72
+ else
73
+ return result["graphs"].map{|x| ArangoG.new(database: @database, graph: x["_key"], edgeDefinitions: x["edgeDefinitions"], orphanCollections: x["orphanCollections"])}
74
+ end
75
+ end
76
+ end
77
+
78
+ def functions
79
+ self.class.get("/_db/#{@database}/_api/aqlfunction").parsed_response
80
+ end
81
+
82
+ # === QUERY ===
83
+
84
+ def propertiesQuery
85
+ result = self.class.get("/_db/#{@database}/_api/query/properties").parsed_response
86
+ return_result(result)
87
+ end
88
+
89
+ def currentQuery
90
+ self.class.get("/_db/#{@database}/_api/query/current").parsed_response
91
+ end
92
+
93
+ def slowQuery
94
+ self.class.get("/_db/#{@database}/_api/query/slow").parsed_response
95
+ end
96
+
97
+ def stopSlowQuery
98
+ result = self.class.delete("/_db/#{@database}/_api/query/slow").parsed_response
99
+ @@verbose ? result : result["error"] ? result["errorMessage"] : true
100
+ end
101
+
102
+ def killQuery(id:)
103
+ result = self.class.delete("/_db/#{@database}/_api/query/#{id}").parsed_response
104
+ @@verbose ? result : result["error"] ? result["errorMessage"] : true
105
+ end
106
+
107
+ def changePropertiesQuery(slowQueryThreshold: nil, enabled: nil, maxSlowQueries: nil, trackSlowQueries: nil, maxQueryStringLength: nil)
108
+ body = {
109
+ "slowQueryThreshold" => slowQueryThreshold,
110
+ "enabled" => enabled,
111
+ "maxSlowQueries" => maxSlowQueries,
112
+ "trackSlowQueries" => trackSlowQueries,
113
+ "maxQueryStringLength" => maxQueryStringLength
114
+ }.delete_if{|k,v| v.nil?}
115
+ new_Document = { :body => body.to_json }
116
+ result = self.class.put("/_db/#{@database}/_api/query/properties", new_Document).parsed_response
117
+ return_result(result)
118
+ end
119
+
120
+ # === CACHE ===
121
+
122
+ def clearCache
123
+ result = self.class.delete("/_db/#{@database}/_api/query-cache").parsed_response
124
+ @@verbose ? result : result["error"] ? result["errorMessage"] : true
125
+ end
126
+
127
+ def propertyCache
128
+ self.class.get("/_db/#{@database}/_api/query-cache/properties").parsed_response
129
+ end
130
+
131
+ def changePropertyCache(mode: nil, maxResults: nil)
132
+ body = { "mode" => mode, "maxResults" => maxResults }.delete_if{|k,v| v.nil?}
133
+ new_Document = { :body => body.to_json }
134
+ self.class.put("/_db/#{@database}/_api/query-cache/properties", new_Document).parsed_response
135
+ end
136
+
137
+ # === AQL FUNCTION ===
138
+
139
+ def createFunction(code:, name:, isDeterministic: nil)
140
+ body = {
141
+ "code" => code,
142
+ "name" => name,
143
+ "isDeterministic" => isDeterministic
144
+ }.delete_if{|k,v| v.nil?}
145
+ new_Document = { :body => body.to_json }
146
+ result = self.class.post("/_db/#{@database}/_api/aqlfunction", new_Document).parsed_response
147
+ return_result(result)
148
+ end
149
+
150
+ def deleteFunction(name:)
151
+ result = self.class.delete("/_db/#{@database}/_api/aqlfunction/#{name}")
152
+ @@verbose ? result : result["error"] ? result["errorMessage"] : true
153
+ end
154
+
155
+ # === UTILITY ===
156
+
157
+ def return_result(result)
158
+ if @@verbose
159
+ result
160
+ else
161
+ if result["error"]
162
+ result["errorMessage"]
163
+ else
164
+ result.delete("error")
165
+ result.delete("code")
166
+ result
167
+ end
168
+ end
169
+ end
170
+ end
@@ -0,0 +1,297 @@
1
+ # ==== DOCUMENT ====
2
+
3
+ class ArangoDoc < ArangoS
4
+ def initialize(key: nil, collection: @@collection, database: @@database, body: {}, from: nil, to: nil)
5
+ if collection.is_a?(String)
6
+ @collection = collection
7
+ elsif collection.is_a?(ArangoC)
8
+ @collection = collection.collection
9
+ else
10
+ raise "collection should be a String or an ArangoC instance, not a #{collection.class}"
11
+ end
12
+
13
+ if database.is_a?(String)
14
+ @database = database
15
+ else
16
+ raise "database should be a String, not a #{database.class}"
17
+ end
18
+
19
+ if key.is_a?(String) || key.nil?
20
+ @key = key
21
+ unless key.nil?
22
+ body["_key"] = @key
23
+ @id = "#{@collection}/#{@key}"
24
+ end
25
+ else
26
+ raise "key should be a String, not a #{key.class}"
27
+ end
28
+
29
+ if body.is_a?(Hash)
30
+ @body = body
31
+ else
32
+ raise "body should be a Hash, not a #{body.class}"
33
+ end
34
+
35
+ if from.is_a?(String)
36
+ @body["_from"] = from
37
+ elsif from.is_a?(ArangoDoc)
38
+ @body["_from"] = from.id
39
+ elsif from.nil?
40
+ else
41
+ raise "from should be a String or an ArangoDoc instance, not a #{from.class}"
42
+ end
43
+
44
+ if to.is_a?(String)
45
+ @body["_to"] = to
46
+ elsif to.is_a?(ArangoDoc)
47
+ @body["_to"] = to.id
48
+ elsif to.nil?
49
+ else
50
+ raise "to should be a String or an ArangoDoc instance, not a #{to.class}"
51
+ end
52
+ end
53
+
54
+ attr_reader :key, :id, :body, :collection, :database
55
+
56
+ # === GET ===
57
+
58
+ def retrieve
59
+ result = self.class.get("/_db/#{@database}/_api/document/#{@id}").parsed_response
60
+ if @@verbose
61
+ @body = result unless result["error"]
62
+ result
63
+ else
64
+ if result["error"]
65
+ result["errorMessage"]
66
+ else
67
+ @body = result
68
+ self
69
+ end
70
+ end
71
+ end
72
+
73
+ def retrieve_edges(collection: , direction: nil)
74
+ query = {"vertex" => @id, "direction" => direction }.delete_if{|k,v| v.nil?}
75
+ new_Document = { :query => query }
76
+ collection = collection.is_a?(String) ? collection : collection.collection
77
+ result = self.class.get("/_db/#{@database}/_api/edges/#{collection}", new_Document).parsed_response
78
+ @@verbose ? result : result["error"] ? result["errorMessage"] : result["edges"].map{|edge|
79
+ ArangoDoc.new(key: edge["_key"], collection: collection, database: @database, body: edge)
80
+ }
81
+ end
82
+
83
+ def in(collection)
84
+ self.retrieve_edges collection: collection, direction: "in"
85
+ end
86
+
87
+ def out(collection)
88
+ self.retrieve_edges collection: collection, direction: "out"
89
+ end
90
+
91
+ def any(collection)
92
+ self.retrieve_edges collection: collection
93
+ end
94
+
95
+ def from
96
+ result = self.class.get("/_db/#{@database}/_api/document/#{self.body["_from"]}").parsed_response
97
+ collection = result["_id"].split("/")[0]
98
+ @@verbose ? result : result["error"] ? result["errorMessage"] : ArangoDoc.new(key: result["_key"], collection: collection, database: @database, body: result)
99
+ end
100
+
101
+ def to
102
+ result = self.class.get("/_db/#{@database}/_api/document/#{self.body["_to"]}").parsed_response
103
+ collection = result["_id"].split("/")[0]
104
+ @@verbose ? result : result["error"] ? result["errorMessage"] : ArangoDoc.new(key: result["_key"], collection: collection, database: @database, body: result)
105
+ end
106
+
107
+ # def header
108
+ # result = self.class.head("/_db/#{@database}/_api/document/#{@id}", follow_redirects: true, maintain_method_across_redirects: true)
109
+ # @@verbose ? result : result["error"] ? result["errorMessage"] : result
110
+ # end
111
+
112
+ # === POST ====
113
+
114
+ def create(body: @body, waitForSync: nil, returnNew: nil, database: @database, collection: @collection)
115
+ query = {"waitForSync" => waitForSync, "returnNew" => returnNew}.delete_if{|k,v| v.nil?}
116
+ unless body.is_a? Array
117
+ body["_key"] = @key if body["_key"].nil? && !@key.nil?
118
+ new_Document = { :body => body.to_json, :query => query }
119
+ result = self.class.post("/_db/#{database}/_api/document/#{collection}", new_Document).parsed_response
120
+ return_result(result, body)
121
+ else
122
+ new_Document = { :body => body.to_json, :query => query }
123
+ result = self.class.post("/_db/#{database}/_api/document/#{collection}", new_Document).parsed_response
124
+ i = -1
125
+ return @@verbose ? result : !result.is_a?(Array) ? result["errorMessage"] : result.map{|x| ArangoDoc.new(key: x["_key"], collection: collection, database: database, body: body[i+=1])}
126
+ end
127
+ end
128
+ alias create_document create
129
+ alias create_vertex create
130
+
131
+ def self.create(body: {}, waitForSync: nil, returnNew: nil, database: @@database, collection: @@collection)
132
+ collection = collection.is_a?(String) ? collection : collection.collection
133
+ database = database.is_a?(String) ? database : database.database
134
+ query = {"waitForSync" => waitForSync, "returnNew" => returnNew}.delete_if{|k,v| v.nil?}
135
+ unless body.is_a? Array
136
+ body["_key"] = @key if body["_key"].nil? && !@key.nil?
137
+ new_Document = { :body => body.to_json, :query => query }
138
+ result = post("/_db/#{database}/_api/document/#{collection}", new_Document).parsed_response
139
+ self.return_result(result, body)
140
+ else
141
+ new_Document = { :body => body.to_json, :query => query }
142
+ result = post("/_db/#{database}/_api/document/#{collection}", new_Document).parsed_response
143
+ i = -1
144
+ return @@verbose ? result : !result.is_a?(Array) ? result["errorMessage"] : result.map{|x| ArangoDoc.new(key: x["_key"], collection: collection, database: database, body: body[i+=1])}
145
+ end
146
+ end
147
+
148
+ def create_edge(body: [{}], from:, to:, waitForSync: nil, returnNew: nil, database: @database, collection: @collection)
149
+ edges = []
150
+ from = [from] unless from.is_a? Array
151
+ to = [to] unless to.is_a? Array
152
+ body = [body] unless body.is_a? Array
153
+ body.each do |b|
154
+ from.each do |f|
155
+ b["_from"] = f.is_a?(String) ? f : f.id
156
+ to.each do |t|
157
+ b["_to"] = t.is_a?(String) ? t : t.id
158
+ edges << b.clone
159
+ end
160
+ end
161
+ end
162
+ edges = edges[0] if edges.length == 1
163
+ create(body: edges, waitForSync: waitForSync, returnNew: returnNew, database: database, collection: collection)
164
+ # ArangoDoc.create_edge(body: body, from: from, to: to, waitForSync: waitForSync, returnNew: returnNew, database: database, collection: collection)
165
+ end
166
+
167
+ def self.create_edge(body: {}, from:, to:, waitForSync: nil, returnNew: nil, database: @@database, collection: @@collection)
168
+ edges = []
169
+ from = [from] unless from.is_a? Array
170
+ to = [to] unless to.is_a? Array
171
+ body = [body] unless body.is_a? Array
172
+ body.each do |b|
173
+ from.each do |f|
174
+ b["_from"] = f.is_a?(String) ? f : f.id
175
+ to.each do |t|
176
+ b["_to"] = t.is_a?(String) ? t : t.id
177
+ edges << b.clone
178
+ end
179
+ end
180
+ end
181
+
182
+ edges = edges[0] if edges.length == 1
183
+ self.create(body: edges, waitForSync: waitForSync, returnNew: returnNew, database: database, collection: collection)
184
+ end
185
+
186
+ # === MODIFY ===
187
+
188
+ def replace(body: {}, waitForSync: nil, ignoreRevs: nil, returnOld: nil, returnNew: nil)
189
+ query = {
190
+ "waitForSync" => waitForSync,
191
+ "returnNew" => returnNew,
192
+ "returnOld" => returnOld,
193
+ "ignoreRevs" => ignoreRevs
194
+ }.delete_if{|k,v| v.nil?}
195
+ new_Document = { :body => body.to_json, :query => query }
196
+
197
+ unless body.is_a? Array
198
+ result = self.class.put("/_db/#{@database}/_api/document/#{@id}", new_Document).parsed_response
199
+ return_result(result, body)
200
+ else
201
+ result = self.class.put("/_db/#{@database}/_api/document/#{@collection}", new_Document).parsed_response
202
+ i = -1
203
+ return @@verbose ? result : !result.is_a?(Array) ? result["errorMessage"] : result.map{|x| ArangoDoc.new(key: x["_key"], collection: @collection, database: @database, body: body[i+=1])}
204
+ end
205
+ end
206
+
207
+ def update(body: {}, waitForSync: nil, ignoreRevs: nil, returnOld: nil, returnNew: nil, keepNull: nil, mergeObjects: nil)
208
+ query = {
209
+ "waitForSync" => waitForSync,
210
+ "returnNew" => returnNew,
211
+ "returnOld" => returnOld,
212
+ "ignoreRevs" => ignoreRevs,
213
+ "keepNull" => keepNull,
214
+ "mergeObjects" => mergeObjects
215
+ }.delete_if{|k,v| v.nil?}
216
+ new_Document = { :body => body.to_json, :query => query }
217
+
218
+ unless body.is_a? Array
219
+ result = self.class.patch("/_db/#{@database}/_api/document/#{@id}", new_Document).parsed_response
220
+ if @@verbose
221
+ unless result["error"]
222
+ @key = result["_key"]
223
+ @id = "#{@collection}/#{@key}"
224
+ @body = body
225
+ end
226
+ result
227
+ else
228
+ if result["error"]
229
+ result["errorMessage"]
230
+ else
231
+ @key = result["_key"]
232
+ @id = "#{@collection}/#{@key}"
233
+ @body = @body.merge(body)
234
+ self
235
+ end
236
+ end
237
+ else
238
+ result = self.class.patch("/_db/#{@database}/_api/document/#{@collection}", new_Document).parsed_response
239
+ i = -1
240
+ return @@verbose ? result : !result.is_a?(Array) ? result["errorMessage"] : result.map{|x| ArangoDoc.new(key: x["_key"], collection: @collection, database: @database, body: body[i+=1])}
241
+ end
242
+ end
243
+
244
+ # === DELETE ===
245
+
246
+ def destroy(body: nil, waitForSync: nil, ignoreRevs: nil, returnOld: nil)
247
+ query = {
248
+ "waitForSync" => waitForSync,
249
+ "returnOld" => returnOld,
250
+ "ignoreRevs" => ignoreRevs
251
+ }.delete_if{|k,v| v.nil?}
252
+ new_Document = { :query => query }
253
+
254
+ unless body.is_a? Array
255
+ result = self.class.delete("/_db/#{@database}/_api/document/#{@id}", new_Document).parsed_response
256
+ @@verbose ? result : result["error"] ? result["errorMessage"] : true
257
+ else
258
+ new_Document = { :body => body.to_json, :query => query }
259
+ result = self.class.delete("/_db/#{@database}/_api/document/#{@collection}", new_Document).parsed_response
260
+ return result
261
+ end
262
+ end
263
+
264
+ # === UTILITY ===
265
+
266
+ def return_result(result, body)
267
+ if @@verbose
268
+ unless result["error"]
269
+ @key = result["_key"]
270
+ @id = "#{@collection}/#{@key}"
271
+ @body = body
272
+ end
273
+ result
274
+ else
275
+ if result["error"]
276
+ result["errorMessage"]
277
+ else
278
+ @key = result["_key"]
279
+ @id = "#{@collection}/#{@key}"
280
+ @body = body
281
+ self
282
+ end
283
+ end
284
+ end
285
+
286
+ def self.return_result(result, body)
287
+ if @@verbose
288
+ result
289
+ else
290
+ if result["error"]
291
+ result["errorMessage"]
292
+ else
293
+ ArangoDoc.new key: result["_key"], collection: result["_id"].split("/")[0], body: body
294
+ end
295
+ end
296
+ end
297
+ end