arangorb 0.1.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. checksums.yaml +4 -4
  2. data/ArangoRB.gemspec +2 -2
  3. data/README.md +418 -123
  4. data/lib/ArangoRB_AQL.rb +90 -103
  5. data/lib/ArangoRB_Col.rb +476 -159
  6. data/lib/ArangoRB_DB.rb +305 -79
  7. data/lib/ArangoRB_Doc.rb +112 -114
  8. data/lib/ArangoRB_Edg.rb +81 -62
  9. data/lib/ArangoRB_Gra.rb +125 -76
  10. data/lib/ArangoRB_Index.rb +144 -0
  11. data/lib/ArangoRB_Ser.rb +439 -18
  12. data/lib/ArangoRB_Task.rb +136 -0
  13. data/lib/ArangoRB_Tra.rb +47 -42
  14. data/lib/ArangoRB_Tran.rb +48 -0
  15. data/lib/ArangoRB_User.rb +152 -0
  16. data/lib/ArangoRB_Ver.rb +74 -57
  17. data/lib/arangorb.rb +4 -0
  18. data/spec/arangoRB_helper.rb +2 -9
  19. data/spec/arangoRestart_helper.rb +14 -0
  20. data/spec/lib/{arangoAQL_helper.rb → 0.1.0/arangoAQL_helper.rb} +2 -21
  21. data/spec/lib/{arangoC_helper.rb → 0.1.0/arangoC_helper.rb} +40 -19
  22. data/spec/lib/{arangoDB_helper.rb → 0.1.0/arangoDB_helper.rb} +13 -13
  23. data/spec/lib/{arangoDoc_helper.rb → 0.1.0/arangoDoc_helper.rb} +10 -23
  24. data/spec/lib/0.1.0/arangoE_helper.rb +50 -0
  25. data/spec/lib/{arangoG_helper.rb → 0.1.0/arangoG_helper.rb} +7 -21
  26. data/spec/lib/0.1.0/arangoS_helper.rb +37 -0
  27. data/spec/lib/0.1.0/arangoT_helper.rb +48 -0
  28. data/spec/lib/{arangoV_helper.rb → 0.1.0/arangoV_helper.rb} +6 -22
  29. data/spec/lib/1.0.0/arangoC_helper.rb +73 -0
  30. data/spec/lib/1.0.0/arangoDB_helper.rb +81 -0
  31. data/spec/lib/1.0.0/arangoI_helper.rb +43 -0
  32. data/spec/lib/1.0.0/arangoS_helper.rb +196 -0
  33. data/spec/lib/1.0.0/arangoTa_helper.rb +49 -0
  34. data/spec/lib/1.0.0/arangoTr_helper.rb +15 -0
  35. data/spec/lib/1.0.0/arangoU_helper.rb +72 -0
  36. data/spec/lib/arangoRB_0.1.0_helper.rb +9 -0
  37. data/spec/lib/arangoRB_1.0.0_helper.rb +6 -0
  38. data/spec/spec_helper.rb +34 -0
  39. metadata +28 -15
  40. data/spec/lib/arangoE_helper.rb +0 -70
  41. data/spec/lib/arangoS_helper.rb +0 -28
  42. data/spec/lib/arangoT_helper.rb +0 -67
data/lib/ArangoRB_Col.rb CHANGED
@@ -1,23 +1,27 @@
1
1
  # === COLLECTION ===
2
2
 
3
- class ArangoC < ArangoS
4
- def initialize(collection: @@collection, database: @@database, body: {}, type: nil)
3
+ class ArangoCollection < ArangoServer
4
+ def initialize(collection: @@collection, database: @@database, body: {}, type: nil) # TESTED
5
5
  if collection.is_a?(String)
6
6
  @collection = collection
7
+ elsif collection.is_a?(ArangoCollection)
8
+ @collection = collection.collection
7
9
  else
8
- raise "collection should be a String, not a #{collection.class}"
10
+ raise "collection should be a String or an ArangoCollection instance, not a #{collection.class}"
9
11
  end
10
12
 
11
13
  if database.is_a?(String)
12
14
  @database = database
15
+ elsif database.is_a?(ArangoDatabase)
16
+ @database = database.database
13
17
  else
14
- raise "database should be a String, not a #{database.class}"
18
+ raise "database should be a String or an ArangoDatabase instance, not a #{database.class}"
15
19
  end
16
20
 
17
21
  if body.is_a?(Hash)
18
22
  @body = body
19
23
  else
20
- raise "body should be a String, not a #{body.class}"
24
+ raise "body should be a Hash, not a #{body.class}"
21
25
  end
22
26
 
23
27
  if !@type.nil? && @type != "Document" && @type != "Edge"
@@ -36,43 +40,47 @@ class ArangoC < ArangoS
36
40
 
37
41
  # === GET ===
38
42
 
