orientdb4r 0.2.8 → 0.2.9
Sign up to get free protection for your applications and to get access to all the features.
- data/changelog.txt +7 -1
- data/fstudy/design_v1.dia +0 -0
- data/fstudy/flat_class_perf.rb +13 -3
- data/fstudy/technical_feasibility.rb +7 -2
- data/lib/orientdb4r/client.rb +7 -0
- data/lib/orientdb4r/rest/client.rb +27 -17
- data/lib/orientdb4r/rest/model.rb +2 -1
- data/lib/orientdb4r/rid.rb +50 -0
- data/lib/orientdb4r/version.rb +1 -0
- data/lib/orientdb4r.rb +1 -0
- data/test/test_database.rb +30 -5
- data/test/test_dmo.rb +1 -0
- data/test/test_document_crud.rb +4 -4
- metadata +3 -2
data/changelog.txt
CHANGED
@@ -3,7 +3,13 @@
|
|
3
3
|
- 'rest-client' replaced by 'excon' for HTTP communication with Keep-Alive
|
4
4
|
- introduced support for distributed server
|
5
5
|
|
6
|
-
|
6
|
+
|
7
|
+
0.2.9 /07/07/18
|
8
|
+
- introduced class Rid
|
9
|
+
- added feature Client#delete_database
|
10
|
+
|
11
|
+
|
12
|
+
0.2.8 /07/07/16
|
7
13
|
- changed and stabilized exception handling
|
8
14
|
- added feature Client#create_class(:properties)
|
9
15
|
|
data/fstudy/design_v1.dia
CHANGED
Binary file
|
data/fstudy/flat_class_perf.rb
CHANGED
@@ -3,7 +3,7 @@ require 'study_case'
|
|
3
3
|
# This class tests performance on a simple flat class.
|
4
4
|
class FlatClassPerf < FStudy::Case
|
5
5
|
|
6
|
-
|
6
|
+
def db; 'perf'; end
|
7
7
|
|
8
8
|
def drop
|
9
9
|
client.drop_class 'User'
|
@@ -35,8 +35,18 @@ class FlatClassPerf < FStudy::Case
|
|
35
35
|
end
|
36
36
|
end
|
37
37
|
|
38
|
-
def
|
39
|
-
|
38
|
+
def product
|
39
|
+
1.upto(500000) do |i|
|
40
|
+
Orientdb4r::logger.info "...done: #{i}" if 0 == (i % 100000)
|
41
|
+
name = dg.word
|
42
|
+
type = (rand(3) == 0) ? 'a' : 'b'
|
43
|
+
begin
|
44
|
+
client.command "insert into product cluster #{type} (name,type) values ('#{name}','#{type}')"
|
45
|
+
# client.command "insert into product_simple (name,type) values ('#{name}','#{type}')"
|
46
|
+
rescue Exception => e
|
47
|
+
Orientdb4r::logger.error e
|
48
|
+
end
|
49
|
+
end
|
40
50
|
end
|
41
51
|
|
42
52
|
end
|
@@ -190,7 +190,7 @@ class TechnicalFeasibility < FStudy::Case
|
|
190
190
|
types = [:login, :logout, :likeit, :rated, :saw, :commented]
|
191
191
|
limit = users.size * user_coef
|
192
192
|
1.upto(limit) do |i|
|
193
|
-
puts "... #{i}" if 0 == i % 100000
|
193
|
+
puts "... #{i} #{Time.now - start}" if 0 == i % 100000
|
194
194
|
type = rand(types.size)
|
195
195
|
activity = { '@class' => 'Activity', :type => type, :stamp => (Time.now.to_i - rand(3600*23*30)) }
|
196
196
|
# random distribution of Users (1) & the same communities as user
|
@@ -201,7 +201,12 @@ class TechnicalFeasibility < FStudy::Case
|
|
201
201
|
content = (types[type] == :login or types[type] == :logout) ? nil : contents[rand(contents.size)]
|
202
202
|
activity[content['@class'].downcase] = content[:rid] unless content.nil?
|
203
203
|
|
204
|
-
|
204
|
+
begin
|
205
|
+
client.create_document(activity)
|
206
|
+
rescue Exception => e
|
207
|
+
Orientdb4r::logger.error "problem storing index=#{i}, user=#{user.inspect}"
|
208
|
+
Orientdb4r::logger.error e
|
209
|
+
end
|
205
210
|
end
|
206
211
|
puts "Created Activities: #{limit}, time = #{Time.now - start} [s]"
|
207
212
|
end
|
data/lib/orientdb4r/client.rb
CHANGED
@@ -84,6 +84,13 @@ module Orientdb4r
|
|
84
84
|
end
|
85
85
|
|
86
86
|
|
87
|
+
###
|
88
|
+
# Drops a database.
|
89
|
+
# Requires additional authentication to the server.
|
90
|
+
def delete_database(options)
|
91
|
+
raise NotImplementedError, 'this should be overridden by concrete client'
|
92
|
+
end
|
93
|
+
|
87
94
|
# ---------------------------------------------------------------------- SQL
|
88
95
|
|
89
96
|
###
|
@@ -103,7 +103,7 @@ module Orientdb4r
|
|
103
103
|
def create_database(options) #:nodoc:
|
104
104
|
options_pattern = {
|
105
105
|
:database => :mandatory, :type => 'memory',
|
106
|
-
:user => :optional, :password => :optional
|
106
|
+
:user => :optional, :password => :optional
|
107
107
|
}
|
108
108
|
verify_and_sanitize_options(options, options_pattern)
|
109
109
|
|
@@ -141,6 +141,22 @@ module Orientdb4r
|
|
141
141
|
end
|
142
142
|
|
143
143
|
|
144
|
+
def delete_database(options) #:nodoc:
|
145
|
+
options_pattern = {
|
146
|
+
:database => :mandatory, :user => :optional, :password => :optional
|
147
|
+
}
|
148
|
+
verify_and_sanitize_options(options, options_pattern)
|
149
|
+
|
150
|
+
u = options.include?(:user) ? options[:user] : user
|
151
|
+
p = options.include?(:password) ? options[:password] : password
|
152
|
+
|
153
|
+
# uses one-off request because of additional authentication to the server
|
154
|
+
response = a_node.oo_request :method => :delete, :user => u, :password => p, \
|
155
|
+
:uri => "database/#{options[:database]}"
|
156
|
+
process_response(response)
|
157
|
+
end
|
158
|
+
|
159
|
+
|
144
160
|
# ---------------------------------------------------------------------- SQL
|
145
161
|
|
146
162
|
def query(sql, options=nil) #:nodoc:
|
@@ -212,24 +228,20 @@ module Orientdb4r
|
|
212
228
|
|
213
229
|
# ----------------------------------------------------------------- DOCUMENT
|
214
230
|
|
215
|
-
def create_document(doc)
|
231
|
+
def create_document(doc) #:nodoc:
|
216
232
|
response = a_node.request(:method => :post, :uri => "document/#{@database}", \
|
217
233
|
:content_type => 'application/json', :data => doc.to_json)
|
218
|
-
|
234
|
+
srid = process_response(response) do
|
219
235
|
raise DataError, 'validation problem' if response.body =~ /OValidationException/
|
220
236
|
end
|
221
237
|
|
222
|
-
|
223
|
-
rid
|
238
|
+
Rid.new srid
|
224
239
|
end
|
225
240
|
|
226
241
|
|
227
242
|
def get_document(rid) #:nodoc:
|
228
|
-
|
229
|
-
|
230
|
-
rid = rid[1..-1] if rid.start_with? '#'
|
231
|
-
|
232
|
-
response = a_node.request(:method => :get, :uri => "document/#{@database}/#{rid}")
|
243
|
+
rid = Rid.new(rid) unless rid.is_a? Rid
|
244
|
+
response = a_node.request(:method => :get, :uri => "document/#{@database}/#{rid.unprefixed}")
|
233
245
|
rslt = process_response(response) do
|
234
246
|
raise NotFoundError, 'record not found' if response.body =~ /ORecordNotFoundException/
|
235
247
|
raise NotFoundError, 'record not found' if response.body =~ /Record with id .* was not found/ # why after delete?
|
@@ -245,10 +257,10 @@ module Orientdb4r
|
|
245
257
|
raise ArgumentError, 'document has no RID' if doc.doc_rid.nil?
|
246
258
|
raise ArgumentError, 'document has no version' if doc.doc_version.nil?
|
247
259
|
|
248
|
-
rid = doc.
|
249
|
-
rid
|
260
|
+
rid = doc.doc_rid
|
261
|
+
doc.delete '@rid' # will be not updated
|
250
262
|
|
251
|
-
response = a_node.request(:method => :put, :uri => "document/#{@database}/#{rid}", \
|
263
|
+
response = a_node.request(:method => :put, :uri => "document/#{@database}/#{rid.unprefixed}", \
|
252
264
|
:content_type => 'application/json', :data => doc.to_json)
|
253
265
|
process_response(response) do
|
254
266
|
raise DataError, 'concurrent modification' if response.body =~ /OConcurrentModificationException/
|
@@ -259,11 +271,9 @@ module Orientdb4r
|
|
259
271
|
|
260
272
|
|
261
273
|
def delete_document(rid) #:nodoc:
|
262
|
-
|
263
|
-
# remove the '#' prefix
|
264
|
-
rid = rid[1..-1] if rid.start_with? '#'
|
274
|
+
rid = Rid.new(rid) unless rid.is_a? Rid
|
265
275
|
|
266
|
-
response = a_node.request(:method => :delete, :uri => "document/#{@database}/#{rid}")
|
276
|
+
response = a_node.request(:method => :delete, :uri => "document/#{@database}/#{rid.unprefixed}")
|
267
277
|
process_response(response) do
|
268
278
|
raise NotFoundError, 'record not found' if response.body =~ /ORecordNotFoundException/
|
269
279
|
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module Orientdb4r
|
2
|
+
|
3
|
+
###
|
4
|
+
# This class represents encapsulation of RecordID.
|
5
|
+
class Rid
|
6
|
+
include Utils
|
7
|
+
|
8
|
+
# Format validation regexp.
|
9
|
+
RID_REGEXP_PATTERN = /^#?\d+:\d+$/
|
10
|
+
|
11
|
+
attr_reader :cluster_id, :document_id
|
12
|
+
|
13
|
+
###
|
14
|
+
# Constructor.
|
15
|
+
def initialize(rid)
|
16
|
+
raise ArgumentError, 'RID cannot be blank' if blank? rid
|
17
|
+
raise ArgumentError, 'RID is not String' unless rid.is_a? String
|
18
|
+
raise ArgumentError, "bad RID format, rid=#{rid}" unless rid =~ RID_REGEXP_PATTERN
|
19
|
+
|
20
|
+
rid = rid[1..-1] if rid.start_with? '#'
|
21
|
+
ids = rid.split ':'
|
22
|
+
self.cluster_id = ids[0].to_i
|
23
|
+
self.document_id = ids[1].to_i
|
24
|
+
end
|
25
|
+
|
26
|
+
def cluster_id=(cid)
|
27
|
+
@cluster_id = cid.to_i
|
28
|
+
end
|
29
|
+
|
30
|
+
def document_id=(did)
|
31
|
+
@document_id = did.to_i
|
32
|
+
end
|
33
|
+
|
34
|
+
def to_s
|
35
|
+
"##{cluster_id}:#{document_id}"
|
36
|
+
end
|
37
|
+
|
38
|
+
###
|
39
|
+
# Gets RID's string representation with no prefix.
|
40
|
+
def unprefixed
|
41
|
+
"#{cluster_id}:#{document_id}"
|
42
|
+
end
|
43
|
+
|
44
|
+
def ==(another_rid) #:nodoc:
|
45
|
+
self.cluster_id == another_rid.cluster_id and self.document_id == another_rid.document_id
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
data/lib/orientdb4r/version.rb
CHANGED
@@ -2,6 +2,7 @@ module Orientdb4r
|
|
2
2
|
|
3
3
|
# Version history.
|
4
4
|
VERSION_HISTORY = [
|
5
|
+
['0.2.9', '2012-07-18', "Added feature Client#delete_database, New class Rid"],
|
5
6
|
['0.2.8', '2012-07-16', "New exception handling, added feature Client#create_class(:properties)"],
|
6
7
|
['0.2.7', '2012-07-07', "Added method Client#class_exists?"],
|
7
8
|
['0.2.6', '2012-07-03', "BF #8, BF #6"],
|
data/lib/orientdb4r.rb
CHANGED
@@ -11,6 +11,7 @@ module Orientdb4r
|
|
11
11
|
autoload :Utils, 'orientdb4r/utils'
|
12
12
|
autoload :Client, 'orientdb4r/client'
|
13
13
|
autoload :RestClient, 'orientdb4r/rest/client'
|
14
|
+
autoload :Rid, 'orientdb4r/rid'
|
14
15
|
autoload :HashExtension, 'orientdb4r/rest/model'
|
15
16
|
autoload :OClass, 'orientdb4r/rest/model'
|
16
17
|
autoload :ChainedError, 'orientdb4r/chained_error'
|
data/test/test_database.rb
CHANGED
@@ -76,14 +76,16 @@ class TestDatabase < Test::Unit::TestCase
|
|
76
76
|
|
77
77
|
###
|
78
78
|
# CREATE DATABASE
|
79
|
-
# Temporary disabled because of
|
79
|
+
# Temporary disabled because of dependency to password of 'root' account
|
80
80
|
def xtest_create_database
|
81
|
-
|
81
|
+
assert_nothing_thrown do
|
82
|
+
@client.create_database :database => 'UniT', :user => 'root', :password => 'root'
|
83
|
+
end
|
82
84
|
assert_nothing_thrown do
|
83
85
|
@client.get_database :database => 'UniT', :user => 'admin', :password => 'admin'
|
84
86
|
end
|
85
87
|
# creating an existing DB
|
86
|
-
assert_raise Orientdb4r::
|
88
|
+
assert_raise Orientdb4r::ServerError do
|
87
89
|
@client.create_database :database => 'UniT', :user => 'root', :password => 'root'
|
88
90
|
end
|
89
91
|
# insufficient rights
|
@@ -93,8 +95,10 @@ class TestDatabase < Test::Unit::TestCase
|
|
93
95
|
|
94
96
|
# By convention 3 users are always created by default every time you create a new database.
|
95
97
|
# Default users are: admin, reader, writer
|
96
|
-
|
97
|
-
|
98
|
+
assert_nothing_thrown do
|
99
|
+
@client.connect :database => 'UniT', :user => 'admin', :password => 'admin'
|
100
|
+
end
|
101
|
+
@client.delete_database({:database => 'UniT', :user => 'root', :password => 'root'})
|
98
102
|
end
|
99
103
|
|
100
104
|
|
@@ -126,6 +130,27 @@ class TestDatabase < Test::Unit::TestCase
|
|
126
130
|
end
|
127
131
|
|
128
132
|
|
133
|
+
###
|
134
|
+
# DELETE DATABASE
|
135
|
+
# Temporary disabled because of dependency to password of 'root' account
|
136
|
+
def xtest_delete_database
|
137
|
+
@client.create_database :database => 'UniT', :user => 'root', :password => 'root'
|
138
|
+
|
139
|
+
# deleting non-existing DB
|
140
|
+
assert_raise Orientdb4r::ServerError do
|
141
|
+
@client.delete_database :database => 'UniT1', :user => 'root', :password => 'root'
|
142
|
+
end
|
143
|
+
# insufficient rights
|
144
|
+
assert_raise Orientdb4r::OrientdbError do
|
145
|
+
@client.delete_database :database => 'UniT', :user => 'admin', :password => 'admin'
|
146
|
+
end
|
147
|
+
|
148
|
+
assert_nothing_thrown do
|
149
|
+
@client.delete_database({:database => 'UniT', :user => 'root', :password => 'root'})
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
|
129
154
|
###
|
130
155
|
# SERVER info
|
131
156
|
# Temporary disabled because of dependency to password of 'root' account
|
data/test/test_dmo.rb
CHANGED
@@ -77,6 +77,7 @@ class TestDmo < Test::Unit::TestCase
|
|
77
77
|
assert_instance_of Array, entries
|
78
78
|
assert_equal 20, entries.size # 20 is default limit
|
79
79
|
entries.each { |doc| assert doc.kind_of? Orientdb4r::DocumentMetadata }
|
80
|
+
entries.each { |doc| assert_instance_of Orientdb4r::Rid, doc.doc_rid }
|
80
81
|
# limit
|
81
82
|
assert_equal 5, @client.query("SELECT FROM #{CLASS} LIMIT 5").size
|
82
83
|
entries = @client.query "SELECT FROM #{CLASS}", :limit => 100
|
data/test/test_document_crud.rb
CHANGED
@@ -32,7 +32,7 @@ class TestDocumentCrud < Test::Unit::TestCase
|
|
32
32
|
def test_create_document
|
33
33
|
assert_nothing_thrown do @client.create_document( { '@class' => CLASS, 'prop1' => 99, 'prop2' => 'ipsum lorem' }); end
|
34
34
|
rid = @client.create_document({ '@class' => CLASS, 'prop1' => 1, 'prop2' => 'text' })
|
35
|
-
|
35
|
+
assert_instance_of Orientdb4r::Rid, rid
|
36
36
|
|
37
37
|
# no effect if a define the version
|
38
38
|
assert_nothing_thrown do
|
@@ -86,10 +86,10 @@ class TestDocumentCrud < Test::Unit::TestCase
|
|
86
86
|
assert doc.kind_of? Orientdb4r::DocumentMetadata
|
87
87
|
|
88
88
|
# not existing RID
|
89
|
-
rid1 =
|
89
|
+
rid1 = Orientdb4r::Rid.new("#{rid.cluster_id}:#{rid.document_id + 1}") # '#6:0' > '#6:1' or '#6:11' > '#6:12'
|
90
90
|
assert_raise Orientdb4r::NotFoundError do @client.get_document rid1; end
|
91
91
|
# bad RID format
|
92
|
-
assert_raise
|
92
|
+
assert_raise ArgumentError do @client.get_document('xx'); end
|
93
93
|
end
|
94
94
|
|
95
95
|
###
|
@@ -146,7 +146,7 @@ class TestDocumentCrud < Test::Unit::TestCase
|
|
146
146
|
# not existing RID
|
147
147
|
assert_raise Orientdb4r::NotFoundError do @client.delete_document '#4:1111'; end
|
148
148
|
# bad RID format
|
149
|
-
assert_raise
|
149
|
+
assert_raise ArgumentError do @client.delete_document 'xx'; end
|
150
150
|
end
|
151
151
|
|
152
152
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: orientdb4r
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.9
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-07-
|
12
|
+
date: 2012-07-18 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rest-client
|
@@ -59,6 +59,7 @@ files:
|
|
59
59
|
- lib/orientdb4r/rest/model.rb
|
60
60
|
- lib/orientdb4r/rest/node.rb
|
61
61
|
- lib/orientdb4r/rest/restclient_node.rb
|
62
|
+
- lib/orientdb4r/rid.rb
|
62
63
|
- lib/orientdb4r/utils.rb
|
63
64
|
- lib/orientdb4r/version.rb
|
64
65
|
- orientdb4r.gemspec
|