arangorb 1.2.0 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/ArangoRB.gemspec +18 -18
  3. data/Gemfile +8 -7
  4. data/LICENSE +21 -21
  5. data/README.md +906 -867
  6. data/lib/ArangoRB_AQL.rb +181 -160
  7. data/lib/ArangoRB_Cache.rb +174 -174
  8. data/lib/ArangoRB_Col.rb +526 -499
  9. data/lib/ArangoRB_DB.rb +363 -339
  10. data/lib/ArangoRB_Doc.rb +319 -298
  11. data/lib/ArangoRB_Edg.rb +184 -169
  12. data/lib/ArangoRB_Gra.rb +201 -180
  13. data/lib/ArangoRB_Index.rb +135 -115
  14. data/lib/ArangoRB_Replication.rb +261 -0
  15. data/lib/ArangoRB_Ser.rb +446 -441
  16. data/lib/ArangoRB_Task.rb +129 -113
  17. data/lib/ArangoRB_Tra.rb +169 -142
  18. data/lib/ArangoRB_Tran.rb +68 -53
  19. data/lib/ArangoRB_User.rb +149 -136
  20. data/lib/ArangoRB_Ver.rb +162 -147
  21. data/lib/arangorb.rb +16 -15
  22. data/spec/arangoRB_helper.rb +4 -4
  23. data/spec/arangoRestart_helper.rb +14 -14
  24. data/spec/lib/0.1.0/arangoAQL_helper.rb +64 -64
  25. data/spec/lib/0.1.0/arangoC_helper.rb +170 -170
  26. data/spec/lib/0.1.0/arangoDB_helper.rb +119 -119
  27. data/spec/lib/0.1.0/arangoDoc_helper.rb +79 -79
  28. data/spec/lib/0.1.0/arangoE_helper.rb +50 -50
  29. data/spec/lib/0.1.0/arangoG_helper.rb +78 -78
  30. data/spec/lib/0.1.0/arangoS_helper.rb +37 -37
  31. data/spec/lib/0.1.0/arangoT_helper.rb +48 -48
  32. data/spec/lib/0.1.0/arangoV_helper.rb +65 -65
  33. data/spec/lib/1.0.0/arangoC_helper.rb +73 -73
  34. data/spec/lib/1.0.0/arangoDB_helper.rb +48 -48
  35. data/spec/lib/1.0.0/arangoI_helper.rb +43 -43
  36. data/spec/lib/1.0.0/arangoS_helper.rb +192 -192
  37. data/spec/lib/1.0.0/arangoTa_helper.rb +49 -49
  38. data/spec/lib/1.0.0/arangoTr_helper.rb +15 -15
  39. data/spec/lib/1.0.0/arangoU_helper.rb +72 -72
  40. data/spec/lib/1.1.0/arangoRB_helper.rb +144 -144
  41. data/spec/lib/1.1.0/arangoRB_walks_helper.rb +19 -19
  42. data/spec/lib/1.2.0/arangoCache_helper.rb +66 -66
  43. data/spec/lib/1.3.0/arangoHash_helper.rb +30 -0
  44. data/spec/lib/arangoRB_0.1.0_helper.rb +9 -9
  45. data/spec/lib/arangoRB_1.0.0_helper.rb +6 -6
  46. data/spec/lib/arangoRB_1.1.0_helper.rb +2 -2
  47. data/spec/lib/arangoRB_1.2.0_helper.rb +2 -1
  48. data/spec/spec_helper.rb +41 -41
  49. metadata +6 -5