39
- def retrieve
40
- result = self.class.get("/_db/#{@database}/_api/collection/#{@collection}").parsed_response
41
- self.return_result(result, true)
43
+ def retrieve # TESTED
44
+ result = self.class.get("/_db/#{@database}/_api/collection/#{@collection}", @@request)
45
+ self.return_result result: result, checkType: true
42
46
  end
43
47
 
44
- def properties
45
- result = self.class.get("/_db/#{@database}/_api/collection/#{@collection}/properties").parsed_response
46
- @@verbose ? result : result["error"] ? result["errorMessage"] : result
48
+ def properties # TESTED
49
+ result = self.class.get("/_db/#{@database}/_api/collection/#{@collection}/properties", @@request)
50
+ result = self.return_result result: result
51
+ return result.is_a?(ArangoCollection) ? result.body : result
47
52
  end
48
53
 
49
- def count
50
- result = self.class.get("/_db/#{@database}/_api/collection/#{@collection}/count").parsed_response
51
- @@verbose ? result : result["error"] ? result["errorMessage"] : result["count"]
54
+ def count # TESTED
55
+ result = self.class.get("/_db/#{@database}/_api/collection/#{@collection}/count", @@request)
56
+ self.return_result result: result, key: "count"
52
57
  end
53
58
 
54
- def stats
55
- result = self.class.get("/_db/#{@database}/_api/collection/#{@collection}/figures").parsed_response
56
- @@verbose ? result : result["error"] ? result["errorMessage"] : result["figures"]
59
+ def statistics # TESTED
60
+ result = self.class.get("/_db/#{@database}/_api/collection/#{@collection}/figures", @@request)
61
+ self.return_result result: result, key: "figures"
57
62
  end
58
63
 
59
- # def revisions
60
- # self.class.get("/_db/#{@database}/_api/collection/#{@collection}/revisions").parsed_response
61
- # end
64
+ def revision # TESTED
65
+ result = self.class.get("/_db/#{@database}/_api/collection/#{@collection}/revision", @@request)
66
+ self.return_result result: result, key: "revision"
67
+ end
62
68
 
63
- def checksum(withRevisions: nil, withData: nil)
69
+ def checksum(withRevisions: nil, withData: nil) # TESTED
64
70
  query = {
65
71
  "withRevisions": withRevisions,
66
72
  "withData": withData
67
73
  }.delete_if{|k,v| v.nil?}
68
- new_Document = { :query => query }
69
- result = self.class.get("/_db/#{@database}/_api/collection/#{@collection}/checksum", new_Document).parsed_response
70
- @@verbose ? result : result["error"] ? result["errorMessage"] : result["checksum"]
74
+ request = @@request.merge({ :query => query })
75
+ result = self.class.get("/_db/#{@database}/_api/collection/#{@collection}/checksum", request)
76
+ self.return_result result: result, key: "checksum"
71
77
  end
72
78
 
73
79
  # === POST ===
74
80
 
75
- def create(type: nil, journalSize: nil, keyOptions: nil, waitForSync: nil, doCompact: nil, isVolatile: nil, shardKeys: nil, numberOfShards: nil, isSystem: nil, indexBuckets: nil)
81
+ def create(type: nil, journalSize: nil, keyOptions: nil, waitForSync: nil, doCompact: nil, isVolatile: nil, shardKeys: nil, numberOfShards: nil, isSystem: nil, indexBuckets: nil) # TESTED
82
+ type = 3 if type == "Edge"
83
+ type = nil if type == "Document"
76
84
  body = {
77
85
  "name" => collection,
78
86
  "type" => type,
@@ -87,133 +95,148 @@ class ArangoC < ArangoS
87
95
  "indexBuckets" => indexBuckets
88
96
  }
89
97
  body = body.delete_if{|k,v| v.nil?}.to_json
90
- new_Collection = { :body => body }
91
- result = self.class.post("/_db/#{@database}/_api/collection", new_Collection).parsed_response
92
- self.return_result(result, true)
98
+ request = @@request.merge({ :body => body })
99
+ result = self.class.post("/_db/#{@database}/_api/collection", request)
100
+ self.return_result result: result, checkType: true
93
101
  end
94
102
  alias create_collection create
95
103
  alias create_document_collection create
96
104
  alias create_vertex_collection create
97
105
 
98
- def create_edge_collection(journalSize: nil, keyOptions: nil, waitForSync: nil, doCompact: nil, isVolatile: nil, shardKeys: nil, numberOfShards: nil, isSystem: nil, indexBuckets: nil)
106
+ def create_edge_collection(journalSize: nil, keyOptions: nil, waitForSync: nil, doCompact: nil, isVolatile: nil, shardKeys: nil, numberOfShards: nil, isSystem: nil, indexBuckets: nil) # TESTED
99
107
  self.create type: 3, journalSize: journalSize, keyOptions: keyOptions, waitForSync: waitForSync, doCompact: doCompact, isVolatile: isVolatile, shardKeys: shardKeys, numberOfShards: numberOfShards, isSystem: isSystem, indexBuckets: indexBuckets
