arangorb 1.1.0 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- 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:
|