orientdb4r 0.2.4 → 0.2.5
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +5 -2
- data/lib/orientdb4r/client.rb +26 -2
- data/lib/orientdb4r/rest/client.rb +63 -45
- data/lib/orientdb4r/utils.rb +12 -6
- data/lib/orientdb4r/version.rb +1 -0
- data/test/graphs.rb +114 -0
- data/test/test_database.rb +21 -0
- metadata +4 -2
data/README.rdoc
CHANGED
@@ -72,12 +72,15 @@ see Wiki page for more sample at https://github.com/veny/orientdb4r/wiki
|
|
72
72
|
Tested on
|
73
73
|
* Ruby 1.9.3
|
74
74
|
* OrientDB 1.0.0
|
75
|
+
* OrientDB 1.1.0-SNAPSHOT r5913+
|
75
76
|
|
76
77
|
== TESTS
|
78
|
+
In order to run the tests you only need to:
|
77
79
|
|
78
|
-
|
80
|
+
cd /path/to/repository
|
81
|
+
rake test
|
79
82
|
|
80
|
-
Start an instance of OrientDB (on localhost with default port and 'admin/admin' account) before running.
|
83
|
+
Start an instance of OrientDB (on localhost with default web port 2480 and 'admin/admin' account) before running.
|
81
84
|
|
82
85
|
== AUTHOR
|
83
86
|
|
data/lib/orientdb4r/client.rb
CHANGED
@@ -16,6 +16,7 @@ module Orientdb4r
|
|
16
16
|
@connected = false
|
17
17
|
end
|
18
18
|
|
19
|
+
|
19
20
|
# --------------------------------------------------------------- CONNECTION
|
20
21
|
|
21
22
|
###
|
@@ -47,6 +48,7 @@ module Orientdb4r
|
|
47
48
|
raise NotImplementedError, 'this should be overridden by concrete client'
|
48
49
|
end
|
49
50
|
|
51
|
+
|
50
52
|
# ----------------------------------------------------------------- DATABASE
|
51
53
|
|
52
54
|
###
|
@@ -59,11 +61,25 @@ module Orientdb4r
|
|
59
61
|
|
60
62
|
|
61
63
|
###
|
62
|
-
#
|
63
|
-
def
|
64
|
+
# Retrieves all the information about a database.
|
65
|
+
def get_database(name)
|
64
66
|
raise NotImplementedError, 'this should be overridden by concrete client'
|
65
67
|
end
|
66
68
|
|
69
|
+
|
70
|
+
###
|
71
|
+
# Checks existence of a given database.
|
72
|
+
def database_exists?(name)
|
73
|
+
rslt = true
|
74
|
+
begin
|
75
|
+
get_database name
|
76
|
+
rescue NotFoundError
|
77
|
+
rslt = false
|
78
|
+
end
|
79
|
+
rslt
|
80
|
+
end
|
81
|
+
|
82
|
+
|
67
83
|
# ---------------------------------------------------------------------- SQL
|
68
84
|
|
69
85
|
###
|
@@ -79,6 +95,7 @@ module Orientdb4r
|
|
79
95
|
raise NotImplementedError, 'this should be overridden by concrete client'
|
80
96
|
end
|
81
97
|
|
98
|
+
|
82
99
|
# -------------------------------------------------------------------- CLASS
|
83
100
|
|
84
101
|
###
|
@@ -111,6 +128,13 @@ module Orientdb4r
|
|
111
128
|
end
|
112
129
|
|
113
130
|
|
131
|
+
###
|
132
|
+
# Gets informations about requested class.
|
133
|
+
def get_class(name)
|
134
|
+
raise NotImplementedError, 'this should be overridden by concrete client'
|
135
|
+
end
|
136
|
+
|
137
|
+
|
114
138
|
###
|
115
139
|
# Removes a class from the schema.
|
116
140
|
def drop_class(name, options={})
|
@@ -6,7 +6,7 @@ module Orientdb4r
|
|
6
6
|
# Name of cookie that represents a session.
|
7
7
|
SESSION_COOKIE_NAME = 'OSESSIONID'
|
8
8
|
|
9
|
-
before [:create_database, :get_class, :query, :command], :assert_connected
|
9
|
+
before [:create_database, :get_database, :get_class, :query, :command], :assert_connected
|
10
10
|
around [:query, :command], :time_around
|
11
11
|
|
12
12
|
attr_reader :host, :port, :ssl, :user, :password, :database, :session_id
|
@@ -22,6 +22,8 @@ module Orientdb4r
|
|
22
22
|
end
|
23
23
|
|
24
24
|
|
25
|
+
# --------------------------------------------------------------- CONNECTION
|
26
|
+
|
25
27
|
def connect(options) #:nodoc:
|
26
28
|
options_pattern = { :database => :mandatory, :user => :mandatory, :password => :mandatory }
|
27
29
|
verify_and_sanitize_options(options, options_pattern)
|
@@ -89,6 +91,26 @@ module Orientdb4r
|
|
89
91
|
end
|
90
92
|
|
91
93
|
|
94
|
+
def server(options={}) #:nodoc:
|
95
|
+
# 'server' does NOT use the RestClient Resource to construct the HTTP request
|
96
|
+
|
97
|
+
options_pattern = { :user => :optional, :password => :optional }
|
98
|
+
verify_options(options, options_pattern)
|
99
|
+
|
100
|
+
u = options.include?(:user) ? options[:user] : user
|
101
|
+
p = options.include?(:password) ? options[:password] : password
|
102
|
+
resource = ::RestClient::Resource.new(url, :user => u, :password => p)
|
103
|
+
begin
|
104
|
+
response = resource['server'].get
|
105
|
+
rescue
|
106
|
+
raise OrientdbError
|
107
|
+
end
|
108
|
+
process_response(response)
|
109
|
+
end
|
110
|
+
|
111
|
+
|
112
|
+
# ----------------------------------------------------------------- DATABASE
|
113
|
+
|
92
114
|
def create_database(options) #:nodoc:
|
93
115
|
options_pattern = {
|
94
116
|
:database => :mandatory, :type => 'memory',
|
@@ -108,6 +130,46 @@ module Orientdb4r
|
|
108
130
|
end
|
109
131
|
|
110
132
|
|
133
|
+
def get_database(name) #:nodoc:
|
134
|
+
begin
|
135
|
+
response = @resource["database/#{name}"].get
|
136
|
+
rescue
|
137
|
+
raise NotFoundError
|
138
|
+
end
|
139
|
+
process_response(response)
|
140
|
+
end
|
141
|
+
|
142
|
+
|
143
|
+
# ---------------------------------------------------------------------- SQL
|
144
|
+
|
145
|
+
def query(sql) #:nodoc:
|
146
|
+
raise ArgumentError, 'query is blank' if blank? sql
|
147
|
+
|
148
|
+
response = @resource["query/#{@database}/sql/#{CGI::escape(sql)}"].get
|
149
|
+
entries = process_response(response)
|
150
|
+
rslt = entries['result']
|
151
|
+
# mixin all document entries (they have '@class' attribute)
|
152
|
+
rslt.each { |doc| doc.extend Orientdb4r::DocumentMetadata unless doc['@class'].nil? }
|
153
|
+
rslt
|
154
|
+
end
|
155
|
+
|
156
|
+
|
157
|
+
def command(sql) #:nodoc:
|
158
|
+
raise ArgumentError, 'command is blank' if blank? sql
|
159
|
+
begin
|
160
|
+
#puts "REQ command/#{@database}/sql/#{CGI::escape(sql)}"
|
161
|
+
response = @resource["command/#{@database}/sql/#{CGI::escape(sql)}"].post ''
|
162
|
+
rslt = process_response(response)
|
163
|
+
rslt
|
164
|
+
#puts "RESP #{response.body}"
|
165
|
+
rescue
|
166
|
+
raise OrientdbError
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
|
171
|
+
# -------------------------------------------------------------------- CLASS
|
172
|
+
|
111
173
|
def get_class(name) #:nodoc:
|
112
174
|
raise ArgumentError, "class name is blank" if blank?(name)
|
113
175
|
|
@@ -144,50 +206,6 @@ module Orientdb4r
|
|
144
206
|
end
|
145
207
|
|
146
208
|
|
147
|
-
def query(sql) #:nodoc:
|
148
|
-
raise ArgumentError, 'query is blank' if blank? sql
|
149
|
-
|
150
|
-
response = @resource["query/#{@database}/sql/#{CGI::escape(sql)}"].get
|
151
|
-
entries = process_response(response)
|
152
|
-
rslt = entries['result']
|
153
|
-
# mixin all document entries (they have '@class' attribute)
|
154
|
-
rslt.each { |doc| doc.extend Orientdb4r::DocumentMetadata unless doc['@class'].nil? }
|
155
|
-
rslt
|
156
|
-
end
|
157
|
-
|
158
|
-
|
159
|
-
def command(sql) #:nodoc:
|
160
|
-
raise ArgumentError, 'command is blank' if blank? sql
|
161
|
-
begin
|
162
|
-
#puts "REQ #{sql}"
|
163
|
-
response = @resource["command/#{@database}/sql/#{CGI::escape(sql)}"].post ''
|
164
|
-
rslt = process_response(response)
|
165
|
-
rslt
|
166
|
-
puts "RESP #{response.body}"
|
167
|
-
rescue
|
168
|
-
raise OrientdbError
|
169
|
-
end
|
170
|
-
end
|
171
|
-
|
172
|
-
|
173
|
-
def server(options={}) #:nodoc:
|
174
|
-
# 'server' does NOT use the RestClient Resource to construct the HTTP request
|
175
|
-
|
176
|
-
options_pattern = { :user => :optional, :password => :optional }
|
177
|
-
verify_options(options, options_pattern)
|
178
|
-
|
179
|
-
u = options.include?(:user) ? options[:user] : user
|
180
|
-
p = options.include?(:password) ? options[:password] : password
|
181
|
-
resource = ::RestClient::Resource.new(url, :user => u, :password => p)
|
182
|
-
begin
|
183
|
-
response = resource['server'].get
|
184
|
-
rescue
|
185
|
-
raise OrientdbError
|
186
|
-
end
|
187
|
-
process_response(response)
|
188
|
-
end
|
189
|
-
|
190
|
-
|
191
209
|
# ----------------------------------------------------------------- DOCUMENT
|
192
210
|
|
193
211
|
def create_document(doc)
|
data/lib/orientdb4r/utils.rb
CHANGED
@@ -82,16 +82,22 @@ module Orientdb4r
|
|
82
82
|
class DataGenerator
|
83
83
|
|
84
84
|
def initialize
|
85
|
-
@
|
86
|
-
0.upto(@
|
87
|
-
word = @
|
85
|
+
@words = IO.readlines('/usr/share/dict/words')
|
86
|
+
0.upto(@words.size - 1) do |i|
|
87
|
+
word = @words[i]
|
88
88
|
word.strip!
|
89
89
|
idx = word.index("'")
|
90
90
|
word = word[0..(idx - 1)] unless idx.nil?
|
91
|
-
@
|
91
|
+
@words[i] = word
|
92
92
|
end
|
93
|
-
@
|
94
|
-
Orientdb4r::logger.info "DataGenerator: #{@
|
93
|
+
@words.uniq
|
94
|
+
Orientdb4r::logger.info "DataGenerator: #{@words.size} words"
|
95
|
+
end
|
96
|
+
|
97
|
+
###
|
98
|
+
# Gets a random word.
|
99
|
+
def word
|
100
|
+
@words[rand(@words.size)]
|
95
101
|
end
|
96
102
|
|
97
103
|
end # DataGenerator
|
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.5', '2012-07-01', "Added 'get_database' into database CRUD"],
|
5
6
|
# v-- https://groups.google.com/forum/?fromgroups#!topic/orient-database/5MAMCvFavTc
|
6
7
|
['0.2.4', '2012-06-26', "Added session management"],
|
7
8
|
['0.2.3', '2012-06-24', "Documents received by a query are kind of Orientdb4r::DocumentMetadata"],
|
data/test/graphs.rb
ADDED
@@ -0,0 +1,114 @@
|
|
1
|
+
require 'orientdb4r'
|
2
|
+
|
3
|
+
DB = 'temp'
|
4
|
+
|
5
|
+
c = Orientdb4r.client
|
6
|
+
c.connect :database => DB, :user => 'admin', :password => 'admin'
|
7
|
+
dg = Orientdb4r::Utils::DataGenerator.new
|
8
|
+
|
9
|
+
|
10
|
+
def clear(conn)
|
11
|
+
conn.drop_class 'Community'
|
12
|
+
puts "droped class: Community"
|
13
|
+
conn.drop_class 'OrgUnit'
|
14
|
+
puts "droped class: OrgUnit"
|
15
|
+
conn.drop_class 'User'
|
16
|
+
puts "droped class: User"
|
17
|
+
end
|
18
|
+
|
19
|
+
if ARGV.include?('--clear')
|
20
|
+
clear(c)
|
21
|
+
end
|
22
|
+
|
23
|
+
if ARGV.include?('--schema')
|
24
|
+
clear(c)
|
25
|
+
# OrgUnit
|
26
|
+
c.create_class 'OrgUnit' do |c|
|
27
|
+
c.property 'name', :string, :mandatory => true
|
28
|
+
c.property 'network', :boolean
|
29
|
+
c.link 'descendants', :linkset, 'OrgUnit'
|
30
|
+
end
|
31
|
+
puts "created class: OrgUnit"
|
32
|
+
# Community
|
33
|
+
c.create_class 'Community' do |c|
|
34
|
+
c.property 'name', :string, :mandatory => true
|
35
|
+
end
|
36
|
+
puts "created class: Community"
|
37
|
+
# User
|
38
|
+
c.create_class 'User' do |c|
|
39
|
+
c.property 'username', :string, :mandatory => true
|
40
|
+
c.property 'name', :string, :mandatory => true
|
41
|
+
c.link 'unit', :link, 'OrgUnit', :mandatory => true
|
42
|
+
c.link 'communities', :linkset, 'Community'
|
43
|
+
end
|
44
|
+
puts "created class: User"
|
45
|
+
end
|
46
|
+
|
47
|
+
if ARGV.include?('--data')
|
48
|
+
|
49
|
+
# Organisational Units
|
50
|
+
c. command 'DELETE FROM OrgUnit'
|
51
|
+
units = []
|
52
|
+
|
53
|
+
comp_rids = []
|
54
|
+
auto_rids = []
|
55
|
+
auto_rids << c.create_document({ '@class' => 'OrgUnit', :name => 'Sales', :network => true })
|
56
|
+
auto_rids << c.create_document({ '@class' => 'OrgUnit', :name => 'Marketing', :network => true })
|
57
|
+
auto_rids << c.create_document({ '@class' => 'OrgUnit', :name => 'Design', :network => true })
|
58
|
+
comp_rids << c.create_document({ '@class' => 'OrgUnit', :name => 'Automotive', :network => true, :descendants => auto_rids })
|
59
|
+
#
|
60
|
+
research_rids = []
|
61
|
+
research_rids << c.create_document({ '@class' => 'OrgUnit', :name => 'Scientist', :network => false })
|
62
|
+
research_rids << c.create_document({ '@class' => 'OrgUnit', :name => 'Spies', :network => false })
|
63
|
+
comp_rids << c.create_document({ '@class' => 'OrgUnit', :name => 'Research', :network => false, :descendants => research_rids })
|
64
|
+
#
|
65
|
+
infra_rids = []
|
66
|
+
recruit_rid = c.create_document({ '@class' => 'OrgUnit', :name => 'Recruitment', :network => false })
|
67
|
+
infra_rids << c.create_document({ '@class' => 'OrgUnit', :name => 'Human Resources', :network => false, :descendants => [recruit_rid] })
|
68
|
+
infra_rids << c.create_document({ '@class' => 'OrgUnit', :name => 'Accounting', :network => false })
|
69
|
+
comp_rids << c.create_document({ '@class' => 'OrgUnit', :name => 'Company Infrastructure', :network => false, :descendants => infra_rids })
|
70
|
+
#
|
71
|
+
units << c.create_document({ '@class' => 'OrgUnit', :name => 'Big Company', :network => false, :descendants => comp_rids })
|
72
|
+
units << auto_rids << research_rids << infra_rids << comp_rids
|
73
|
+
units.flatten!.uniq!
|
74
|
+
puts "created units: #{units}"
|
75
|
+
|
76
|
+
# Communities
|
77
|
+
c. command 'DELETE FROM Community'
|
78
|
+
communities = []
|
79
|
+
communities << c.create_document({ '@class' => 'Community', :name => 'Pianists' })
|
80
|
+
communities << c.create_document({ '@class' => 'Community', :name => 'Violinists' })
|
81
|
+
communities << c.create_document({ '@class' => 'Community', :name => 'Dog fanciers' })
|
82
|
+
communities << c.create_document({ '@class' => 'Community', :name => 'Cat fanciers' })
|
83
|
+
communities << c.create_document({ '@class' => 'Community', :name => 'Soccer fans' })
|
84
|
+
communities << c.create_document({ '@class' => 'Community', :name => 'Ski fans' })
|
85
|
+
communities << c.create_document({ '@class' => 'Community', :name => 'Basket fans' })
|
86
|
+
communities << c.create_document({ '@class' => 'Community', :name => 'Gourmets' })
|
87
|
+
communities << c.create_document({ '@class' => 'Community', :name => 'Scifi reader' })
|
88
|
+
communities << c.create_document({ '@class' => 'Community', :name => 'Comic reader' })
|
89
|
+
puts "created communities: #{communities}"
|
90
|
+
|
91
|
+
# Users
|
92
|
+
c. command 'DELETE FROM User'
|
93
|
+
1.upto(1000) do
|
94
|
+
first_name = dg.word.capitalize
|
95
|
+
surname = dg.word.capitalize
|
96
|
+
# random distribution of Units (1) & Communities (0..3)
|
97
|
+
unit = units[rand(units.size)]
|
98
|
+
comms = []
|
99
|
+
0.upto(rand(4)) { |i| comms << communities[rand(communities.size)] if i > 0 }
|
100
|
+
|
101
|
+
c.create_document({ '@class' => 'User', \
|
102
|
+
:username => "#{first_name.downcase}.#{surname.downcase}", \
|
103
|
+
:name => "#{first_name.capitalize} #{surname.capitalize}", \
|
104
|
+
:unit => unit, \
|
105
|
+
:communities => comms })
|
106
|
+
end
|
107
|
+
|
108
|
+
end
|
109
|
+
|
110
|
+
# FIND REFERENCES #6:5 [OrgUnit] # get parent
|
111
|
+
|
112
|
+
# TRAVERSE descendants FROM #6:10 WHERE $depth < 2 # get first level of descendants
|
113
|
+
# SELECT FROM (TRAVERSE descendants FROM #6:10 WHERE $depth < 2) WHERE $depth > 0 # eliminate root of query
|
114
|
+
# SELECT FROM orgunit WHERE any() traverse(0,10) (name = 'Recruitment') # get ancestors
|
data/test/test_database.rb
CHANGED
@@ -75,6 +75,7 @@ class TestDatabase < Test::Unit::TestCase
|
|
75
75
|
# Temporary disabled because of unknown way how to drop a new created datatabse.
|
76
76
|
def xtest_create_database
|
77
77
|
@client.create_database :database => 'UniT', :user => 'root', :password => 'root'
|
78
|
+
assert_nothing_thrown do @client.get_database 'UniT'; end
|
78
79
|
# creating an existing DB
|
79
80
|
assert_raise Orientdb4r::OrientdbError do
|
80
81
|
@client.create_database :database => 'UniT', :user => 'root', :password => 'root'
|
@@ -91,6 +92,26 @@ class TestDatabase < Test::Unit::TestCase
|
|
91
92
|
end
|
92
93
|
|
93
94
|
|
95
|
+
###
|
96
|
+
# GET DATABASE
|
97
|
+
def test_get_database
|
98
|
+
@client.connect :database => 'temp', :user => 'admin', :password => 'admin'
|
99
|
+
assert_nothing_thrown do @client.get_database 'temp'; end
|
100
|
+
|
101
|
+
rslt = @client.get_database 'temp'
|
102
|
+
assert_not_nil rslt
|
103
|
+
assert_instance_of Hash, rslt
|
104
|
+
assert rslt.include? 'classes'
|
105
|
+
assert @client.database_exists?('temp')
|
106
|
+
|
107
|
+
# bad databases
|
108
|
+
assert_raise Orientdb4r::NotFoundError do @client.get_database 'UnknownDB'; end
|
109
|
+
assert_raise Orientdb4r::NotFoundError do @client.get_database 'temp/admin'; end
|
110
|
+
assert !@client.database_exists?('UnknownDB')
|
111
|
+
assert !@client.database_exists?('temp/admin')
|
112
|
+
end
|
113
|
+
|
114
|
+
|
94
115
|
###
|
95
116
|
# SERVER info
|
96
117
|
# Temporary disabled because of dependency to password of 'root' account
|
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.5
|
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-
|
12
|
+
date: 2012-07-01 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rest-client
|
@@ -48,6 +48,7 @@ files:
|
|
48
48
|
- lib/orientdb4r/utils.rb
|
49
49
|
- lib/orientdb4r/version.rb
|
50
50
|
- orientdb4r.gemspec
|
51
|
+
- test/graphs.rb
|
51
52
|
- test/readme_sample.rb
|
52
53
|
- test/test_database.rb
|
53
54
|
- test/test_ddo.rb
|
@@ -80,6 +81,7 @@ signing_key:
|
|
80
81
|
specification_version: 3
|
81
82
|
summary: Ruby binding for Orient DB.
|
82
83
|
test_files:
|
84
|
+
- test/graphs.rb
|
83
85
|
- test/readme_sample.rb
|
84
86
|
- test/test_database.rb
|
85
87
|
- test/test_ddo.rb
|