vagas-orientdb4r 0.5.2
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/.coveralls.yml +1 -0
- data/.gitignore +26 -0
- data/.travis.yml +18 -0
- data/Gemfile +9 -0
- data/LICENSE +202 -0
- data/README.rdoc +124 -0
- data/Rakefile +43 -0
- data/changelog.txt +60 -0
- data/ci/initialize-ci.sh +36 -0
- data/fstudy/design_v1.dia +0 -0
- data/fstudy/design_v1.png +0 -0
- data/fstudy/domain_model.dia +0 -0
- data/fstudy/domain_model.png +0 -0
- data/fstudy/flat_class_perf.rb +56 -0
- data/fstudy/sample1_object_diagram.dia +0 -0
- data/fstudy/sample1_object_diagram.png +0 -0
- data/fstudy/study_case.rb +87 -0
- data/fstudy/technical_feasibility.rb +256 -0
- data/lib/orientdb4r.rb +115 -0
- data/lib/orientdb4r/bin/client.rb +86 -0
- data/lib/orientdb4r/bin/connection.rb +29 -0
- data/lib/orientdb4r/bin/constants.rb +20 -0
- data/lib/orientdb4r/bin/io.rb +38 -0
- data/lib/orientdb4r/bin/protocol28.rb +101 -0
- data/lib/orientdb4r/bin/protocol_factory.rb +25 -0
- data/lib/orientdb4r/chained_error.rb +37 -0
- data/lib/orientdb4r/client.rb +364 -0
- data/lib/orientdb4r/load_balancing.rb +113 -0
- data/lib/orientdb4r/node.rb +42 -0
- data/lib/orientdb4r/rest/client.rb +517 -0
- data/lib/orientdb4r/rest/excon_node.rb +115 -0
- data/lib/orientdb4r/rest/model.rb +159 -0
- data/lib/orientdb4r/rest/node.rb +43 -0
- data/lib/orientdb4r/rest/restclient_node.rb +77 -0
- data/lib/orientdb4r/rid.rb +54 -0
- data/lib/orientdb4r/utils.rb +203 -0
- data/lib/orientdb4r/version.rb +39 -0
- data/orientdb4r.gemspec +37 -0
- data/test/bin/test_client.rb +21 -0
- data/test/readme_sample.rb +38 -0
- data/test/test_client.rb +93 -0
- data/test/test_database.rb +261 -0
- data/test/test_ddo.rb +237 -0
- data/test/test_dmo.rb +115 -0
- data/test/test_document_crud.rb +184 -0
- data/test/test_gremlin.rb +52 -0
- data/test/test_helper.rb +10 -0
- data/test/test_loadbalancing.rb +81 -0
- data/test/test_utils.rb +67 -0
- metadata +136 -0
data/test/test_ddo.rb
ADDED
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
###
|
|
4
|
+
# This class tests Data Definition Operarions.
|
|
5
|
+
class TestDdo < Test::Unit::TestCase
|
|
6
|
+
|
|
7
|
+
CLASS = 'testing'
|
|
8
|
+
DB = 'temp'
|
|
9
|
+
|
|
10
|
+
def initialize(params)
|
|
11
|
+
super params
|
|
12
|
+
@client = Orientdb4r.client
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def setup
|
|
16
|
+
@client.connect :database => DB, :user => 'admin', :password => 'admin'
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def teardown
|
|
20
|
+
# remove the testing class after each test
|
|
21
|
+
@client.drop_class(CLASS, :mode => :strict)
|
|
22
|
+
@client.disconnect
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
###
|
|
27
|
+
# GET - Class
|
|
28
|
+
def test_get_class
|
|
29
|
+
assert_nothing_thrown do ouser = @client.get_class 'OUser'; end
|
|
30
|
+
# class does not exist
|
|
31
|
+
assert_raise Orientdb4r::NotFoundError do @client.get_class 'OUserXXX'; end
|
|
32
|
+
|
|
33
|
+
clazz = @client.get_class 'OUser'
|
|
34
|
+
# test OClass
|
|
35
|
+
assert_equal 'OUser', clazz.name
|
|
36
|
+
assert_nothing_thrown do clazz.properties; end
|
|
37
|
+
assert_instance_of Array, clazz.properties
|
|
38
|
+
assert !clazz.properties.empty?
|
|
39
|
+
assert_nothing_thrown do clazz.property(:password); end
|
|
40
|
+
assert_raise ArgumentError do clazz.property(:unknown_prop); end
|
|
41
|
+
assert_equal 'OIdentity', clazz.super_class
|
|
42
|
+
assert_instance_of Array, clazz.clusters
|
|
43
|
+
assert !clazz.clusters.empty?
|
|
44
|
+
assert_not_nil clazz.default_cluster
|
|
45
|
+
assert clazz.kind_of? Orientdb4r::OClass
|
|
46
|
+
assert !clazz.abstract?
|
|
47
|
+
# test Property
|
|
48
|
+
prop = clazz.property :password
|
|
49
|
+
assert_equal 'password', prop.name
|
|
50
|
+
assert_equal 'STRING', prop.type
|
|
51
|
+
assert prop.mandatory
|
|
52
|
+
assert prop.not_null
|
|
53
|
+
assert_nil prop.min
|
|
54
|
+
assert_nil prop.min
|
|
55
|
+
assert prop.kind_of? Orientdb4r::Property
|
|
56
|
+
|
|
57
|
+
assert @client.class_exists?('OUser')
|
|
58
|
+
assert !@client.class_exists?('UnknownClass')
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
###
|
|
63
|
+
# CREATE CLASS
|
|
64
|
+
def test_create_class
|
|
65
|
+
assert !@client.class_exists?(CLASS)
|
|
66
|
+
assert_nothing_thrown do @client.create_class(CLASS); end
|
|
67
|
+
assert @client.class_exists?(CLASS)
|
|
68
|
+
assert_nothing_thrown do @client.get_class(CLASS); end # raises an Error if no class found
|
|
69
|
+
# already exist
|
|
70
|
+
assert_raise Orientdb4r::ServerError do @client.create_class(CLASS); end
|
|
71
|
+
|
|
72
|
+
# create with :force=>true
|
|
73
|
+
assert_nothing_thrown do @client.create_class(CLASS, :force => true); end
|
|
74
|
+
assert_nothing_thrown do @client.get_class(CLASS); end
|
|
75
|
+
|
|
76
|
+
# create ABSTRACT
|
|
77
|
+
ab_class = 'testingAbstr'
|
|
78
|
+
assert_nothing_thrown do @client.create_class(ab_class, :abstract => true); end
|
|
79
|
+
clazz = @client.get_class ab_class
|
|
80
|
+
assert clazz.abstract?
|
|
81
|
+
assert_raise Orientdb4r::ServerError do @client.create_document({ '@class' => ab_class, 'prop1' => 1 }); end
|
|
82
|
+
# clean up
|
|
83
|
+
@client.drop_class(ab_class, :mode => :strict)
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
###
|
|
88
|
+
# CREATE CLASS ... EXTENDS
|
|
89
|
+
def test_create_class_extends
|
|
90
|
+
assert_nothing_thrown do @client.create_class(CLASS, :extends => 'OUser'); end
|
|
91
|
+
assert_nothing_thrown do @client.get_class(CLASS); end
|
|
92
|
+
clazz = @client.get_class(CLASS)
|
|
93
|
+
assert_equal 'OUser', clazz.super_class
|
|
94
|
+
|
|
95
|
+
# bad super class
|
|
96
|
+
assert_raise Orientdb4r::InvalidRequestError do @client.create_class(CLASS, :extends => 'nonExistingSuperClass'); end
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
###
|
|
101
|
+
# DROP TABLE
|
|
102
|
+
def test_drop_class
|
|
103
|
+
super_clazz = "#{CLASS}Sup"
|
|
104
|
+
@client.drop_class(super_clazz); # just to be sure if previous test failed
|
|
105
|
+
@client.create_class(super_clazz);
|
|
106
|
+
@client.create_class(CLASS);
|
|
107
|
+
assert_nothing_thrown do @client.drop_class(CLASS); end
|
|
108
|
+
assert_raise Orientdb4r::NotFoundError do @client.get_class(CLASS); end # no info more
|
|
109
|
+
# the class is not visible in class list delivered by connect
|
|
110
|
+
db_info = @client.get_database
|
|
111
|
+
assert db_info['classes'].select { |i| i.name == CLASS }.empty?
|
|
112
|
+
|
|
113
|
+
# CLASS extends super_class
|
|
114
|
+
@client.create_class(CLASS, :extends => super_clazz);
|
|
115
|
+
assert_raise Orientdb4r::OrientdbError do @client.drop_class(super_clazz, :mode => :strict); end
|
|
116
|
+
assert_nothing_thrown do @client.get_class(super_clazz); end # still there
|
|
117
|
+
@client.drop_class(CLASS);
|
|
118
|
+
assert_nothing_thrown do @client.drop_class(super_clazz, :mode => :strict); end
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
###
|
|
123
|
+
# CREATE PROPERTY
|
|
124
|
+
def test_create_property
|
|
125
|
+
@client.create_class(CLASS)
|
|
126
|
+
assert_nothing_thrown do @client.create_property(CLASS, 'prop1', :integer); end
|
|
127
|
+
clazz = @client.get_class(CLASS)
|
|
128
|
+
assert_equal 'INTEGER', clazz.property(:prop1).type
|
|
129
|
+
assert_nil clazz.property(:prop1).linked_class
|
|
130
|
+
|
|
131
|
+
# already exist
|
|
132
|
+
assert_raise Orientdb4r::ServerError do @client.create_property(CLASS, 'prop1', :integer); end
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
###
|
|
137
|
+
# CREATE PROPERTY (linked-type)
|
|
138
|
+
def test_create_linkedtype
|
|
139
|
+
@client.create_class(CLASS)
|
|
140
|
+
assert_nothing_thrown do @client.create_property(CLASS, 'friends', :linkset, :linked_class => 'OUser'); end
|
|
141
|
+
clazz = @client.get_class(CLASS)
|
|
142
|
+
assert_equal 'LINKSET', clazz.property(:friends).type
|
|
143
|
+
assert_equal 'OUser', clazz.property(:friends).linked_class
|
|
144
|
+
|
|
145
|
+
# unknow linked-class
|
|
146
|
+
assert_raise Orientdb4r::ServerError do
|
|
147
|
+
@client.create_property(CLASS, 'friends2', :linkset, :linked_class => 'UnknownClass')
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
# already exist
|
|
151
|
+
assert_raise Orientdb4r::ServerError do
|
|
152
|
+
@client.create_property(CLASS, 'friends', :linkset, :linked_class => 'OUser');
|
|
153
|
+
end
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
###
|
|
158
|
+
# CREATE CLASS + PROPERTY
|
|
159
|
+
def test_create_class_with_properties
|
|
160
|
+
assert_nothing_thrown do
|
|
161
|
+
@client.create_class(CLASS) do |c|
|
|
162
|
+
c.property 'prop1', :integer
|
|
163
|
+
c.property 'prop2', :string, :mandatory => true, :notnull => true, :readonly => true, :min => 1, :max => 99
|
|
164
|
+
c.link 'user', :linkset, 'OUser', :mandatory => true
|
|
165
|
+
end
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
clazz = @client.get_class(CLASS)
|
|
169
|
+
assert_equal 3, clazz.properties.size
|
|
170
|
+
|
|
171
|
+
prop1 = clazz.property(:prop1)
|
|
172
|
+
assert_equal 'INTEGER', prop1.type
|
|
173
|
+
assert !prop1.mandatory
|
|
174
|
+
assert !prop1.not_null
|
|
175
|
+
assert !prop1.read_only
|
|
176
|
+
assert_nil prop1.min
|
|
177
|
+
assert_nil prop1.max
|
|
178
|
+
assert_nil prop1.linked_class
|
|
179
|
+
|
|
180
|
+
prop2 = clazz.property(:prop2)
|
|
181
|
+
assert_equal 'STRING', prop2.type
|
|
182
|
+
assert prop2.mandatory
|
|
183
|
+
assert prop2.not_null
|
|
184
|
+
assert prop2.read_only
|
|
185
|
+
assert_equal '1', prop2.min
|
|
186
|
+
assert_equal '99', prop2.max
|
|
187
|
+
assert_nil prop2.linked_class
|
|
188
|
+
|
|
189
|
+
user = clazz.property(:user)
|
|
190
|
+
assert_equal 'LINKSET', user.type
|
|
191
|
+
assert user.mandatory
|
|
192
|
+
assert !user.not_null
|
|
193
|
+
assert !user.read_only
|
|
194
|
+
assert_nil user.min
|
|
195
|
+
assert_nil user.max
|
|
196
|
+
assert_equal 'OUser', user.linked_class
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
# properties direct as parametr
|
|
200
|
+
@client.drop_class CLASS
|
|
201
|
+
assert_nothing_thrown do
|
|
202
|
+
@client.create_class(CLASS, :properties => [
|
|
203
|
+
{ :property => 'prop1_q', :type => :integer },
|
|
204
|
+
{ :property => 'prop2_q', :type => :string, :mandatory => true, :notnull => true, :min => 1, :max => 99 },
|
|
205
|
+
{ :property => 'user_q', :type => :linkset, :linked_class => 'OUser', :mandatory => true }
|
|
206
|
+
])
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
clazz = @client.get_class(CLASS)
|
|
210
|
+
assert_equal 3, clazz.properties.size
|
|
211
|
+
|
|
212
|
+
prop1 = clazz.property(:prop1_q)
|
|
213
|
+
assert_equal 'INTEGER', prop1.type
|
|
214
|
+
assert !prop1.mandatory
|
|
215
|
+
assert !prop1.not_null
|
|
216
|
+
assert_nil prop1.min
|
|
217
|
+
assert_nil prop1.max
|
|
218
|
+
assert_nil prop1.linked_class
|
|
219
|
+
|
|
220
|
+
prop2 = clazz.property(:prop2_q)
|
|
221
|
+
assert_equal 'STRING', prop2.type
|
|
222
|
+
assert prop2.mandatory
|
|
223
|
+
assert prop2.not_null
|
|
224
|
+
assert_equal '1', prop2.min
|
|
225
|
+
assert_equal '99', prop2.max
|
|
226
|
+
assert_nil prop2.linked_class
|
|
227
|
+
|
|
228
|
+
user = clazz.property(:user_q)
|
|
229
|
+
assert_equal 'LINKSET', user.type
|
|
230
|
+
assert user.mandatory
|
|
231
|
+
assert !user.not_null
|
|
232
|
+
assert_nil user.min
|
|
233
|
+
assert_nil user.max
|
|
234
|
+
assert_equal 'OUser', user.linked_class
|
|
235
|
+
end
|
|
236
|
+
|
|
237
|
+
end
|
data/test/test_dmo.rb
ADDED
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
###
|
|
4
|
+
# This class tests Data Manipulation Operarions.
|
|
5
|
+
class TestDmo < Test::Unit::TestCase
|
|
6
|
+
include Orientdb4r::Utils
|
|
7
|
+
|
|
8
|
+
CLASS = 'testing'
|
|
9
|
+
DB = 'temp'
|
|
10
|
+
|
|
11
|
+
def setup
|
|
12
|
+
@client = Orientdb4r.client
|
|
13
|
+
@client.connect :database => DB, :user => 'admin', :password => 'admin'
|
|
14
|
+
@client.drop_class(CLASS) # just to be sure if the previous test failed
|
|
15
|
+
@client.create_class(CLASS) do |c|
|
|
16
|
+
c.property 'prop1', :integer
|
|
17
|
+
c.property 'prop2', :string, :mandatory => true, :notnull => :true, :min => 1, :max => 99
|
|
18
|
+
c.link 'friends', :linkset, 'OUser', :mandatory => true
|
|
19
|
+
end
|
|
20
|
+
@admin = @client.query("SELECT FROM OUser WHERE name = 'admin'")[0]
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def teardown
|
|
24
|
+
# remove the testing class after each test
|
|
25
|
+
@client.drop_class(CLASS)
|
|
26
|
+
@client.disconnect
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
###
|
|
31
|
+
# INSERT INTO
|
|
32
|
+
def test_insert
|
|
33
|
+
assert_nothing_thrown do
|
|
34
|
+
1.upto(10) do |i|
|
|
35
|
+
@client.command "INSERT INTO #{CLASS} (prop1, prop2, friends) VALUES (#{i}, '#{random_string}', [#{@admin['@rid']}])"
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
entries = @client.query("SELECT FROM #{CLASS}")
|
|
40
|
+
assert_equal 10, entries.size
|
|
41
|
+
assert_equal 10, entries.select { |e| e if e['prop1'] <= 10 }.size
|
|
42
|
+
assert_equal 10, entries.select { |e| e if e['friends'].size == 1 }.size
|
|
43
|
+
|
|
44
|
+
# insert more users into LINKSET
|
|
45
|
+
urids = @client.query('SELECT FROM OUser').collect { |u| u['@rid'] }
|
|
46
|
+
assert_nothing_thrown do
|
|
47
|
+
@client.command "INSERT INTO #{CLASS} (prop1, prop2, friends) VALUES (1, 'linkset', [#{urids.join(',')}])"
|
|
48
|
+
end
|
|
49
|
+
assert_equal urids.size, @client.query("SELECT FROM #{CLASS} WHERE prop2 = 'linkset'")[0]['friends'].size
|
|
50
|
+
|
|
51
|
+
# table doesn't exist
|
|
52
|
+
assert_raise Orientdb4r::InvalidRequestError do
|
|
53
|
+
@client.command "INSERT INTO #{CLASS}x (prop1, prop2, friends) VALUES (1, 'linkset', [#{urids.join(',')}])"
|
|
54
|
+
end
|
|
55
|
+
# bad syntax
|
|
56
|
+
assert_raise Orientdb4r::ServerError do
|
|
57
|
+
@client.command 'xxx'
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# used for SELECT
|
|
61
|
+
assert_equal @client.query('SELECT FROM OUser'), @client.command('SELECT FROM OUser')['result']
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
###
|
|
66
|
+
# SELECT
|
|
67
|
+
def test_query
|
|
68
|
+
1.upto(25) do |i|
|
|
69
|
+
@client.command "INSERT INTO #{CLASS} (prop1, prop2, friends) VALUES (#{i}, 'string#{i}', [#{@admin['@rid']}])"
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
entries = @client.query("SELECT FROM #{CLASS}")
|
|
73
|
+
assert_not_nil entries
|
|
74
|
+
assert_instance_of Array, entries
|
|
75
|
+
assert_equal 20, entries.size # 20 is default limit
|
|
76
|
+
entries.each { |doc| assert doc.kind_of? Orientdb4r::DocumentMetadata }
|
|
77
|
+
entries.each { |doc| assert_instance_of Orientdb4r::Rid, doc.doc_rid }
|
|
78
|
+
# limit
|
|
79
|
+
assert_equal 5, @client.query("SELECT FROM #{CLASS} LIMIT 5").size
|
|
80
|
+
entries = @client.query "SELECT FROM #{CLASS}", :limit => 100
|
|
81
|
+
assert_equal 25, entries.size
|
|
82
|
+
assert_raise ArgumentError do @client.query "SELECT FROM #{CLASS}", :unknown => 100; end
|
|
83
|
+
|
|
84
|
+
assert_equal 1, @client.query("SELECT FROM #{CLASS} WHERE prop1 = 1").size
|
|
85
|
+
assert_equal 0, @client.query("SELECT FROM #{CLASS} WHERE prop1 = -1").size
|
|
86
|
+
# graph
|
|
87
|
+
rid = @client.query("SELECT FROM #{CLASS} WHERE prop1 = 1")[0]['@rid']
|
|
88
|
+
gr = @client.query("SELECT FROM (TRAVERSE * FROM #{rid})")
|
|
89
|
+
assert_equal 3, gr.size # entries: testing, OUser, ORole
|
|
90
|
+
assert_equal 1, gr.select { |e| e if e['@class'] == CLASS }.size
|
|
91
|
+
assert_equal 1, gr.select { |e| e if e['@class'] == 'OUser' }.size
|
|
92
|
+
assert_equal 1, gr.select { |e| e if e['@class'] == 'ORole' }.size
|
|
93
|
+
|
|
94
|
+
# table doesn't exist
|
|
95
|
+
assert_raise Orientdb4r::InvalidRequestError do
|
|
96
|
+
@client.query 'SELECT FROM OUserX'
|
|
97
|
+
end
|
|
98
|
+
# bad syntax
|
|
99
|
+
assert_raise Orientdb4r::ServerError do
|
|
100
|
+
@client.query 'xxx'
|
|
101
|
+
end
|
|
102
|
+
# record not found in existing cluster
|
|
103
|
+
entries = @client.query 'SELECT FROM #0:1111'
|
|
104
|
+
assert_not_nil entries
|
|
105
|
+
assert_instance_of Array, entries
|
|
106
|
+
assert entries.empty?
|
|
107
|
+
# try to find entry in a non-existing cluster
|
|
108
|
+
assert_raise Orientdb4r::NotFoundError do @client.query 'SELECT FROM #111:1111'; end
|
|
109
|
+
# used for INSERT
|
|
110
|
+
assert_raise Orientdb4r::ServerError do
|
|
111
|
+
@client.query "INSERT INTO #{CLASS} (prop1, prop2, friends) VALUES (0, 'string0', [])"
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
end
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
###
|
|
4
|
+
# This class tests CRUD operarions on document.
|
|
5
|
+
class TestDocumentCrud < Test::Unit::TestCase
|
|
6
|
+
include Orientdb4r::Utils
|
|
7
|
+
|
|
8
|
+
CLASS = 'testing'
|
|
9
|
+
DB = 'temp'
|
|
10
|
+
|
|
11
|
+
def setup
|
|
12
|
+
@client = Orientdb4r.client
|
|
13
|
+
@client.connect :database => DB, :user => 'admin', :password => 'admin'
|
|
14
|
+
@client.create_class(CLASS) do |c|
|
|
15
|
+
c.property 'prop1', :integer, :notnull => :true, :min => 1, :max => 99
|
|
16
|
+
c.property 'prop2', :string, :mandatory => true
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def teardown
|
|
21
|
+
# remove the testing class after each test
|
|
22
|
+
@client.drop_class(CLASS)
|
|
23
|
+
@client.disconnect
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
###
|
|
28
|
+
# CREATE
|
|
29
|
+
def test_create_document
|
|
30
|
+
assert_nothing_thrown do @client.create_document( { '@class' => CLASS, 'prop1' => 99, 'prop2' => 'ipsum lorem' }); end
|
|
31
|
+
doc = @client.create_document({ '@class' => CLASS, 'prop1' => 1, 'prop2' => 'text' })
|
|
32
|
+
assert_instance_of Hash, doc
|
|
33
|
+
assert_not_nil doc.doc_rid
|
|
34
|
+
assert_instance_of Orientdb4r::Rid, doc.doc_rid
|
|
35
|
+
assert_equal CLASS, doc.doc_class
|
|
36
|
+
assert doc.doc_version >= 1 # https://github.com/orientechnologies/orientdb/issues/3656
|
|
37
|
+
|
|
38
|
+
# no effect if a define the version
|
|
39
|
+
# doc = @client.create_document({ '@class' => CLASS, '@version' => 2, 'prop1' => 1, 'prop2' => 'text' })
|
|
40
|
+
# OrientDB bug https://github.com/orientechnologies/orientdb/issues/3657
|
|
41
|
+
# assert_equal 0, doc.doc_version
|
|
42
|
+
|
|
43
|
+
# no effect if an unknown class
|
|
44
|
+
doc = @client.create_document({ '@class' => 'unknown_class', 'a' => 11, 'b' => 'text1' })
|
|
45
|
+
assert_equal 'unknown_class', doc.doc_class
|
|
46
|
+
assert_equal 11, doc['a']
|
|
47
|
+
assert_equal 'text1', doc['b']
|
|
48
|
+
# or missing class
|
|
49
|
+
assert_nothing_thrown do @client.create_document({ 'a' => 1, 'b' => 'text' }); end
|
|
50
|
+
|
|
51
|
+
# no mandatory property
|
|
52
|
+
assert_raise Orientdb4r::DataError do @client.create_document({ '@class' => CLASS, 'prop1' => 1 }); end
|
|
53
|
+
# notNull is null, or lesser/bigger
|
|
54
|
+
assert_raise Orientdb4r::DataError do
|
|
55
|
+
@client.create_document({ '@class' => CLASS, 'prop1' => nil, 'prop2' => 'text' })
|
|
56
|
+
end
|
|
57
|
+
assert_raise Orientdb4r::DataError do
|
|
58
|
+
@client.create_document({ '@class' => CLASS, 'prop1' => 0, 'prop2' => 'text' })
|
|
59
|
+
end
|
|
60
|
+
assert_raise Orientdb4r::DataError do
|
|
61
|
+
@client.create_document({ '@class' => CLASS, 'prop1' => 100, 'prop2' => 'text' })
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
###
|
|
66
|
+
# GET
|
|
67
|
+
def test_get_document
|
|
68
|
+
created = @client.create_document( { '@class' => CLASS, 'prop1' => 1, 'prop2' => 'text' })
|
|
69
|
+
|
|
70
|
+
doc = @client.get_document created.doc_rid
|
|
71
|
+
assert_equal CLASS, doc.doc_class
|
|
72
|
+
assert_equal created.doc_rid, doc.doc_rid
|
|
73
|
+
assert doc.doc_version >= 1 # https://github.com/orientechnologies/orientdb/issues/3657
|
|
74
|
+
assert_equal 'd', doc.doc_type
|
|
75
|
+
assert_equal 1, doc['prop1']
|
|
76
|
+
assert_equal 'text', doc['prop2']
|
|
77
|
+
assert_nil doc['unknown_property']
|
|
78
|
+
assert doc.kind_of? Orientdb4r::DocumentMetadata
|
|
79
|
+
|
|
80
|
+
# not existing RID
|
|
81
|
+
rid1 = Orientdb4r::Rid.new("#{created.doc_rid.cluster_id}:#{created.doc_rid.document_id + 1}") # '#6:0' > '#6:1' or '#6:11' > '#6:12'
|
|
82
|
+
assert_raise Orientdb4r::NotFoundError do @client.get_document rid1; end
|
|
83
|
+
# bad RID format
|
|
84
|
+
assert_raise ArgumentError do @client.get_document('xx'); end
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
###
|
|
88
|
+
# UPDATE
|
|
89
|
+
def test_update_document
|
|
90
|
+
created = @client.create_document( { '@class' => CLASS, 'prop1' => 1, 'prop2' => 'text' })
|
|
91
|
+
doc = @client.get_document created.doc_rid
|
|
92
|
+
|
|
93
|
+
doc['prop1'] = 2
|
|
94
|
+
doc['prop2'] = 'unit'
|
|
95
|
+
assert_nothing_thrown do @client.update_document doc; end
|
|
96
|
+
doc = @client.get_document created.doc_rid
|
|
97
|
+
assert_equal 2, doc['prop1']
|
|
98
|
+
assert_equal 'unit', doc['prop2']
|
|
99
|
+
|
|
100
|
+
# bad version
|
|
101
|
+
doc = @client.get_document created.doc_rid
|
|
102
|
+
doc['prop1'] = 222 # a property has to be changed to server engine sees a difference
|
|
103
|
+
doc['@version'] = 2
|
|
104
|
+
assert_raise Orientdb4r::DataError do @client.update_document doc; end
|
|
105
|
+
|
|
106
|
+
# class cannot be changed
|
|
107
|
+
doc = @client.get_document created.doc_rid
|
|
108
|
+
doc['@class'] = 'OUser'
|
|
109
|
+
assert_nothing_thrown do @client.update_document doc; end
|
|
110
|
+
assert_equal CLASS, @client.get_document(created.doc_rid).doc_class
|
|
111
|
+
|
|
112
|
+
# no mandatory property
|
|
113
|
+
doc = @client.get_document created.doc_rid
|
|
114
|
+
doc.delete 'prop2'
|
|
115
|
+
assert_raise Orientdb4r::DataError do @client.update_document doc; end
|
|
116
|
+
# notNull is null, or lesser/bigger
|
|
117
|
+
doc = @client.get_document created.doc_rid
|
|
118
|
+
doc['prop1'] = nil
|
|
119
|
+
assert_raise Orientdb4r::DataError do @client.update_document doc; end
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
###
|
|
124
|
+
# DELETE
|
|
125
|
+
def test_delete_document
|
|
126
|
+
doc = @client.create_document( { '@class' => CLASS, 'prop1' => 1, 'prop2' => 'text' })
|
|
127
|
+
assert_not_nil doc
|
|
128
|
+
|
|
129
|
+
assert_nothing_thrown do @client.delete_document doc.doc_rid; end
|
|
130
|
+
assert_raise Orientdb4r::NotFoundError do @client.get_document doc.doc_rid; end
|
|
131
|
+
|
|
132
|
+
# already deleted
|
|
133
|
+
assert_raise Orientdb4r::NotFoundError do @client.delete_document doc.doc_rid; end
|
|
134
|
+
|
|
135
|
+
# not existing RID
|
|
136
|
+
assert_raise Orientdb4r::NotFoundError do @client.delete_document '#4:1111'; end
|
|
137
|
+
# bad RID format
|
|
138
|
+
assert_raise ArgumentError do @client.delete_document 'xx'; end
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
#######################
|
|
143
|
+
# BATCH
|
|
144
|
+
#######################
|
|
145
|
+
|
|
146
|
+
def test_batch_ok
|
|
147
|
+
doc = @client.create_document( { '@class' => CLASS, 'prop1' => 1, 'prop2' => 'text' })
|
|
148
|
+
rslt = @client.batch({:transaction => true, :operations => [
|
|
149
|
+
{:type => :c, :record => {'@class' => CLASS, :prop2 => 'foo'}},
|
|
150
|
+
{:type => :d, :record => {'@rid' => doc.doc_rid}}
|
|
151
|
+
]})
|
|
152
|
+
assert_instance_of Hash, rslt
|
|
153
|
+
assert_equal 1, @client.query("SELECT count(*) FROM #{CLASS}")[0]['count']
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
def test_batch_bad_params
|
|
157
|
+
doc = @client.create_document( { '@class' => CLASS, 'prop1' => 1, 'prop2' => 'text' })
|
|
158
|
+
assert_raise Orientdb4r::ServerError do @client.batch(nil); end
|
|
159
|
+
assert_raise Orientdb4r::ServerError do @client.batch({:foo => :baz, :bar => :alfa}); end # bad structure
|
|
160
|
+
assert_raise Orientdb4r::NotFoundError do @client.batch({:operations => [{:type => :d, :record => {'@rid' => '#123:456'}}]}); end # bad cluster
|
|
161
|
+
assert_nothing_thrown do @client.batch({:operations => [{:type => :d, :record => {'@rid' => "##{doc.doc_rid.cluster_id}:678"}}]}); end # bad RID is not problem
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
def test_batch_transaction
|
|
165
|
+
doc = @client.create_document( { '@class' => CLASS, 'prop1' => 1, 'prop2' => 'text' })
|
|
166
|
+
|
|
167
|
+
assert_raise Orientdb4r::ServerError do # will fail on update => tx on => create must be rollbacked
|
|
168
|
+
rslt = @client.batch({:transaction => true, :operations => [
|
|
169
|
+
{:type => :c, :record => {'@class' => CLASS, :prop2 => 'foo'}},
|
|
170
|
+
{:type => :u, :record => {'@rid' => doc.doc_rid}},
|
|
171
|
+
]})
|
|
172
|
+
end
|
|
173
|
+
assert_equal 1, @client.query("SELECT count(*) FROM #{CLASS}")[0]['count']
|
|
174
|
+
|
|
175
|
+
assert_raise Orientdb4r::ServerError do # will fail on update => tx off => create must be done
|
|
176
|
+
rslt = @client.batch({:transaction => false, :operations => [
|
|
177
|
+
{:type => :c, :record => {'@class' => CLASS, :prop2 => 'foo'}},
|
|
178
|
+
{:type => :u, :record => {'@rid' => doc.doc_rid}},
|
|
179
|
+
]})
|
|
180
|
+
end
|
|
181
|
+
assert_equal 2, @client.query("SELECT count(*) FROM #{CLASS}")[0]['count']
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
end
|