activerdf 1.0
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.
- data/LICENSE +504 -0
- data/README +28 -0
- data/Rakefile +69 -0
- data/lib/active_rdf/federation/active_rdf_adapter.rb +18 -0
- data/lib/active_rdf/federation/connection_pool.rb +114 -0
- data/lib/active_rdf/federation/federation_manager.rb +80 -0
- data/lib/active_rdf/objectmanager/namespace.rb +77 -0
- data/lib/active_rdf/objectmanager/object_manager.rb +123 -0
- data/lib/active_rdf/objectmanager/resource.rb +325 -0
- data/lib/active_rdf/queryengine/query.rb +166 -0
- data/lib/active_rdf/queryengine/query2jars2.rb +27 -0
- data/lib/active_rdf/queryengine/query2sparql.rb +51 -0
- data/lib/active_rdf.rb +48 -0
- data/lib/active_rdf_helpers.rb +12 -0
- data/lib/active_rdf_log.rb +43 -0
- data/test/common.rb +91 -0
- data/test/federation/test_connection_pool.rb +76 -0
- data/test/federation/test_federation_manager.rb +148 -0
- data/test/objectmanager/test_namespace.rb +65 -0
- data/test/objectmanager/test_object_manager.rb +52 -0
- data/test/objectmanager/test_resource_reading.rb +83 -0
- data/test/objectmanager/test_resource_writing.rb +26 -0
- data/test/queryengine/test_query.rb +51 -0
- data/test/queryengine/test_query2jars2.rb +51 -0
- data/test/queryengine/test_query2sparql.rb +51 -0
- data/test/queryengine/test_query_engine.rb +52 -0
- data/test/test_adapters.rb +52 -0
- data/test/test_person_data.nt +28 -0
- data/tools/rakehelp.rb +103 -0
- metadata +89 -0
data/test/common.rb
ADDED
@@ -0,0 +1,91 @@
|
|
1
|
+
def get_adapter
|
2
|
+
types = ConnectionPool.adapter_types
|
3
|
+
if types.include?(:rdflite)
|
4
|
+
ConnectionPool.add :type => :rdflite
|
5
|
+
elsif types.include?(:redland)
|
6
|
+
ConnectionPool.add :type => :redland
|
7
|
+
elsif types.include?(:sparql)
|
8
|
+
ConnectionPool.add(:type => :sparql, :url => "http://m3pe.org:8080/repositories/test-people", :results => :sparql_xml)
|
9
|
+
elsif types.include?(:yars)
|
10
|
+
ConnectionPool.add :type => :yars
|
11
|
+
elsif types.include?(:jars2)
|
12
|
+
ConnectionPool.add :type => :jars2
|
13
|
+
else
|
14
|
+
raise ActiveRdfError, "no suitable adapter found for test"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def get_read_only_adapter
|
19
|
+
types = ConnectionPool.adapter_types
|
20
|
+
if types.include?(:sparql)
|
21
|
+
ConnectionPool.add(:type => :sparql, :url => "http://m3pe.org:8080/repositories/test-people", :results => :sparql_xml)
|
22
|
+
else
|
23
|
+
raise ActiveRdfError, "no suitable read only adapter found for test"
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
# TODO make this work with a list of existing adapters, not only one
|
29
|
+
def get_different_adapter(existing_adapter)
|
30
|
+
types = ConnectionPool.adapter_types
|
31
|
+
if types.include?(:rdflite) and existing_adapter.class != RDFLite
|
32
|
+
ConnectionPool.add :type => :rdflite
|
33
|
+
elsif types.include?(:redland) and existing_adapter.class != RedlandAdapter
|
34
|
+
ConnectionPool.add :type => :redland
|
35
|
+
elsif types.include?(:sparql) and existing_adapter.class != SparqlAdapter
|
36
|
+
ConnectionPool.add(:type => :sparql, :url => "http://m3pe.org:8080/repositories/test-people", :results => :sparql_xml)
|
37
|
+
elsif types.include?(:yars) and existing_adapter.class != YarsAdapter
|
38
|
+
ConnectionPool.add :type => :yars
|
39
|
+
elsif types.include?(:jars2) and existing_adapter.class != Jars2Adapter
|
40
|
+
ConnectionPool.add :type => :jars2
|
41
|
+
else
|
42
|
+
raise ActiveRdfError, "only one adapter on this system, or no suitable adapter found for test"
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def get_all_read_adapters
|
47
|
+
types = ConnectionPool.adapter_types
|
48
|
+
adapters = types.collect {|type|
|
49
|
+
if type == :sparql
|
50
|
+
ConnectionPool.add(:type => :sparql, :url => "http://m3pe.org:8080/repositories/test-people", :results => :sparql_xml)
|
51
|
+
else
|
52
|
+
ConnectionPool.add :type => type
|
53
|
+
end
|
54
|
+
}
|
55
|
+
adapters.select {|adapter| adapter.reads?}
|
56
|
+
end
|
57
|
+
|
58
|
+
def get_all_write_adapters
|
59
|
+
types = ConnectionPool.adapter_types
|
60
|
+
adapters = types.collect {|type| ConnectionPool.add :type => type }
|
61
|
+
adapters.select {|adapter| adapter.writes?}
|
62
|
+
end
|
63
|
+
|
64
|
+
def get_write_adapter
|
65
|
+
types = ConnectionPool.adapter_types
|
66
|
+
if types.include?(:rdflite)
|
67
|
+
ConnectionPool.add :type => :rdflite
|
68
|
+
elsif types.include?(:redland)
|
69
|
+
ConnectionPool.add :type => :redland
|
70
|
+
elsif types.include?(:yars)
|
71
|
+
ConnectionPool.add :type => :yars
|
72
|
+
elsif types.include?(:jars2)
|
73
|
+
ConnectionPool.add :type => :jars2
|
74
|
+
else
|
75
|
+
raise ActiveRdfError, "no suitable adapter found for test"
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
# TODO use a list of exisiting adapters not only one
|
80
|
+
def get_different_write_adapter(existing_adapter)
|
81
|
+
types = ConnectionPool.adapter_types
|
82
|
+
if types.include?(:rdflite) and existing_adapter.class != RDFLite
|
83
|
+
ConnectionPool.add :type => :rdflite
|
84
|
+
elsif types.include?(:redland) and existing_adapter.class != RedlandAdapter
|
85
|
+
ConnectionPool.add :type => :redland
|
86
|
+
elsif types.include?(:yars) and existing_adapter.class != YarsAdapter
|
87
|
+
ConnectionPool.add :type => :yars
|
88
|
+
else
|
89
|
+
raise ActiveRdfError, "only one write adapter on this system, or no suitable write adapter found for test"
|
90
|
+
end
|
91
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
# Author:: Benjamin Heitmann
|
2
|
+
# Copyright:: (c) 2005-2006
|
3
|
+
# License:: LGPL
|
4
|
+
|
5
|
+
require 'test/unit'
|
6
|
+
require 'active_rdf'
|
7
|
+
require 'federation/connection_pool'
|
8
|
+
require "#{File.dirname(__FILE__)}/../common"
|
9
|
+
|
10
|
+
class TestConnectionPool < Test::Unit::TestCase
|
11
|
+
def setup
|
12
|
+
ConnectionPool.clear
|
13
|
+
end
|
14
|
+
|
15
|
+
def teardown
|
16
|
+
ConnectionPool.clear
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_class_add_data_source
|
20
|
+
# test for successfull adding of an adapter
|
21
|
+
adapter = get_adapter
|
22
|
+
assert_kind_of ActiveRdfAdapter, adapter
|
23
|
+
assert ConnectionPool.adapter_pool.include?(adapter)
|
24
|
+
|
25
|
+
# now check that we get the same adapter if we supply the same parameters
|
26
|
+
adapter2 = get_adapter
|
27
|
+
assert_equal adapter, adapter2
|
28
|
+
# test same object_id
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_class_adapter_pool
|
32
|
+
#ConnectionPool.clear
|
33
|
+
assert_equal 0, ConnectionPool.adapter_pool.size
|
34
|
+
adapter = get_adapter
|
35
|
+
assert_equal 1, ConnectionPool.adapter_pool.size
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_class_register_adapter
|
39
|
+
ConnectionPool.register_adapter(:funkytype, ActiveRdfAdapter)
|
40
|
+
assert ConnectionPool.adapter_types.include?(:funkytype)
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_class_auto_flush_equals
|
44
|
+
# assert auto flushing by default
|
45
|
+
assert ConnectionPool.auto_flush?
|
46
|
+
ConnectionPool.auto_flush = false
|
47
|
+
assert !ConnectionPool.auto_flush?
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_class_clear
|
51
|
+
ConnectionPool.clear
|
52
|
+
assert ConnectionPool.adapter_pool.empty?
|
53
|
+
assert_nil ConnectionPool.write_adapter
|
54
|
+
end
|
55
|
+
|
56
|
+
def test_class_write_adapter
|
57
|
+
adapter = get_write_adapter
|
58
|
+
assert_kind_of ActiveRdfAdapter, adapter
|
59
|
+
end
|
60
|
+
|
61
|
+
def test_class_write_adapter_equals
|
62
|
+
adapter1 = get_write_adapter
|
63
|
+
adapter2 = get_different_write_adapter(adapter1)
|
64
|
+
assert_equal adapter2, ConnectionPool.write_adapter
|
65
|
+
ConnectionPool.write_adapter = adapter1
|
66
|
+
assert_equal adapter1, ConnectionPool.write_adapter
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
# need access to connectionpool.adapter_pool in tests
|
71
|
+
class ConnectionPool
|
72
|
+
def self.adapter_pool
|
73
|
+
@@adapter_pool
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
@@ -0,0 +1,148 @@
|
|
1
|
+
# Author:: Eyal Oren
|
2
|
+
# Copyright:: (c) 2005-2006
|
3
|
+
# License:: LGPL
|
4
|
+
|
5
|
+
require 'test/unit'
|
6
|
+
require 'active_rdf'
|
7
|
+
require 'federation/federation_manager'
|
8
|
+
require "#{File.dirname(__FILE__)}/../common"
|
9
|
+
|
10
|
+
class TestFederationManager < Test::Unit::TestCase
|
11
|
+
def setup
|
12
|
+
ConnectionPool.clear
|
13
|
+
end
|
14
|
+
|
15
|
+
def teardown
|
16
|
+
end
|
17
|
+
|
18
|
+
@@eyal = RDFS::Resource.new("http://activerdf.org/test/eyal")
|
19
|
+
@@age = RDFS::Resource.new("http://activerdf.org/test/age")
|
20
|
+
@@age_number = RDFS::Resource.new("27")
|
21
|
+
@@eye = RDFS::Resource.new("http://activerdf.org/test/eye")
|
22
|
+
@@eye_value = RDFS::Resource.new("blue")
|
23
|
+
@@type = RDFS::Resource.new("http://www.w3.org/1999/02/22-rdf-syntax-ns#type")
|
24
|
+
@@person = RDFS::Resource.new("http://www.w3.org/2000/01/rdf-schema#Resource")
|
25
|
+
@@resource = RDFS::Resource.new("http://activerdf.org/test/Person")
|
26
|
+
|
27
|
+
|
28
|
+
def test_single_pool
|
29
|
+
a1 = get_adapter
|
30
|
+
a2 = get_adapter
|
31
|
+
assert_equal a1, a2
|
32
|
+
assert_equal a1.object_id, a2.object_id
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_class_add
|
36
|
+
write1 = get_write_adapter
|
37
|
+
FederationManager.add(@@eyal, @@age, @@age_number)
|
38
|
+
|
39
|
+
age_result = Query.new.select(:o).where(@@eyal, @@age, :o).execute
|
40
|
+
assert "27", age_result
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_class_add_no_write_adapter
|
44
|
+
# zero write, one read -> must raise error
|
45
|
+
|
46
|
+
adapter = get_read_only_adapter
|
47
|
+
assert(!(adapter.writes?))
|
48
|
+
assert_raises NoMethodError do
|
49
|
+
FederationManager.add(@@eyal, @@age, @@age_number)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_class_add_one_write_one_read
|
54
|
+
# one write, one read
|
55
|
+
|
56
|
+
write1 = get_write_adapter
|
57
|
+
read1 = get_read_only_adapter
|
58
|
+
assert_not_equal write1,read1
|
59
|
+
assert_not_equal write1.object_id, read1.object_id
|
60
|
+
|
61
|
+
FederationManager.add(@@eyal, @@age, @@age_number)
|
62
|
+
|
63
|
+
age_result = Query.new.select(:o).where(@@eyal, @@age, :o).execute
|
64
|
+
assert "27", age_result
|
65
|
+
end
|
66
|
+
|
67
|
+
def test_get_different_read_and_write_adapters
|
68
|
+
r1 = get_adapter
|
69
|
+
r2 = get_different_adapter(r1)
|
70
|
+
assert_not_equal r1,r2
|
71
|
+
assert_not_equal r1.object_id, r2.object_id
|
72
|
+
|
73
|
+
w1 = get_write_adapter
|
74
|
+
w2 = get_different_write_adapter(w1)
|
75
|
+
assert_not_equal w1,w2
|
76
|
+
assert_not_equal w1.object_id, w2.object_id
|
77
|
+
end
|
78
|
+
|
79
|
+
def test_class_add_two_write
|
80
|
+
# two write, one read, no switching
|
81
|
+
# we need to different write adapters for this
|
82
|
+
#
|
83
|
+
|
84
|
+
write1 = get_write_adapter
|
85
|
+
write2 = get_different_write_adapter(write1)
|
86
|
+
|
87
|
+
read1 = get_read_only_adapter
|
88
|
+
|
89
|
+
FederationManager.add(@@eyal, @@age, @@age_number)
|
90
|
+
|
91
|
+
age_result = Query.new.select(:o).where(@@eyal, @@age, :o).execute
|
92
|
+
assert "27", age_result
|
93
|
+
end
|
94
|
+
|
95
|
+
def test_class_add_two_write_switching
|
96
|
+
# two write, one read, with switching
|
97
|
+
|
98
|
+
write1 = get_write_adapter
|
99
|
+
write2 = get_different_write_adapter(write1)
|
100
|
+
|
101
|
+
read1 = get_read_only_adapter
|
102
|
+
|
103
|
+
FederationManager.add(@@eyal, @@age, @@age_number)
|
104
|
+
age_result = Query.new.select(:o).where(@@eyal, @@age, :o).execute
|
105
|
+
assert "27", age_result
|
106
|
+
|
107
|
+
ConnectionPool.write_adapter = write2
|
108
|
+
|
109
|
+
FederationManager.add(@@eyal, @@eye, @@eye_value)
|
110
|
+
age_result = Query.new.select(:o).where(@@eyal, @@eye, :o).execute
|
111
|
+
assert "blue", age_result
|
112
|
+
|
113
|
+
second_result = write2.query(Query.new.select(:o).where(@@eyal, @@eye, :o))
|
114
|
+
assert "blue", second_result
|
115
|
+
end
|
116
|
+
|
117
|
+
# this test makes no sense without two different data sources
|
118
|
+
def test_federated_query
|
119
|
+
first_adapter = get_write_adapter
|
120
|
+
first_adapter.load("#{File.dirname(__FILE__)}/../test_person_data.nt")
|
121
|
+
first = Query.new.select(:s,:p,:o).where(:s,:p,:o).execute
|
122
|
+
|
123
|
+
# results should not be empty, because then the test succeeds trivially
|
124
|
+
assert_not_nil first
|
125
|
+
assert first != []
|
126
|
+
|
127
|
+
ConnectionPool.clear
|
128
|
+
second_adapter = get_different_write_adapter(first_adapter)
|
129
|
+
second_adapter.load("#{File.dirname(__FILE__)}/../test_person_data.nt")
|
130
|
+
second = Query.new.select(:s,:p,:o).where(:s,:p,:o).execute
|
131
|
+
|
132
|
+
# now we query both adapters in parallel
|
133
|
+
ConnectionPool.clear
|
134
|
+
first_adapter = get_write_adapter
|
135
|
+
first_adapter.load("#{File.dirname(__FILE__)}/../test_person_data.nt")
|
136
|
+
second_adapter = get_different_write_adapter(first_adapter)
|
137
|
+
second_adapter.load("#{File.dirname(__FILE__)}/../test_person_data.nt")
|
138
|
+
both = Query.new.select(:s,:p,:o).where(:s,:p,:o).execute
|
139
|
+
# assert both together contain twice the sum of the separate sources
|
140
|
+
assert_equal first + second, both
|
141
|
+
|
142
|
+
# since both sources contain the same data, we check that querying (both!)
|
143
|
+
# in parallel for distinct data, actually gives same results as querying
|
144
|
+
# only the one set
|
145
|
+
uniq = Query.new.distinct(:s,:p,:o).where(:s,:p,:o).execute
|
146
|
+
assert_equal first, uniq
|
147
|
+
end
|
148
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
# Author:: Eyal Oren
|
2
|
+
# Copyright:: (c) 2005-2006
|
3
|
+
# License:: LGPL
|
4
|
+
|
5
|
+
require 'test/unit'
|
6
|
+
require 'active_rdf'
|
7
|
+
require 'objectmanager/namespace'
|
8
|
+
require "#{File.dirname(__FILE__)}/../common"
|
9
|
+
|
10
|
+
class TestNamespace < Test::Unit::TestCase
|
11
|
+
Rdf = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#'
|
12
|
+
RdfType = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#type'
|
13
|
+
RdfsResource = 'http://www.w3.org/2000/01/rdf-schema#Resource'
|
14
|
+
Rdfs = 'http://www.w3.org/2000/01/rdf-schema#'
|
15
|
+
|
16
|
+
def setup
|
17
|
+
end
|
18
|
+
|
19
|
+
def teardown
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_default_ns_expansion
|
23
|
+
rdftype = RdfType
|
24
|
+
rdfsresource = RdfsResource
|
25
|
+
|
26
|
+
assert_equal rdftype, Namespace.expand(:rdf, :type)
|
27
|
+
assert_equal rdftype, Namespace.expand(:rdf, 'type')
|
28
|
+
assert_equal rdftype, Namespace.expand('rdf', :type)
|
29
|
+
assert_equal rdftype, Namespace.expand('rdf', 'type')
|
30
|
+
|
31
|
+
assert_equal rdfsresource, Namespace.expand(:rdfs, :Resource)
|
32
|
+
assert_equal rdfsresource, Namespace.expand(:rdfs, 'Resource')
|
33
|
+
assert_equal rdfsresource, Namespace.expand('rdfs', :Resource)
|
34
|
+
assert_equal rdfsresource, Namespace.expand('rdfs', 'Resource')
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_default_ns_lookup
|
38
|
+
rdftype = RDFS::Resource.new RdfType
|
39
|
+
rdfsresource = RDFS::Resource.new RdfsResource
|
40
|
+
|
41
|
+
assert_equal rdftype, Namespace.lookup(:rdf, :type)
|
42
|
+
assert_equal rdfsresource, Namespace.lookup(:rdfs, :Resource)
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_find_prefix
|
46
|
+
assert_equal :rdf, Namespace.prefix(Namespace.lookup(:rdf, :type))
|
47
|
+
assert_equal :rdf, Namespace.prefix(Namespace.expand(:rdf, :type))
|
48
|
+
|
49
|
+
assert_equal :rdfs, Namespace.prefix(Namespace.lookup(:rdfs, :Resource))
|
50
|
+
assert_equal :rdfs, Namespace.prefix(Namespace.expand(:rdfs, :Resource))
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_class_localname
|
54
|
+
assert_equal 'type', Namespace.localname(Namespace.lookup(:rdf, :type))
|
55
|
+
assert_equal 'Class', Namespace.localname(Namespace.lookup(:rdfs, :Class))
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_class_register
|
59
|
+
test = 'http://test.org/'
|
60
|
+
abc = "#{test}abc"
|
61
|
+
Namespace.register :test, test
|
62
|
+
|
63
|
+
assert_equal abc, Namespace.expand(:test, :abc)
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# Author:: Eyal Oren
|
2
|
+
# Copyright:: (c) 2005-2006
|
3
|
+
# License:: LGPL
|
4
|
+
|
5
|
+
require 'test/unit'
|
6
|
+
require 'active_rdf'
|
7
|
+
require "#{File.dirname(__FILE__)}/../common"
|
8
|
+
|
9
|
+
class TestObjectManager < Test::Unit::TestCase
|
10
|
+
def setup
|
11
|
+
ConnectionPool.clear
|
12
|
+
end
|
13
|
+
|
14
|
+
def teardown
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_resource_creation
|
18
|
+
assert_nothing_raised { RDFS::Resource.new('abc') }
|
19
|
+
|
20
|
+
r1 = RDFS::Resource.new('abc')
|
21
|
+
r2 = RDFS::Resource.new('cde')
|
22
|
+
r3 = RDFS::Resource.new('cde')
|
23
|
+
|
24
|
+
assert_equal 'abc', r1.uri
|
25
|
+
assert_equal 'cde', r2.uri
|
26
|
+
assert_equal r3, r2
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_class_construct_classes
|
30
|
+
adapter = get_write_adapter
|
31
|
+
adapter.load "#{File.dirname(__FILE__)}/../test_person_data.nt"
|
32
|
+
|
33
|
+
Namespace.register(:test, 'http://activerdf.org/test/')
|
34
|
+
ObjectManager.construct_classes
|
35
|
+
|
36
|
+
assert(defined? TEST, "class construction should have created module TEST")
|
37
|
+
assert(defined? RDFS, "class construction should have created module RDFS")
|
38
|
+
assert(defined? TEST::Person, "class construction should have created TEST::Person")
|
39
|
+
assert(defined? RDFS::Class, "class construction should have created RDFS::Class")
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_class_construct_class
|
43
|
+
adapter = get_write_adapter
|
44
|
+
adapter.load "#{File.dirname(__FILE__)}/../test_person_data.nt"
|
45
|
+
|
46
|
+
Namespace.register(:test, 'http://activerdf.org/test/')
|
47
|
+
person_resource = Namespace.lookup(:test, :Person)
|
48
|
+
person_class = ObjectManager.construct_class(person_resource)
|
49
|
+
assert_instance_of Class, person_class
|
50
|
+
assert_equal person_resource.uri, person_class.class_uri.uri
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
# Author:: Eyal Oren
|
2
|
+
# Copyright:: (c) 2005-2006
|
3
|
+
# License:: LGPL
|
4
|
+
|
5
|
+
require 'test/unit'
|
6
|
+
require 'active_rdf'
|
7
|
+
require 'federation/connection_pool'
|
8
|
+
require "#{File.dirname(__FILE__)}/../common"
|
9
|
+
|
10
|
+
class TestResourceReading < Test::Unit::TestCase
|
11
|
+
def setup
|
12
|
+
ConnectionPool.clear
|
13
|
+
@adapter = get_read_only_adapter
|
14
|
+
Namespace.register(:ar, 'http://activerdf.org/test/')
|
15
|
+
@eyal = RDFS::Resource.new 'http://activerdf.org/test/eyal'
|
16
|
+
end
|
17
|
+
|
18
|
+
def teardown
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_find_all_instances
|
22
|
+
assert_equal 36, RDFS::Resource.find_all.size
|
23
|
+
assert_equal [@eyal], AR::Person.find_all
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_class_predicates
|
27
|
+
assert_equal 10, RDFS::Resource.predicates.size
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_eyal_predicates
|
31
|
+
predicates = @eyal.direct_predicates
|
32
|
+
|
33
|
+
# assert that the three found predicates are eye, age, and type
|
34
|
+
assert_equal 3, predicates.size
|
35
|
+
predicates_labels = predicates.collect {|pred| pred.label }
|
36
|
+
['age', 'eye', 'type'].each do |pr|
|
37
|
+
assert predicates_labels.include?(pr), "Eyal should have predicate #{pr}"
|
38
|
+
end
|
39
|
+
|
40
|
+
# assert that the found predicates on Person are eye, age, and type
|
41
|
+
predicates_labels = predicates.collect {|pred| pred.label }
|
42
|
+
['age', 'eye', 'type'].each do |pr|
|
43
|
+
assert predicates_labels.include?(pr), "Eyal should have predicate #{pr}"
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_eyal_types
|
48
|
+
type_labels = @eyal.types.collect {|pred| pred.label}
|
49
|
+
assert_equal ['Person','Resource'], type_labels
|
50
|
+
end
|
51
|
+
|
52
|
+
def test_eyal_age
|
53
|
+
# triple exists '<eyal> age 27'
|
54
|
+
assert_equal '27', @eyal.age
|
55
|
+
|
56
|
+
# Person has property car, but eyal has no value for it
|
57
|
+
assert_equal nil, @eyal.car
|
58
|
+
|
59
|
+
# non-existent method should throw error
|
60
|
+
assert_equal nil, @eyal.non_existing_method
|
61
|
+
end
|
62
|
+
|
63
|
+
def test_eyal_type
|
64
|
+
assert_instance_of RDFS::Resource, @eyal
|
65
|
+
assert_instance_of AR::Person, @eyal
|
66
|
+
end
|
67
|
+
|
68
|
+
def test_find_methods
|
69
|
+
found_eyal = RDFS::Resource.find_by_eye('blue')
|
70
|
+
assert_not_nil found_eyal
|
71
|
+
assert_equal @eyal, found_eyal
|
72
|
+
assert_equal 'blue', RDFS::Resource.find_by_age(27).eye
|
73
|
+
assert_equal @eyal, RDFS::Resource.find_by_age_and_eye(27,'blue')
|
74
|
+
end
|
75
|
+
|
76
|
+
# test for writing if no write adapter is defined (like only sparqls)
|
77
|
+
def test_write_without_write_adapter
|
78
|
+
assert_raises NoMethodError do
|
79
|
+
@eyal.age = 18
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# Author:: Eyal Oren
|
2
|
+
# Copyright:: (c) 2005-2006
|
3
|
+
# License:: LGPL
|
4
|
+
|
5
|
+
require 'test/unit'
|
6
|
+
require 'active_rdf'
|
7
|
+
require 'federation/connection_pool'
|
8
|
+
require "#{File.dirname(__FILE__)}/../common"
|
9
|
+
|
10
|
+
class TestResourceWriting < Test::Unit::TestCase
|
11
|
+
def setup
|
12
|
+
ConnectionPool.clear
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_update_value
|
16
|
+
Namespace.register(:ar, 'http://activerdf.org/test/')
|
17
|
+
adapter = get_write_adapter
|
18
|
+
|
19
|
+
eyal = RDFS::Resource.new 'http://activerdf.org/test/eyal'
|
20
|
+
assert_raises(ActiveRdfError) { eyal.age = 18 }
|
21
|
+
|
22
|
+
adapter.load "#{File.dirname(__FILE__)}/../test_person_data.nt"
|
23
|
+
assert_nothing_raised { eyal.age = 18 }
|
24
|
+
assert_equal ['18','27'], eyal.age
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
# Author:: Eyal Oren
|
2
|
+
# Copyright:: (c) 2005-2006
|
3
|
+
# License:: LGPL
|
4
|
+
|
5
|
+
require 'test/unit'
|
6
|
+
require 'active_rdf'
|
7
|
+
require 'queryengine/query'
|
8
|
+
require "#{File.dirname(__FILE__)}/../common"
|
9
|
+
|
10
|
+
class TestQuery < Test::Unit::TestCase
|
11
|
+
def setup
|
12
|
+
end
|
13
|
+
|
14
|
+
def teardown
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_sparql_generation
|
18
|
+
|
19
|
+
# TODO: write tests for distinct, ask
|
20
|
+
|
21
|
+
query = Query.new
|
22
|
+
query.select(:s)
|
23
|
+
query.where(:s, RDFS::Resource.new('predicate'), '30')
|
24
|
+
|
25
|
+
generated = Query2SPARQL.translate(query)
|
26
|
+
expected = "SELECT ?s WHERE { ?s <predicate> \"30\" . }"
|
27
|
+
assert_equal expected, generated
|
28
|
+
|
29
|
+
query = Query.new
|
30
|
+
query.select(:s)
|
31
|
+
query.where(:s, RDFS::Resource.new('foaf:age'), :a)
|
32
|
+
query.where(:a, RDFS::Resource.new('rdf:type'), RDFS::Resource.new('xsd:int'))
|
33
|
+
generated = Query2SPARQL.translate(query)
|
34
|
+
expected = "SELECT ?s WHERE { ?s <foaf:age> ?a. ?a <rdf:type> <xsd:int> . }"
|
35
|
+
assert_equal expected, generated
|
36
|
+
|
37
|
+
# query = Query.new
|
38
|
+
# query.select(:s).select(:a)
|
39
|
+
# query.where(:s, 'foaf:age', :a)
|
40
|
+
# generated = Query2SPARQL.translate(query)
|
41
|
+
# expected = "SELECT DISTINCT ?s ?a WHERE { ?s foaf:age ?a .}"
|
42
|
+
# assert_equal expected, generated
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_query_omnipotent
|
46
|
+
# can define multiple select clauses at once or separately
|
47
|
+
q1 = Query.new.select(:s,:a)
|
48
|
+
q2 = Query.new.select(:s).select(:a)
|
49
|
+
assert_equal Query2SPARQL.translate(q1),Query2SPARQL.translate(q2)
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
# Author:: Eyal Oren
|
2
|
+
# Copyright:: (c) 2005-2006
|
3
|
+
# License:: LGPL
|
4
|
+
|
5
|
+
require 'test/unit'
|
6
|
+
require 'active_rdf'
|
7
|
+
require 'queryengine/query2jars2'
|
8
|
+
require "#{File.dirname(__FILE__)}/../common"
|
9
|
+
|
10
|
+
class TestQuery2Jars2 < Test::Unit::TestCase
|
11
|
+
def setup
|
12
|
+
end
|
13
|
+
|
14
|
+
def teardown
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_sparql_generation
|
18
|
+
|
19
|
+
# TODO: write tests for distinct, ask
|
20
|
+
|
21
|
+
query = Query.new
|
22
|
+
query.select(:s)
|
23
|
+
query.where(:s, RDFS::Resource.new('predicate'), '30')
|
24
|
+
|
25
|
+
generated = Query2SPARQL.translate(query)
|
26
|
+
expected = "SELECT ?s WHERE { ?s <predicate> \"30\" . }"
|
27
|
+
assert_equal expected, generated
|
28
|
+
|
29
|
+
query = Query.new
|
30
|
+
query.select(:s)
|
31
|
+
query.where(:s, RDFS::Resource.new('foaf:age'), :a)
|
32
|
+
query.where(:a, RDFS::Resource.new('rdf:type'), RDFS::Resource.new('xsd:int'))
|
33
|
+
generated = Query2SPARQL.translate(query)
|
34
|
+
expected = "SELECT ?s WHERE { ?s <foaf:age> ?a. ?a <rdf:type> <xsd:int> . }"
|
35
|
+
assert_equal expected, generated
|
36
|
+
|
37
|
+
# query = Query.new
|
38
|
+
# query.select(:s).select(:a)
|
39
|
+
# query.where(:s, 'foaf:age', :a)
|
40
|
+
# generated = Query2SPARQL.translate(query)
|
41
|
+
# expected = "SELECT DISTINCT ?s ?a WHERE { ?s foaf:age ?a .}"
|
42
|
+
# assert_equal expected, generated
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_query_omnipotent
|
46
|
+
# can define multiple select clauses at once or separately
|
47
|
+
q1 = Query.new.select(:s,:a)
|
48
|
+
q2 = Query.new.select(:s).select(:a)
|
49
|
+
assert_equal Query2SPARQL.translate(q1),Query2SPARQL.translate(q2)
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
# Author:: Eyal Oren
|
2
|
+
# Copyright:: (c) 2005-2006
|
3
|
+
# License:: LGPL
|
4
|
+
|
5
|
+
require 'test/unit'
|
6
|
+
require 'active_rdf'
|
7
|
+
require 'queryengine/query2sparql'
|
8
|
+
require "#{File.dirname(__FILE__)}/../common"
|
9
|
+
|
10
|
+
class TestQuery2Sparql < Test::Unit::TestCase
|
11
|
+
def setup
|
12
|
+
end
|
13
|
+
|
14
|
+
def teardown
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_sparql_generation
|
18
|
+
|
19
|
+
# TODO: write tests for distinct, ask
|
20
|
+
|
21
|
+
query = Query.new
|
22
|
+
query.select(:s)
|
23
|
+
query.where(:s, RDFS::Resource.new('predicate'), '30')
|
24
|
+
|
25
|
+
generated = Query2SPARQL.translate(query)
|
26
|
+
expected = "SELECT ?s WHERE { ?s <predicate> \"30\" . }"
|
27
|
+
assert_equal expected, generated
|
28
|
+
|
29
|
+
query = Query.new
|
30
|
+
query.select(:s)
|
31
|
+
query.where(:s, RDFS::Resource.new('foaf:age'), :a)
|
32
|
+
query.where(:a, RDFS::Resource.new('rdf:type'), RDFS::Resource.new('xsd:int'))
|
33
|
+
generated = Query2SPARQL.translate(query)
|
34
|
+
expected = "SELECT ?s WHERE { ?s <foaf:age> ?a. ?a <rdf:type> <xsd:int> . }"
|
35
|
+
assert_equal expected, generated
|
36
|
+
|
37
|
+
# query = Query.new
|
38
|
+
# query.select(:s).select(:a)
|
39
|
+
# query.where(:s, 'foaf:age', :a)
|
40
|
+
# generated = Query2SPARQL.translate(query)
|
41
|
+
# expected = "SELECT DISTINCT ?s ?a WHERE { ?s foaf:age ?a .}"
|
42
|
+
# assert_equal expected, generated
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_query_omnipotent
|
46
|
+
# can define multiple select clauses at once or separately
|
47
|
+
q1 = Query.new.select(:s,:a)
|
48
|
+
q2 = Query.new.select(:s).select(:a)
|
49
|
+
assert_equal Query2SPARQL.translate(q1),Query2SPARQL.translate(q2)
|
50
|
+
end
|
51
|
+
end
|