100
108
  end
101
109
 
102
- def create_document(document: {}, waitForSync: nil, returnNew: nil)
103
- if document.is_a? Hash
104
- body = document
105
- elsif document.is_a? ArangoDoc
106
- body = document.body
107
- elsif document.is_a? Array
108
- body = document.map{|x| x.is_a?(Hash) ? x : x.is_a?(ArangoDoc) ? x.body : nil}
109
- else
110
- raise "document should be Hash, an ArangoDoc instance or an Array of Hashes or ArangoDoc instances"
111
- end
112
- ArangoDoc.create(body: body, waitForSync: waitForSync, returnNew: returnNew, database: @database, collection: @collection)
110
+ def create_document(document: {}, waitForSync: nil, returnNew: nil) # TESTED
111
+ # if document.is_a? Hash
112
+ # body = document
113
+ # elsif document.is_a? ArangoDocument
114
+ # body = document.body
115
+ # elsif document.is_a? Array
116
+ # body = document.map{|x| x.is_a?(Hash) ? x : x.is_a?(ArangoDocument) ? x.body : nil}
117
+ # else
118
+ # raise "document should be Hash, an ArangoDocument instance or an Array of Hashes or ArangoDocument instances"
119
+ # end
120
+ ArangoDocument.create(body: document, waitForSync: waitForSync, returnNew: returnNew, database: @database, collection: @collection)
113
121
  end
114
122
  alias create_vertex create_document
115
123
 
116
- def create_edge(document: {}, from:, to:, waitForSync: nil, returnNew: nil)
117
- if document.is_a? Hash
118
- body = document
119
- elsif document.is_a? ArangoDoc
120
- body = document.body
121
- elsif document.is_a? Array
122
- body = document.map{|x| x.is_a?(Hash) ? x : x.is_a?(ArangoDoc) ? x.body : nil}
123
- else
124
- raise "document should be Hash, an ArangoDoc instance or an Array of Hashes or ArangoDoc instances"
125
- end
126
- ArangoDoc.create_edge(body: body, from: from, to: to, waitForSync: waitForSync, returnNew: returnNew, database: @database, collection: @collection)
124
+ def create_edge(document: {}, from:, to:, waitForSync: nil, returnNew: nil) # TESTED
125
+ # if document.is_a? Hash
126
+ # body = document
127
+ # elsif document.is_a? ArangoDocument
128
+ # body = document.body
129
+ # elsif document.is_a? Array
130
+ # body = document.map{|x| x.is_a?(Hash) ? x : x.is_a?(ArangoDocument) ? x.body : nil}
131
+ # else
132
+ # raise "document should be Hash, an ArangoDocument instance or an Array of Hashes or ArangoDocument instances"
133
+ # end
134
+ ArangoDocument.create_edge(body: document, from: from, to: to, waitForSync: waitForSync, returnNew: returnNew, database: @database, collection: @collection)
127
135
  end
128
136
 
129
137
  # === DELETE ===
130
138
 
131
- def destroy
132
- result = self.class.delete("/_db/#{@database}/_api/collection/#{@collection}").parsed_response
133
- @@verbose ? result : result["error"] ? result["errorMessage"] : true
139
+ def destroy # TESTED
140
+ result = self.class.delete("/_db/#{@database}/_api/collection/#{@collection}", @@request)
141
+ self.return_result result: result, caseTrue: true
134
142
  end
135
143
 
136
- def truncate
137
- result = self.class.put("/_db/#{@database}/_api/collection/#{@collection}/truncate").parsed_response
138
- self.return_result(result)
144
+ def truncate # TESTED
145
+ result = self.class.put("/_db/#{@database}/_api/collection/#{@collection}/truncate", @@request)
146
+ self.return_result result: result
139
147
  end
140
148
 
141
149
  # === MODIFY ===
142
150
 
143
- def load
144
- result = self.class.put("/_db/#{@database}/_api/collection/#{@collection}/load").parsed_response
145
- self.return_result(result)
151
+ def load # TESTED
152
+ result = self.class.put("/_db/#{@database}/_api/collection/#{@collection}/load", @@request)
153
+ self.return_result result: result
146
154
  end
147
155
 
148
- def unload
149
- result = self.class.put("/_db/#{@database}/_api/collection/#{@collection}/unload").parsed_response
150
- self.return_result(result)
156
+ def unload # TESTED
157
+ result = self.class.put("/_db/#{@database}/_api/collection/#{@collection}/unload", @@request)
158
+ self.return_result result: result
151
159
  end
152
160
 
