arangorb 1.4.1 → 2.0.0

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 (71) hide show
  1. checksums.yaml +4 -4
  2. data/ArangoRB.gemspec +20 -18
  3. data/Gemfile +3 -0
  4. data/README.md +1079 -908
  5. data/lib/AQL.rb +155 -0
  6. data/lib/Batch.rb +97 -0
  7. data/lib/Cache.rb +71 -0
  8. data/lib/Collection.rb +852 -0
  9. data/lib/Database.rb +417 -0
  10. data/lib/Document.rb +346 -0
  11. data/lib/Edge.rb +104 -0
  12. data/lib/Error.rb +125 -0
  13. data/lib/Foxx.rb +277 -0
  14. data/lib/Graph.rb +325 -0
  15. data/lib/Index.rb +126 -0
  16. data/lib/Replication.rb +235 -0
  17. data/lib/Request.rb +143 -0
  18. data/lib/Server.rb +466 -0
  19. data/lib/Task.rb +120 -0
  20. data/lib/Transaction.rb +115 -0
  21. data/lib/Traversal.rb +224 -0
  22. data/lib/User.rb +197 -0
  23. data/lib/Vertex.rb +127 -0
  24. data/lib/View.rb +151 -0
  25. data/lib/arangorb.rb +23 -15
  26. data/lib/helpers/Error.rb +28 -0
  27. data/lib/helpers/Return.rb +53 -0
  28. metadata +64 -45
  29. data/lib/ArangoRB_AQL.rb +0 -181
  30. data/lib/ArangoRB_Cache.rb +0 -174
  31. data/lib/ArangoRB_Col.rb +0 -526
  32. data/lib/ArangoRB_DB.rb +0 -363
  33. data/lib/ArangoRB_Doc.rb +0 -319
  34. data/lib/ArangoRB_Edg.rb +0 -184
  35. data/lib/ArangoRB_Gra.rb +0 -201
  36. data/lib/ArangoRB_Index.rb +0 -135
  37. data/lib/ArangoRB_Replication.rb +0 -261
  38. data/lib/ArangoRB_Ser.rb +0 -446
  39. data/lib/ArangoRB_Task.rb +0 -129
  40. data/lib/ArangoRB_Tra.rb +0 -169
  41. data/lib/ArangoRB_Tran.rb +0 -68
  42. data/lib/ArangoRB_User.rb +0 -157
  43. data/lib/ArangoRB_Ver.rb +0 -162
  44. data/spec/arangoRB_helper.rb +0 -4
  45. data/spec/arangoRestart_helper.rb +0 -14
  46. data/spec/arangorb-1.3.0.gem +0 -0
  47. data/spec/lib/0.1.0/arangoAQL_helper.rb +0 -64
  48. data/spec/lib/0.1.0/arangoC_helper.rb +0 -170
  49. data/spec/lib/0.1.0/arangoDB_helper.rb +0 -119
  50. data/spec/lib/0.1.0/arangoDoc_helper.rb +0 -79
  51. data/spec/lib/0.1.0/arangoE_helper.rb +0 -50
  52. data/spec/lib/0.1.0/arangoG_helper.rb +0 -78
  53. data/spec/lib/0.1.0/arangoS_helper.rb +0 -37
  54. data/spec/lib/0.1.0/arangoT_helper.rb +0 -48
  55. data/spec/lib/0.1.0/arangoV_helper.rb +0 -65
  56. data/spec/lib/1.0.0/arangoC_helper.rb +0 -73
  57. data/spec/lib/1.0.0/arangoDB_helper.rb +0 -48
  58. data/spec/lib/1.0.0/arangoI_helper.rb +0 -43
  59. data/spec/lib/1.0.0/arangoS_helper.rb +0 -192
  60. data/spec/lib/1.0.0/arangoTa_helper.rb +0 -49
  61. data/spec/lib/1.0.0/arangoTr_helper.rb +0 -15
  62. data/spec/lib/1.0.0/arangoU_helper.rb +0 -72
  63. data/spec/lib/1.1.0/arangoRB_helper.rb +0 -144
  64. data/spec/lib/1.1.0/arangoRB_walks_helper.rb +0 -19
  65. data/spec/lib/1.2.0/arangoCache_helper.rb +0 -66
  66. data/spec/lib/1.3.0/arangoHash_helper.rb +0 -30
  67. data/spec/lib/arangoRB_0.1.0_helper.rb +0 -9
  68. data/spec/lib/arangoRB_1.0.0_helper.rb +0 -6
  69. data/spec/lib/arangoRB_1.1.0_helper.rb +0 -2
  70. data/spec/lib/arangoRB_1.2.0_helper.rb +0 -2
  71. data/spec/spec_helper.rb +0 -42
