arangorb 1.2.0 → 1.3.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 (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