153
- def change(waitForSync: nil, journalSize: nil)
161
+ def change(waitForSync: nil, journalSize: nil) # TESTED
154
162
  body = {
155
163
  "journalSize" => journalSize,
156
164
  "waitForSync" => waitForSync
157
165
  }
158
166
  body = body.delete_if{|k,v| k.nil?}.to_json
159
- new_Collection = { :body => body }
160
- result = self.class.put("/_db/#{@database}/_api/collection/#{@collection}/properties", new_Collection).parsed_response
161
- self.return_result(result)
167
+ request = @@request.merge({ :body => body })
168
+ result = self.class.put("/_db/#{@database}/_api/collection/#{@collection}/properties", request)
169
+ self.return_result result: result
162
170
  end
163
171
 
164
- def rename(newName)
172
+ def rename(newName) # TESTED
165
173
  body = { "name" => newName }
166
- new_Collection = { :body => body.to_json }
167
- result = self.class.put("/_db/#{@database}/_api/collection/#{@collection}/rename", new_Collection).parsed_response
168
- @collection = newName unless result["error"]
169
- self.return_result(result)
174
+ request = @@request.merge({ :body => body.to_json })
175
+ result = self.class.put("/_db/#{@database}/_api/collection/#{@collection}/rename", request)
176
+ @collection = newName unless result.parsed_response["error"]
177
+ self.return_result result: result
178
+ end
179
+
180
+ def rotate
181
+ result = self.class.put("/_db/#{@database}/_api/collection/#{@collection}/rotate", @@request)
182
+ self.return_result result: result, caseTrue: true
170
183
  end
171
184
 
172
185
  # === SIMPLE FUNCTIONS ===
173
186
 
174
- def documents(type: nil) # "path", "id", "key"
187
+ def documents(type: nil) # "path", "id", "key" # TESTED
175
188
  body = {
176
189
  "collection" => @collection,
177
190
  "type" => type
178
191
  }.delete_if{|k,v| v.nil?}.to_json
179
- collection_to_look = { :body => body }
180
- result = self.class.put("/_db/#{@database}/_api/simple/all-keys", collection_to_look).parsed_response
181
- if type.nil?
182
- if @@verbose
183
- result
184
- else
185
- if result["error"]
186
- result["errorMessage"]
192
+ request = @@request.merge({ :body => body })
193
+ result = self.class.put("/_db/#{@database}/_api/simple/all-keys", request)
194
+ if @@async == "store"
195
+ result.headers["x-arango-async-id"]
196
+ else
197
+ result = result.parsed_response
198
+ if type.nil?
199
+ if @@verbose
200
+ result
187
201
  else
188
- result["result"].map{|x| value = self.class.get(x).parsed_response; ArangoDoc.new(key: value["_key"], collection: @collection, body: value)}
202
+ if result["error"]
203
+ result["errorMessage"]
204
+ else
205
+ result["result"].map{|x| value = self.class.get(x).parsed_response; ArangoDocument.new(key: value["_key"], collection: @collection, body: value)}
206
+ end
189
207
  end
208
+ else
209
+ @@verbose ? result : result["error"] ? result["errorMessage"] : result["result"]
190
210
  end
191
- else
192
- @@verbose ? result : result["error"] ? result["errorMessage"] : result["result"]
193
211
  end
194
212
  end
195
213
 
196
- def allDocuments(skip: nil, limit: nil, batchSize: nil)
214
+ def allDocuments(skip: nil, limit: nil, batchSize: nil) # TESTED
197
215
  body = {
198
216
  "collection" => @collection,
199
217
  "skip" => skip,
200
218
  "limit" => limit,
201
219
  "batchSize" => batchSize
202
220
  }.delete_if{|k,v| v.nil?}.to_json
203
- collection_to_look = { :body => body }
204
- result = self.class.put("/_db/#{@database}/_api/simple/all", collection_to_look).parsed_response
205
- if @@verbose
206
- result
221
+ request = @@request.merge({ :body => body })
222
+ result = self.class.put("/_db/#{@database}/_api/simple/all", request)
223
+ if @@async == "store"
224
+ result.headers["x-arango-async-id"]
207
225
  else
208
- if result["error"]
209
- result["errorMessage"]
226
+ result = result.parsed_response
227
+ if @@verbose
228
+ result
210
229
  else
211
- result["result"].map{|x| ArangoDoc.new(key: x["_key"], collection: @collection, body: x)}
230
+ if result["error"]
231
+ result["errorMessage"]
232
+ else
233
+ result["result"].map{|x| ArangoDocument.new(key: x["_key"], collection: @collection, body: x)}
234
+ end
212
235
  end
213
236
  end
214
237
  end
215
238
 
