arangorb3 0.0.10
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 +7 -0
- data/ArangoRB.gemspec +21 -0
- data/Gemfile +11 -0
- data/LICENSE +21 -0
- data/README.md +1104 -0
- data/lib/AQL.rb +155 -0
- data/lib/Batch.rb +97 -0
- data/lib/Cache.rb +71 -0
- data/lib/Collection.rb +852 -0
- data/lib/Database.rb +417 -0
- data/lib/Document.rb +346 -0
- data/lib/Edge.rb +104 -0
- data/lib/Error.rb +125 -0
- data/lib/Foxx.rb +277 -0
- data/lib/Graph.rb +325 -0
- data/lib/Index.rb +126 -0
- data/lib/Replication.rb +237 -0
- data/lib/Request.rb +143 -0
- data/lib/Server.rb +486 -0
- data/lib/Task.rb +120 -0
- data/lib/Transaction.rb +115 -0
- data/lib/Traversal.rb +224 -0
- data/lib/User.rb +197 -0
- data/lib/Vertex.rb +127 -0
- data/lib/View.rb +151 -0
- data/lib/arangorb.rb +25 -0
- data/lib/helpers/Error.rb +28 -0
- data/lib/helpers/Return.rb +53 -0
- metadata +142 -0
data/lib/AQL.rb
ADDED
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
# === AQL ===
|
|
2
|
+
|
|
3
|
+
module Arango
|
|
4
|
+
class AQL
|
|
5
|
+
include Arango::Helper_Error
|
|
6
|
+
include Arango::Helper_Return
|
|
7
|
+
include Arango::Database_Return
|
|
8
|
+
|
|
9
|
+
def initialize(query:, database:, count: nil, batchSize: nil, cache: nil,
|
|
10
|
+
memoryLimit: nil, ttl: nil, bindVars: nil, failOnWarning: nil,
|
|
11
|
+
profile: nil, maxTransactionSize: nil, skipInaccessibleCollections: nil,
|
|
12
|
+
maxWarningCount: nil, intermediateCommitCount: nil,
|
|
13
|
+
satelliteSyncWait: nil, fullCount: nil, intermediateCommitSize: nil,
|
|
14
|
+
optimizer_rules: nil, maxPlans: nil)
|
|
15
|
+
satisfy_class?(query, [String])
|
|
16
|
+
@query = query
|
|
17
|
+
assign_database(database)
|
|
18
|
+
|
|
19
|
+
@count = count
|
|
20
|
+
@batchSize = batchSize
|
|
21
|
+
@cache = cache
|
|
22
|
+
@memoryLimit = memoryLimit
|
|
23
|
+
@ttl = ttl
|
|
24
|
+
@bindVars = bindVars
|
|
25
|
+
|
|
26
|
+
@quantity = nil
|
|
27
|
+
@hasMore = false
|
|
28
|
+
@id = ""
|
|
29
|
+
@result = []
|
|
30
|
+
@options = {}
|
|
31
|
+
# DEFINE
|
|
32
|
+
["failOnWarning", "profile", "maxTransactionSize",
|
|
33
|
+
"skipInaccessibleCollections", "maxWarningCount", "intermediateCommitCount",
|
|
34
|
+
"satelliteSyncWait", "fullCount", "intermediateCommitSize",
|
|
35
|
+
"optimizer_rules", "maxPlans"].each do |param_name|
|
|
36
|
+
param = eval(param_name)
|
|
37
|
+
set_option(param, param_name)
|
|
38
|
+
define_singleton_method("#{param_name}=") do |value|
|
|
39
|
+
set_option(value, param_name)
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# === DEFINE ===
|
|
45
|
+
|
|
46
|
+
attr_accessor :count, :query, :batchSize, :ttl, :cache, :options, :bindVars, :quantity
|
|
47
|
+
attr_reader :hasMore, :id, :result, :idCache, :failOnWarning, :profile,
|
|
48
|
+
:maxTransactionSize, :skipInaccessibleCollections, :maxWarningCount,
|
|
49
|
+
:intermediateCommitCount, :satelliteSyncWait, :fullCount, :server, :cached, :extra,
|
|
50
|
+
:intermediateCommitSize, :optimizer_rules, :maxPlans, :database
|
|
51
|
+
alias size batchSize
|
|
52
|
+
alias size= batchSize=
|
|
53
|
+
|
|
54
|
+
def set_option(attrs, name)
|
|
55
|
+
@options ||= {}
|
|
56
|
+
instance_variable_set("@#{name}", attrs)
|
|
57
|
+
unless attrs
|
|
58
|
+
name = "optimizer.rules" if name == "optimizer_rules"
|
|
59
|
+
@options[name] = attrs
|
|
60
|
+
end
|
|
61
|
+
@options.delete_if{|k,v| v.nil?}
|
|
62
|
+
@options = nil if @options.empty?
|
|
63
|
+
end
|
|
64
|
+
private :set_option
|
|
65
|
+
|
|
66
|
+
# === TO HASH ===
|
|
67
|
+
|
|
68
|
+
def to_h
|
|
69
|
+
{
|
|
70
|
+
"query": @query,
|
|
71
|
+
"result": @result,
|
|
72
|
+
"count": @count,
|
|
73
|
+
"quantity": @quantity,
|
|
74
|
+
"ttl": @ttl,
|
|
75
|
+
"cache": @cache,
|
|
76
|
+
"batchSize": @batchSize,
|
|
77
|
+
"bindVars": @bindVars,
|
|
78
|
+
"options": @options,
|
|
79
|
+
"idCache": @idCache,
|
|
80
|
+
"memoryLimit": @memoryLimit,
|
|
81
|
+
"database": @database.name
|
|
82
|
+
}.delete_if{|k,v| v.nil?}
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
# === REQUEST ===
|
|
86
|
+
|
|
87
|
+
def return_aql(result)
|
|
88
|
+
return result if @server.async != false
|
|
89
|
+
@extra = result[:extra]
|
|
90
|
+
@cached = result[:cached]
|
|
91
|
+
@quantity = result[:count]
|
|
92
|
+
@hasMore = result[:hasMore]
|
|
93
|
+
@id = result[:id]
|
|
94
|
+
if(result[:result][0].nil? || !result[:result][0].is_a?(Hash) || !result[:result][0].key?(:_key))
|
|
95
|
+
@result = result[:result]
|
|
96
|
+
else
|
|
97
|
+
@result = result[:result].map do |x|
|
|
98
|
+
collection = Arango::Collection.new(name: x[:_id].split("/")[0], database: @database)
|
|
99
|
+
Arango::Document.new(name: x[:_key], collection: collection, body: x)
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
return return_directly?(result) ? result: self
|
|
103
|
+
end
|
|
104
|
+
private :return_aql
|
|
105
|
+
|
|
106
|
+
# === EXECUTE QUERY ===
|
|
107
|
+
|
|
108
|
+
def execute
|
|
109
|
+
body = {
|
|
110
|
+
"query": @query,
|
|
111
|
+
"count": @count,
|
|
112
|
+
"batchSize": @batchSize,
|
|
113
|
+
"ttl": @ttl,
|
|
114
|
+
"cache": @cache,
|
|
115
|
+
"options": @options,
|
|
116
|
+
"bindVars": @bindVars,
|
|
117
|
+
"memoryLimit": @memoryLimit
|
|
118
|
+
}
|
|
119
|
+
result = @database.request("POST", "_api/cursor", body: body)
|
|
120
|
+
return_aql(result)
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
def next
|
|
124
|
+
if @hasMore
|
|
125
|
+
result = @database.request("PUT", "_api/cursor/#{@id}")
|
|
126
|
+
return_aql(result)
|
|
127
|
+
else
|
|
128
|
+
raise Arango::Error.new err::no_other_aql_next, data: {"hasMore": false}
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
def destroy
|
|
133
|
+
@database.request("DELETE", "_api/cursor/#{@id}")
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
def kill
|
|
137
|
+
@database.request("DELETE", "_api/query/#{@id}")
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
# === PROPERTY QUERY ===
|
|
141
|
+
|
|
142
|
+
def explain
|
|
143
|
+
body = {
|
|
144
|
+
"query": @query,
|
|
145
|
+
"options": @options,
|
|
146
|
+
"bindVars": @bindVars
|
|
147
|
+
}
|
|
148
|
+
@database.request("POST", "_api/explain", body: body)
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
def parse
|
|
152
|
+
@database.request("POST", "_api/query", body: {"query": @query})
|
|
153
|
+
end
|
|
154
|
+
end
|
|
155
|
+
end
|
data/lib/Batch.rb
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
module Arango
|
|
2
|
+
class Batch
|
|
3
|
+
include Arango::Helper_Error
|
|
4
|
+
include Arango::Helper_Return
|
|
5
|
+
include Arango::Server_Return
|
|
6
|
+
|
|
7
|
+
def initialize(server:, boundary: "XboundaryX", queries: [])
|
|
8
|
+
@id = 1
|
|
9
|
+
assign_server(server)
|
|
10
|
+
assign_queries(queries)
|
|
11
|
+
@headers = {
|
|
12
|
+
"Content-Type": "multipart/form-data",
|
|
13
|
+
"boundary": boundary
|
|
14
|
+
}
|
|
15
|
+
@boundary = boundary
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# === DEFINE ===
|
|
19
|
+
|
|
20
|
+
attr_reader :server, :boundary, :queries
|
|
21
|
+
|
|
22
|
+
def boundary=(boundary)
|
|
23
|
+
@boundary = boundary
|
|
24
|
+
@headers[:boundary] = boundary
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def queries=(queries)
|
|
28
|
+
queries = [queries] unless queries.is_a?(Array)
|
|
29
|
+
@queries = {}
|
|
30
|
+
queries.each do |query|
|
|
31
|
+
begin
|
|
32
|
+
query.keys.each do |key|
|
|
33
|
+
query[(key.to_sym rescue key) || key] = query.delete(key)
|
|
34
|
+
end
|
|
35
|
+
rescue
|
|
36
|
+
raise Arango::Error.new(err: :batch_query_not_valid,
|
|
37
|
+
data: {wrong_query: query})
|
|
38
|
+
end
|
|
39
|
+
satisfy_class?(query, [Hash])
|
|
40
|
+
if query[:id].nil?
|
|
41
|
+
query[:id] = @id.to_s
|
|
42
|
+
@id += 1
|
|
43
|
+
end
|
|
44
|
+
@queries[query[:id]] = query
|
|
45
|
+
end
|
|
46
|
+
return @queries
|
|
47
|
+
end
|
|
48
|
+
alias assign_queries queries=
|
|
49
|
+
|
|
50
|
+
# === TO HASH ===
|
|
51
|
+
|
|
52
|
+
def to_h
|
|
53
|
+
{
|
|
54
|
+
"boundary": @boundary,
|
|
55
|
+
"queries": @queries,
|
|
56
|
+
"database": @database.name
|
|
57
|
+
}.delete_if{|k,v| v.nil?}
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# === QUERY ===
|
|
61
|
+
|
|
62
|
+
def addQuery(id: @id, method:, address:, body: nil)
|
|
63
|
+
id = id.to_s
|
|
64
|
+
@queries[id] = {
|
|
65
|
+
"id": id,
|
|
66
|
+
"method": method,
|
|
67
|
+
"address": address,
|
|
68
|
+
"body": body
|
|
69
|
+
}.delete_if{|k,v| v.nil?}
|
|
70
|
+
@id += 1
|
|
71
|
+
return @queries
|
|
72
|
+
end
|
|
73
|
+
alias modifyQuery addQuery
|
|
74
|
+
|
|
75
|
+
def removeQuery(id:)
|
|
76
|
+
@queries.delete(id)
|
|
77
|
+
return @queries
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
# === EXECUTE ===
|
|
81
|
+
|
|
82
|
+
def execute
|
|
83
|
+
body = ""
|
|
84
|
+
@queries.each do |id, query|
|
|
85
|
+
body += "--#{@boundary}\n"
|
|
86
|
+
body += "Content-Type: application/x-arango-batchpart\n"
|
|
87
|
+
body += "Content-Id: #{query[:id]}\n\n"
|
|
88
|
+
body += "#{query[:method]} "
|
|
89
|
+
body += "#{query[:address]} HTTP/1.1\n"
|
|
90
|
+
body += "\n#{Oj.dump(query[:body])}\n" unless query[:body].nil?
|
|
91
|
+
end
|
|
92
|
+
body += "--#{@boundary}--\n" if @queries.length > 0
|
|
93
|
+
@server.request("POST", "_api/batch", body: body, skip_to_json: true,
|
|
94
|
+
headers: @headers, skip_parsing: true)
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
end
|
data/lib/Cache.rb
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
module Arango
|
|
2
|
+
class Cache
|
|
3
|
+
def initialize
|
|
4
|
+
@max = {
|
|
5
|
+
database: 10,
|
|
6
|
+
collection: 20,
|
|
7
|
+
document: 200,
|
|
8
|
+
graph: 10,
|
|
9
|
+
index: 20,
|
|
10
|
+
user: 20,
|
|
11
|
+
task: 20,
|
|
12
|
+
view: 20,
|
|
13
|
+
foxx: 20
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
@cache = {
|
|
17
|
+
database: {},
|
|
18
|
+
collection: {},
|
|
19
|
+
document: {},
|
|
20
|
+
graph: {},
|
|
21
|
+
index: {},
|
|
22
|
+
aql: {},
|
|
23
|
+
user: {},
|
|
24
|
+
task: {},
|
|
25
|
+
view: {},
|
|
26
|
+
foxx: {}
|
|
27
|
+
}
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
attr_reader :cache, :max
|
|
31
|
+
|
|
32
|
+
def to_h
|
|
33
|
+
hash = {
|
|
34
|
+
"max": @max,
|
|
35
|
+
"cache": {}
|
|
36
|
+
}
|
|
37
|
+
@cache.each do |key, hash2|
|
|
38
|
+
next if hash2.empty?
|
|
39
|
+
hash[:cache][key] = hash2.keys
|
|
40
|
+
end
|
|
41
|
+
hash
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def save(type, id, obj)
|
|
45
|
+
while @cache[type].length >= @max[type]
|
|
46
|
+
@cache[type].shift
|
|
47
|
+
end
|
|
48
|
+
@cache[type][id] = obj
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def destroy(type, id)
|
|
52
|
+
@cache[type].delete(id)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def clear
|
|
56
|
+
@cache.each_key{|k| @cache[k] = {}}
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def updateMax(type:, val:)
|
|
60
|
+
type = type.to_sym rescue type = :error
|
|
61
|
+
unless @max.has_key?(type.to_sym)
|
|
62
|
+
ArangoDB::Error.new :element_in_cache_does_not_exist,
|
|
63
|
+
{wrong_attribute: :type, wrong_value: type}
|
|
64
|
+
end
|
|
65
|
+
while @cache[type].length > val
|
|
66
|
+
@cache[type].shift
|
|
67
|
+
end
|
|
68
|
+
@max[type] = val
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|