data/lib/Database.rb ADDED
@@ -0,0 +1,417 @@
1
+ # === DATABASE ===
2
+
3
+ module Arango
4
+ class Database
5
+ include Arango::Helper_Error
6
+ include Arango::Helper_Return
7
+ include Arango::Server_Return
8
+
9
+ def self.new(*args)
10
+ hash = args[0]
11
+ super unless hash.is_a?(Hash)
12
+ server = hash[:server]
13
+ if server.is_a?(Arango::Server) && server.active_cache
14
+ cache_name = hash[:name]
15
+ cached = server.cache.cache.dig(:database, cache_name)
16
+ if cached.nil?
17
+ hash[:cache_name] = cache_name
18
+ return super
19
+ else
20
+ return cached
21
+ end
22
+ end
23
+ super
24
+ end
25
+
26
+ def initialize(name:, server:, cache_name: nil)
27
+ assign_server(server)
28
+ unless cache_name.nil?
29
+ @cache_name = cache_name
30
+ @server.cache.save(:database, cache_name, self)
31
+ end
32
+ @name = name
33
+ @server = server
34
+ @isSystem = nil
35
+ @path = nil
36
+ @id = nil
37
+ end
38
+
39
+ # === DEFINE ===
40
+
41
+ attr_reader :isSystem, :path, :id, :server, :cache_name
42
+ attr_accessor :name
43
+
44
+ # === TO HASH ===
45
+
46
+ def to_h
47
+ {
48
+ "name": @name,
49
+ "isSystem": @isSystem,
50
+ "path": @path,
51
+ "id": @id,
52
+ "cache_name": @cache_name,
53
+ "server": @server.base_uri
54
+ }.delete_if{|k,v| v.nil?}
55
+ end
56
+
57
+ # === REQUEST ===
58
+
59
+ def request(action, url, body: {}, headers: {},
60
+ query: {}, key: nil, return_direct_result: false,
61
+ skip_to_json: false, keepNull: false)
62
+ url = "_db/#{@name}/#{url}"
63
+ @server.request(action, url, body: body,
64
+ headers: headers, query: query, key: key,
65
+ return_direct_result: return_direct_result,
66
+ skip_to_json: skip_to_json, keepNull: keepNull)
67
+ end
68
+
69
+ # === GET ===
70
+
71
+ def assign_attributes(result)
72
+ return unless result.is_a?(Hash)
73
+ @name = result[:name]
74
+ @isSystem = result[:isSystem]
75
+ @path = result[:path]
76
+ @id = result[:id]
77
+ if @server.active_cache && @cache_name.nil?
78
+ @cache_name = result[:name]
79
+ @server.cache.save(:database, @cache_name, self)
80
+ end
81
+ end
82
+
83
+ def retrieve
84
+ result = request("GET", "_api/database/current", key: :result)
85
+ assign_attributes(result)
86
+ return return_directly?(result) ? result : self
87
+ end
88
+ alias current retrieve
89
+
90
+ # === POST ===
91
+
92
+ def create(name: @name, users: nil)
93
+ body = {
94
+ "name": name,
95
+ "users": users
96
+ }
97
+ result = @server.request("POST", "_api/database", body: body, key: :result)
98
+ return return_directly?(result) ? result : self
99
+ end
100
+
101
+ # == DELETE ==
102
+
103
+ def destroy
104
+ @server.request("DELETE", "_api/database/#{@name}", key: :result)
105
+ end
106
+
107
+ # == COLLECTION ==
108
+
109
+ def [](name)
110
+ Arango::Collection.new(name: name, database: self)
111
+ end
112
+
113
+ def collection(name:, body: {}, type: :document)
114
+ Arango::Collection.new(name: name, database: self, body: body, type: type)
115
+ end
116
+
117
+ def collections(excludeSystem: true)
118
+ query = { "excludeSystem": excludeSystem }
119
+ result = request("GET", "_api/collection", query: query)
120
+ return result if return_directly?(result)
121
+ result[:result].map do |x|
122
+ Arango::Collection.new(database: self, name: x[:name], body: x )
123
+ end
124
+ end
125
+
126
+ # == GRAPH ==
127
+
128
+ def graphs
129
+ result = request("GET", "_api/gharial")
130
+ return result if return_directly?(result)
131
+ result[:graphs].map do |graph|
132
+ Arango::Graph.new(database: self, name: graph[:_key], body: graph)
133
+ end
134
+ end
135
+
136
+ def graph(name:, edgeDefinitions: [], orphanCollections: [],
137
+ body: {})
138
+ Arango::Graph.new(name: name, database: self,
139
+ edgeDefinitions: edgeDefinitions,
140
+ orphanCollections: orphanCollections, body: body)
141
+ end
142
+
143
+ # == QUERY ==
144
+
145
+ def queryProperties
146
+ request("GET", "_api/query/properties")
147
+ end
148
+
149
+ def changeQueryProperties(slowQueryThreshold: nil, enabled: nil, maxSlowQueries: nil,
150
+ trackSlowQueries: nil, maxQueryStringLength: nil, trackBindVars: nil)
151
+ body = {
152
+ "slowQueryThreshold": slowQueryThreshold,
153
+ "enabled": enabled,
154
+ "maxSlowQueries": maxSlowQueries,
155
+ "trackSlowQueries": trackSlowQueries,
156
+ "maxQueryStringLength": maxQueryStringLength,
157
+ "trackBindVars": trackBindVars
158
+ }
159
+ request("PUT", "_api/query/properties", body: body)
160
+ end
161
+
162
+ def currentQuery
163
+ request("GET", "_api/query/current")
164
+ end
165
+
166
+ def slowQueries
167
+ request("GET", "_api/query/slow")
168
+ end
169
+
170
+ def stopSlowQueries
171
+ result = request("DELETE", "_api/query/slow")
172
+ return return_delete(result)
173
+ end
174
+
175
+ # === QUERY CACHE ===
176
+
177
+ def clearQueryCache
178
+ result = request("DELETE", "_api/query-cache")
179
+ return return_delete(result)
180
+ end
181
+
182
+ def retrieveQueryCache
183
+ request("GET", "_api/query-cache/entries")
184
+ end
185
+
186
+ def propertyQueryCache
187
+ request("GET", "_api/query-cache/properties")
188
+ end
189
+
190
+ def changePropertyQueryCache(mode:, maxResults: nil)
191
+ satisfy_category?(mode, ["off", "on", "demand"])
192
+ body = { "mode": mode, "maxResults": maxResults }
193
+ database.request("PUT", "_api/query-cache/properties", body: body)
194
+ end
195
+
196
+ # === AQL ===
197
+
198
+ def aql(query:, count: nil, batchSize: nil, cache: nil, memoryLimit: nil,
199
+ ttl: nil, bindVars: nil, failOnWarning: nil, profile: nil,
200
+ maxTransactionSize: nil, skipInaccessibleCollections: nil,
201
+ maxWarningCount: nil, intermediateCommitCount: nil,
202
+ satelliteSyncWait: nil, fullCount: nil, intermediateCommitSize: nil,
203
+ optimizer_rules: nil, maxPlans: nil)
204
+ Arango::AQL.new(query: query, database: self, count: count,
205
+ batchSize: batchSize, cache: cache, memoryLimit: memoryLimit, ttl: ttl,
206
+ bindVars: bindVars, failOnWarning: failOnWarning, profile: profile,
207
+ maxTransactionSize: maxTransactionSize,
208
+ skipInaccessibleCollections: skipInaccessibleCollections,
209
+ maxWarningCount: maxWarningCount,
210
+ intermediateCommitCount: intermediateCommitCount,
211
+ satelliteSyncWait: satelliteSyncWait, fullCount: fullCount,
212
+ intermediateCommitSize: intermediateCommitSize,
213
+ optimizer_rules: optimizer_rules, maxPlans: maxPlans)
214
+ end
215
+
216
+ # === AQL FUNCTION ===
217
+
218
+ def aqlFunctions(namespace: nil)
219
+ request("GET", "_api/aqlfunction", query: {"namespace": namespace}, key: :result)
220
+ end
221
+
222
+ def createAqlFunction(code:, name:, isDeterministic: nil)
223
+ body = { "code": code, "name": name, "isDeterministic": isDeterministic }
224
+ request("POST", "_api/aqlfunction", body: body)
225
+ end
226
+
227
+ def deleteAqlFunction(name:)
228
+ result = request("DELETE", "_api/aqlfunction/#{name}")
229
+ return return_delete(result)
230
+ end
231
+
232
+ # === REPLICATION ===
233
+
234
+ def inventory(includeSystem: nil, global: nil, batchId:)
235
+ query = {
236
+ "includeSystem": includeSystem,
237
+ "global": global,
238
+ "batchId": batchId
239
+ }
240
+ request("GET", "_api/replication/inventory", query: query)
241
+ end
242
+
243
+ def clusterInventory(includeSystem: nil)
244
+ query = { "includeSystem": includeSystem }
245
+ request("GET", "_api/replication/clusterInventory", query: query)
246
+ end
247
+
248
+ def logger
249
+ request("GET", "_api/replication/logger-state")
250
+ end
251
+
252
+ def loggerFollow(from: nil, to: nil, chunkSize: nil, includeSystem: nil)
253
+ query = {
254
+ "from": from,
255
+ "to": to,
256
+ "chunkSize": chunkSize,
257
+ "includeSystem": includeSystem
258
+ }
259
+ request("GET", "_api/replication/logger-follow", query: query)
260
+ end
261
+
262
+ def loggerFirstTick
263
+ request("GET", "_api/replication/logger-first-tick", key: :firstTick)
264
+ end
265
+
266
+ def loggerRangeTick
267
+ request("GET", "_api/replication/logger-tick-ranges")
268
+ end
269
+
270
+ def serverId
271
+ request("GET", "_api/replication/server-id", key: :serverId)
272
+ end
273
+
274
+ def range
275
+ request("GET", "_api/wal/range")
276
+ end
277
+
278
+ def lastTick
279
+ request("GET", "_api/wal/lastTick")
280
+ end
281
+
282
+ def tail(from: nil, to: nil, global: nil, chunkSize: nil,
283
+ serverID: nil, barrierID: nil)
284
+ query = {
285
+ from: from,
286
+ to: to,
287
+ global: global,
288
+ chunkSize: chunkSize,
289
+ serverID: serverID,
290
+ barrierID: barrierID
291
+ }
292
+ request("GET", "_api/wal/tail", query: query)
293
+ end
294
+
295
+ def replication(master:, includeSystem: true,
296
+ initialSyncMaxWaitTime: nil, incremental: nil,
297
+ restrictCollections: nil, connectTimeout: nil,
298
+ autoResync: nil, idleMinWaitTime: nil, requestTimeout: nil,
299
+ requireFromPresent: nil, idleMaxWaitTime: nil, restrictType: nil,
300
+ maxConnectRetries: nil, adaptivePolling: nil,
301
+ connectionRetryWaitTime: nil, autoResyncRetries: nil, chunkSize: nil,
302
+ verbose: nil)
303
+ Arango::Replication.new(slave: self, master: master, includeSystem: includeSystem,
304
+ initialSyncMaxWaitTime: initialSyncMaxWaitTime, incremental: incremental,
305
+ restrictCollections: restrictCollections, connectTimeout: connectTimeout,
306
+ autoResync: autoResync, idleMinWaitTime: idleMinWaitTime,
307
+ requestTimeout: requestTimeout, requireFromPresent: requireFromPresent, idleMaxWaitTime: idleMaxWaitTime, restrictType: restrictType,
308
+ maxConnectRetries: maxConnectRetries, adaptivePolling: adaptivePolling,
309
+ connectionRetryWaitTime: connectionRetryWaitTime,
310
+ autoResyncRetries: autoResyncRetries, chunkSize: chunkSize,
311
+ verbose: verbose)
312
+ end
313
+
314
+ def replication_as_master(slave:, includeSystem: true,
315
+ initialSyncMaxWaitTime: nil, incremental: nil,
316
+ restrictCollections: nil, connectTimeout: nil,
317
+ autoResync: nil, idleMinWaitTime: nil, requestTimeout: nil,
318
+ requireFromPresent: nil, idleMaxWaitTime: nil, restrictType: nil,
319
+ maxConnectRetries: nil, adaptivePolling: nil,
320
+ connectionRetryWaitTime: nil, autoResyncRetries: nil, chunkSize: nil,
321
+ verbose: nil)
322
+ Arango::Replication.new(master: self, slave: slave, includeSystem: includeSystem,
323
+ initialSyncMaxWaitTime: initialSyncMaxWaitTime, incremental: incremental,
324
+ restrictCollections: restrictCollections, connectTimeout: connectTimeout,
325
+ autoResync: autoResync, idleMinWaitTime: idleMinWaitTime,
326
+ requestTimeout: requestTimeout, requireFromPresent: requireFromPresent, idleMaxWaitTime: idleMaxWaitTime, restrictType: restrictType,
327
+ maxConnectRetries: maxConnectRetries, adaptivePolling: adaptivePolling,
328
+ connectionRetryWaitTime: connectionRetryWaitTime,
329
+ autoResyncRetries: autoResyncRetries, chunkSize: chunkSize,
330
+ verbose: verbose)
331
+ end
332
+
333
+ # === FOXX ===
334
+
335
+ def foxx(body: {}, mount:, development: nil, legacy: nil, provides: nil,
336
+ name: nil, version: nil, type: "application/json", setup: nil,
337
+ teardown: nil)
338
+ Arango::Foxx.new(database: self, body: body, mount: mount,
339
+ development: development, legacy: legacy, provides: provides,
340
+ name: name, version: version, type: type, setup: setup,
341
+ teardown: teardown)
342
+ end
343
+
344
+ def foxxes
345
+ result = request("GET", "_api/foxx")
346
+ return result if return_directly?(result)
347
+ result.map do |fox|
348
+ Arango::Foxx.new(database: self, mount: fox[:mount], body: fox)
349
+ end
350
+ end
351
+
352
+ # === USER ACCESS ===
353
+
354
+ def check_user(user)
355
+ user = Arango::User.new(user: user) if user.is_a?(String)
356
+ return user
357
+ end
358
+ private :check_user
359
+
360
+ def addUserAccess(grant:, user:)
361
+ user = check_user(user)
362
+ user.addDatabaseAccess(grant: grant, database: @name)
363
+ end
364
+
365
+ def revokeUserAccess(user:)
366
+ user = check_user(user)
367
+ user.revokeDatabaseAccess(database: @name)
368
+ end
369
+
370
+ def userAccess(user:)
371
+ user = check_user(user)
372
+ user.databaseAccess(database: @name)
373
+ end
374
+
375
+ # === VIEW ===
376
+
377
+ def views
378
+ result = request("GET", "_api/view", key: :result)
379
+ return result if return_directly?(result)
380
+ result.map do |view|
381
+ Arango::View.new(database: self, id: view[:id], name: view[:name], type: view[:type])
382
+ end
383
+ end
384
+
385
+ def view(name:)
386
+ Arango::View.new(database: self, name: name)
387
+ end
388
+
389
+ # === TASK ===
390
+
391
+ def task(id: nil, name: nil, type: nil, period: nil, command: nil, params: nil, created: nil, body: {})
392
+ Arango::Task.new(id: id, name: name, type: type, period: period, command: command,
393
+ params: params, created: created, body: body, database: self)
394
+ end
395
+
396
+ def tasks
397
+ result = request("GET", "_api/tasks")
398
+ return result if return_directly?(result)
399
+ result.delete_if{|k| k[:database] != @name}
400
+ result.map do |task|
401
+ Arango::Task.new(body: task, database: self)
402
+ end
403
+ end
404
+
405
+ # === TRANSACTION ===
406
+
407
+ def transaction(action:, write: [], read: [], params: nil,
408
+ maxTransactionSize: nil, lockTimeout: nil, waitForSync: nil,
409
+ intermediateCommitCount: nil, intermedateCommitSize: nil)
410
+ Arango::Transaction.new(database: self, action: action, write: write,
411
+ read: read, params: params, maxTransactionSize: maxTransactionSize,
412
+ lockTimeout: lockTimeout, waitForSync: waitForSync,
413
+ intermediateCommitCount: intermediateCommitCount,
414
+ intermedateCommitSize: intermedateCommitSize)
415
+ end
416
+ end
417
+ end
data/lib/Document.rb ADDED
@@ -0,0 +1,346 @@
1
+ # ==== DOCUMENT ====
2
+
3
+ module Arango
4
+ class Document
5
+ include Arango::Helper_Error
6
+ include Arango::Helper_Return
7
+ include Arango::Collection_Return
8
+
9
+ def self.new(*args)
10
+ hash = args[0]
11
+ super unless hash.is_a?(Hash)
12
+ collection = hash[:collection]
13
+ if collection.is_a?(Arango::Collection) &&
14
+ collection.database.server.active_cache && !hash[:name].nil?
15
+ cache_name = "#{collection.database.name}/#{collection.name}/#{hash[:name]}"
16
+ cached = collection.database.server.cache.cache.dig(:document, cache_name)
17
+ if cached.nil?
18
+ hash[:cache_name] = cache_name
19
+ return super
20
+ else
21
+ body = hash[:body] || {}
22
+ [:rev, :from, :to].each{|k| body[:"_#{k}"] ||= hash[k]}
23
+ body[:"_key"] ||= hash[:name]
24
+ cached.assign_attributes(body)
25
+ return cached
26
+ end
27
+ end
28
+ super
29
+ end
30
+
31
+ def initialize(name: nil, collection:, body: {}, rev: nil, from: nil,
32
+ to: nil, cache_name: nil)
33
+ assign_collection(collection)
34
+ unless cache_name.nil?
35
+ @cache_name = cache_name
36
+ @server.cache.save(:document, cache_name, self)
37
+ end
38
+ body[:_key] ||= name
39
+ body[:_rev] ||= rev
40
+ body[:_to] ||= to
41
+ body[:_from] ||= from
42
+ body[:_id] ||= "#{@collection.name}/#{name}" unless name.nil?
43
+ assign_attributes(body)
44
+ end
45
+
46
+ def name
47
+ return @body[:_key]
48
+ end
49
+ alias key name
50
+
51
+ def rev
52
+ return @body[:_rev]
53
+ end
54
+
55
+ def id
56
+ return @body[:_id]
57
+ end
58
+
59
+ def name=(att)
60
+ assign_attributes({_key: att})
61
+ end
62
+ alias key= name=
63
+
64
+ def rev=(att)
65
+ assign_attributes({_rev: att})
66
+ end
67
+
68
+ def id=(att)
69
+ assign_attributes({_id: id})
70
+ end
71
+
72
+ def from=(att)
73
+ att = att.id if att.is_a?(Arango::Document)
74
+ assign_attributes({_from: att})
75
+ end
76
+
77
+ def to=(att)
78
+ att = att.id if att.is_a?(Arango::Document)
79
+ assign_attributes({_to: att})
80
+ end
81
+
82
+ # === DEFINE ==
83
+
84
+ attr_reader :collection, :graph, :database, :server, :body, :cache_name
85
+
86
+ def body=(result)
87
+ result.delete_if{|k,v| v.nil?}
88
+ @body ||= {}
89
+ # binding.pry if @body[:_key] == "Second_Key"
90
+ hash = {
91
+ "_key": @body[:_key],
92
+ "_id": @body[:_id],
93
+ "_rev": @body[:_rev],
94
+ "_from": @body[:_from],
95
+ "_to": @body[:_to]
96
+ }
97
+ @body = hash.merge(result)
98
+ if @body[:_id].nil? && !@body[:_key].nil?
99
+ @body[:_id] = "#{@collection.name}/#{@body[:_key]}"
100
+ end
101
+ set_up_from_or_to("from", result[:_from])
102
+ set_up_from_or_to("to", result[:_to])
103
+ if @server.active_cache && @cache_name.nil? && !@body[:_id].nil?
104
+ @cache_name = "#{@database.name}/#{@body[:_id]}"
105
+ @server.cache.save(:document, @cache_name, self)
106
+ end
107
+ end
108
+ alias assign_attributes body=
109
+
110
+ # === TO HASH ===
111
+
112
+ def to_h
113
+ {
114
+ "name": @body[:_key],
115
+ "id": @body[:_id],
116
+ "rev": @body[:_rev],
117
+ "from": @body[:_from],
118
+ "to": @body[:_to],
119
+ "body": @body,
120
+ "cache_name": @cache_name,
121
+ "collection": @collection.name,
122
+ "graph": @graph&.name
123
+ }.delete_if{|k,v| v.nil?}
124
+ end
125
+
126
+ def set_up_from_or_to(attrs, var)
127
+ case var
128
+ when NilClass
129
+ @body[:"_#{attrs}"] = nil
130
+ when String
131
+ unless var.include?("/")
132
+ raise Arango::Error.new err: :attribute_is_not_valid, data:
133
+ {"attribute": attrs, "wrong_value": var}
134
+ end
135
+ @body[:"_#{attrs}"] = var
136
+ when Arango::Document
137
+ @body[:"_#{attrs}"] = var.id
138
+ @from = var if attrs == "from"
139
+ @to = var if attrs == "to"
140
+ else
141
+ raise Arango::Error.new err: :attribute_is_not_valid, data:
142
+ {"attribute": attrs, "wrong_value": var}
143
+ end
144
+ end
145
+ private :set_up_from_or_to
146
+
147
+ def from(string: false)
148
+ return @body[:_from] if string
149
+ @from ||= retrieve_instance_from_and_to(@body[:_from])
150
+ return @from
151
+ end
152
+
153
+ def to(string: false)
154
+ return @body[:_to] if string
155
+ @to ||= retrieve_instance_from_and_to(@body[:_to])
156
+ return @to
157
+ end
158
+
159
+ def retrieve_instance_from_and_to(var)
160
+ case var
161
+ when NilClass
162
+ return nil
163
+ when String
164
+ collection_name, document_name = var.split("/")
165
+ collection = Arango::Collection.new name: collection_name, database: @database
166
+ if @graph.nil?
167
+ return Arango::Document.new(name: document_name, collection: collection)
168
+ else
169
+ collection.graph = @graph
170
+ return Arango::Vertex.new(name: document_name, collection: collection)
171
+ end
172
+ end
173
+ end
174
+ private :retrieve_instance_from_and_to
175
+
176
+ # == GET ==
177
+
178
+ def retrieve(if_none_match: false, if_match: false)
179
+ headers = {}
180
+ headers[:"If-None-Match"] = @body[:_rev] if if_none_match
181
+ headers[:"If-Match"] = @body[:_rev] if if_match
182
+ result = @database.request("GET", "_api/document/#{@body[:_id]}", headers: headers)
183
+ return_element(result)
184
+ end
185
+
186
+ # == HEAD ==
187
+
188
+ def head(if_none_match: false, if_match: false)
189
+ headers = {}
190
+ headers[:"If-None-Match"] = @body[:_rev] if if_none_match
191
+ headers[:"If-Match"] = @body[:_rev] if if_match
192
+ @database.request("HEAD", "_api/document/#{@body[:_id]}", headers: headers)
193
+ end
194
+
195
+ # == POST ==
196
+
197
+ def create(body: {}, waitForSync: nil, returnNew: nil, silent: nil)
198
+ body = @body.merge(body)
199
+ query = {
200
+ "waitForSync": waitForSync,
201
+ "returnNew": returnNew,
202
+ "silent": silent
203
+ }
204
+ result = @database.request("POST", "_api/document/#{@collection.name}", body: body,
205
+ query: query)
206
+ return result if @server.async != false || silent
207
+ body2 = result.clone
208
+ if returnNew
209
+ body2.delete(:new)
210
+ body2 = body2.merge(result[:new])
211
+ end
212
+ body = body.merge(body2)
213
+ assign_attributes(body)
214
+ return return_directly?(result) ? result : self
215
+ end
216
+
217
+ # == PUT ==
218
+
219
+ def replace(body: {}, waitForSync: nil, ignoreRevs: nil, returnOld: nil,
220
+ returnNew: nil, silent: nil, if_match: false)
221
+ query = {
222
+ "waitForSync": waitForSync,
223
+ "returnNew": returnNew,
224
+ "returnOld": returnOld,
225
+ "ignoreRevs": ignoreRevs,
226
+ "silent": silent
227
+ }
228
+ headers = {}
229
+ headers[:"If-Match"] = @body[:_rev] if if_match
230
+ result = @database.request("PUT", "_api/document/#{@body[:_id]}", body: body,
231
+ query: query, headers: headers)
232
+ return result if @server.async != false || silent
233
+ body2 = result.clone
234
+ if returnNew
235
+ body2.delete(:new)
236
+ body2 = body2.merge(result[:new])
237
+ end
238
+ body = body.merge(body2)
239
+ assign_attributes(body)
240
+ return return_directly?(result) ? result : self
241
+ end
242
+
243
+ def update(body: {}, waitForSync: nil, ignoreRevs: nil,
244
+ returnOld: nil, returnNew: nil, keepNull: nil,
245
+ mergeObjects: nil, silent: nil, if_match: false)
246
+ query = {
247
+ "waitForSync": waitForSync,
248
+ "returnNew": returnNew,
249
+ "returnOld": returnOld,
250
+ "ignoreRevs": ignoreRevs,
251
+ "keepNull": keepNull,
252
+ "mergeObjects": mergeObjects,
253
+ "silent": silent
254
+ }
255
+ headers = {}
256
+ headers[:"If-Match"] = @body[:_rev] if if_match
257
+ result = @database.request("PATCH", "_api/document/#{@body[:_id]}", body: body,
258
+ query: query, headers: headers, keepNull: keepNull)
259
+ return result if @server.async != false || silent
260
+ body2 = result.clone
261
+ if returnNew
262
+ body2.delete(:new)
263
+ body2 = body2.merge(result[:new])
264
+ end
265
+ body = body.merge(body2)
266
+ if mergeObjects
267
+ @body = @body.merge(body)
268
+ else
269
+ body.each{|key, value| @body[key] = value}
270
+ end
271
+ assign_attributes(@body)
272
+ return return_directly?(result) ? result : self
273
+ end
274
+
275
+ # === DELETE ===
276
+
277
+ def destroy(waitForSync: nil, silent: nil, returnOld: nil, if_match: false)
278
+ query = {
279
+ "waitForSync": waitForSync,
280
+ "returnOld": returnOld,
281
+ "silent": silent
282
+ }
283
+ headers = {}
284
+ headers[:"If-Match"] = @body[:_rev] if if_match
285
+ result = @database.request("DELETE", "_api/document/#{@body[:_id]}", query: query,
286
+ headers: headers)
287
+ return result if @server.async != false || silent
288
+ body2 = result.clone
289
+ if returnOld
290
+ body2.delete(:old)
291
+ body2 = body2.merge(result[:old])
292
+ else
293
+ body2 = body2.merge(@body)
294
+ end
295
+ return_element(body2)
296
+ return true
297
+ end
298
+
299
+ # === EDGE ===
300
+
301
+ def edges(collection:, direction: nil)
302
+ satisfy_class?(collection, [Arango::Collection, String])
303
+ collection = collection.is_a?(Arango::Collection) ? collection.name : collection
304
+ query = {
305
+ "vertex": @body[:_id],
306
+ "direction": direction
307
+ }
308
+ result = @database.request("GET", "_api/edges/#{collection}", query: query)
309
+ return result if return_directly?(result)
310
+ result[:edges].map do |edge|
311
+ collection_name, key = edge[:_id].split("/")
312
+ collection = Arango::Collection.new(name: collection_name,
313
+ database: @database, type: :edge)
314
+ Arango::Document.new(name: key, body: edge, collection: collection)
315
+ end
316
+ end
317
+
318
+ def any(collection)
319
+ edges(collection: collection)
320
+ end
321
+
322
+ def out(collection)
323
+ edges(collection: collection, direction: "out")
324
+ end
325
+
326
+ def in(collection)
327
+ edges(collection: collection, direction: "in")
328
+ end
329
+
330
+ # === TRAVERSAL ===
331
+
332
+ def traversal(body: {}, sort: nil, direction: nil, minDepth: nil,
333
+ visitor: nil, itemOrder: nil, strategy: nil,
334
+ filter: nil, init: nil, maxIterations: nil, maxDepth: nil,
335
+ uniqueness: nil, order: nil, expander: nil,
336
+ edgeCollection: nil)
337
+ Arango::Traversal.new(body: body,
338
+ sort: sort, direction: direction, minDepth: minDepth,
339
+ vertex: self, visitor: visitor,itemOrder: itemOrder,
340
+ strategy: strategy, filter: filter, init: init,
341
+ maxIterations: maxIterations, maxDepth: maxDepth,
342
+ uniqueness: uniqueness, order: order,
343
+ expander: expander, edgeCollection: edgeCollection)
344
+ end
345
+ end
346
+ end