216
- def documentsMatch(match:, skip: nil, limit: nil, batchSize: nil)
239
+ def documentsMatch(match:, skip: nil, limit: nil, batchSize: nil) # TESTED
217
240
  body = {
218
241
  "collection" => @collection,
219
242
  "example" => match,
@@ -221,129 +244,423 @@ class ArangoC < ArangoS
221
244
  "limit" => limit,
222
245
  "batchSize" => batchSize
223
246
  }.delete_if{|k,v| v.nil?}.to_json
224
- collection_to_look = { :body => body }
225
- result = self.class.put("/_db/#{@database}/_api/simple/by-example", collection_to_look).parsed_response
226
- if @@verbose
227
- result
247
+ request = @@request.merge({ :body => body })
248
+ result = self.class.put("/_db/#{@database}/_api/simple/by-example", request)
249
+ if @@async == "store"
250
+ result.headers["x-arango-async-id"]
228
251
  else
229
- if result["error"]
230
- result["errorMessage"]
252
+ result = result.parsed_response
253
+ if @@verbose
254
+ result
231
255
  else
232
- result["result"].map{|x| ArangoDoc.new(key: x["_key"], collection: @collection, body: x)}
256
+ if result["error"]
257
+ result["errorMessage"]
258
+ else
259
+ result["result"].map{|x| ArangoDocument.new(key: x["_key"], collection: @collection, body: x)}
260
+ end
233
261
  end
234
262
  end
235
263
  end
236
264
 
237
- def documentMatch(match:)
265
+ def documentMatch(match:) # TESTED
238
266
  body = {
239
267
  "collection" => @collection,
240
268
  "example" => match
241
269
  }.delete_if{|k,v| v.nil?}.to_json
242
- collection_to_look = { :body => body }
243
- result = self.class.put("/_db/#{@database}/_api/simple/first-example", collection_to_look).parsed_response
244
- if @@verbose
245
- result
270
+ request = @@request.merge({ :body => body })
271
+ result = self.class.put("/_db/#{@database}/_api/simple/first-example", request)
272
+ if @@async == "store"
273
+ result.headers["x-arango-async-id"]
246
274
  else
247
- if result["error"]
248
- result["errorMessage"]
275
+ result = result.parsed_response
276
+ if @@verbose
277
+ result
249
278
  else
250
- ArangoDoc.new(key: result["document"]["_key"], collection: @collection, body: result["document"])
279
+ if result["error"]
280
+ result["errorMessage"]
281
+ else
282
+ ArangoDocument.new(key: result["document"]["_key"], collection: @collection, body: result["document"])
283
+ end
251
284
  end
252
285
  end
253
286
  end
254
287
 
255
- def documentByKeys(keys:)
256
- keys = keys.map{|x| x.is_a?(String) ? x : x.is_a?(ArangoDoc) ? x.key : nil} if keys.is_a? Array
288
+ def documentByKeys(keys:) # TESTED
289
+ keys = keys.map{|x| x.is_a?(String) ? x : x.is_a?(ArangoDocument) ? x.key : nil} if keys.is_a? Array
257
290
  keys = [keys] if keys.is_a? String
258
291
  body = { "collection" => @collection, "keys" => keys }
259
- collection_to_look = { :body => body.to_json }
260
- result = self.class.put("/_db/#{@database}/_api/simple/lookup-by-keys", collection_to_look).parsed_response
261
- if @@verbose
262
- result
292
+ request = @@request.merge({ :body => body.to_json })
293
+ result = self.class.put("/_db/#{@database}/_api/simple/lookup-by-keys", request)
294
+ if @@async == "store"
295
+ result.headers["x-arango-async-id"]
263
296
  else
264
- if result["error"]
265
- result["errorMessage"]
297
+ result = result.parsed_response
298
+ if @@verbose
299
+ result
266
300
  else
267
- result["documents"].map{|x| ArangoDoc.new(key: x["_key"], collection: @collection, body: x)}
301
+ if result["error"]
302
+ result["errorMessage"]
303
+ else
304
+ result["documents"].map{|x| ArangoDocument.new(key: x["_key"], collection: @collection, body: x)}
305
+ end
268
306
  end
269
307
  end
270
308
  end
271
309
 
272
- def random
273
- body = { "collection" => @collection }
274
- collection_to_look = { :body => body.to_json }
275
- result = self.class.put("/_db/#{@database}/_api/simple/any", collection_to_look)
276
- if @@verbose
277
- result
310
+ def random # TESTED
311
+ body = { "collection" => @collection }.to_json
312
+ request = @@request.merge({ :body => body })
313
+ result = self.class.put("/_db/#{@database}/_api/simple/any", request)
314
+ if @@async == "store"
315
+ result.headers["x-arango-async-id"]
278
316
  else
279
- if result["error"]
280
- result["errorMessage"]
317
+ result = result.parsed_response
318
+ if @@verbose
319
+ result
281
320
  else
