ashikawa-core 0.7.2 → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.coveralls.yml +1 -0
- data/.ruby-version +1 -0
- data/.travis.yml +0 -4
- data/Gemfile +1 -1
- data/Gemfile.devtools +24 -18
- data/README.md +6 -11
- data/ashikawa-core.gemspec +7 -6
- data/config/flay.yml +2 -2
- data/config/flog.yml +2 -1
- data/config/reek.yml +68 -84
- data/config/rubocop.yml +99 -0
- data/config/yardstick.yml +1 -1
- data/lib/ashikawa-core/collection.rb +74 -21
- data/lib/ashikawa-core/configuration.rb +26 -0
- data/lib/ashikawa-core/connection.rb +5 -2
- data/lib/ashikawa-core/cursor.rb +28 -16
- data/lib/ashikawa-core/database.rb +89 -12
- data/lib/ashikawa-core/document.rb +32 -5
- data/lib/ashikawa-core/edge.rb +3 -0
- data/lib/ashikawa-core/exceptions/client_error.rb +3 -3
- data/lib/ashikawa-core/exceptions/server_error.rb +3 -3
- data/lib/ashikawa-core/figure.rb +17 -5
- data/lib/ashikawa-core/index.rb +4 -0
- data/lib/ashikawa-core/key_options.rb +54 -0
- data/lib/ashikawa-core/query.rb +39 -74
- data/lib/ashikawa-core/request_preprocessor.rb +2 -2
- data/lib/ashikawa-core/response_preprocessor.rb +21 -12
- data/lib/ashikawa-core/transaction.rb +113 -0
- data/lib/ashikawa-core/version.rb +1 -1
- data/spec/acceptance/basic_spec.rb +40 -12
- data/spec/acceptance/index_spec.rb +2 -1
- data/spec/acceptance/query_spec.rb +18 -17
- data/spec/acceptance/transactions_spec.rb +30 -0
- data/spec/fixtures/collections/all.json +90 -30
- data/spec/fixtures/cursor/edges.json +23 -0
- data/spec/setup/arangodb.sh +7 -6
- data/spec/unit/collection_spec.rb +89 -13
- data/spec/unit/connection_spec.rb +23 -14
- data/spec/unit/cursor_spec.rb +15 -4
- data/spec/unit/database_spec.rb +58 -17
- data/spec/unit/document_spec.rb +24 -4
- data/spec/unit/edge_spec.rb +1 -1
- data/spec/unit/exception_spec.rb +4 -2
- data/spec/unit/figure_spec.rb +17 -10
- data/spec/unit/index_spec.rb +1 -1
- data/spec/unit/key_options_spec.rb +25 -0
- data/spec/unit/query_spec.rb +1 -1
- data/spec/unit/spec_helper.rb +20 -2
- data/spec/unit/transaction_spec.rb +153 -0
- data/tasks/adjustments.rake +23 -14
- metadata +31 -41
- data/.rvmrc +0 -1
- data/config/roodi.yml +0 -17
- data/spec/spec_helper.rb +0 -27
@@ -1,5 +1,5 @@
|
|
1
1
|
require "faraday"
|
2
|
-
require "
|
2
|
+
require "json"
|
3
3
|
require "ashikawa-core/exceptions/client_error"
|
4
4
|
require "ashikawa-core/exceptions/client_error/resource_not_found"
|
5
5
|
require "ashikawa-core/exceptions/client_error/resource_not_found/index_not_found"
|
@@ -51,10 +51,10 @@ module Ashikawa
|
|
51
51
|
# @api private
|
52
52
|
def resource_not_found_for(env)
|
53
53
|
raise case env[:url].path
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
54
|
+
when /\A\/_api\/document/ then Ashikawa::Core::DocumentNotFoundException
|
55
|
+
when /\A\/_api\/collection/ then Ashikawa::Core::CollectionNotFoundException
|
56
|
+
when /\A\/_api\/index/ then Ashikawa::Core::IndexNotFoundException
|
57
|
+
else Ashikawa::Core::ResourceNotFound
|
58
58
|
end
|
59
59
|
end
|
60
60
|
|
@@ -64,9 +64,9 @@ module Ashikawa
|
|
64
64
|
# @return [Hash] The parsed body
|
65
65
|
# @api private
|
66
66
|
def parse_json(env)
|
67
|
-
raise
|
68
|
-
|
69
|
-
rescue
|
67
|
+
raise JSON::ParserError unless json_content_type?(env[:response_headers]["content-type"])
|
68
|
+
JSON.parse(env[:body])
|
69
|
+
rescue JSON::ParserError
|
70
70
|
raise Ashikawa::Core::JsonError
|
71
71
|
end
|
72
72
|
|
@@ -85,12 +85,11 @@ module Ashikawa
|
|
85
85
|
# @return [nil]
|
86
86
|
# @api private
|
87
87
|
def handle_status(env)
|
88
|
-
|
89
|
-
case status
|
88
|
+
case env[:status]
|
90
89
|
when BadSyntaxStatus then raise Ashikawa::Core::BadSyntax
|
91
90
|
when ResourceNotFoundErrorError then raise resource_not_found_for(env)
|
92
|
-
when ClientErrorStatuses then raise Ashikawa::Core::ClientError,
|
93
|
-
when ServerErrorStatuses then raise Ashikawa::Core::ServerError,
|
91
|
+
when ClientErrorStatuses then raise Ashikawa::Core::ClientError, error(env[:body])
|
92
|
+
when ServerErrorStatuses then raise Ashikawa::Core::ServerError, error(env[:body])
|
94
93
|
end
|
95
94
|
end
|
96
95
|
|
@@ -103,6 +102,16 @@ module Ashikawa
|
|
103
102
|
@logger.info("#{env[:status]} #{env[:body]}")
|
104
103
|
nil
|
105
104
|
end
|
105
|
+
|
106
|
+
# Read the error message for the request
|
107
|
+
#
|
108
|
+
# @param [String] The raw body of the request
|
109
|
+
# @return [String] The formatted error message
|
110
|
+
# @api private
|
111
|
+
def error(body)
|
112
|
+
parsed_body = JSON.parse(body)
|
113
|
+
"#{parsed_body["errorNum"]}: #{parsed_body["errorMessage"]}"
|
114
|
+
end
|
106
115
|
end
|
107
116
|
|
108
117
|
Faraday.register_middleware :response,
|
@@ -0,0 +1,113 @@
|
|
1
|
+
module Ashikawa
|
2
|
+
module Core
|
3
|
+
# A JavaScript Transaction on the database
|
4
|
+
class Transaction
|
5
|
+
# The collections the transaction writes to
|
6
|
+
#
|
7
|
+
# @return [Array<String>]
|
8
|
+
# @api public
|
9
|
+
# @example Get the collections that the transaction writes to
|
10
|
+
# transaction.write_collections # => ["collection_1"]
|
11
|
+
def write_collections
|
12
|
+
@request_parameters[:collections][:write]
|
13
|
+
end
|
14
|
+
|
15
|
+
# The collections the transaction reads from
|
16
|
+
#
|
17
|
+
# @return [Array<String>]
|
18
|
+
# @api public
|
19
|
+
# @example Get the collections that the transaction reads from
|
20
|
+
# transaction.read_collections # => ["collection_1"]
|
21
|
+
def read_collections
|
22
|
+
@request_parameters[:collections][:read]
|
23
|
+
end
|
24
|
+
|
25
|
+
# If set to true, the transaction will write all data to disk before returning
|
26
|
+
#
|
27
|
+
# @return [Boolean]
|
28
|
+
# @api public
|
29
|
+
# @example Check, if the transaction waits for sync
|
30
|
+
# transaction.wait_for_sync #=> false
|
31
|
+
def wait_for_sync
|
32
|
+
@request_parameters[:waitForSync]
|
33
|
+
end
|
34
|
+
|
35
|
+
# If set to true, the transaction will write all data to disk before returning
|
36
|
+
#
|
37
|
+
# @param [Boolean] wait_for_sync
|
38
|
+
# @api public
|
39
|
+
# @example Activate wait sync
|
40
|
+
# transaction.wait_for_sync = true
|
41
|
+
def wait_for_sync=(wait_for_sync)
|
42
|
+
@request_parameters[:waitForSync] = wait_for_sync
|
43
|
+
end
|
44
|
+
|
45
|
+
# An optional numeric value used to set a timeout for waiting on collection locks
|
46
|
+
#
|
47
|
+
# @return [Integer]
|
48
|
+
# @api public
|
49
|
+
# @example Check how long the lock timeout is
|
50
|
+
# transaction.lock_timeout # => 30
|
51
|
+
def lock_timeout
|
52
|
+
@request_parameters[:lockTimeout]
|
53
|
+
end
|
54
|
+
|
55
|
+
# An optional numeric value used to set a timeout for waiting on collection locks
|
56
|
+
#
|
57
|
+
# @param [Integer] lock_timeout
|
58
|
+
# @api public
|
59
|
+
# @example Set the lock timeout to 30
|
60
|
+
# transaction.lock_timeout = 30
|
61
|
+
def lock_timeout=(timeout)
|
62
|
+
@request_parameters[:lockTimeout] = timeout
|
63
|
+
end
|
64
|
+
|
65
|
+
# Initialize a Transaction
|
66
|
+
#
|
67
|
+
# @param [Database] database
|
68
|
+
# @param [String] action An action written in JavaScript
|
69
|
+
# @option options [Array<String>] :write The collections you want to write to
|
70
|
+
# @option options [Array<String>] :read The collections you want to read from
|
71
|
+
# @api public
|
72
|
+
# @example Create a Transaction
|
73
|
+
# transaction = Ashikawa::Core::Transaction.new(database, "function () { return 5; }",
|
74
|
+
# :read => ["collection_1"]
|
75
|
+
def initialize(database, action, options)
|
76
|
+
@database = database
|
77
|
+
@request_parameters = {
|
78
|
+
:action => action,
|
79
|
+
:collections => parse_options(options),
|
80
|
+
:waitForSync => false
|
81
|
+
}
|
82
|
+
end
|
83
|
+
|
84
|
+
# Execute the transaction
|
85
|
+
#
|
86
|
+
# @param [Object] action_params The parameters for the defined action
|
87
|
+
# @return Object The result of the transaction
|
88
|
+
# @api public
|
89
|
+
# @example Run a Transaction
|
90
|
+
# transaction.execute({ :a => 5 })
|
91
|
+
def execute(action_parameters = :no_params_provided)
|
92
|
+
@request_parameters[:params] = action_parameters unless action_parameters == :no_params_provided
|
93
|
+
response = @database.send_request("transaction", :post => @request_parameters)
|
94
|
+
response["result"]
|
95
|
+
end
|
96
|
+
|
97
|
+
private
|
98
|
+
|
99
|
+
# Parse the read and write collections from the options
|
100
|
+
#
|
101
|
+
# @option options [Array<String>] :write The collections you want to write to
|
102
|
+
# @option options [Array<String>] :read The collections you want to read from
|
103
|
+
# @return [Hash]
|
104
|
+
# @api private
|
105
|
+
def parse_options(options)
|
106
|
+
collections = {}
|
107
|
+
collections[:write] = options[:write] if options.has_key? :write
|
108
|
+
collections[:read] = options[:read] if options.has_key? :read
|
109
|
+
collections
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
@@ -38,6 +38,20 @@ describe "Basics" do
|
|
38
38
|
subject["volatile_collection"].volatile?.should be_true
|
39
39
|
end
|
40
40
|
|
41
|
+
it "should create an autoincrementing collection" do
|
42
|
+
subject.create_collection("autoincrement_collection", :is_volatile => true, :key_options => {
|
43
|
+
:type => :autoincrement,
|
44
|
+
:increment => 10,
|
45
|
+
:allow_user_keys => false
|
46
|
+
})
|
47
|
+
key_options = subject["autoincrement_collection"].key_options
|
48
|
+
|
49
|
+
key_options.type.should == "autoincrement"
|
50
|
+
key_options.offset.should == 0
|
51
|
+
key_options.increment.should == 10
|
52
|
+
key_options.allow_user_keys.should == false
|
53
|
+
end
|
54
|
+
|
41
55
|
it "should be possible to create an edge collection" do
|
42
56
|
subject.create_collection("edge_collection", :content_type => :edge)
|
43
57
|
subject["edge_collection"].content_type.should == :edge
|
@@ -55,6 +69,10 @@ describe "Basics" do
|
|
55
69
|
subject[my_collection.id].name.should == "test_collection"
|
56
70
|
end
|
57
71
|
|
72
|
+
it "should be possible to list all system collections" do
|
73
|
+
subject.system_collections.length.should > 0
|
74
|
+
end
|
75
|
+
|
58
76
|
it "should be possible to load and unload collections" do
|
59
77
|
my_collection = subject["test_collection"]
|
60
78
|
my_collection.status.loaded?.should be_true
|
@@ -89,8 +107,8 @@ describe "Basics" do
|
|
89
107
|
it "should be possible to get information about the number of documents" do
|
90
108
|
empty_collection = subject["empty_collection"]
|
91
109
|
empty_collection.length.should == 0
|
92
|
-
empty_collection
|
93
|
-
empty_collection
|
110
|
+
empty_collection.create_document({ :name => "testname", :age => 27})
|
111
|
+
empty_collection.create_document({ :name => "anderer name", :age => 28})
|
94
112
|
empty_collection.length.should == 2
|
95
113
|
empty_collection.truncate!
|
96
114
|
empty_collection.length.should == 0
|
@@ -104,7 +122,7 @@ describe "Basics" do
|
|
104
122
|
document["name"] = "Other Dude"
|
105
123
|
document.save
|
106
124
|
|
107
|
-
collection
|
125
|
+
collection.fetch(document_key)["name"].should == "Other Dude"
|
108
126
|
end
|
109
127
|
|
110
128
|
it "should be possible to access and create documents from a collection" do
|
@@ -112,10 +130,10 @@ describe "Basics" do
|
|
112
130
|
|
113
131
|
document = collection.create_document(:name => "The Dude", :bowling => true)
|
114
132
|
document_key = document.key
|
115
|
-
collection
|
133
|
+
collection.fetch(document_key)["name"].should == "The Dude"
|
116
134
|
|
117
|
-
collection
|
118
|
-
collection
|
135
|
+
collection.replace(document_key, { :name => "Other Dude", :bowling => true })
|
136
|
+
collection.fetch(document_key)["name"].should == "Other Dude"
|
119
137
|
end
|
120
138
|
|
121
139
|
it "should be possible to create an edge between two documents" do
|
@@ -126,7 +144,7 @@ describe "Basics" do
|
|
126
144
|
b = nodes.create_document({:name => "b"})
|
127
145
|
e = edges.create_edge(a, b, {:name => "fance_edge"})
|
128
146
|
|
129
|
-
e = edges
|
147
|
+
e = edges.fetch(e.key)
|
130
148
|
e.from_id.should == a.id
|
131
149
|
e.to_id.should == b.id
|
132
150
|
end
|
@@ -145,22 +163,32 @@ describe "Basics" do
|
|
145
163
|
it "should be possible to manipulate documents and save them" do
|
146
164
|
subject["name"] = "Jeffrey Lebowski"
|
147
165
|
subject["name"].should == "Jeffrey Lebowski"
|
148
|
-
collection
|
166
|
+
collection.fetch(document_key)["name"].should == "The Dude"
|
149
167
|
subject.save
|
150
|
-
collection
|
168
|
+
collection.fetch(document_key)["name"].should == "Jeffrey Lebowski"
|
151
169
|
end
|
152
170
|
|
153
171
|
it "should be possible to delete a document" do
|
154
|
-
collection
|
172
|
+
collection.fetch(document_key).delete
|
155
173
|
expect {
|
156
|
-
collection
|
174
|
+
collection.fetch(document_key)
|
157
175
|
}.to raise_exception Ashikawa::Core::DocumentNotFoundException
|
158
176
|
end
|
159
177
|
|
160
178
|
it "should not be possible to delete a document that doesn't exist" do
|
161
179
|
expect {
|
162
|
-
collection
|
180
|
+
collection.fetch(123).delete
|
163
181
|
}.to raise_exception Ashikawa::Core::DocumentNotFoundException
|
164
182
|
end
|
183
|
+
|
184
|
+
it "should be possible to refresh a document" do
|
185
|
+
changed_document = collection.fetch(document_key)
|
186
|
+
changed_document["name"] = "New Name"
|
187
|
+
changed_document.save
|
188
|
+
|
189
|
+
subject["name"].should == "The Dude"
|
190
|
+
subject.refresh!
|
191
|
+
subject["name"].should == "New Name"
|
192
|
+
end
|
165
193
|
end
|
166
194
|
end
|
@@ -1,7 +1,8 @@
|
|
1
1
|
require 'acceptance/spec_helper'
|
2
2
|
|
3
3
|
describe "Queries" do
|
4
|
-
let(:database) {
|
4
|
+
let(:database) {
|
5
|
+
Ashikawa::Core::Database.new do |config|
|
5
6
|
config.url = ARANGO_HOST
|
6
7
|
end
|
7
8
|
}
|
@@ -12,10 +13,10 @@ describe "Queries" do
|
|
12
13
|
query = "FOR u IN my_collection FILTER u.bowling == true RETURN u"
|
13
14
|
options = { :batch_size => 2, :count => true }
|
14
15
|
|
15
|
-
collection
|
16
|
-
collection
|
17
|
-
collection
|
18
|
-
collection
|
16
|
+
collection.create_document({ "name" => "Jeff Lebowski", "bowling" => true })
|
17
|
+
collection.create_document({ "name" => "Walter Sobchak", "bowling" => true })
|
18
|
+
collection.create_document({ "name" => "Donny Kerabatsos", "bowling" => true })
|
19
|
+
collection.create_document({ "name" => "Jeffrey Lebowski", "bowling" => false })
|
19
20
|
|
20
21
|
names = database.query.execute(query, options).map { |person| person["name"] }
|
21
22
|
names.should include "Jeff Lebowski"
|
@@ -36,36 +37,36 @@ describe "Queries" do
|
|
36
37
|
before(:each) { subject.truncate! }
|
37
38
|
|
38
39
|
it "should return all documents of a collection" do
|
39
|
-
subject
|
40
|
+
subject.create_document({ :name => "testname", :age => 27})
|
40
41
|
subject.query.all.first["name"].should == "testname"
|
41
42
|
end
|
42
43
|
|
43
44
|
it "should be possible to limit and skip results" do
|
44
|
-
subject
|
45
|
-
subject
|
46
|
-
subject
|
45
|
+
subject.create_document({ :name => "test1"})
|
46
|
+
subject.create_document({ :name => "test2"})
|
47
|
+
subject.create_document({ :name => "test3"})
|
47
48
|
|
48
49
|
subject.query.all(:limit => 2).length.should == 2
|
49
50
|
subject.query.all(:skip => 2).length.should == 1
|
50
51
|
end
|
51
52
|
|
52
53
|
it "should be possible to query documents by example" do
|
53
|
-
subject
|
54
|
+
subject.create_document({ "name" => "Random Document" })
|
54
55
|
result = subject.query.by_example :name => "Random Document"
|
55
56
|
result.length.should == 1
|
56
57
|
end
|
57
58
|
|
58
59
|
it "should be possible to query first document by example" do
|
59
|
-
subject
|
60
|
+
subject.create_document({ "name" => "Single Document" })
|
60
61
|
result = subject.query.first_example :name => "Single Document"
|
61
|
-
result.
|
62
|
+
result["name"].should == "Single Document"
|
62
63
|
end
|
63
64
|
|
64
65
|
describe "query by geo coordinates" do
|
65
66
|
before :each do
|
66
67
|
subject.add_index :geo, :on => [:latitude, :longitude]
|
67
|
-
subject
|
68
|
-
subject
|
68
|
+
subject.create_document({ "name" => "cologne", "latitude" => 50.948045, "longitude" => 6.961212 })
|
69
|
+
subject.create_document({ "name" => "san francisco", "latitude" => -122.395899, "longitude" => 37.793621 })
|
69
70
|
end
|
70
71
|
|
71
72
|
it "should be possible to query documents near a certain location" do
|
@@ -83,9 +84,9 @@ describe "Queries" do
|
|
83
84
|
describe "queries by integer ranges" do
|
84
85
|
before :each do
|
85
86
|
subject.add_index :skiplist, :on => [:age]
|
86
|
-
subject
|
87
|
-
subject
|
88
|
-
subject
|
87
|
+
subject.create_document({ "name" => "Georg", "age" => 12 })
|
88
|
+
subject.create_document({ "name" => "Anne", "age" => 21 })
|
89
|
+
subject.create_document({ "name" => "Jens", "age" => 49 })
|
89
90
|
end
|
90
91
|
|
91
92
|
it "should be possible to query documents for numbers in a certain range" do
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'acceptance/spec_helper'
|
2
|
+
|
3
|
+
describe "Transactions" do
|
4
|
+
subject {
|
5
|
+
Ashikawa::Core::Database.new do |config|
|
6
|
+
config.url = ARANGO_HOST
|
7
|
+
end
|
8
|
+
}
|
9
|
+
|
10
|
+
before :each do
|
11
|
+
subject.collections.each { |collection| collection.delete }
|
12
|
+
subject["collection_1"]
|
13
|
+
subject["collection_2"]
|
14
|
+
subject["collection_3"]
|
15
|
+
end
|
16
|
+
|
17
|
+
let(:js_function) { "function (x) { return x.a; }" }
|
18
|
+
|
19
|
+
it "should create and execute a transaction" do
|
20
|
+
transaction = subject.create_transaction(js_function,
|
21
|
+
:write => ["collection_1", "collection_2"],
|
22
|
+
:read => ["collection_3"]
|
23
|
+
)
|
24
|
+
|
25
|
+
transaction.wait_for_sync = true
|
26
|
+
transaction.lock_timeout = 14
|
27
|
+
|
28
|
+
transaction.execute({ :a => 5 }).should == 5
|
29
|
+
end
|
30
|
+
end
|
@@ -1,32 +1,92 @@
|
|
1
1
|
{
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
2
|
+
"collections": [
|
3
|
+
{
|
4
|
+
"name": "example_1",
|
5
|
+
"waitForSync": true,
|
6
|
+
"id": "60768679",
|
7
|
+
"status": 3
|
8
|
+
},
|
9
|
+
{
|
10
|
+
"name": "example_2",
|
11
|
+
"waitForSync": true,
|
12
|
+
"id": "60768669",
|
13
|
+
"status": 3
|
14
|
+
},
|
15
|
+
{
|
16
|
+
"id": "2703783",
|
17
|
+
"name": "_modules",
|
18
|
+
"status": 2,
|
19
|
+
"type": 2
|
20
|
+
},
|
21
|
+
{
|
22
|
+
"id": "7618983",
|
23
|
+
"name": "_aqlfunctions",
|
24
|
+
"status":2,
|
25
|
+
"type":2
|
26
|
+
},
|
27
|
+
{
|
28
|
+
"id": "10699175",
|
29
|
+
"name": "_trx",
|
30
|
+
"status": 2,
|
31
|
+
"type": 2
|
32
|
+
},
|
33
|
+
{
|
34
|
+
"id": "3490215",
|
35
|
+
"name": "_routing",
|
36
|
+
"status": 3,
|
37
|
+
"type": 2
|
38
|
+
},
|
39
|
+
{
|
40
|
+
"id": "1655207",
|
41
|
+
"name": "_graphs",
|
42
|
+
"status": 2,
|
43
|
+
"type": 2
|
44
|
+
}
|
45
|
+
],
|
46
|
+
"code": 200,
|
47
|
+
"error": false,
|
48
|
+
"names": {
|
49
|
+
"example_1": {
|
50
|
+
"name": "example_1",
|
51
|
+
"waitForSync": true,
|
52
|
+
"id": "60768679",
|
53
|
+
"status": 3
|
54
|
+
},
|
55
|
+
"example_2": {
|
56
|
+
"name": "example_2",
|
57
|
+
"waitForSync": true,
|
58
|
+
"id": "60768669",
|
59
|
+
"status": 3
|
60
|
+
},
|
61
|
+
"_modules": {
|
62
|
+
"id": "2703783",
|
63
|
+
"name": "_modules",
|
64
|
+
"status": 2,
|
65
|
+
"type": 2
|
66
|
+
},
|
67
|
+
"_aqlfunctions": {
|
68
|
+
"id": "7618983",
|
69
|
+
"name": "_aqlfunctions",
|
70
|
+
"status": 2,
|
71
|
+
"type": 2
|
72
|
+
},
|
73
|
+
"_trx":{
|
74
|
+
"id": "10699175",
|
75
|
+
"name": "_trx",
|
76
|
+
"status": 2,
|
77
|
+
"type": 2
|
78
|
+
},
|
79
|
+
"_routing":{
|
80
|
+
"id": "3490215",
|
81
|
+
"name": "_routing",
|
82
|
+
"status": 3,
|
83
|
+
"type": 2
|
84
|
+
},
|
85
|
+
"_graphs":{
|
86
|
+
"id": "1655207",
|
87
|
+
"name": "_graphs",
|
88
|
+
"status": 2,
|
89
|
+
"type": 2
|
90
|
+
}
|
91
|
+
}
|
32
92
|
}
|