@@ -1,339 +1,363 @@
1
- # === DATABASE ===
2
-
3
- class ArangoDatabase < ArangoServer
4
- @isSystem = false
5
- @path = nil
6
- @id = nil
7
-
8
- def initialize(database: @@database) # TESTED
9
- if database.is_a?(String)
10
- @database = database
11
- elsif database.is_a?(ArangoDatabase)
12
- @database = database.database
13
- else
14
- raise "database should be a String or an ArangoDatabase instance, not a #{database.class}"
15
- end
16
- @idCache = "DB_#{@database}"
17
- end
18
-
19
- attr_reader :database, :isSystem, :path, :id, :idCache # TESTED
20
- alias name database
21
-
22
- # === RETRIEVE ===
23
-
24
- def [](collection_name)
25
- ArangoCollection.new(collection: collection_name, database: @database)
26
- end
27
- alias collection []
28
-
29
- def graph(graph_name)
30
- ArangoGraph.new(graph: graph_name, database: @database)
31
- end
32
-
33
- # === GET ===
34
-
35
- def info # TESTED
36
- result = self.class.get("/_db/#{@database}/_api/database/current", @@request)
37
- return result.headers["x-arango-async-id"] if @@async == "store"
38
- result = result.parsed_response
39
- @@verbose ? result : result["error"] ? result["errorMessage"] : result["result"].delete_if{|k,v| k == "error" || k == "code"}
40
- end
41
-
42
- def retrieve # TESTED
43
- result = self.class.get("/_db/#{@database}/_api/database/current", @@request)
44
- return result.headers["x-arango-async-id"] if @@async == "store"
45
- result = result.parsed_response
46
- @isSystem = result["isSystem"]
47
- @path = result["path"]
48
- @id = result["id"]
49
- @@verbose ? result : result["error"] ? result["errorMessage"] : self
50
- end
51
-
52
- # === POST ===
53
-
54
- def create(username: nil, passwd: nil, users: nil) # TESTED
55
- body = {
56
- "name" => @database,
57
- "username" => username,
58
- "passwd" => passwd,
59
- "users" => users
60
- }
61
- body = body.delete_if{|k,v| v.nil?}.to_json
62
- request = @@request.merge({ :body => body })
63
- result = self.class.post("/_api/database", request)
64
- @@async == "store" ? result.headers["x-arango-async-id"] : @@verbose ? result.parsed_response : result.parsed_response["error"] ? result.parsed_response["errorMessage"] : self
65
- end
66
-
67
- # === DELETE ===
68
-
69
- def destroy # TESTED
70
- result = self.class.delete("/_api/database/#{@database}", @@request)
71
- self.class.return_result(result: result, caseTrue: true)
72
- end
73
-
74
- # === LISTS ===
75
-
76
- def self.databases(user: nil) # TESTED
77
- user = user.user if user.is_a?(ArangoUser)
78
- result = user.nil? ? get("/_api/database") : get("/_api/database/#{user}", @@request)
79
- return result.headers["x-arango-async-id"] if @@async == "store"
80
- result = result.parsed_response
81
- @@verbose ? result : result["error"] ? result["errorMessage"] : result["result"].map{|x| ArangoDatabase.new(database: x)}
82
- end
83
-
84
- def collections(excludeSystem: true) # TESTED
85
- query = { "excludeSystem": excludeSystem }.delete_if{|k,v| v.nil?}
86
- request = @@request.merge({ :query => query })
87
- result = self.class.get("/_db/#{@database}/_api/collection", request)
88
- return result.headers["x-arango-async-id"] if @@async == "store"
89
- result = result.parsed_response
90
- @@verbose ? result : result["error"] ? result["errorMessage"] : result["result"].map{|x| ArangoCollection.new(database: @database, collection: x["name"])}
91
- end
92
-
93
- def graphs # TESTED
94
- result = self.class.get("/_db/#{@database}/_api/gharial", @@request)
95
- return result.headers["x-arango-async-id"] if @@async == "store"
96
- result = result.parsed_response
97
- @@verbose ? result : result["error"] ? result["errorMessage"] : result["graphs"].map{|x| ArangoGraph.new(database: @database, graph: x["_key"], edgeDefinitions: x["edgeDefinitions"], orphanCollections: x["orphanCollections"])}
98
- end
99
-
100
- def functions # TESTED
101
- result = self.class.get("/_db/#{@database}/_api/aqlfunction", @@request)
102
- self.class.return_result result: result
103
- end
104
-
105
- # === QUERY ===
106
-
107
- def propertiesQuery # TESTED
108
- result = self.class.get("/_db/#{@database}/_api/query/properties", @@request)
109
- self.class.return_result result: result
110
- end
111
-
112
- def currentQuery # TESTED
113
- result = self.class.get("/_db/#{@database}/_api/query/current", @@request)
114
- self.class.return_result result: result
115
- end
116
-
117
- def slowQuery # TESTED
118
- result = self.class.get("/_db/#{@database}/_api/query/slow", @@request)
119
- self.class.return_result result: result
120
- end
121
-
122
- def stopSlowQuery # TESTED
123
- result = self.class.delete("/_db/#{@database}/_api/query/slow", @@request)
124
- self.class.return_result result: result, caseTrue: true
125
- end
126
-
127
- def killQuery(query:) # TESTED
128
- id = query.is_a?(ArangoAQL) ? query.id : query.is_a?(String) ? query : nil
129
- result = self.class.delete("/_db/#{@database}/_api/query/#{id}", @@request)
130
- self.class.return_result result: result, caseTrue: true
131
- end
132
-
133
- def changePropertiesQuery(slowQueryThreshold: nil, enabled: nil, maxSlowQueries: nil, trackSlowQueries: nil, maxQueryStringLength: nil) # TESTED
134
- body = {
135
- "slowQueryThreshold" => slowQueryThreshold,
136
- "enabled" => enabled,
137
- "maxSlowQueries" => maxSlowQueries,
138
- "trackSlowQueries" => trackSlowQueries,
139
- "maxQueryStringLength" => maxQueryStringLength
140
- }.delete_if{|k,v| v.nil?}
141
- request = @@request.merge({ :body => body.to_json })
142
- result = self.class.put("/_db/#{@database}/_api/query/properties", request)
143
- self.class.return_result result: result
144
- end
145
-
146
- # === CACHE ===
147
-
148
- def clearCache # TESTED
149
- result = self.class.delete("/_db/#{@database}/_api/query-cache", @@request)
150
- self.class.return_result result: result, caseTrue: true
151
- end
152
-
153
- def propertyCache # TESTED
154
- result = self.class.get("/_db/#{@database}/_api/query-cache/properties", @@request)
155
- self.class.return_result result: result
156
- end
157
-
158
- def changePropertyCache(mode: nil, maxResults: nil) # TESTED
159
- body = { "mode" => mode, "maxResults" => maxResults }.delete_if{|k,v| v.nil?}
160
- request = @@request.merge({ :body => body.to_json })
161
- result = self.class.put("/_db/#{@database}/_api/query-cache/properties", request)
162
- self.class.return_result result: result
163
- end
164
-
165
- # === AQL FUNCTION ===
166
-
167
- def createFunction(code:, name:, isDeterministic: nil) # TESTED
168
- body = {
169
- "code" => code,
170
- "name" => name,
171
- "isDeterministic" => isDeterministic
172
- }.delete_if{|k,v| v.nil?}
173
- request = @@request.merge({ :body => body.to_json })
174
- result = self.class.post("/_db/#{@database}/_api/aqlfunction", request)
175
- self.class.return_result result: result
176
- end
177
-
178
- def deleteFunction(name:) # TESTED
179
- result = self.class.delete("/_db/#{@database}/_api/aqlfunction/#{name}", @@request)
180
- self.class.return_result result: result, caseTrue: true
181
- end
182
-
183
- # === REPLICATION ===
184
-
185
- def inventory(includeSystem: false) # TESTED
186
- query = { "includeSystem": includeSystem }
187
- request = @@request.merge({ :query => query })
188
- result = self.class.get("/_db/#{@database}/_api/replication/inventory", request)
189
- self.class.return_result result: result
190
- end
191
-
192
- def clusterInventory(includeSystem: false) # TESTED
193
- query = { "includeSystem": includeSystem }
194
- request = @@request.merge({ :query => query })
195
- result = self.class.get("/_db/#{@database}/_api/replication/clusterInventory", request)
196
- self.class.return_result result: result
197
- end
198
-
199
- def logger # TESTED
200
- result = self.class.get("/_db/#{@database}/_api/replication/logger-state")
201
- self.class.return_result result: result
202
- end
203
-
204
- def loggerFollow(from: nil, to: nil, chunkSize: nil, includeSystem: false) # TESTED
205
- query = {
206
- "from": from,
207
- "to": to,
208
- "chunkSize": chunkSize,
209
- "includeSystem": includeSystem
210
- }.delete_if{|k,v| v.nil?}
211
- request = @@request.merge({ :query => query })
212
- result = self.class.get("/_db/#{@database}/_api/replication/logger-follow", request)
213
- self.class.return_result result: result
214
- end
215
-
216
- def firstTick # TESTED
217
- result = self.class.get("/_db/#{@database}/_api/replication/logger-first-tick")
218
- self.class.return_result result: result, key: "firstTick"
219
- end
220
-
221
- def rangeTick # TESTED
222
- result = self.class.get("/_db/#{@database}/_api/replication/logger-tick-ranges")
223
- self.class.return_result result: result
224
- end
225
-
226
- def sync(endpoint: "tcp://#{@@server}:#{@@port}", username: @@username, password: @@password, includeSystem: false, database: @database, initialSyncMaxWaitTime: nil, restrictType: nil, incremental: nil, restrictCollections: nil)
227
- body = {
228
- "username" => username,
229
- "password" => password,
230
- "includeSystem" => includeSystem,
231
- "endpoint" => endpoint,
232
- "initialSyncMaxWaitTime" => initialSyncMaxWaitTime,
233
- "database" => database,
234
- "restrictType" => restrictType,
235
- "incremental" => incremental,
236
- "restrictCollections" => restrictCollections
237
- }.delete_if{|k,v| v.nil?}
238
- request = @@request.merge({ :body => body.to_json })
239
- result = self.class.put("/_db/#{database}/_api/replication/sync", request)
240
- self.class.return_result result: result
241
- end
242
-
243
- def configurationReplication # TESTED
244
- result = self.class.get("/_db/#{@database}/_api/replication/applier-config", @@request)
245
- self.class.return_result result: result
246
- end
247
-
248
- def modifyConfigurationReplication(endpoint: "tcp://#{@@server}:#{@@port}", username: @@username, password: @@password, database: @database, includeSystem: false, verbose: false, connectTimeout: nil, autoResync: nil, idleMinWaitTime: nil, requestTimeout: nil, requireFromPresent: nil, idleMaxWaitTime: nil, restrictCollections: nil, restrictType: nil, initialSyncMaxWaitTime: nil, maxConnectRetries: nil, autoStart: nil, adaptivePolling: nil, connectionRetryWaitTime: nil, autoResyncRetries: nil, chunkSize: nil) # TESTED
249
- body = {
250
- "username" => username,
251
- "password" => password,
252
- "includeSystem" => includeSystem,
253
- "endpoint" => endpoint,
254
- "initialSyncMaxWaitTime" => initialSyncMaxWaitTime,
255
- "database" => database,
256
- "verbose" => verbose,
257
- "connectTimeout" => connectTimeout,
258
- "autoResync" => autoResync,
259
- "idleMinWaitTime" => idleMinWaitTime,
260
- "requestTimeout" => requestTimeout,
261
- "requireFromPresent" => requireFromPresent,
262
- "idleMaxWaitTime" => idleMaxWaitTime,
263
- "restrictType" => restrictType,
264
- "maxConnectRetries" => maxConnectRetries,
265
- "autoStart" => autoStart,
266
- "adaptivePolling" => adaptivePolling,
267
- "connectionRetryWaitTime" => connectionRetryWaitTime,
268
- "restrictCollections" => restrictCollections,
269
- "autoResyncRetries" => autoResyncRetries,
270
- "chunkSize" => chunkSize
271
- }.delete_if{|k,v| v.nil?}
272
- request = @@request.merge({ :body => body.to_json })
273
- result = self.class.put("/_db/#{database}/_api/replication/applier-config", request)
274
- self.class.return_result result: result
275
- end
276
-
277
- def startReplication(from: nil)
278
- query = {from: from}.delete_if{|k,v| v.nil?}
279
- request = @@request.merge({ :query => query })
280
- result = self.class.put("/_db/#{@database}/_api/replication/applier-start", request)
281
- self.class.return_result result: result
282
- end
283
-
284
- def stopReplication
285
- result = self.class.put("/_db/#{@database}/_api/replication/applier-stop", @@request)
286
- self.class.return_result result: result
287
- end
288
-
289
- def stateReplication
290
- result = self.class.get("/_db/#{@database}/_api/replication/applier-state", @@request)
291
- self.class.return_result result: result
292
- end
293
-
294
- def enslave(username: @@username, includeSystem: false, endpoint: "tcp://#{@@server}:#{@@port}", verbose: false, connectTimeout: nil, autoResync: nil, password: @@password, database: @database, idleMinWaitTime: nil, requestTimeout: nil, requireFromPresent: nil, idleMaxWaitTime: nil, restrictCollections: nil, restrictType: nil, initialSyncMaxWaitTime: nil, maxConnectRetries: nil, adaptivePolling: nil, connectionRetryWaitTime: nil, autoResyncRetries: nil, chunkSize: nil)
295
- body = {
296
- "username" => username,
297
- "password" => password,
298
- "includeSystem" => includeSystem,
299
- "endpoint" => endpoint,
300
- "initialSyncMaxWaitTime" => initialSyncMaxWaitTime,
301
- "database" => database,
302
- "verbose" => verbose,
303
- "connectTimeout" => connectTimeout,
304
- "autoResync" => autoResync,
305
- "idleMinWaitTime" => idleMinWaitTime,
306
- "requestTimeout" => requestTimeout,
307
- "requireFromPresent" => requireFromPresent,
308
- "idleMaxWaitTime" => idleMaxWaitTime,
309
- "restrictType" => restrictType,
310
- "maxConnectRetries" => maxConnectRetries,
311
- "adaptivePolling" => adaptivePolling,
312
- "connectionRetryWaitTime" => connectionRetryWaitTime,
313
- "restrictCollections" => restrictCollections,
314
- "autoResyncRetries" => autoResyncRetries,
315
- "chunkSize" => chunkSize
316
- }.delete_if{|k,v| v.nil?}
317
- request = @@request.merge({ :body => body.to_json })
318
- result = self.class.put("/_db/#{@database}/_api/replication/make-slave", request)
319
- self.class.return_result result: result
320
- end
321
-
322
- # === USER ===
323
-
324
- def grant(user: @@user) # TESTED
325
- user = user.user if user.is_a?(ArangoUser)
326
- body = { "grant" => "rw" }.to_json
327
- request = @@request.merge({ :body => body })
328
- result = self.class.put("/_api/user/#{user}/database/#{@database}", request)
329
- self.class.return_result result: result, caseTrue: true
330
- end
331
-
332
- def revoke(user: @@user) # TESTED
333
- user = user.user if user.is_a?(ArangoUser)
334
- body = { "grant" => "none" }.to_json
335
- request = @@request.merge({ :body => body })
336
- result = self.class.put("/_api/user/#{user}/database/#{@database}", request)
337
- self.class.return_result result: result, caseTrue: true
338
- end
339
- end
1
+ # === DATABASE ===
2
+
3
+ class ArangoDatabase < ArangoServer
4
+ @isSystem = nil
5
+ @path = nil
6
+ @id = nil
7
+
8
+ def initialize(database: @@database) # TESTED
9
+ if database.is_a?(String)
10
+ @database = database
11
+ elsif database.is_a?(ArangoDatabase)
12
+ @database = database.database
13
+ else
14
+ raise "database should be a String or an ArangoDatabase instance, not a #{database.class}"
15
+ end
16
+ @idCache = "DB_#{@database}"
17
+ end
18
+
19
+ attr_reader :database, :isSystem, :path, :id, :idCache # TESTED
20
+ alias name database
21
+
22
+ # === RETRIEVE ===
23
+
24
+ def to_hash
25
+ {
26
+ "database" => @database,
27
+ "isSystem" => @isSystem,
28
+ "path" => @path,
29
+ "id" => @id,
30
+ "idCache" => @idCache,
31
+ "endpoint" => "tcp://#{@@server}:#{@@port}"
32
+ }.delete_if{|k,v| v.nil?}
33
+ end
34
+ alias to_h to_hash
35
+
36
+ def [](collection_name)
37
+ ArangoCollection.new(collection: collection_name, database: @database)
38
+ end
39
+ alias collection []
40
+
41
+ def graph(graph_name)
42
+ ArangoGraph.new(graph: graph_name, database: @database)
43
+ end
44
+
45
+ # === GET ===
46
+
47
+ def info # TESTED
48
+ result = self.class.get("/_db/#{@database}/_api/database/current", @@request)
49
+ return result.headers["x-arango-async-id"] if @@async == "store"
50
+ return true if @@async
51
+ result = result.parsed_response
52
+ @@verbose ? result : result["error"] ? result["errorMessage"] : result["result"].delete_if{|k,v| k == "error" || k == "code"}
53
+ end
54
+
55
+ def retrieve # TESTED
56
+ result = self.class.get("/_db/#{@database}/_api/database/current", @@request)
57
+ return result.headers["x-arango-async-id"] if @@async == "store"
58
+ return true if @@async
59
+ result = result.parsed_response
60
+ @isSystem = result["isSystem"]
61
+ @path = result["path"]
62
+ @id = result["id"]
63
+ @@verbose ? result : result["error"] ? result["errorMessage"] : self
64
+ end
65
+
66
+ # === POST ===
67
+
68
+ def create(username: nil, passwd: nil, users: nil) # TESTED
69
+ body = {
70
+ "name" => @database,
71
+ "username" => username,
72
+ "passwd" => passwd,
73
+ "users" => users
74
+ }
75
+ body = body.delete_if{|k,v| v.nil?}.to_json
76
+ request = @@request.merge({ :body => body })
77
+ result = self.class.post("/_api/database", request)
78
+ return true if @@async
79
+ @@async == "store" ? result.headers["x-arango-async-id"] : @@verbose ? result.parsed_response : result.parsed_response["error"] ? result.parsed_response["errorMessage"] : self
80
+ end
81
+
82
+ # === DELETE ===
83
+
84
+ def destroy # TESTED
85
+ result = self.class.delete("/_api/database/#{@database}", @@request)
86
+ self.class.return_result(result: result, caseTrue: true)
87
+ end
88
+
89
+ # === LISTS ===
90
+
91
+ def self.databases(user: nil) # TESTED
92
+ user = user.user if user.is_a?(ArangoUser)
93
+ result = user.nil? ? get("/_api/database") : get("/_api/database/#{user}", @@request)
94
+ return result.headers["x-arango-async-id"] if @@async == "store"
95
+ return true if @@async
96
+ result = result.parsed_response
97
+ @@verbose ? result : result["error"] ? result["errorMessage"] : result["result"].map{|x| ArangoDatabase.new(database: x)}
98
+ end
99
+
100
+ def collections(excludeSystem: true) # TESTED
101
+ query = { "excludeSystem": excludeSystem }.delete_if{|k,v| v.nil?}
102
+ request = @@request.merge({ :query => query })
103
+ result = self.class.get("/_db/#{@database}/_api/collection", request)
104
+ return result.headers["x-arango-async-id"] if @@async == "store"
105
+ return true if @@async
106
+ result = result.parsed_response
107
+ @@verbose ? result : result["error"] ? result["errorMessage"] : result["result"].map{|x| ArangoCollection.new(database: @database, collection: x["name"], type: x['type'] == 3 ? 'Edge' : 'Collection')}
108
+ end
109
+
110
+ def graphs # TESTED
111
+ result = self.class.get("/_db/#{@database}/_api/gharial", @@request)
112
+ return result.headers["x-arango-async-id"] if @@async == "store"
113
+ return true if @@async
114
+ result = result.parsed_response
115
+ @@verbose ? result : result["error"] ? result["errorMessage"] : result["graphs"].map{|x| ArangoGraph.new(database: @database, graph: x["_key"], edgeDefinitions: x["edgeDefinitions"], orphanCollections: x["orphanCollections"])}
116
+ end
117
+
118
+ def functions # TESTED
119
+ result = self.class.get("/_db/#{@database}/_api/aqlfunction", @@request)
120
+ self.class.return_result result: result
121
+ end
122
+
123
+ # === QUERY ===
124
+
125
+ def propertiesQuery # TESTED
126
+ result = self.class.get("/_db/#{@database}/_api/query/properties", @@request)
127
+ self.class.return_result result: result
128
+ end
129
+
130
+ def currentQuery # TESTED
131
+ result = self.class.get("/_db/#{@database}/_api/query/current", @@request)
132
+ self.class.return_result result: result
133
+ end
134
+
135
+ def slowQuery # TESTED
136
+ result = self.class.get("/_db/#{@database}/_api/query/slow", @@request)
137
+ self.class.return_result result: result
138
+ end
139
+
140
+ def stopSlowQuery # TESTED
141
+ result = self.class.delete("/_db/#{@database}/_api/query/slow", @@request)
142
+ self.class.return_result result: result, caseTrue: true
143
+ end
144
+
145
+ def killQuery(query:) # TESTED
146
+ id = query.is_a?(ArangoAQL) ? query.id : query.is_a?(String) ? query : nil
147
+ result = self.class.delete("/_db/#{@database}/_api/query/#{id}", @@request)
148
+ self.class.return_result result: result, caseTrue: true
149
+ end
150
+
151
+ def changePropertiesQuery(slowQueryThreshold: nil, enabled: nil, maxSlowQueries: nil, trackSlowQueries: nil, maxQueryStringLength: nil) # TESTED
152
+ body = {
153
+ "slowQueryThreshold" => slowQueryThreshold,
154
+ "enabled" => enabled,
155
+ "maxSlowQueries" => maxSlowQueries,
156
+ "trackSlowQueries" => trackSlowQueries,
157
+ "maxQueryStringLength" => maxQueryStringLength
158
+ }.delete_if{|k,v| v.nil?}
159
+ request = @@request.merge({ :body => body.to_json })
160
+ result = self.class.put("/_db/#{@database}/_api/query/properties", request)
161
+ self.class.return_result result: result
162
+ end
163
+
164
+ # === CACHE ===
165
+
166
+ def clearCache # TESTED
167
+ result = self.class.delete("/_db/#{@database}/_api/query-cache", @@request)
168
+ self.class.return_result result: result, caseTrue: true
169
+ end
170
+
171
+ def propertyCache # TESTED
172
+ result = self.class.get("/_db/#{@database}/_api/query-cache/properties", @@request)
173
+ self.class.return_result result: result
174
+ end
175
+
176
+ def changePropertyCache(mode: nil, maxResults: nil) # TESTED
177
+ body = { "mode" => mode, "maxResults" => maxResults }.delete_if{|k,v| v.nil?}
178
+ request = @@request.merge({ :body => body.to_json })
179
+ result = self.class.put("/_db/#{@database}/_api/query-cache/properties", request)
180
+ self.class.return_result result: result
181
+ end
182
+
183
+ # === AQL FUNCTION ===
184
+
185
+ def createFunction(code:, name:, isDeterministic: nil) # TESTED
186
+ body = {
187
+ "code" => code,
188
+ "name" => name,
189
+ "isDeterministic" => isDeterministic
190
+ }.delete_if{|k,v| v.nil?}
191
+ request = @@request.merge({ :body => body.to_json })
192
+ result = self.class.post("/_db/#{@database}/_api/aqlfunction", request)
193
+ self.class.return_result result: result
194
+ end
195
+
196
+ def deleteFunction(name:) # TESTED
197
+ result = self.class.delete("/_db/#{@database}/_api/aqlfunction/#{name}", @@request)
198
+ self.class.return_result result: result, caseTrue: true
199
+ end
200
+
201
+ # === REPLICATION ===
202
+
203
+ def inventory(includeSystem: false) # TESTED
204
+ query = { "includeSystem": includeSystem }
205
+ request = @@request.merge({ :query => query })
206
+ result = self.class.get("/_db/#{@database}/_api/replication/inventory", request)
207
+ self.class.return_result result: result
208
+ end
209
+
210
+ def clusterInventory(includeSystem: false) # TESTED
211
+ query = { "includeSystem": includeSystem }
212
+ request = @@request.merge({ :query => query })
213
+ result = self.class.get("/_db/#{@database}/_api/replication/clusterInventory", request)
214
+ self.class.return_result result: result
215
+ end
216
+
217
+ # def logger # TESTED
218
+ # result = self.class.get("/_db/#{@database}/_api/replication/logger-state")
219
+ # self.class.return_result result: result
220
+ # end
221
+ #
222
+ # def loggerFollow(from: nil, to: nil, chunkSize: nil, includeSystem: false) # TESTED
223
+ # query = {
224
+ # "from": from,
225
+ # "to": to,
226
+ # "chunkSize": chunkSize,
227
+ # "includeSystem": includeSystem
228
+ # }.delete_if{|k,v| v.nil?}
229
+ # request = @@request.merge({ :query => query })
230
+ # result = self.class.get("/_db/#{@database}/_api/replication/logger-follow", request)
231
+ # self.class.return_result result: result
232
+ # end
233
+ #
234
+ # def firstTick # TESTED
235
+ # result = self.class.get("/_db/#{@database}/_api/replication/logger-first-tick")
236
+ # self.class.return_result result: result, key: "firstTick"
237
+ # end
238
+ #
239
+ # def rangeTick # TESTED
240
+ # result = self.class.get("/_db/#{@database}/_api/replication/logger-tick-ranges")
241
+ # self.class.return_result result: result
242
+ # end
243
+ #
244
+ # def sync(endpoint:, username:, password:, includeSystem: true, database: @database, initialSyncMaxWaitTime: nil, restrictType: nil, incremental: nil, restrictCollections: nil) # TESTED
245
+ # body = {
246
+ # "username" => username,
247
+ # "password" => password,
248
+ # "includeSystem" => includeSystem,
249
+ # "endpoint" => endpoint,
250
+ # "initialSyncMaxWaitTime" => initialSyncMaxWaitTime,
251
+ # "database" => database,
252
+ # "restrictType" => restrictType,
253
+ # "incremental" => incremental,
254
+ # "restrictCollections" => restrictCollections
255
+ # }.delete_if{|k,v| v.nil?}
256
+ # request = @@request.merge({ :body => body.to_json })
257
+ # result = self.class.put("/_db/#{database}/_api/replication/sync", request)
258
+ # self.class.return_result result: result
259
+ # end
260
+ #
261
+ # def configurationReplication # TESTED
262
+ # result = self.class.get("/_db/#{@database}/_api/replication/applier-config", @@request)
263
+ # self.class.return_result result: result
264
+ # end
265
+ #
266
+ # def modifyConfigurationReplication(endpoint: nil, username: nil, password: nil, database: @database, includeSystem: false, verbose: false, connectTimeout: nil, autoResync: nil, idleMinWaitTime: nil, requestTimeout: nil, requireFromPresent: nil, idleMaxWaitTime: nil, restrictCollections: nil, restrictType: nil, initialSyncMaxWaitTime: nil, maxConnectRetries: nil, autoStart: nil, adaptivePolling: nil, connectionRetryWaitTime: nil, autoResyncRetries: nil, chunkSize: nil) # TESTED
267
+ # body = {
268
+ # "username" => username,
269
+ # "password" => password,
270
+ # "includeSystem" => includeSystem,
271
+ # "endpoint" => endpoint,
272
+ # "initialSyncMaxWaitTime" => initialSyncMaxWaitTime,
273
+ # "database" => database,
274
+ # "verbose" => verbose,
275
+ # "connectTimeout" => connectTimeout,
276
+ # "autoResync" => autoResync,
277
+ # "idleMinWaitTime" => idleMinWaitTime,
278
+ # "requestTimeout" => requestTimeout,
279
+ # "requireFromPresent" => requireFromPresent,
280
+ # "idleMaxWaitTime" => idleMaxWaitTime,
281
+ # "restrictType" => restrictType,
282
+ # "maxConnectRetries" => maxConnectRetries,
283
+ # "autoStart" => autoStart,
284
+ # "adaptivePolling" => adaptivePolling,
285
+ # "connectionRetryWaitTime" => connectionRetryWaitTime,
286
+ # "restrictCollections" => restrictCollections,
287
+ # "autoResyncRetries" => autoResyncRetries,
288
+ # "chunkSize" => chunkSize
289
+ # }.delete_if{|k,v| v.nil?}
290
+ # request = @@request.merge({ :body => body.to_json })
291
+ # result = self.class.put("/_db/#{database}/_api/replication/applier-config", request)
292
+ # self.class.return_result result: result
293
+ # end
294
+ # alias modifyReplication modifyConfigurationReplication
295
+ #
296
+ # def startReplication(from: nil) # TESTED
297
+ # query = {from: from}.delete_if{|k,v| v.nil?}
298
+ # request = @@request.merge({ :query => query })
299
+ # result = self.class.put("/_db/#{@database}/_api/replication/applier-start", request)
300
+ # self.class.return_result result: result
301
+ # end
302
+ #
303
+ # def stopReplication # TESTED
304
+ # result = self.class.put("/_db/#{@database}/_api/replication/applier-stop", @@request)
305
+ # self.class.return_result result: result
306
+ # end
307
+ #
308
+ # def stateReplication # TESTED
309
+ # result = self.class.get("/_db/#{@database}/_api/replication/applier-state", @@request)
310
+ # self.class.return_result result: result
311
+ # end
312
+ #
313
+ # def enslave(endpoint:, username:, password:, database: @database, includeSystem: true, verbose: false, connectTimeout: nil, autoResync: nil, idleMinWaitTime: nil, requestTimeout: nil, requireFromPresent: nil, idleMaxWaitTime: nil, restrictCollections: nil, restrictType: nil, initialSyncMaxWaitTime: nil, maxConnectRetries: nil, adaptivePolling: nil, connectionRetryWaitTime: nil, autoResyncRetries: nil, chunkSize: nil) # TESTED
314
+ # body = {
315
+ # "username" => username,
316
+ # "password" => password,
317
+ # "includeSystem" => includeSystem,
318
+ # "endpoint" => endpoint,
319
+ # "initialSyncMaxWaitTime" => initialSyncMaxWaitTime,
320
+ # "database" => database,
321
+ # "verbose" => verbose,
322
+ # "connectTimeout" => connectTimeout,
323
+ # "autoResync" => autoResync,
324
+ # "idleMinWaitTime" => idleMinWaitTime,
325
+ # "requestTimeout" => requestTimeout,
326
+ # "requireFromPresent" => requireFromPresent,
327
+ # "idleMaxWaitTime" => idleMaxWaitTime,
328
+ # "restrictType" => restrictType,
329
+ # "maxConnectRetries" => maxConnectRetries,
330
+ # "adaptivePolling" => adaptivePolling,
331
+ # "connectionRetryWaitTime" => connectionRetryWaitTime,
332
+ # "restrictCollections" => restrictCollections,
333
+ # "autoResyncRetries" => autoResyncRetries,
334
+ # "chunkSize" => chunkSize
335
+ # }.delete_if{|k,v| v.nil?}
336
+ # request = @@request.merge({ :body => body.to_json })
337
+ # result = self.class.put("/_db/#{@database}/_api/replication/make-slave", request)
338
+ # self.class.return_result result: result
339
+ # end
340
+ #
341
+ # def serverId # TESTED
342
+ # result = self.class.get("/_db/#{@database}/_api/replication/server-id", @@request)
343
+ # self.class.return_result result: result, key: "serverId"
344
+ # end
345
+
346
+ # === USER ===
347
+
348
+ def grant(user: @@user) # TESTED
349
+ user = user.user if user.is_a?(ArangoUser)
350
+ body = { "grant" => "rw" }.to_json
351
+ request = @@request.merge({ :body => body })
352
+ result = self.class.put("/_api/user/#{user}/database/#{@database}", request)
353
+ self.class.return_result result: result, caseTrue: true
354
+ end
355
+
356
+ def revoke(user: @@user) # TESTED
357
+ user = user.user if user.is_a?(ArangoUser)
358
+ body = { "grant" => "none" }.to_json
359
+ request = @@request.merge({ :body => body })
360
+ result = self.class.put("/_api/user/#{user}/database/#{@database}", request)
361
+ self.class.return_result result: result, caseTrue: true
362
+ end
363
+ end