282
- ArangoDoc.new(key: result["document"]["_key"], collection: @collection, body: result["document"])
321
+ if result["error"]
322
+ result["errorMessage"]
323
+ else
324
+ ArangoDocument.new(key: result["document"]["_key"], collection: @collection, body: result["document"])
325
+ end
283
326
  end
284
327
  end
285
328
  end
286
329
 
287
- def removeByKeys(keys:, options: nil)
288
- keys = keys.map{|x| x.is_a?(String) ? x : x.is_a?(ArangoDoc) ? x.key : nil}
289
- body = { "collection" => @collection, "keys" => keys, "options" => options }.delete_if{|k,v| v.nil?}
290
- collection_to_look = { :body => body.to_json }
291
- self.class.put("/_db/#{@database}/_api/simple/remove-by-keys", collection_to_look).parsed_response
330
+ def removeByKeys(keys:, options: nil) # TESTED
331
+ keys = keys.map{|x| x.is_a?(String) ? x : x.is_a?(ArangoDocument) ? x.key : nil}
332
+ body = { "collection" => @collection, "keys" => keys, "options" => options }.delete_if{|k,v| v.nil?}.to_json
333
+ request = @@request.merge({ :body => body })
334
+ result = self.class.put("/_db/#{@database}/_api/simple/remove-by-keys", request)
335
+ self.return_result result: result, key: "removed"
292
336
  end
293
337
 
294
- def removeMatch(match:, options: nil)
338
+ def removeMatch(match:, options: nil) # TESTED
295
339
  body = {
296
340
  "collection" => @collection,
297
341
  "example" => match,
298
- "options" => option
342
+ "options" => options
299
343
  }.delete_if{|k,v| v.nil?}.to_json
300
- collection_to_look = { :body => body }
301
- self.class.put("/_db/#{@database}/_api/simple/remove-by-example", collection_to_look).parsed_response
344
+ request = @@request.merge({ :body => body })
345
+ result = self.class.put("/_db/#{@database}/_api/simple/remove-by-example", request)
346
+ self.return_result result: result, key: "deleted"
302
347
  end
303
348
 
304
- def replaceMatch(match:, newValue:, options: nil)
349
+ def replaceMatch(match:, newValue:, options: nil) # TESTED
305
350
  body = {
306
351
  "collection" => @collection,
307
352
  "example" => match,
308
- "options" => option,
353
+ "options" => options,
309
354
  "newValue" => newValue
310
355
  }.delete_if{|k,v| v.nil?}.to_json
311
- collection_to_look = { :body => body }
312
- self.class.put("/_db/#{@database}/_api/simple/replace-by-example", collection_to_look).parsed_response
356
+ request = @@request.merge({ :body => body })
357
+ result = self.class.put("/_db/#{@database}/_api/simple/replace-by-example", request)
358
+ self.return_result result: result, key: "replaced"
313
359
  end
314
360
 
315
- def updateMatch(match:, newValue:, options: nil)
361
+ def updateMatch(match:, newValue:, options: nil) # TESTED
316
362
  body = {
317
363
  "collection" => @collection,
318
364
  "example" => match,
319
- "options" => option,
365
+ "options" => options,
320
366
  "newValue" => newValue
321
367
  }.delete_if{|k,v| v.nil?}.to_json
322
- collection_to_look = { :body => body }
323
- self.class.put("/_db/#{@database}/_api/simple/update-by-example", collection_to_look).parsed_response
368
+ request = @@request.merge({ :body => body })
369
+ result = self.class.put("/_db/#{@database}/_api/simple/update-by-example", request)
370
+ self.return_result result: result, key: "updated"
324
371
  end
325
372
 
326
- # === UTILITY ===
373
+ # === IMPORT ===
374
+
375
+ def import(attributes:, values:, from: nil, to: nil, overwrite: nil, waitForSync: nil, onDuplicate: nil, complete: nil, details: nil) # TESTED
376
+ query = {
377
+ "collection": @collection,
378
+ "fromPrefix": from,
379
+ "toPrefix": to,
380
+ "overwrite": overwrite,
381
+ "waitForSync": waitForSync,
382
+ "onDuplicate": onDuplicate,
383
+ "complete": complete,
384
+ "details": details
385
+ }.delete_if{|k,v| v.nil?}
386
+ body = "#{attributes}\n"
387
+ if values[0].is_a? Array
388
+ values.each{|x| body += "#{x}\n"}
389
+ else
390
+ body += "#{values}\n"
391
+ end
392
+ # print body
393
+ request = @@request.merge({ :body => body, :query => query })
394
+ result = self.class.post("/_db/#{@database}/_api/import", request)
395
+ if @@async == "store"
396
+ result.headers["x-arango-async-id"]
397
+ else
398
+ result = result.parsed_response
399
+ if @@verbose
400
+ result
401
+ else
402
+ if result["error"]
403
+ result["errorMessage"]
404
+ else
405
+ result.delete("error")
406
+ result.delete("code")
407
+ result
408
+ end
409
+ end
410
+ end
411
+ end
327
412
 
