activerdf 1.4 → 1.5
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +9 -0
- data/lib/active_rdf/federation/connection_pool.rb +4 -0
- data/lib/active_rdf/federation/federation_manager.rb +1 -0
- data/lib/active_rdf/objectmanager/namespace.rb +2 -2
- data/lib/active_rdf/objectmanager/resource.rb +95 -50
- data/lib/active_rdf/queryengine/query.rb +21 -13
- data/lib/active_rdf/queryengine/query2sparql.rb +11 -13
- data/lib/active_rdf.rb +1 -1
- data/lib/active_rdf_log.rb +1 -1
- data/test/common.rb +12 -4
- data/test/objectmanager/test_object_manager.rb +16 -4
- data/test/objectmanager/test_resource_reading.rb +31 -8
- data/test/objectmanager/test_resource_writing.rb +5 -1
- data/test/test_person_data.nt +2 -0
- metadata +11 -11
data/CHANGELOG
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
== activerdf (1.6)
|
2
|
+
* TODO: remove ObjectManager.construct_classes (classes exist automagically after Namespace.register)
|
3
|
+
|
4
|
+
== activerdf (1.5) Thu, 12 Apr 2007 22:42:28 +0100
|
5
|
+
* allows directly using classes in query: where(:s, RDF::type, SIOC::Post)
|
6
|
+
* extended search in Resource.find (e.g. order results, pagination)
|
7
|
+
* added eyal.all_age and eyal.all_foaf::name to always return Arrays
|
8
|
+
* added support for writing namespaced attributes (eyal.foaf::name = ...)
|
9
|
+
|
1
10
|
== activerdf (1.4) Tue, 27 Feb 2007 20:50:21 +0000
|
2
11
|
* dynamic finders support prefixes (find_by_foaf::name)
|
3
12
|
* ntriples parser supports encoded literals (HTML)
|
@@ -15,6 +15,7 @@ class FederationManager
|
|
15
15
|
# by distributing query over complete read-pool
|
16
16
|
# and aggregating the results
|
17
17
|
def FederationManager.query(q, options={:flatten => true})
|
18
|
+
$activerdflog.debug "querying #{q.to_sp}"
|
18
19
|
if ConnectionPool.read_adapters.empty?
|
19
20
|
raise ActiveRdfError, "cannot execute query without data sources"
|
20
21
|
end
|
@@ -33,7 +33,7 @@ class Namespace
|
|
33
33
|
|
34
34
|
# make some builtin methods private because lookup doesn't work otherwise
|
35
35
|
# on e.g. RDF::type and FOAF::name
|
36
|
-
[:type, :name].each {|m| private(m) }
|
36
|
+
[:type, :name, :id].each {|m| private(m) }
|
37
37
|
end
|
38
38
|
|
39
39
|
# return the namespace proxy object
|
@@ -83,7 +83,7 @@ class Namespace
|
|
83
83
|
end
|
84
84
|
|
85
85
|
delimiter = uri.rindex(/#|\//)
|
86
|
-
if delimiter.nil?
|
86
|
+
if delimiter.nil? or delimiter == uri.size-1
|
87
87
|
uri
|
88
88
|
else
|
89
89
|
uri[delimiter+1..-1]
|
@@ -3,6 +3,9 @@ require 'objectmanager/object_manager'
|
|
3
3
|
require 'objectmanager/namespace'
|
4
4
|
require 'queryengine/query'
|
5
5
|
|
6
|
+
# TODO: finish removal of ObjectManager.construct_classes: make dynamic finders
|
7
|
+
# accessible on instance level, and probably more stuff.
|
8
|
+
|
6
9
|
module RDFS
|
7
10
|
# Represents an RDF resource and manages manipulations of that resource,
|
8
11
|
# including data lookup (e.g. eyal.age), data updates (e.g. eyal.age=20),
|
@@ -21,8 +24,14 @@ module RDFS
|
|
21
24
|
|
22
25
|
# creates new resource representing an RDF resource
|
23
26
|
def initialize uri
|
24
|
-
|
25
|
-
|
27
|
+
@uri = case uri
|
28
|
+
when RDFS::Resource
|
29
|
+
uri.uri
|
30
|
+
when String
|
31
|
+
uri
|
32
|
+
else
|
33
|
+
raise ActiveRdfError, "cannot create resource <#{uri}>"
|
34
|
+
end
|
26
35
|
@predicates = Hash.new
|
27
36
|
end
|
28
37
|
|
@@ -31,17 +40,18 @@ module RDFS
|
|
31
40
|
# because it cannot be found in Namespace.lookup otherwise)
|
32
41
|
self.class_uri = Namespace.lookup(:rdfs, :Resource)
|
33
42
|
|
43
|
+
def self.uri; class_uri.uri; end
|
44
|
+
def self.==(other)
|
45
|
+
other.respond_to?(:uri) ? other.uri == self.uri : false
|
46
|
+
end
|
47
|
+
|
34
48
|
##### ######
|
35
49
|
##### start of instance-level code
|
36
50
|
##### ######
|
37
51
|
|
38
52
|
# a resource is same as another if they both represent the same uri
|
39
53
|
def ==(other)
|
40
|
-
|
41
|
-
other.uri == self.uri
|
42
|
-
else
|
43
|
-
false
|
44
|
-
end
|
54
|
+
other.respond_to?(:uri) ? other.uri == self.uri : false
|
45
55
|
end
|
46
56
|
alias_method 'eql?','=='
|
47
57
|
|
@@ -86,8 +96,46 @@ module RDFS
|
|
86
96
|
|
87
97
|
# returns array of all instances of this class (e.g. Person.find_all)
|
88
98
|
# (always returns collection)
|
89
|
-
def Resource.find_all
|
90
|
-
|
99
|
+
def Resource.find_all(*args)
|
100
|
+
find(:all, *args)
|
101
|
+
end
|
102
|
+
|
103
|
+
def Resource.find(*args)
|
104
|
+
class_uri.find(*args)
|
105
|
+
end
|
106
|
+
|
107
|
+
##### #####
|
108
|
+
##### instance level methods #####
|
109
|
+
##### #####
|
110
|
+
def find(*args)
|
111
|
+
# extract sort options from args
|
112
|
+
options = args.last.is_a?(Hash) ? args.pop : {}
|
113
|
+
|
114
|
+
query = Query.new.distinct(:s)
|
115
|
+
query.where(:s, Namespace.lookup(:rdf,:type), self)
|
116
|
+
|
117
|
+
if options.include? :order
|
118
|
+
sort_predicate = options[:order]
|
119
|
+
query.sort(:sort_value)
|
120
|
+
query.where(:s, sort_predicate, :sort_value)
|
121
|
+
end
|
122
|
+
|
123
|
+
if options.include? :reverse_order
|
124
|
+
sort_predicate = options[:reverse_order]
|
125
|
+
query.reverse_sort(:sort_value)
|
126
|
+
query.where(:s, sort_predicate, :sort_value)
|
127
|
+
end
|
128
|
+
|
129
|
+
if options.include? :where
|
130
|
+
raise ActiveRdfError, "where clause should be hash of predicate => object" unless options[:where].is_a? Hash
|
131
|
+
options[:where].each do |p,o|
|
132
|
+
query.where(:s, p, o)
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
query.limit(options[:limit]) if options[:limit]
|
137
|
+
query.offset(options[:offset]) if options[:offset]
|
138
|
+
|
91
139
|
if block_given?
|
92
140
|
query.execute do |resource|
|
93
141
|
yield resource
|
@@ -97,10 +145,6 @@ module RDFS
|
|
97
145
|
end
|
98
146
|
end
|
99
147
|
|
100
|
-
##### #####
|
101
|
-
##### instance level methods #####
|
102
|
-
##### #####
|
103
|
-
|
104
148
|
# manages invocations such as eyal.age
|
105
149
|
def method_missing(method, *args)
|
106
150
|
# possibilities:
|
@@ -134,42 +178,55 @@ module RDFS
|
|
134
178
|
# action: return namespace proxy that handles 'name' invocation, by
|
135
179
|
# rewriting into predicate lookup (similar to case (5)
|
136
180
|
|
137
|
-
|
138
|
-
# cheaper than (1)-(2) but (1) and (2) are probably more probable (getting
|
139
|
-
# attribute values over executing custom methods)
|
140
|
-
|
141
|
-
$activerdflog.debug "RDFS::Resource: method_missing on instance: called with method name #{method}"
|
181
|
+
$activerdflog.debug "method_missing: #{method}"
|
142
182
|
|
143
183
|
# are we doing an update or not?
|
144
184
|
# checking if method ends with '='
|
145
185
|
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
186
|
+
update = method.to_s[-1..-1] == '='
|
187
|
+
methodname = if update
|
188
|
+
method.to_s[0..-2]
|
189
|
+
else
|
190
|
+
method.to_s
|
191
|
+
end
|
192
|
+
|
193
|
+
# extract single values from array unless user asked for eyal.all_age
|
194
|
+
flatten = true
|
195
|
+
if method.to_s[0..3] == 'all_'
|
196
|
+
flatten = false
|
197
|
+
methodname = methodname[4..-1]
|
152
198
|
end
|
153
199
|
|
154
200
|
# check possibility (5)
|
155
201
|
if @predicates.include?(methodname)
|
156
|
-
return predicate_invocation(@predicates[methodname], args, update)
|
202
|
+
return predicate_invocation(@predicates[methodname], args, update, flatten)
|
157
203
|
end
|
158
204
|
|
159
205
|
# check possibility (6)
|
160
|
-
if Namespace.abbreviations.include?(
|
206
|
+
if Namespace.abbreviations.include?(methodname.to_sym)
|
161
207
|
namespace = Object.new
|
162
|
-
@@uri =
|
208
|
+
@@uri = methodname
|
163
209
|
@@subject = self
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
210
|
+
@@flatten = flatten
|
211
|
+
|
212
|
+
# catch the invocation on the namespace
|
213
|
+
class <<namespace
|
214
|
+
def method_missing(localname, *args)
|
215
|
+
# check if updating or reading predicate value
|
216
|
+
if localname.to_s[-1..-1] == '='
|
217
|
+
# set value
|
218
|
+
predicate = Namespace.lookup(@@uri, localname.to_s[0..-2])
|
219
|
+
args.each { |value| FederationManager.add(@@subject, predicate, value) }
|
220
|
+
else
|
221
|
+
# read value
|
222
|
+
predicate = Namespace.lookup(@@uri, localname)
|
223
|
+
Query.new.distinct(:o).where(@@subject, predicate, :o).execute(:flatten => @@flatten)
|
224
|
+
end
|
225
|
+
end
|
169
226
|
private(:type)
|
170
|
-
|
171
|
-
|
172
|
-
|
227
|
+
end
|
228
|
+
return namespace
|
229
|
+
end
|
173
230
|
|
174
231
|
candidates = if update
|
175
232
|
(class_level_predicates + direct_predicates).compact.uniq
|
@@ -180,7 +237,7 @@ module RDFS
|
|
180
237
|
# checking possibility (1) and (3)
|
181
238
|
candidates.each do |pred|
|
182
239
|
if Namespace.localname(pred) == methodname
|
183
|
-
return predicate_invocation(pred, args, update)
|
240
|
+
return predicate_invocation(pred, args, update, flatten)
|
184
241
|
end
|
185
242
|
end
|
186
243
|
|
@@ -299,11 +356,6 @@ module RDFS
|
|
299
356
|
"<#{uri}>"
|
300
357
|
end
|
301
358
|
|
302
|
-
# # label of resource (rdfs:label if available, uri otherwise)
|
303
|
-
# def label
|
304
|
-
# get_property_value(Namespace.lookup(:rdfs,:label)) || uri
|
305
|
-
# end
|
306
|
-
|
307
359
|
private
|
308
360
|
|
309
361
|
# def ancestors(predicate)
|
@@ -311,24 +363,17 @@ module RDFS
|
|
311
363
|
# Query.new.distinct(:p).where(predicate, subproperty, :p).execute
|
312
364
|
# end
|
313
365
|
|
314
|
-
def predicate_invocation(predicate, args, update)
|
366
|
+
def predicate_invocation(predicate, args, update, flatten)
|
315
367
|
if update
|
316
368
|
args.each do |value|
|
317
369
|
FederationManager.add(self, predicate, value)
|
318
370
|
end
|
319
371
|
args
|
320
372
|
else
|
321
|
-
|
373
|
+
Query.new.distinct(:o).where(self, predicate, :o).execute(:flatten => flatten)
|
322
374
|
end
|
323
375
|
end
|
324
376
|
|
325
|
-
def get_property_value(predicate, args=[])
|
326
|
-
return_ary = args[0][:array] if args[0].is_a?(Hash)
|
327
|
-
flatten_results = !return_ary
|
328
|
-
query = Query.new.distinct(:o).where(self, predicate, :o)
|
329
|
-
query.execute(:flatten => flatten_results)
|
330
|
-
end
|
331
|
-
|
332
377
|
# returns all rdf:types of this resource but without a conversion to
|
333
378
|
# Ruby classes (it returns an array of RDFS::Resources)
|
334
379
|
def types
|
@@ -6,7 +6,7 @@ require 'federation/federation_manager'
|
|
6
6
|
# data source. In all clauses symbols represent variables:
|
7
7
|
# Query.new.select(:s).where(:s,:p,:o).
|
8
8
|
class Query
|
9
|
-
attr_reader :select_clauses, :where_clauses, :sort_clauses, :keywords, :limits, :offsets
|
9
|
+
attr_reader :select_clauses, :where_clauses, :sort_clauses, :keywords, :limits, :offsets, :reverse_sort_clauses
|
10
10
|
bool_accessor :distinct, :ask, :select, :count, :keyword, :reasoning
|
11
11
|
|
12
12
|
def initialize
|
@@ -18,6 +18,7 @@ class Query
|
|
18
18
|
@sort_clauses = []
|
19
19
|
@keywords = {}
|
20
20
|
@reasoning = true
|
21
|
+
@reverse_sort_clauses = []
|
21
22
|
end
|
22
23
|
|
23
24
|
# Clears the select clauses
|
@@ -57,25 +58,33 @@ class Query
|
|
57
58
|
select(*s)
|
58
59
|
end
|
59
60
|
|
60
|
-
# Adds sort predicates
|
61
|
+
# Adds sort predicates
|
61
62
|
def sort *s
|
62
|
-
|
63
|
-
|
64
|
-
end
|
65
|
-
# removing duplicate select clauses
|
63
|
+
# add sort clauses without duplicates
|
64
|
+
s.each { |clause| @sort_clauses << parametrise(clause) }
|
66
65
|
@sort_clauses.uniq!
|
66
|
+
|
67
|
+
self
|
68
|
+
end
|
69
|
+
|
70
|
+
# adds reverse sorting predicates
|
71
|
+
def reverse_sort *s
|
72
|
+
# add sort clauses without duplicates
|
73
|
+
s.each { |clause| @reverse_sort_clauses << parametrise(clause) }
|
74
|
+
@reverse_sort_clauses.uniq!
|
75
|
+
|
67
76
|
self
|
68
77
|
end
|
69
78
|
|
70
79
|
# Adds limit clause (maximum number of results to return)
|
71
80
|
def limit(i)
|
72
|
-
@limits = i
|
81
|
+
@limits = i.to_i
|
73
82
|
self
|
74
83
|
end
|
75
84
|
|
76
85
|
# Add offset clause (ignore first n results)
|
77
86
|
def offset(i)
|
78
|
-
@offsets = i
|
87
|
+
@offsets = i.to_i
|
79
88
|
self
|
80
89
|
end
|
81
90
|
|
@@ -128,6 +137,9 @@ class Query
|
|
128
137
|
# usage:: results = query.execute
|
129
138
|
# usage:: query.execute do |s,p,o| ... end
|
130
139
|
def execute(options={:flatten => false}, &block)
|
140
|
+
options = {:flatten => true} if options == :flatten
|
141
|
+
|
142
|
+
$activerdflog.debug("query: #{self.to_sp}")
|
131
143
|
if block_given?
|
132
144
|
FederationManager.query(self) do |*clauses|
|
133
145
|
block.call(*clauses)
|
@@ -155,14 +167,10 @@ class Query
|
|
155
167
|
private
|
156
168
|
def parametrise s
|
157
169
|
case s
|
158
|
-
when Symbol
|
170
|
+
when Symbol, RDFS::Resource, Literal, Class
|
159
171
|
s
|
160
|
-
when RDFS::Resource
|
161
|
-
s
|
162
172
|
when nil
|
163
173
|
nil
|
164
|
-
when Literal
|
165
|
-
s
|
166
174
|
else
|
167
175
|
'"' + s.to_s + '"'
|
168
176
|
end
|
@@ -15,11 +15,9 @@ class Query2SPARQL
|
|
15
15
|
str << "ASK { #{where_clauses(query)} }"
|
16
16
|
end
|
17
17
|
|
18
|
-
$activerdflog.debug "Query2SPARQL: translated the query to #{str}"
|
19
18
|
return str
|
20
19
|
end
|
21
20
|
|
22
|
-
private
|
23
21
|
# concatenate each where clause using space (e.g. 's p o')
|
24
22
|
# and concatenate the clauses using dot, e.g. 's p o . s2 p2 o2 .'
|
25
23
|
def self.where_clauses(query)
|
@@ -31,17 +29,17 @@ class Query2SPARQL
|
|
31
29
|
end
|
32
30
|
|
33
31
|
def self.construct_clause(term)
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
32
|
+
if term.respond_to? :uri
|
33
|
+
'<' + term.uri + '>'
|
34
|
+
else
|
35
|
+
case term
|
36
|
+
when Symbol
|
37
|
+
'?' + term.to_s
|
38
|
+
else
|
39
|
+
term.to_s
|
40
|
+
end
|
41
|
+
end
|
42
42
|
end
|
43
43
|
|
44
|
-
|
45
|
-
private_class_method :where_clauses
|
46
|
-
private_class_method :construct_clause
|
44
|
+
private_class_method :where_clauses, :construct_clause
|
47
45
|
end
|
data/lib/active_rdf.rb
CHANGED
data/lib/active_rdf_log.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'logger'
|
2
2
|
|
3
3
|
# use either $ACTIVE_RDF_LOG for logging or current directory
|
4
|
-
location = ENV['ACTIVE_RDF_LOG'] || "#{Dir.pwd}/activerdf.log"
|
4
|
+
location = ENV['ACTIVE_RDF_LOG'] || $stdout # "#{Dir.pwd}/activerdf.log"
|
5
5
|
location = $stdout if location == "STDOUT"
|
6
6
|
$activerdflog = Logger.new(location, 1, 100*1024)
|
7
7
|
|
data/test/common.rb
CHANGED
@@ -27,8 +27,12 @@ end
|
|
27
27
|
# TODO make this work with a list of existing adapters, not only one
|
28
28
|
def get_different_adapter(existing_adapter)
|
29
29
|
types = ConnectionPool.adapter_types
|
30
|
-
|
31
|
-
|
30
|
+
if types.include?(:rdflite)
|
31
|
+
if existing_adapter.class == RDFLite
|
32
|
+
ConnectionPool.add :type => :rdflite, :unique => true
|
33
|
+
else
|
34
|
+
ConnectionPool.add :type => :rdflite
|
35
|
+
end
|
32
36
|
elsif types.include?(:redland) and existing_adapter.class != RedlandAdapter
|
33
37
|
ConnectionPool.add :type => :redland
|
34
38
|
elsif types.include?(:sparql) and existing_adapter.class != SparqlAdapter
|
@@ -78,8 +82,12 @@ end
|
|
78
82
|
# TODO use a list of exisiting adapters not only one
|
79
83
|
def get_different_write_adapter(existing_adapter)
|
80
84
|
types = ConnectionPool.adapter_types
|
81
|
-
if types.include?(:rdflite)
|
82
|
-
|
85
|
+
if types.include?(:rdflite)
|
86
|
+
if existing_adapter.class == RDFLite
|
87
|
+
ConnectionPool.add :type => :rdflite, :unique => true
|
88
|
+
else
|
89
|
+
ConnectionPool.add :type => :rdflite
|
90
|
+
end
|
83
91
|
elsif types.include?(:redland) and existing_adapter.class != RedlandAdapter
|
84
92
|
ConnectionPool.add :type => :redland
|
85
93
|
elsif types.include?(:yars) and existing_adapter.class != YarsAdapter
|
@@ -33,10 +33,10 @@ class TestObjectManager < Test::Unit::TestCase
|
|
33
33
|
Namespace.register(:test, 'http://activerdf.org/test/')
|
34
34
|
ObjectManager.construct_classes
|
35
35
|
|
36
|
-
assert(defined? TEST
|
37
|
-
assert(defined? RDFS
|
38
|
-
assert(defined? TEST::Person
|
39
|
-
assert(defined? RDFS::Class
|
36
|
+
assert(defined? TEST)
|
37
|
+
assert(defined? RDFS)
|
38
|
+
assert(defined? TEST::Person)
|
39
|
+
assert(defined? RDFS::Class)
|
40
40
|
end
|
41
41
|
|
42
42
|
def test_class_construct_class
|
@@ -49,4 +49,16 @@ class TestObjectManager < Test::Unit::TestCase
|
|
49
49
|
assert_instance_of Class, person_class
|
50
50
|
assert_equal person_resource.uri, person_class.class_uri.uri
|
51
51
|
end
|
52
|
+
|
53
|
+
def test_class_uri
|
54
|
+
adapter = get_write_adapter
|
55
|
+
adapter.load "#{File.dirname(__FILE__)}/../test_person_data.nt"
|
56
|
+
Namespace.register(:test, 'http://activerdf.org/test/')
|
57
|
+
ObjectManager.construct_classes
|
58
|
+
|
59
|
+
assert_equal RDFS::Resource.new('http://www.w3.org/1999/02/22-rdf-syntax-ns#type'), RDF::type
|
60
|
+
assert_equal RDF::type, RDFS::Resource.new('http://www.w3.org/1999/02/22-rdf-syntax-ns#type')
|
61
|
+
assert_equal TEST::Person, RDFS::Resource.new('http://activerdf.org/test/Person')
|
62
|
+
assert_equal RDFS::Resource.new('http://activerdf.org/test/Person'), TEST::Person
|
63
|
+
end
|
52
64
|
end
|
@@ -10,7 +10,8 @@ require "#{File.dirname(__FILE__)}/../common"
|
|
10
10
|
class TestResourceReading < Test::Unit::TestCase
|
11
11
|
def setup
|
12
12
|
ConnectionPool.clear
|
13
|
-
@adapter =
|
13
|
+
@adapter = get_adapter
|
14
|
+
@adapter.load "#{File.dirname(__FILE__)}/../test_person_data.nt"
|
14
15
|
Namespace.register(:test, 'http://activerdf.org/test/')
|
15
16
|
ObjectManager.construct_classes
|
16
17
|
|
@@ -21,12 +22,12 @@ class TestResourceReading < Test::Unit::TestCase
|
|
21
22
|
end
|
22
23
|
|
23
24
|
def test_find_all_instances
|
24
|
-
assert_equal
|
25
|
-
assert_equal [
|
25
|
+
assert_equal 7, RDFS::Resource.find_all.size
|
26
|
+
assert_equal [TEST::eyal, TEST::other], TEST::Person.find_all
|
26
27
|
end
|
27
28
|
|
28
29
|
def test_class_predicates
|
29
|
-
assert_equal
|
30
|
+
assert_equal 4, RDFS::Resource.predicates.size
|
30
31
|
end
|
31
32
|
|
32
33
|
def test_eyal_predicates
|
@@ -39,9 +40,9 @@ class TestResourceReading < Test::Unit::TestCase
|
|
39
40
|
|
40
41
|
# test class level predicates
|
41
42
|
class_preds = @eyal.class_level_predicates.collect {|p| p.uri }
|
42
|
-
# eyal.type: person and resource, has predicates age, eye
|
43
|
-
# rdfs:label, rdfs:comment, etc.
|
44
|
-
assert_equal
|
43
|
+
# eyal.type: person and resource, has predicates age, eye
|
44
|
+
# not default rdfs:label, rdfs:comment, etc. because not using rdfs reasoning
|
45
|
+
assert_equal 4, class_preds.size
|
45
46
|
end
|
46
47
|
|
47
48
|
def test_eyal_types
|
@@ -54,9 +55,13 @@ class TestResourceReading < Test::Unit::TestCase
|
|
54
55
|
def test_eyal_age
|
55
56
|
# triple exists '<eyal> age 27'
|
56
57
|
assert_equal '27', @eyal.age
|
58
|
+
assert_equal '27', @eyal.test::age
|
59
|
+
assert_equal ['27'], @eyal.all_age
|
57
60
|
|
58
61
|
# Person has property car, but eyal has no value for it
|
59
62
|
assert_equal nil, @eyal.car
|
63
|
+
assert_equal nil, @eyal.test::car
|
64
|
+
assert_equal [], @eyal.all_test::car
|
60
65
|
|
61
66
|
# non-existent method should throw error
|
62
67
|
assert_equal nil, @eyal.non_existing_method
|
@@ -67,6 +72,22 @@ class TestResourceReading < Test::Unit::TestCase
|
|
67
72
|
assert_instance_of TEST::Person, @eyal
|
68
73
|
end
|
69
74
|
|
75
|
+
def test_find_options
|
76
|
+
all = [Namespace.lookup(:test,:Person), Namespace.lookup(:rdfs, :Class), Namespace.lookup(:rdf, :Property), @eyal, TEST::car, TEST::age, TEST::eye]
|
77
|
+
found = RDFS::Resource.find
|
78
|
+
assert_equal all.sort, found.sort
|
79
|
+
|
80
|
+
properties = [TEST::car, TEST::age, TEST::eye]
|
81
|
+
found = RDFS::Resource.find(:where => {RDFS::domain => RDFS::Resource})
|
82
|
+
assert_equal properties.sort, found.sort
|
83
|
+
|
84
|
+
found = RDFS::Resource.find(:where => {RDFS::domain => RDFS::Resource, :prop => :any})
|
85
|
+
assert_equal properties.sort, found.sort
|
86
|
+
|
87
|
+
found = TEST::Person.find(:order => TEST::age)
|
88
|
+
assert_equal [TEST::other, TEST::eyal], found
|
89
|
+
end
|
90
|
+
|
70
91
|
def test_find_methods
|
71
92
|
assert_equal @eyal, RDFS::Resource.find_by_eye('blue')
|
72
93
|
assert_equal @eyal, RDFS::Resource.find_by_test::eye('blue')
|
@@ -82,6 +103,8 @@ class TestResourceReading < Test::Unit::TestCase
|
|
82
103
|
|
83
104
|
# test for writing if no write adapter is defined (like only sparqls)
|
84
105
|
def test_write_without_write_adapter
|
85
|
-
|
106
|
+
ConnectionPool.clear
|
107
|
+
get_read_only_adapter
|
108
|
+
assert_raises(ActiveRdfError) { @eyal.test::age = 18 }
|
86
109
|
end
|
87
110
|
end
|
@@ -18,9 +18,13 @@ class TestResourceWriting < Test::Unit::TestCase
|
|
18
18
|
|
19
19
|
eyal = RDFS::Resource.new 'http://activerdf.org/test/eyal'
|
20
20
|
assert_raises(ActiveRdfError) { eyal.age = 18 }
|
21
|
+
|
22
|
+
assert_nothing_raised { eyal.ar::age = 100 }
|
23
|
+
assert_equal '100', eyal.ar::age
|
24
|
+
assert_equal ['100'], eyal.all_ar::age
|
21
25
|
|
22
26
|
adapter.load "#{File.dirname(__FILE__)}/../test_person_data.nt"
|
23
27
|
assert_nothing_raised { eyal.age = 18 }
|
24
|
-
assert_equal ['18','27'], eyal.age
|
28
|
+
assert_equal ['100', '18', '27'], eyal.age
|
25
29
|
end
|
26
30
|
end
|
data/test/test_person_data.nt
CHANGED
@@ -2,6 +2,8 @@
|
|
2
2
|
<http://activerdf.org/test/Person> <http://www.w3.org/2000/01/rdf-schema#subClassOf> <http://www.w3.org/2000/01/rdf-schema#Resource> .
|
3
3
|
<http://activerdf.org/test/eyal> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://activerdf.org/test/Person> .
|
4
4
|
<http://activerdf.org/test/eyal> <http://activerdf.org/test/age> "27" .
|
5
|
+
<http://activerdf.org/test/other> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://activerdf.org/test/Person> .
|
6
|
+
<http://activerdf.org/test/other> <http://activerdf.org/test/age> "21" .
|
5
7
|
<http://activerdf.org/test/eyal> <http://activerdf.org/test/eye> "blue" .
|
6
8
|
<http://activerdf.org/test/age> <http://www.w3.org/2000/01/rdf-schema#domain> <http://www.w3.org/2000/01/rdf-schema#Resource> .
|
7
9
|
<http://activerdf.org/test/eye> <http://www.w3.org/2000/01/rdf-schema#domain> <http://www.w3.org/2000/01/rdf-schema#Resource> .
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.2
|
|
3
3
|
specification_version: 1
|
4
4
|
name: activerdf
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: "1.
|
7
|
-
date: 2007-
|
6
|
+
version: "1.5"
|
7
|
+
date: 2007-04-12 00:00:00 +01:00
|
8
8
|
summary: Offers object-oriented access to RDF (with adapters to several datastores).
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -38,36 +38,36 @@ files:
|
|
38
38
|
- test/common.rb
|
39
39
|
- test/test_adapters.rb
|
40
40
|
- test/test_person_data.nt
|
41
|
-
- test/federation/test_connection_pool.rb
|
42
41
|
- test/federation/test_federation_manager.rb
|
42
|
+
- test/federation/test_connection_pool.rb
|
43
|
+
- test/objectmanager/test_resource_reading.rb
|
44
|
+
- test/objectmanager/test_literal.rb
|
43
45
|
- test/objectmanager/test_namespace.rb
|
44
46
|
- test/objectmanager/test_object_manager.rb
|
45
|
-
- test/objectmanager/test_resource_reading.rb
|
46
47
|
- test/objectmanager/test_resource_writing.rb
|
47
|
-
- test/
|
48
|
+
- test/queryengine/test_ntriples_parser.rb
|
48
49
|
- test/queryengine/test_query.rb
|
49
50
|
- test/queryengine/test_query2jars2.rb
|
50
51
|
- test/queryengine/test_query2sparql.rb
|
51
52
|
- test/queryengine/test_query_engine.rb
|
52
|
-
- test/queryengine/test_ntriples_parser.rb
|
53
53
|
- lib/active_rdf
|
54
54
|
- lib/active_rdf.rb
|
55
|
-
- lib/active_rdf_helpers.rb
|
56
55
|
- lib/active_rdf_log.rb
|
56
|
+
- lib/active_rdf_helpers.rb
|
57
57
|
- lib/active_rdf/federation
|
58
58
|
- lib/active_rdf/objectmanager
|
59
59
|
- lib/active_rdf/queryengine
|
60
|
-
- lib/active_rdf/federation/active_rdf_adapter.rb
|
61
60
|
- lib/active_rdf/federation/connection_pool.rb
|
62
61
|
- lib/active_rdf/federation/federation_manager.rb
|
63
|
-
- lib/active_rdf/
|
64
|
-
- lib/active_rdf/objectmanager/object_manager.rb
|
62
|
+
- lib/active_rdf/federation/active_rdf_adapter.rb
|
65
63
|
- lib/active_rdf/objectmanager/resource.rb
|
64
|
+
- lib/active_rdf/objectmanager/namespace.rb
|
66
65
|
- lib/active_rdf/objectmanager/literal.rb
|
66
|
+
- lib/active_rdf/objectmanager/object_manager.rb
|
67
67
|
- lib/active_rdf/queryengine/query.rb
|
68
|
-
- lib/active_rdf/queryengine/query2jars2.rb
|
69
68
|
- lib/active_rdf/queryengine/query2sparql.rb
|
70
69
|
- lib/active_rdf/queryengine/ntriples_parser.rb
|
70
|
+
- lib/active_rdf/queryengine/query2jars2.rb
|
71
71
|
test_files: []
|
72
72
|
|
73
73
|
rdoc_options: []
|