arangorb 1.1.0 → 1.2.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.
- checksums.yaml +4 -4
- data/ArangoRB.gemspec +2 -2
- data/README.md +64 -18
- data/lib/ArangoRB_AQL.rb +2 -1
- data/lib/ArangoRB_Cache.rb +174 -0
- data/lib/ArangoRB_Col.rb +2 -1
- data/lib/ArangoRB_DB.rb +16 -1
- data/lib/ArangoRB_Doc.rb +3 -1
- data/lib/ArangoRB_Edg.rb +3 -1
- data/lib/ArangoRB_Gra.rb +3 -1
- data/lib/ArangoRB_Index.rb +3 -1
- data/lib/ArangoRB_Task.rb +2 -1
- data/lib/ArangoRB_Tra.rb +10 -1
- data/lib/ArangoRB_Tran.rb +4 -1
- data/lib/ArangoRB_User.rb +2 -1
- data/lib/ArangoRB_Ver.rb +2 -1
- data/lib/arangorb.rb +1 -0
- data/spec/arangoRB_helper.rb +1 -0
- data/spec/lib/1.0.0/arangoS_helper.rb +0 -4
- data/spec/lib/1.1.0/arangoRB_walks_helper.rb +1 -0
- data/spec/lib/1.2.0/arangoCache_helper.rb +66 -0
- data/spec/lib/arangoRB_1.2.0_helper.rb +1 -0
- metadata +7 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b9083016d3d65b87f4f4b039e1b1a8c294e92fb8
|
4
|
+
data.tar.gz: 4edf6c5fb4644ec569172b3e5291b445a4c9945c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3b19660e6341a311663c7106ec0d4665c24afcd9cf5400a8f34ece5467ef95a299bb745a8ee5a64fee181efd92a5d5b367b17525c6dfb44775476c90c7277dbe
|
7
|
+
data.tar.gz: 4e128d0d611404a35591867dce29402c5d24534f4361070fbd105fbac60b7f4a09a4ba3670dff3c380e0c841377420bb5493abb7f01b92105e81429edb398a01
|
data/ArangoRB.gemspec
CHANGED
@@ -4,13 +4,13 @@ require "rake"
|
|
4
4
|
|
5
5
|
Gem::Specification.new do |s|
|
6
6
|
s.name = 'arangorb'
|
7
|
-
s.version = '1.
|
7
|
+
s.version = '1.2.0'
|
8
8
|
s.authors = ['Stefano Martin']
|
9
9
|
s.email = ['stefano@seluxit.com']
|
10
10
|
s.homepage = 'https://github.com/StefanoMartin/ArangoRB'
|
11
11
|
s.license = 'MIT'
|
12
12
|
s.summary = 'A simple ruby client for ArangoDB'
|
13
|
-
s.description = "
|
13
|
+
s.description = "ArangoRB is an experimental Ruby gems based on ArangoDB's HTTP API. ArangoDB is a powerful mixed database based on documents and graphs"
|
14
14
|
s.platform = Gem::Platform::RUBY
|
15
15
|
s.require_paths = ['lib']
|
16
16
|
s.files = FileList['lib/*', 'spec/**/*', 'ArangoRB.gemspec', 'Gemfile', 'LICENSE', 'README.md'].to_a
|
data/README.md
CHANGED
@@ -29,6 +29,7 @@ ArangoRB has the following classes.
|
|
29
29
|
* [ArangoIndex](#ArangoIndex): to manage Indexes
|
30
30
|
* [ArangoTask](#ArangoTask): to manage Tasks
|
31
31
|
* [ArangoTransaction](#ArangoTransaction): to manage Transactions
|
32
|
+
* [ArangoCache](#ArangoCache): to manage a cache on your Computer
|
32
33
|
|
33
34
|
<a name="ArangoServer"></a>
|
34
35
|
## ArangoServer
|
@@ -239,9 +240,9 @@ myDatabase.functions # Obtain an Array with the available functions in the sele
|
|
239
240
|
It is possible to access its Collections and Graphs by their ids.
|
240
241
|
|
241
242
|
``` ruby
|
242
|
-
myDatabase["MyCollection"] # where "MyCollection" is the id of the collection
|
243
|
-
myDatabase.collection("MyCollection")
|
244
|
-
myDatabase.graph("MyGraph")
|
243
|
+
myDatabase["MyCollection"].retrieve # where "MyCollection" is the id of the collection
|
244
|
+
myDatabase.collection("MyCollection").retrieve
|
245
|
+
myDatabase.graph("MyGraph").retrieve
|
245
246
|
```
|
246
247
|
|
247
248
|
|
@@ -281,26 +282,26 @@ myDatabase.functions # Retrieve a list of the available functions
|
|
281
282
|
You can manage the right of a user to access the database.
|
282
283
|
|
283
284
|
``` ruby
|
284
|
-
|
285
|
-
|
285
|
+
myDatabase.grant user: myUser # Grant access to database
|
286
|
+
myDatabase.revoke user: myUser # Revoke access to database
|
286
287
|
```
|
287
288
|
|
288
289
|
### Replication (UNTESTED)
|
289
290
|
|
290
291
|
``` ruby
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
292
|
+
myDatabase.inventory # Returns an overview of collections and their indexes
|
293
|
+
myDatabase.clusterInventory # Return cluster inventory of collections and indexes
|
294
|
+
myDatabase.logger # Return replication logger state
|
295
|
+
myDatabase.loggerFollow # Returns log entries
|
296
|
+
myDatabase.firstTick # Returns the first available tick value
|
297
|
+
myDatabase.rangeTick # Return the tick ranges available in the WAL logfiles
|
298
|
+
myDatabase.sync # Synchronize data from a remote endpoint
|
299
|
+
myDatabase.configurationReplication # Return configuration of replication applier
|
300
|
+
myDatabase.modifyConfigurationReplication # Adjust configuration of replication applier
|
301
|
+
myDatabase.startReplication # Start replication applier
|
302
|
+
myDatabase.stateReplication # State of the replication applier
|
303
|
+
myDatabase.stopReplication # Stop replication applier
|
304
|
+
myDatabase.enslave # Turn the server into a slave of another
|
304
305
|
```
|
305
306
|
|
306
307
|
<a name="ArangoCollection"></a>
|
@@ -819,3 +820,48 @@ ArangoTask.tasks # Retrieve a list of active tasks
|
|
819
820
|
myArangoTask.retrieve # Retrieve a Task
|
820
821
|
myArangoTask.destroy # Delete a Task
|
821
822
|
```
|
823
|
+
|
824
|
+
<a name="ArangoCache"></a>
|
825
|
+
## ArangoCache
|
826
|
+
|
827
|
+
ArangoCache helps you to manage your request to your Database by creating a cache.
|
828
|
+
|
829
|
+
``` ruby
|
830
|
+
myQuery = ArangoAQL.new query: "FOR v,e,p IN 1..6 ANY 'Year/2016' GRAPH 'MyGraph' FILTER p.vertices[1].num == 6 && p.vertices[2].num == 22 && p.vertices[6]._key == '424028e5-e429-4885-b50b-007867208c71' RETURN [p.vertices[4].value, p.vertices[5].data]"
|
831
|
+
myQuery.execute # Heavy computation
|
832
|
+
ArangoCache.cache data: myQuery # Cache these heavy query
|
833
|
+
ArangoCache.uncache data: myQuery # Retrieve cached ArangoAQL with same query request
|
834
|
+
ArangoCache.clear data: myQuery # Free the cache from these three documents
|
835
|
+
ArangoCache.clear type: "AQL" # Delete cache from AQL requests
|
836
|
+
ArangoCache.clear # Clear completely all the cache
|
837
|
+
```
|
838
|
+
|
839
|
+
Alternatively we can save, retrieve and delete multiple values
|
840
|
+
|
841
|
+
``` ruby
|
842
|
+
myQuery = ArangoAQL.new query: "FOR v,e,p IN 1..6 ANY 'Year/2016' GRAPH 'MyGraph' FILTER p.vertices[1].num == 6 && p.vertices[2].num == 22 && p.vertices[6]._key == '424028e5-e429-4885-b50b-007867208c71' RETURN [p.vertices[4].value, p.vertices[5].data]"
|
843
|
+
myQuery2 = ArangoAQL.new query: "FOR u IN Hour FILTER u._key == "2016-10-04T23" RETURN u"
|
844
|
+
myQuery.execute # Heavy computation
|
845
|
+
myQuery2.execute
|
846
|
+
ArangoCache.cache data: [myQuery, myQuery2] # Cache these heavy query
|
847
|
+
ArangoCache.uncache data: [myQuery, myQuery2] # Retrieve cached ArangoAQL
|
848
|
+
ArangoCache.clear data: [myQuery, myQuery2] # Free the cache from these request
|
849
|
+
```
|
850
|
+
|
851
|
+
If we need we can save with personalized ID.
|
852
|
+
|
853
|
+
``` ruby
|
854
|
+
ArangoCache.cache id: ["myFirstQuery", "mySecondQuery"] data: [myQuery, myQuery2] # Cache these heavy query
|
855
|
+
ArangoCache.uncache type: "AQL", id: ["myFirstQuery", "mySecondQuery"] # Retrieve cached ArangoAQL
|
856
|
+
ArangoCache.clear type: "AQL", id: ["myFirstQuery", "mySecondQuery"] # Free the cache from these request
|
857
|
+
```
|
858
|
+
|
859
|
+
The type and the quantity that you can save in the cache are the following: Database: 1, Collection: 20, Document: 200, Graph: 1, Vertex: 50, Edge: 100, Index: 20, AQL: 100, User: 50, Task: 20, Traversal: 20, Transaction: 20, Other: 100. For "Other" we mean all the values that are not included in the other categories.
|
860
|
+
|
861
|
+
To modify these limitations you can use the following command:
|
862
|
+
``` ruby
|
863
|
+
ArangoCache.max type: "Document", val: 100 # Change limits Document
|
864
|
+
```
|
865
|
+
NB: If you insert a max value higher than the quantity of elements in the Cache, then the first elements in excess will be removed from the Cache.
|
866
|
+
|
867
|
+
If the limit of the Cache for one type is reached, then the first element cached of that type will be deleted from the Cache.
|
data/lib/ArangoRB_AQL.rb
CHANGED
@@ -28,10 +28,11 @@ class ArangoAQL < ArangoServer
|
|
28
28
|
@hasMore = false
|
29
29
|
@id = ""
|
30
30
|
@result = []
|
31
|
+
@idCache = "AQL_#{@query}"
|
31
32
|
end
|
32
33
|
|
33
34
|
attr_accessor :query, :batchSize, :ttl, :cache, :options, :bindVars
|
34
|
-
attr_reader :count, :count, :hasMore, :id, :result
|
35
|
+
attr_reader :count, :count, :hasMore, :id, :result, :idCache
|
35
36
|
alias size batchSize
|
36
37
|
alias size= batchSize=
|
37
38
|
|
@@ -0,0 +1,174 @@
|
|
1
|
+
# ==== CACHE ====
|
2
|
+
|
3
|
+
class ArangoCache
|
4
|
+
@max = {
|
5
|
+
"Database" => 1,
|
6
|
+
"Collection" => 20,
|
7
|
+
"Document" => 200,
|
8
|
+
"Graph" => 1,
|
9
|
+
"Vertex" => 50,
|
10
|
+
"Edge" => 100,
|
11
|
+
"Index" => 20,
|
12
|
+
"AQL" => 100,
|
13
|
+
"User" => 50,
|
14
|
+
"Task" => 20,
|
15
|
+
"Traversal" => 20,
|
16
|
+
"Transaction" => 20,
|
17
|
+
"Other" => 100
|
18
|
+
}
|
19
|
+
@cache = {
|
20
|
+
"Database" => {},
|
21
|
+
"Collection" => {},
|
22
|
+
"Document" => {},
|
23
|
+
"Graph" => {},
|
24
|
+
"Vertex" => {},
|
25
|
+
"Edge" => {},
|
26
|
+
"Index" => {},
|
27
|
+
"AQL" => {},
|
28
|
+
"User" => {},
|
29
|
+
"Task" => {},
|
30
|
+
"Traversal" => {},
|
31
|
+
"Transaction" => {},
|
32
|
+
"Other" => {}
|
33
|
+
}
|
34
|
+
|
35
|
+
class << self
|
36
|
+
attr_accessor :max
|
37
|
+
|
38
|
+
def max(type:, val:)
|
39
|
+
return nil if @max[type].nil?
|
40
|
+
while @cache[type].length > val
|
41
|
+
@cache[type].shift
|
42
|
+
end
|
43
|
+
@max[type] = val
|
44
|
+
end
|
45
|
+
|
46
|
+
def retrieve
|
47
|
+
@cache
|
48
|
+
end
|
49
|
+
|
50
|
+
def cache(id: nil, data:)
|
51
|
+
val_to_cache = []
|
52
|
+
data = [data] unless data.is_a? Array
|
53
|
+
|
54
|
+
if id.nil?
|
55
|
+
data.each do |d|
|
56
|
+
type = d.class.to_s
|
57
|
+
type.slice! "Arango"
|
58
|
+
if @max[type].nil?
|
59
|
+
type = "Other"
|
60
|
+
idCache = "OTH_#{d.class.to_s}_#{Random.rand(10^12)}"
|
61
|
+
else
|
62
|
+
idCache = d.idCache
|
63
|
+
end
|
64
|
+
val_to_cache << [type, idCache, d]
|
65
|
+
end
|
66
|
+
else
|
67
|
+
id = [id] unless id.is_a? Array
|
68
|
+
if data.length == id.length
|
69
|
+
for i in 0...id.length
|
70
|
+
type = data[i].class.to_s
|
71
|
+
type.slice! "Arango"
|
72
|
+
type = "Other" if @max[type].nil?
|
73
|
+
val_to_cache << [type, id[i], data[i]]
|
74
|
+
end
|
75
|
+
else
|
76
|
+
return "Id should be a String or an Array with the same size of the Data Array"
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
val_to_cache.each do |val|
|
81
|
+
@cache[val[0]][val[1]] = val[2]
|
82
|
+
@cache[val[0]].shift if @cache[val[0]].length > @max[val[0]]
|
83
|
+
end
|
84
|
+
|
85
|
+
val_to_cache
|
86
|
+
end
|
87
|
+
|
88
|
+
def uncache(type: nil, id: nil, data: nil)
|
89
|
+
if id.nil? && data.nil? && !type.nil?
|
90
|
+
val_to_uncache = @cache[type].map{|k,v| v}
|
91
|
+
val_to_uncache = val_to_uncache[0] if val_to_uncache.length == 1
|
92
|
+
return val_to_uncache
|
93
|
+
end
|
94
|
+
|
95
|
+
val_to_uncache = []
|
96
|
+
unless data.nil?
|
97
|
+
data = [data] unless data.is_a? Array
|
98
|
+
data.each do |d|
|
99
|
+
type = d.class.to_s
|
100
|
+
type.slice! "Arango"
|
101
|
+
next if @max[type].nil? || type == "Other"
|
102
|
+
idCache = d.idCache
|
103
|
+
val_to_uncache << [type, idCache]
|
104
|
+
end
|
105
|
+
end
|
106
|
+
unless type.nil? || id.nil?
|
107
|
+
id = [id] unless id.is_a? Array
|
108
|
+
if type.is_a? Array
|
109
|
+
if type.length == id.length
|
110
|
+
for i in 0...type.length
|
111
|
+
val_to_uncache << [type[i], id[i]]
|
112
|
+
end
|
113
|
+
else
|
114
|
+
return "Type should be a String or an Array with the same size of the Id Array"
|
115
|
+
end
|
116
|
+
elsif type.is_a? String
|
117
|
+
id.each do |idCache|
|
118
|
+
val_to_uncache << [type, idCache]
|
119
|
+
end
|
120
|
+
else
|
121
|
+
return "Type should be a String or an Array with the same size of the Id Array"
|
122
|
+
end
|
123
|
+
end
|
124
|
+
val_to_uncache = val_to_uncache.map{|val| @cache[val[0]][val[1]]}
|
125
|
+
val_to_uncache = val_to_uncache[0] if val_to_uncache.length == 1
|
126
|
+
val_to_uncache
|
127
|
+
end
|
128
|
+
|
129
|
+
def clear(type: nil, id: nil, data: nil)
|
130
|
+
if type.nil? && id.nil? && data.nil?
|
131
|
+
@cache = { "Database" => {}, "Collection" => {}, "Document" => {}, "Graph" => {}, "Vertex" => {}, "Edge" => {}, "Index" => {}, "Query" => {},"User" => {}, "Traversal" => {}, "Transaction" => {} }
|
132
|
+
return true
|
133
|
+
end
|
134
|
+
|
135
|
+
if !type.nil? && id.nil? && data.nil?
|
136
|
+
@cache[type] = {}
|
137
|
+
return true
|
138
|
+
end
|
139
|
+
|
140
|
+
val_to_clear = []
|
141
|
+
unless data.nil?
|
142
|
+
data = [data] unless data.is_a? Array
|
143
|
+
data.each do |d|
|
144
|
+
type = d.class.to_s
|
145
|
+
type.slice! "Arango"
|
146
|
+
next if @max[type].nil? || type == "Other"
|
147
|
+
val_to_clear << [type, d.idCache]
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
unless type.nil? || id.nil?
|
152
|
+
id = [id] unless id.is_a? Array
|
153
|
+
if type.is_a? Array
|
154
|
+
if type.length == id.length
|
155
|
+
for i in 0...type.length
|
156
|
+
val_to_clear << [type[i], id[i]]
|
157
|
+
end
|
158
|
+
else
|
159
|
+
return "Type should be a String or an Array with the same size of the Id Array"
|
160
|
+
end
|
161
|
+
elsif type.is_a? String
|
162
|
+
id.each do |idCache|
|
163
|
+
val_to_clear << [type, idCache]
|
164
|
+
end
|
165
|
+
else
|
166
|
+
return "Type should be a String or an Array with the same size of the Id Array"
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
val_to_clear.each{|val| @cache[val[0]].delete(val[1])}
|
171
|
+
true
|
172
|
+
end
|
173
|
+
end
|
174
|
+
end
|
data/lib/ArangoRB_Col.rb
CHANGED
@@ -34,9 +34,10 @@ class ArangoCollection < ArangoServer
|
|
34
34
|
@body["type"] = 3
|
35
35
|
end
|
36
36
|
end
|
37
|
+
@idCache = "COL_#{@collection}"
|
37
38
|
end
|
38
39
|
|
39
|
-
attr_reader :collection, :body, :type
|
40
|
+
attr_reader :collection, :body, :type, :idCache
|
40
41
|
alias name collection
|
41
42
|
|
42
43
|
# === RETRIEVE ===
|
data/lib/ArangoRB_DB.rb
CHANGED
@@ -1,6 +1,10 @@
|
|
1
1
|
# === DATABASE ===
|
2
2
|
|
3
3
|
class ArangoDatabase < ArangoServer
|
4
|
+
@isSystem = false
|
5
|
+
@path = nil
|
6
|
+
@id = nil
|
7
|
+
|
4
8
|
def initialize(database: @@database) # TESTED
|
5
9
|
if database.is_a?(String)
|
6
10
|
@database = database
|
@@ -9,9 +13,10 @@ class ArangoDatabase < ArangoServer
|
|
9
13
|
else
|
10
14
|
raise "database should be a String or an ArangoDatabase instance, not a #{database.class}"
|
11
15
|
end
|
16
|
+
@idCache = "DB_#{@database}"
|
12
17
|
end
|
13
18
|
|
14
|
-
attr_reader :database # TESTED
|
19
|
+
attr_reader :database, :isSystem, :path, :id, :idCache # TESTED
|
15
20
|
alias name database
|
16
21
|
|
17
22
|
# === RETRIEVE ===
|
@@ -34,6 +39,16 @@ class ArangoDatabase < ArangoServer
|
|
34
39
|
@@verbose ? result : result["error"] ? result["errorMessage"] : result["result"].delete_if{|k,v| k == "error" || k == "code"}
|
35
40
|
end
|
36
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
|
+
|
37
52
|
# === POST ===
|
38
53
|
|
39
54
|
def create(username: nil, passwd: nil, users: nil) # TESTED
|
data/lib/ArangoRB_Doc.rb
CHANGED
@@ -54,9 +54,11 @@ class ArangoDocument < ArangoServer
|
|
54
54
|
else
|
55
55
|
raise "to should be a String or an ArangoDocument instance, not a #{to.class}"
|
56
56
|
end
|
57
|
+
|
58
|
+
@idCache = "DOC_#{@id}"
|
57
59
|
end
|
58
60
|
|
59
|
-
attr_reader :key, :id, :body
|
61
|
+
attr_reader :key, :id, :body, :idCache
|
60
62
|
alias name key
|
61
63
|
|
62
64
|
# === RETRIEVE ===
|
data/lib/ArangoRB_Edg.rb
CHANGED
@@ -62,9 +62,11 @@ class ArangoEdge < ArangoDocument
|
|
62
62
|
else
|
63
63
|
raise "to should be a String or an ArangoDocument instance, not a #{to.class}"
|
64
64
|
end
|
65
|
+
|
66
|
+
@idCache = "EDG_#{@id}"
|
65
67
|
end
|
66
68
|
|
67
|
-
attr_reader :key, :id, :body
|
69
|
+
attr_reader :key, :id, :body, :idCache
|
68
70
|
|
69
71
|
# === RETRIEVE ===
|
70
72
|
|
data/lib/ArangoRB_Gra.rb
CHANGED
@@ -29,9 +29,11 @@ class ArangoGraph < ArangoServer
|
|
29
29
|
else
|
30
30
|
raise "orphanCollections should be an Array, not a #{orphanCollections.class}"
|
31
31
|
end
|
32
|
+
|
33
|
+
@idCache = "GRA_#{@graph}"
|
32
34
|
end
|
33
35
|
|
34
|
-
attr_reader :graph, :edgeDefinitions, :orphanCollections, :database
|
36
|
+
attr_reader :graph, :edgeDefinitions, :orphanCollections, :database, :idCache
|
35
37
|
alias name graph
|
36
38
|
|
37
39
|
# === RETRIEVE ===
|
data/lib/ArangoRB_Index.rb
CHANGED
@@ -39,9 +39,11 @@ class ArangoIndex < ArangoServer
|
|
39
39
|
else
|
40
40
|
raise "fields should be a String or an Array, not a #{database.class}"
|
41
41
|
end
|
42
|
+
|
43
|
+
@idCache = "IND_#{@id}"
|
42
44
|
end
|
43
45
|
|
44
|
-
attr_reader :body, :type, :id, :unique, :fields, :key, :sparse
|
46
|
+
attr_reader :body, :type, :id, :unique, :fields, :key, :sparse, :idCache
|
45
47
|
|
46
48
|
### RETRIEVE ###
|
47
49
|
|
data/lib/ArangoRB_Task.rb
CHANGED
@@ -16,9 +16,10 @@ class ArangoTask < ArangoServer
|
|
16
16
|
@command = command
|
17
17
|
@params = params
|
18
18
|
@created = created
|
19
|
+
@idCache = "IND_#{@id}"
|
19
20
|
end
|
20
21
|
|
21
|
-
attr_reader :id, :name, :type, :period, :created, :command, :params
|
22
|
+
attr_reader :id, :name, :type, :period, :created, :command, :params, :idCache
|
22
23
|
|
23
24
|
def database
|
24
25
|
ArangoDatabase.new(database: @database)
|
data/lib/ArangoRB_Tra.rb
CHANGED
@@ -21,9 +21,11 @@ class ArangoTraversal < ArangoServer
|
|
21
21
|
@database = database
|
22
22
|
@vertices = nil
|
23
23
|
@paths = nil
|
24
|
+
@idCache = "ATR_#{@database}_#{@direction}_#{@startVertex}_" + (@graphName.nil? ? "#{@edgeCollection}" : "#{@graphName}")
|
24
25
|
end
|
25
26
|
|
26
|
-
attr_accessor :sort, :direction, :maxDepth, :minDepth, :visitor, :itemOrder, :strategy, :filter, :init, :maxiterations, :uniqueness, :order, :expander
|
27
|
+
attr_accessor :sort, :direction, :maxDepth, :minDepth, :visitor, :itemOrder, :strategy, :filter, :init, :maxiterations, :uniqueness, :order, :expander
|
28
|
+
attr_reader :idCache, :vertices, :paths
|
27
29
|
|
28
30
|
### RETRIEVE ###
|
29
31
|
|
@@ -52,6 +54,7 @@ class ArangoTraversal < ArangoServer
|
|
52
54
|
else
|
53
55
|
raise "startVertex should be a String or an ArangoDocument instance, not a #{startVertex.class}"
|
54
56
|
end
|
57
|
+
@idCache = "ATR_#{@database}_#{@direction}_#{@startVertex}_" + (@graphName.nil? ? "#{@edgeCollection}" : "#{@graphName}")
|
55
58
|
end
|
56
59
|
|
57
60
|
def graphName=(graphName) # TESTED
|
@@ -62,6 +65,7 @@ class ArangoTraversal < ArangoServer
|
|
62
65
|
else
|
63
66
|
raise "graphName should be a String or an ArangoGraph instance, not a #{graphName.class}"
|
64
67
|
end
|
68
|
+
@idCache = "ATR_#{@database}_#{@direction}_#{@startVertex}_" + (@graphName.nil? ? "#{@edgeCollection}" : "#{@graphName}")
|
65
69
|
end
|
66
70
|
|
67
71
|
def edgeCollection=(edgeCollection) # TESTED
|
@@ -72,18 +76,22 @@ class ArangoTraversal < ArangoServer
|
|
72
76
|
else
|
73
77
|
raise "edgeCollection should be a String or an ArangoCollection instance, not a #{edgeCollection.class}"
|
74
78
|
end
|
79
|
+
@idCache = "ATR_#{@database}_#{@direction}_#{@startVertex}_" + (@graphName.nil? ? "#{@edgeCollection}" : "#{@graphName}")
|
75
80
|
end
|
76
81
|
|
77
82
|
def in # TESTED
|
78
83
|
@direction = "inbound"
|
84
|
+
@idCache = "ATR_#{@database}_#{@direction}_#{@startVertex}_" + (@graphName.nil? ? "#{@edgeCollection}" : "#{@graphName}")
|
79
85
|
end
|
80
86
|
|
81
87
|
def out # TESTED
|
82
88
|
@direction = "outbound"
|
89
|
+
@idCache = "ATR_#{@database}_#{@direction}_#{@startVertex}_" + (@graphName.nil? ? "#{@edgeCollection}" : "#{@graphName}")
|
83
90
|
end
|
84
91
|
|
85
92
|
def any # TESTED
|
86
93
|
@direction = "any"
|
94
|
+
@idCache = "ATR_#{@database}_#{@direction}_#{@startVertex}_" + (@graphName.nil? ? "#{@edgeCollection}" : "#{@graphName}")
|
87
95
|
end
|
88
96
|
|
89
97
|
alias vertex= startVertex=
|
@@ -128,6 +136,7 @@ class ArangoTraversal < ArangoServer
|
|
128
136
|
"vertices" => x["vertices"].map{|v| ArangoDocument.new(key: v["_key"], collection: v["_id"].split("/")[0], database: @database, body: v )}
|
129
137
|
}
|
130
138
|
}
|
139
|
+
@idCache = "ATR_#{@database}_#{@direction}_#{@startVertex}_" + (@graphName.nil? ? "#{@edgeCollection}" : "#{@graphName}")
|
131
140
|
@@verbose ? result : self
|
132
141
|
end
|
133
142
|
end
|
data/lib/ArangoRB_Tran.rb
CHANGED
@@ -16,9 +16,11 @@ class ArangoTransaction < ArangoServer
|
|
16
16
|
@params = params
|
17
17
|
@lockTimeout = lockTimeout
|
18
18
|
@waitForSync = waitForSync
|
19
|
+
@result = nil
|
20
|
+
@idCache = "AT_#{@database}_#{Random.rand(0..10^12)}"
|
19
21
|
end
|
20
22
|
|
21
|
-
attr_reader :action, :params, :lockTimeout, :waitForSync
|
23
|
+
attr_reader :action, :params, :lockTimeout, :waitForSync, :idCache
|
22
24
|
|
23
25
|
### RETRIEVE ###
|
24
26
|
|
@@ -45,6 +47,7 @@ class ArangoTransaction < ArangoServer
|
|
45
47
|
result = self.class.post("/_db/#{@database}/_api/transaction", request)
|
46
48
|
return result.headers["x-arango-async-id"] if @@async == "store"
|
47
49
|
result = result.parsed_response
|
50
|
+
@result = result["result"] unless result["error"]
|
48
51
|
@@verbose ? result : result["error"] ? {"message": result["errorMessage"], "stacktrace": result["stacktrace"]} : result["result"]
|
49
52
|
end
|
50
53
|
end
|
data/lib/ArangoRB_User.rb
CHANGED
data/lib/ArangoRB_Ver.rb
CHANGED
data/lib/arangorb.rb
CHANGED
data/spec/arangoRB_helper.rb
CHANGED
@@ -0,0 +1,66 @@
|
|
1
|
+
require_relative './../../spec_helper'
|
2
|
+
|
3
|
+
describe ArangoCache do
|
4
|
+
context "#cache" do
|
5
|
+
it "cache" do
|
6
|
+
@myDatabase.retrieve
|
7
|
+
@myCollection.retrieve
|
8
|
+
@myEdgeCollection.retrieve
|
9
|
+
@myGraph.retrieve
|
10
|
+
@myAQL.execute
|
11
|
+
@myVertex.retrieve
|
12
|
+
@myEdge.retrieve
|
13
|
+
@myIndex.retrieve
|
14
|
+
@myUser.retrieve
|
15
|
+
@myTask.retrieve
|
16
|
+
val = ArangoCache.cache data: [@myDatabase, @myCollection, @myEdgeCollection, @myGraph, @myAQL, @myVertex, @myEdge, @myIndex, @myUser, @myTask, [1,2,3]]
|
17
|
+
expect(val.length).to eq 11
|
18
|
+
end
|
19
|
+
|
20
|
+
it "cache with ID" do
|
21
|
+
myAQL2 = ArangoAQL.new query: "FOR u IN MyCollection RETURN u"
|
22
|
+
myAQL2.execute
|
23
|
+
ArangoCache.cache id: "myAQL", data: myAQL2
|
24
|
+
val = ArangoCache.uncache type: "AQL", id: "myAQL"
|
25
|
+
expect(val.result.length).to be > 0
|
26
|
+
end
|
27
|
+
|
28
|
+
it "uncache" do
|
29
|
+
val = ArangoCache.uncache data: [@myCollection, @myVertex]
|
30
|
+
val = val.map{|v| v.class.to_s}
|
31
|
+
expect(val).to eq ["ArangoCollection", "ArangoVertex"]
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
context "#limits" do
|
36
|
+
it "max" do
|
37
|
+
ArangoCache.cache data: @myDoc
|
38
|
+
val = ArangoCache.retrieve["Document"]
|
39
|
+
ArangoCache.max type: "Document", val: 5
|
40
|
+
ArangoCache.retrieve["Document"]
|
41
|
+
ArangoCache.cache data: @myDoc[0]
|
42
|
+
val = ArangoCache.uncache type: "Document"
|
43
|
+
expect(val.length).to eq 5
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
context "#clear" do
|
48
|
+
it "clear object" do
|
49
|
+
ArangoCache.clear data: @myCollection
|
50
|
+
val = ArangoCache.uncache data: @myCollection
|
51
|
+
expect(val.nil?).to be true
|
52
|
+
end
|
53
|
+
|
54
|
+
it "clear type" do
|
55
|
+
ArangoCache.clear type: "Vertex"
|
56
|
+
val = ArangoCache.retrieve
|
57
|
+
expect(val["Vertex"].empty?).to be true
|
58
|
+
end
|
59
|
+
|
60
|
+
it "clear type" do
|
61
|
+
ArangoCache.clear
|
62
|
+
val = ArangoCache.retrieve
|
63
|
+
expect(val["Database"].empty?).to be true
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require "lib/1.2.0/arangoCache_helper"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: arangorb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stefano Martin
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-09-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: httparty
|
@@ -30,8 +30,8 @@ dependencies:
|
|
30
30
|
- - ">="
|
31
31
|
- !ruby/object:Gem::Version
|
32
32
|
version: 0.14.0
|
33
|
-
description:
|
34
|
-
|
33
|
+
description: ArangoRB is an experimental Ruby gems based on ArangoDB's HTTP API. ArangoDB
|
34
|
+
is a powerful mixed database based on documents and graphs
|
35
35
|
email:
|
36
36
|
- stefano@seluxit.com
|
37
37
|
executables: []
|
@@ -43,6 +43,7 @@ files:
|
|
43
43
|
- LICENSE
|
44
44
|
- README.md
|
45
45
|
- lib/ArangoRB_AQL.rb
|
46
|
+
- lib/ArangoRB_Cache.rb
|
46
47
|
- lib/ArangoRB_Col.rb
|
47
48
|
- lib/ArangoRB_DB.rb
|
48
49
|
- lib/ArangoRB_Doc.rb
|
@@ -76,9 +77,11 @@ files:
|
|
76
77
|
- spec/lib/1.0.0/arangoU_helper.rb
|
77
78
|
- spec/lib/1.1.0/arangoRB_helper.rb
|
78
79
|
- spec/lib/1.1.0/arangoRB_walks_helper.rb
|
80
|
+
- spec/lib/1.2.0/arangoCache_helper.rb
|
79
81
|
- spec/lib/arangoRB_0.1.0_helper.rb
|
80
82
|
- spec/lib/arangoRB_1.0.0_helper.rb
|
81
83
|
- spec/lib/arangoRB_1.1.0_helper.rb
|
84
|
+
- spec/lib/arangoRB_1.2.0_helper.rb
|
82
85
|
- spec/spec_helper.rb
|
83
86
|
homepage: https://github.com/StefanoMartin/ArangoRB
|
84
87
|
licenses:
|