328
- def return_result(result, checkType=false)
329
- if @@verbose
330
- resultTemp = result
331
- unless result["errorMessage"]
332
- result.delete("error")
333
- result.delete("code")
334
- @body = result
335
- @type = result["type"] == 2 ? "Document" : "Edge" if(checkType)
413
+ def importJSON(body:, type: "auto", from: nil, to: nil, overwrite: nil, waitForSync: nil, onDuplicate: nil, complete: nil, details: nil) # TESTED
414
+ query = {
415
+ "collection": @collection,
416
+ "type": type,
417
+ "fromPrefix": from,
418
+ "toPrefix": to,
419
+ "overwrite": overwrite,
420
+ "waitForSync": waitForSync,
421
+ "onDuplicate": onDuplicate,
422
+ "complete": complete,
423
+ "details": details
424
+ }.delete_if{|k,v| v.nil?}
425
+ request = @@request.merge({ :body => body.to_json, :query => query })
426
+ result = self.class.post("/_db/#{@database}/_api/import", request)
427
+ if @@async == "store"
428
+ result.headers["x-arango-async-id"]
429
+ else
430
+ result = result.parsed_response
431
+ if @@verbose
432
+ result
433
+ else
434
+ if result["error"]
435
+ result["errorMessage"]
436
+ else
437
+ result.delete("error")
438
+ result.delete("code")
439
+ result
440
+ end
336
441
  end
337
- resultTemp
442
+ end
443
+ end
444
+
445
+ # === EXPORT ===
446
+
447
+ def export(count: nil, restrict: nil, batchSize: nil, flush: nil, limit: nil, ttl: nil) # TESTED
448
+ query = { "collection": @collection }
449
+ body = {
450
+ "count" => count,
451
+ "restrict" => restrict,
452
+ "batchSize" => batchSize,
453
+ "flush" => flush,
454
+ "limit" => limit,
455
+ "ttl" => ttl
456
+ }.delete_if{|k,v| v.nil?}
457
+ request = @@request.merge({ :body => body.to_json, :query => query })
458
+ result = self.class.post("/_db/#{@database}/_api/export", request)
459
+ if @@async == "store"
460
+ result.headers["x-arango-async-id"]
338
461
  else
462
+ result = result.parsed_response
339
463
  if result["error"]
