orientdb 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.document +5 -0
- data/Gemfile +8 -0
- data/Gemfile.lock +32 -0
- data/LICENSE +20 -0
- data/README.rdoc +88 -0
- data/Rakefile +57 -0
- data/bin/orientdb_console +23 -0
- data/lib/jars/blueprints-core-2.2.0-SNAPSHOT.jar +0 -0
- data/lib/jars/blueprints-orient-graph-2.2.0-SNAPSHOT.jar +0 -0
- data/lib/jars/orient-commons-1.2.0.jar +0 -0
- data/lib/jars/orientdb-client-1.2.0.jar +0 -0
- data/lib/jars/orientdb-core-1.2.0.jar +0 -0
- data/lib/jars/orientdb-distributed-1.2.0.jar +0 -0
- data/lib/jars/orientdb-enterprise-1.2.0.jar +0 -0
- data/lib/jars/orientdb-graphdb-1.2.0.jar +0 -0
- data/lib/jars/orientdb-server-1.2.0.jar +0 -0
- data/lib/jars/orientdb-tools-1.2.0.jar +0 -0
- data/lib/jars/pipes-2.0.0-SNAPSHOT.jar +0 -0
- data/lib/orientdb.rb +29 -0
- data/lib/orientdb/constants.rb +57 -0
- data/lib/orientdb/database.rb +167 -0
- data/lib/orientdb/document.rb +78 -0
- data/lib/orientdb/ext.rb +13 -0
- data/lib/orientdb/oclass.rb +141 -0
- data/lib/orientdb/property.rb +37 -0
- data/lib/orientdb/record.rb +18 -0
- data/lib/orientdb/rid.rb +46 -0
- data/lib/orientdb/schema.rb +33 -0
- data/lib/orientdb/sql.rb +18 -0
- data/lib/orientdb/sql/common.rb +247 -0
- data/lib/orientdb/sql/delete.rb +23 -0
- data/lib/orientdb/sql/ext.rb +249 -0
- data/lib/orientdb/sql/insert.rb +37 -0
- data/lib/orientdb/sql/query.rb +138 -0
- data/lib/orientdb/sql/update.rb +57 -0
- data/lib/orientdb/storage.rb +51 -0
- data/lib/orientdb/version.rb +3 -0
- data/orientdb.gemspec +95 -0
- data/spec/database_spec.rb +111 -0
- data/spec/document_spec.rb +99 -0
- data/spec/graph_spec.rb +39 -0
- data/spec/orientdb_spec.rb +10 -0
- data/spec/spec.opts +7 -0
- data/spec/spec_basic_helper.rb +25 -0
- data/spec/spec_helper.rb +68 -0
- data/spec/sql_spec.rb +839 -0
- data/spec/tinkerpop_graph_spec.rb +32 -0
- metadata +165 -0
@@ -0,0 +1,57 @@
|
|
1
|
+
module OrientDB::SQL
|
2
|
+
class Update
|
3
|
+
|
4
|
+
include OrientDB::SQL::UtilsMixin
|
5
|
+
include OrientDB::SQL::ClassClusterParametersMixin
|
6
|
+
include OrientDB::SQL::FieldsValuesParametersMixin
|
7
|
+
include OrientDB::SQL::ConditionsParametersMixin
|
8
|
+
|
9
|
+
def initialize
|
10
|
+
@oclass = nil
|
11
|
+
@cluster = nil
|
12
|
+
@action = "SET"
|
13
|
+
@fields = []
|
14
|
+
@values = []
|
15
|
+
@conditions = []
|
16
|
+
end
|
17
|
+
|
18
|
+
def action(new_action)
|
19
|
+
@action = new_action.to_s.upcase
|
20
|
+
self
|
21
|
+
end
|
22
|
+
|
23
|
+
alias :action! :action
|
24
|
+
|
25
|
+
def to_s
|
26
|
+
(target_sql(:update) + fields_sql + conditions_sql).strip
|
27
|
+
end
|
28
|
+
|
29
|
+
def to_sql_command
|
30
|
+
OrientDB::SQLCommand.new to_s
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def fields_sql
|
36
|
+
raise "Missing fields" if @fields.empty?
|
37
|
+
str = "#{@action} "
|
38
|
+
if @action == "REMOVE" && @values.empty?
|
39
|
+
str += @fields.join(', ')
|
40
|
+
else
|
41
|
+
raise "Missing values" if @values.empty?
|
42
|
+
raise "Unbalanced fields & values" unless @values.size == @fields.size
|
43
|
+
ary = []
|
44
|
+
@fields.each_with_index do |field, idx|
|
45
|
+
ary << "#{field} = #{@values[idx]}"
|
46
|
+
end
|
47
|
+
str += ary.join(", ")
|
48
|
+
end
|
49
|
+
str + ' '
|
50
|
+
end
|
51
|
+
|
52
|
+
def values_sql
|
53
|
+
"(#{@values.join(', ')})"
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module OrientDB
|
2
|
+
|
3
|
+
class LocalStorage
|
4
|
+
|
5
|
+
def get_cluster(name_or_id)
|
6
|
+
case name_or_id
|
7
|
+
when Integer
|
8
|
+
getClusterById name_or_id
|
9
|
+
else
|
10
|
+
getClusterByName name_or_id.to_s
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def inspect
|
15
|
+
"#<OrientDB::LocalStorage:#{hashCode}>"
|
16
|
+
end
|
17
|
+
|
18
|
+
alias :to_s :inspect
|
19
|
+
|
20
|
+
end
|
21
|
+
|
22
|
+
class RemoteStorage
|
23
|
+
|
24
|
+
def get_cluster(name_or_id)
|
25
|
+
case name_or_id
|
26
|
+
when Integer
|
27
|
+
getClusterById name_or_id
|
28
|
+
else
|
29
|
+
getClusterByName name_or_id.to_s
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def inspect
|
34
|
+
"#<OrientDB::RemoteStorage:#{hashCode}>"
|
35
|
+
end
|
36
|
+
|
37
|
+
alias :to_s :inspect
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
class LocalCluster
|
42
|
+
|
43
|
+
def inspect
|
44
|
+
"#<OrientDB::LocalCluster:#{getId} name=#{getName.inspect}>"
|
45
|
+
end
|
46
|
+
|
47
|
+
alias :to_s :inspect
|
48
|
+
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
data/orientdb.gemspec
ADDED
@@ -0,0 +1,95 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = "orientdb"
|
8
|
+
s.version = "1.2.0"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Adrian Madrid"]
|
12
|
+
s.date = "2012-11-13"
|
13
|
+
s.description = "Simple JRuby wrapper for the OrientDB."
|
14
|
+
s.email = "aemadrid@gmail.com"
|
15
|
+
s.executables = ["orientdb_console"]
|
16
|
+
s.extra_rdoc_files = [
|
17
|
+
"LICENSE",
|
18
|
+
"README.rdoc"
|
19
|
+
]
|
20
|
+
s.files = [
|
21
|
+
".document",
|
22
|
+
"Gemfile",
|
23
|
+
"Gemfile.lock",
|
24
|
+
"LICENSE",
|
25
|
+
"README.rdoc",
|
26
|
+
"Rakefile",
|
27
|
+
"bin/orientdb_console",
|
28
|
+
"lib/jars/blueprints-core-2.2.0-SNAPSHOT.jar",
|
29
|
+
"lib/jars/blueprints-orient-graph-2.2.0-SNAPSHOT.jar",
|
30
|
+
"lib/jars/orient-commons-1.2.0.jar",
|
31
|
+
"lib/jars/orientdb-client-1.2.0.jar",
|
32
|
+
"lib/jars/orientdb-core-1.2.0.jar",
|
33
|
+
"lib/jars/orientdb-distributed-1.2.0.jar",
|
34
|
+
"lib/jars/orientdb-enterprise-1.2.0.jar",
|
35
|
+
"lib/jars/orientdb-graphdb-1.2.0.jar",
|
36
|
+
"lib/jars/orientdb-server-1.2.0.jar",
|
37
|
+
"lib/jars/orientdb-tools-1.2.0.jar",
|
38
|
+
"lib/jars/pipes-2.0.0-SNAPSHOT.jar",
|
39
|
+
"lib/orientdb.rb",
|
40
|
+
"lib/orientdb/constants.rb",
|
41
|
+
"lib/orientdb/database.rb",
|
42
|
+
"lib/orientdb/document.rb",
|
43
|
+
"lib/orientdb/ext.rb",
|
44
|
+
"lib/orientdb/oclass.rb",
|
45
|
+
"lib/orientdb/property.rb",
|
46
|
+
"lib/orientdb/record.rb",
|
47
|
+
"lib/orientdb/rid.rb",
|
48
|
+
"lib/orientdb/schema.rb",
|
49
|
+
"lib/orientdb/sql.rb",
|
50
|
+
"lib/orientdb/sql/common.rb",
|
51
|
+
"lib/orientdb/sql/delete.rb",
|
52
|
+
"lib/orientdb/sql/ext.rb",
|
53
|
+
"lib/orientdb/sql/insert.rb",
|
54
|
+
"lib/orientdb/sql/query.rb",
|
55
|
+
"lib/orientdb/sql/update.rb",
|
56
|
+
"lib/orientdb/storage.rb",
|
57
|
+
"lib/orientdb/version.rb",
|
58
|
+
"orientdb.gemspec",
|
59
|
+
"spec/database_spec.rb",
|
60
|
+
"spec/document_spec.rb",
|
61
|
+
"spec/graph_spec.rb",
|
62
|
+
"spec/orientdb_spec.rb",
|
63
|
+
"spec/spec.opts",
|
64
|
+
"spec/spec_basic_helper.rb",
|
65
|
+
"spec/spec_helper.rb",
|
66
|
+
"spec/sql_spec.rb",
|
67
|
+
"spec/tinkerpop_graph_spec.rb"
|
68
|
+
]
|
69
|
+
s.homepage = "http://github.com/aemadrid/orientdb-jruby"
|
70
|
+
s.require_paths = ["lib"]
|
71
|
+
s.rubygems_version = "1.8.24"
|
72
|
+
s.summary = "Simple JRuby wrapper for the OrientDB."
|
73
|
+
|
74
|
+
if s.respond_to? :specification_version then
|
75
|
+
s.specification_version = 3
|
76
|
+
|
77
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
78
|
+
s.add_development_dependency(%q<rspec>, [">= 2.4"])
|
79
|
+
s.add_development_dependency(%q<awesome_print>, [">= 0"])
|
80
|
+
s.add_development_dependency(%q<bundler>, [">= 1.0.0"])
|
81
|
+
s.add_development_dependency(%q<jeweler>, [">= 1.8.3"])
|
82
|
+
else
|
83
|
+
s.add_dependency(%q<rspec>, [">= 2.4"])
|
84
|
+
s.add_dependency(%q<awesome_print>, [">= 0"])
|
85
|
+
s.add_dependency(%q<bundler>, [">= 1.0.0"])
|
86
|
+
s.add_dependency(%q<jeweler>, [">= 1.8.3"])
|
87
|
+
end
|
88
|
+
else
|
89
|
+
s.add_dependency(%q<rspec>, [">= 2.4"])
|
90
|
+
s.add_dependency(%q<awesome_print>, [">= 0"])
|
91
|
+
s.add_dependency(%q<bundler>, [">= 1.0.0"])
|
92
|
+
s.add_dependency(%q<jeweler>, [">= 1.8.3"])
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
@@ -0,0 +1,111 @@
|
|
1
|
+
require File.expand_path("../spec_helper", __FILE__)
|
2
|
+
|
3
|
+
describe "OrientDB" do
|
4
|
+
|
5
|
+
describe "DocumentDatabase" do
|
6
|
+
|
7
|
+
before :all do
|
8
|
+
create_classes
|
9
|
+
end
|
10
|
+
|
11
|
+
it "should create a valid simple table" do
|
12
|
+
exp_class = "#<OrientDB::OClassImpl:person name=STRING>"
|
13
|
+
exp_props = ["#<OrientDB::Property:name type=string indexed=false mandatory=false not_null=false>"]
|
14
|
+
@person_class.to_s.should == exp_class
|
15
|
+
@person_class.properties.map { |x| x.to_s }.should == exp_props
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should create a valid simple descendant table" do
|
19
|
+
exp_class = "#<OrientDB::OClassImpl:customer super=person tab=FLOAT name=STRING>"
|
20
|
+
exp_props = [
|
21
|
+
"#<OrientDB::Property:tab type=float indexed=false mandatory=false not_null=false>",
|
22
|
+
"#<OrientDB::Property:name type=string indexed=false mandatory=false not_null=false>"
|
23
|
+
]
|
24
|
+
@customer_class.to_s.should == exp_class
|
25
|
+
@customer_class.properties.map { |x| x.to_s }.should == exp_props
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should create a complex table" do
|
29
|
+
#exp_class = "#<OrientDB::OClassImpl:invoice total=FLOAT sold_on=DATE lines=LINKLIST number=INTEGER(idx) customer=LINK>"
|
30
|
+
exp_props = [
|
31
|
+
"#<OrientDB::Property:total type=float indexed=false mandatory=false not_null=false>",
|
32
|
+
"#<OrientDB::Property:sold_on type=date indexed=false mandatory=false not_null=false>",
|
33
|
+
"#<OrientDB::Property:lines type=linklist indexed=false mandatory=false not_null=false>",
|
34
|
+
"#<OrientDB::Property:number type=integer indexed=true mandatory=true not_null=false>",
|
35
|
+
"#<OrientDB::Property:customer type=link indexed=false mandatory=false not_null=true>"
|
36
|
+
]
|
37
|
+
#@invoice_class.to_s.should == exp_class
|
38
|
+
#@invoice_class.properties.map { |x| x.to_s }.should == exp_props
|
39
|
+
|
40
|
+
#TODO: test all those things above
|
41
|
+
%w(total sold_on lines number customer).each do |property|
|
42
|
+
@invoice_class.get_property(property).class.to_s.should == "Java::ComOrientechnologiesOrientCoreMetadataSchema::OPropertyImpl"
|
43
|
+
end
|
44
|
+
|
45
|
+
number_prop = @invoice_class.get_property("number")
|
46
|
+
number_prop.type.to_s.should == "INTEGER"
|
47
|
+
number_prop.indexed.should be_true
|
48
|
+
number_prop.mandatory.should be_true
|
49
|
+
number_prop.not_null.should be_false
|
50
|
+
end
|
51
|
+
|
52
|
+
describe "Query" do
|
53
|
+
|
54
|
+
before :all do
|
55
|
+
create_classes
|
56
|
+
|
57
|
+
@oclass = @employee_class.name
|
58
|
+
@e1 = OrientDB::Document.create DB, @oclass, :name => "Mark", :age => 36, :groups => %w{admin sales}
|
59
|
+
@e2 = OrientDB::Document.create DB, @oclass, :name => "John", :age => 37, :groups => %w{admin tech}
|
60
|
+
@e3 = OrientDB::Document.create DB, @oclass, :name => "Luke", :age => 38, :groups => %w{tech support}
|
61
|
+
@e4 = OrientDB::Document.create DB, @oclass, :name => "Matt", :age => 39, :groups => %w{admin office}
|
62
|
+
@e5 = OrientDB::Document.create DB, @oclass, :name => "Pete", :age => 40, :groups => %w{vp office}
|
63
|
+
@employees = [@e1, @e2, @e3, @e4, @e5]
|
64
|
+
end
|
65
|
+
|
66
|
+
it "should prepare valid queries" do
|
67
|
+
exp = "SELECT * FROM #{@oclass}"
|
68
|
+
qry1 = DB.prepare_sql_query exp
|
69
|
+
qry1.should be_a_kind_of OrientDB::SQLSynchQuery
|
70
|
+
qry1.text.should == exp
|
71
|
+
|
72
|
+
qry2 = DB.prepare_sql_query OrientDB::SQL::Query.new.from(@oclass).where(:name => "John")
|
73
|
+
qry2.should be_a_kind_of OrientDB::SQLSynchQuery
|
74
|
+
qry2.text.should == "SELECT FROM #{@oclass} WHERE name = 'John'"
|
75
|
+
|
76
|
+
qry3 = DB.prepare_sql_query qry2.text
|
77
|
+
qry3.should be_a_kind_of OrientDB::SQLSynchQuery
|
78
|
+
qry3.text.should == qry2.text
|
79
|
+
|
80
|
+
qry4 = DB.prepare_sql_query qry3
|
81
|
+
qry4.should be_a_kind_of OrientDB::SQLSynchQuery
|
82
|
+
qry4.text.should == qry2.text
|
83
|
+
end
|
84
|
+
|
85
|
+
it "should get all rows for a class" do
|
86
|
+
DB.all('SELECT FROM employee').map { |x| x.name }.sort.should == @employees.map { |x| x.name }.sort
|
87
|
+
end
|
88
|
+
|
89
|
+
it "should create a valid query and return the right results" do
|
90
|
+
qry = OrientDB::SQL::Query.new.from(@oclass).where("'admin' IN groups", 'age > 37')
|
91
|
+
DB.first(qry).should == @e4
|
92
|
+
end
|
93
|
+
|
94
|
+
it "should find rows by simple field values" do
|
95
|
+
DB.first('SELECT * FROM employee WHERE age = 37').should == @e2
|
96
|
+
end
|
97
|
+
|
98
|
+
it "should find rows by simple field values" do
|
99
|
+
DB.find_by_rid(@e3.rid).rid.should == @e3.rid
|
100
|
+
end
|
101
|
+
|
102
|
+
it "should find rows by values in arrays" do
|
103
|
+
qry = DB.prepare_sql_query "SELECT * FROM #{@oclass} WHERE 'admin' IN groups"
|
104
|
+
DB.all(qry).map { |x| x.name }.sort.should == [@e1, @e2, @e4].map { |x| x.name }.sort
|
105
|
+
end
|
106
|
+
|
107
|
+
end
|
108
|
+
|
109
|
+
end
|
110
|
+
|
111
|
+
end
|
@@ -0,0 +1,99 @@
|
|
1
|
+
require File.expand_path("../spec_helper", __FILE__)
|
2
|
+
|
3
|
+
describe "OrientDB" do
|
4
|
+
|
5
|
+
describe "RID" do
|
6
|
+
it "should create valid empty" do
|
7
|
+
rid = OrientDB::RID.new
|
8
|
+
rid.to_s == '-1:-1'
|
9
|
+
rid.valid?.should == true
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should create valid saved" do
|
13
|
+
rid = OrientDB::RID.new '5:40'
|
14
|
+
rid.to_s == '5:40'
|
15
|
+
rid.valid?.should == true
|
16
|
+
rid.saved?.should == true
|
17
|
+
rid.unsaved?.should == false
|
18
|
+
rid.cluster_id.should == 5
|
19
|
+
rid.document_id.should == 40
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should create valid unsaved" do
|
23
|
+
rid = OrientDB::RID.new '-1:-1'
|
24
|
+
rid.to_s == '5:40'
|
25
|
+
rid.valid?.should == true
|
26
|
+
rid.saved?.should == false
|
27
|
+
rid.unsaved?.should == true
|
28
|
+
rid.cluster_id.should == -1
|
29
|
+
rid.document_id.should == -1
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
describe "Document" do
|
34
|
+
|
35
|
+
before :all do
|
36
|
+
create_classes
|
37
|
+
|
38
|
+
@h_fields = {:sku => 'H509', :title => "Hammer", :price => 3.25}
|
39
|
+
@hammer = OrientDB::Document.create DB, @product_class.name, @h_fields
|
40
|
+
|
41
|
+
@n_fields = {:sku => 'N034', :title => "Nail", :price => 0.25}
|
42
|
+
@nail = OrientDB::Document.create DB, @product_class.name, @n_fields
|
43
|
+
|
44
|
+
@line1 = OrientDB::Document.create DB, @line_class.name,
|
45
|
+
:product => @hammer,
|
46
|
+
:quantity => 1,
|
47
|
+
:price => @hammer.price
|
48
|
+
@line2 = OrientDB::Document.create DB, @line_class.name,
|
49
|
+
:product => @nail,
|
50
|
+
:quantity => 10,
|
51
|
+
:price => @nail.price
|
52
|
+
@lines = [@line1, @line2]
|
53
|
+
@total = @lines.inject(0.0) { |a, x| a + x.price * x.quantity }
|
54
|
+
|
55
|
+
@customer = OrientDB::Document.create DB, @customer_class.name,
|
56
|
+
:name => "Mark Dumber",
|
57
|
+
:tab => 500.00
|
58
|
+
|
59
|
+
@invoice = OrientDB::Document.create DB, @invoice_class.name,
|
60
|
+
:number => 10001,
|
61
|
+
:customer => @customer,
|
62
|
+
:total => @total.to_s,
|
63
|
+
:sold_on => Date.civil(2011, 1, 1).proxy_object,
|
64
|
+
:lines => @lines
|
65
|
+
end
|
66
|
+
|
67
|
+
it "should instantiate new documents" do
|
68
|
+
@screw = OrientDB::Document.new DB, @product_class.name, :sku => "S365", :price => 0.33
|
69
|
+
@screw.should be_a_kind_of OrientDB::Document
|
70
|
+
end
|
71
|
+
|
72
|
+
it "should create simple documents" do
|
73
|
+
@hammer.should be_a_kind_of OrientDB::Document
|
74
|
+
@h_fields.each { |k, v| @hammer[k].should == v }
|
75
|
+
|
76
|
+
@nail.should be_a_kind_of OrientDB::Document
|
77
|
+
@n_fields.each { |k, v| @nail.send(k).should == v }
|
78
|
+
end
|
79
|
+
|
80
|
+
it "should create embedded documents" do
|
81
|
+
@line1.should be_a_kind_of OrientDB::Document
|
82
|
+
@line1.product.should == @hammer
|
83
|
+
@line1.price.should == @hammer.price
|
84
|
+
|
85
|
+
@line2.should be_a_kind_of OrientDB::Document
|
86
|
+
@line2.product.should == @nail
|
87
|
+
@line2.price.should == @nail.price
|
88
|
+
end
|
89
|
+
|
90
|
+
it "should create complex, embedded documents" do
|
91
|
+
@invoice.should be_a_kind_of OrientDB::Document
|
92
|
+
# @invoice.to_s.should == "#<OrientDB::Document:invoice_line:8:0 product:#<OrientDB::Document:product:7:0 title:Hammer price:5.5 sku:H509> price:5.5 quantity:1>"
|
93
|
+
@invoice.customer.should == @customer
|
94
|
+
@invoice.total = @total
|
95
|
+
@invoice.lines.map{|x| x}.should == [@line1, @line2]
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
end
|
data/spec/graph_spec.rb
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
require File.expand_path("../spec_helper", __FILE__)
|
2
|
+
|
3
|
+
describe "OrientDB" do
|
4
|
+
|
5
|
+
describe "Graph Database" do
|
6
|
+
|
7
|
+
before do
|
8
|
+
@database = OrientDB::GraphDatabase.new("local:#{TEST_DB_PATH}/graph").create
|
9
|
+
@root_node = @database.create_vertex.field("id", 0).save
|
10
|
+
#this creates a long chain of nodes... 1000 of 'em that are chained together
|
11
|
+
@last_node = @root_node
|
12
|
+
1000.times do |i|
|
13
|
+
new_node = @database.create_vertex.field("id", i+1).save
|
14
|
+
@database.create_edge(@last_node, new_node)
|
15
|
+
@last_node = new_node
|
16
|
+
end
|
17
|
+
@database.set_root("graph", @root_node)
|
18
|
+
end
|
19
|
+
|
20
|
+
after do
|
21
|
+
@database.drop
|
22
|
+
@database.close
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should get the root" do
|
26
|
+
@database.get_root("graph").should == @root_node
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should traverse to the last node" do
|
30
|
+
node = @root_node
|
31
|
+
while @database.get_out_edges(node) and !@database.get_out_edges(node).empty?
|
32
|
+
node = @database.get_in_vertex(@database.get_out_edges(node).first)
|
33
|
+
end
|
34
|
+
node.should == @last_node
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|