340
- result["errorMessage"]
464
+ return @@verbose ? result : result["errorMessage"]
465
+ else
466
+ @countExport = result["count"]
467
+ @hasMoreExport = result["hasMore"]
468
+ @idExport = result["id"]
469
+ if(result["result"][0].nil? || !result["result"][0].is_a?(Hash) || !result["result"][0].key?("_key"))
470
+ result = result["result"]
471
+ else
472
+ result = result["result"].map{|x| ArangoDocument.new(
473
+ key: x["_key"],
474
+ collection: @collection,
475
+ database: @database,
476
+ body: x
477
+ )}
478
+ end
479
+ result
480
+ end
481
+ end
482
+ end
483
+
484
+ def exportNext # TESTED
485
+ unless @hasMoreExport
486
+ print "No other results"
487
+ else
488
+ query = { "collection": @collection }
489
+ request = @@request.merge({ :query => query })
490
+ result = self.class.put("/_db/#{@database}/_api/cursor/#{@idExport}", request)
491
+ if @@async == "store"
492
+ result.headers["x-arango-async-id"]
493
+ else
494
+ result = result.parsed_response
495
+ if result["error"]
496
+ return @@verbose ? result : result["errorMessage"]
497
+ else
498
+ @countExport = result["count"]
499
+ @hasMoreExport = result["hasMore"]
500
+ @idExport = result["id"]
501
+ if(result["result"][0].nil? || !result["result"][0].is_a?(Hash) || !result["result"][0].key?("_key"))
502
+ result = result["result"]
503
+ else
504
+ result = result["result"].map{|x| ArangoDocument.new(
505
+ key: x["_key"],
506
+ collection: @collection,
507
+ database: @database,
508
+ body: x
509
+ )}
510
+ end
511
+ result
512
+ end
513
+ end
514
+ end
515
+ end
516
+
517
+ # === INDEXES ===
518
+
519
+ # def retrieveIndex(id:) # TESTED
520
+ # result = self.class.get("/_db/#{@database}/_api/index/#{@collection}/#{id}", @@request)
521
+ # if @@async == "store"
522
+ # result.headers["x-arango-async-id"]
523
+ # else
524
+ # result = result.parsed_response
525
+ # if @@verbose
526
+ # result
527
+ # else
528
+ # if result["error"]
529
+ # result["errorMessage"]
530
+ # else
531
+ # ArangoIndex.new(body: result, id: result["id"], database: @database, collection: @collection, type: result["type"], unique: result["unique"], fields: result["fields"])
532
+ # end
533
+ # end
534
+ # end
535
+ # end
536
+
537
+ def indexes # TESTED
538
+ query = { "collection": @collection }
539
+ request = @@request.merge({ :query => query })
540
+ result = self.class.get("/_db/#{@database}/_api/index", request)
541
+ if @@async == "store"
542
+ result.headers["x-arango-async-id"]
543
+ else
544
+ result = result.parsed_response
545
+ if @@verbose
546
+ result
547
+ else
548
+ if result["error"]
549
+ result["errorMessage"]
550
+ else
551
+ result.delete("error")
552
+ result.delete("code")
553
+ result["indexes"] = result["indexes"].map{|x| ArangoIndex.new(body: x, id: x["id"], database: @database, collection: @collection, type: x["type"], unique: x["unique"], fields: x["fields"])}
554
+ result
555
+ end
556
+ end
557
+ end
558
+ end
559
+
560
+ def createIndex(body: {}, unique: nil, type:, fields:, id: nil) # TESTED
561
+ body["fields"] = fields.is_a?(Array) ? fields : [fields]
562
+ body["unique"] = unique unless unique.nil?
563
+ body["type"] = type unless type.nil?
564
+ body["id"] = id unless type.nil?
565
+ query = { "collection": @collection }
566
+ request = @@request.merge({ :body => body.to_json, :query => query })
567
+ result = self.class.post("/_db/#{@database}/_api/index", request)
568
+ if @@async == "store"
569
+ result.headers["x-arango-async-id"]
570
+ else
571
+ result = result.parsed_response
572
+ if @@verbose
573
+ result
574
+ else
575
+ if result["error"]
576
+ result["errorMessage"]
577
+ else
578
+ ArangoIndex.new(body: result, id: result["id"], database: @database, collection: @collection, type: result["type"], unique: result["unique"], fields: result["fields"])
579
+ end
580
+ end
581
+ end
582
+ end
583
+ #
584
+ # def deleteIndex(id:) # TESTED
585
+ # result = self.class.delete("/_db/#{@database}/_api/index/#{@collection}/#{id}", @@request)
586
+ # if @@async == "store"
587
+ # result.headers["x-arango-async-id"]
588
+ # else
589
+ # result = result.parsed_response
590
+ # if @@verbose
591
+ # result
592
+ # else
593
+ # if result["error"]
594
+ # result["errorMessage"]
595
+ # else
596
+ # true
597
+ # end
598
+ # end
599
+ # end
600
+ # end
601
+
602
+ # === REPLICATION ===
603
+
604
+ def data(from: nil, to: nil, chunkSize: nil, includeSystem: false, failOnUnknown: nil, ticks: nil, flush: nil) # TESTED
605
+ query = {
606
+ "collection": @collection,
607
+ "from": from,
608
+ "to": to,
609
+ "chunkSize": chunkSize,
610
+ "includeSystem": includeSystem,
611
+ "failOnUnknown": failOnUnknown,
612
+ "ticks": ticks,
613
+ "flush": flush
614
+ }.delete_if{|k,v| v.nil?}
615
+ request = @@request.merge({ :query => query })
616
+ result = self.class.get("/_db/#{@database}/_api/replication/dump", request)
617
+ if @@async == "store"
618
+ result.headers["x-arango-async-id"]
619
+ else
620
+ result = result.parsed_response
621
+ if @@verbose
622
+ result
341
623
  else
342
- result.delete("error")
343
- result.delete("code")
344
- @body = result
345
- @type = result["type"] == 2 ? "Document" : "Edge" if(checkType)
346
- self
624
+ if result["error"]
625
+ result["errorMessage"]
626
+ else
627
+ result
628
+ end
629
+ end
630
+ end
631
+ end
632
+
633
+ # === UTILITY ===
634
+
635
+ def return_result(result:, caseTrue: false, key: nil, checkType: false)
636
+ if @@async == "store"
637
+ result.headers["x-arango-async-id"]
638
+ else
639
+ result = result.parsed_response
640
+ if @@verbose || !result.is_a?(Hash)
641
+ resultTemp = result
642
+ unless result["errorMessage"]
643
+ result.delete("error")
644
+ result.delete("code")
645
+ @body = result
646
+ @type = result["type"] == 2 ? "Document" : "Edge" if(checkType)
647
+ end
648
+ resultTemp
649
+ else
650
+ if result["error"]
651
+ result["errorMessage"]
652
+ else
653
+ return true if caseTrue
654
+ result.delete("error")
655
+ result.delete("code")
656
+ @body = result
657
+ @type = result["type"] == 2 ? "Document" : "Edge" if(checkType)
658
+ if key.nil?
659
+ self
660
+ else
661
+ result[key]
662
+ end
663
+ end
347
664
  end
348
665
  end
349
666
  end