activerdf 1.6.8 → 1.6.9

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/CHANGELOG CHANGED
@@ -1,3 +1,7 @@
1
+ == activerdf (1.6.9) Fri, 08 Feb 2008 13:36:31 +0100
2
+ * automatic conversion from typed literals to Ruby internal datatypes
3
+ * added Resource#to_xml (José Ignacio)
4
+
1
5
  == activerdf (1.6.8) Thu, 01 Nov 2007 15:55:38 +0100
2
6
  * no need for ObjectManager.construct_classes (done during namespace registration)
3
7
  * small fix to running form source on jruby
@@ -11,6 +11,13 @@ class FederationManager
11
11
  ConnectionPool.write_adapter.add(s,p,o)
12
12
  end
13
13
 
14
+ # delete triple s,p,o from the currently selected write adapter (s and p are
15
+ # mandatory, o is optional, symbols are interpreted as wildcards)
16
+ def FederationManager.delete(s,p,o=:all)
17
+ raise ActiveRdfError, "cannot write without a write-adapter" unless ConnectionPool.write_adapter
18
+ ConnectionPool.write_adapter.delete(s,p,o)
19
+ end
20
+
14
21
  # executes read-only queries
15
22
  # by distributing query over complete read-pool
16
23
  # and aggregating the results
@@ -0,0 +1,13 @@
1
+ module Kernel
2
+ # Like instace_eval but allows parameters to be passed.
3
+ def instance_exec(*args, &block)
4
+ mname = "__instance_exec_#{Thread.current.object_id.abs}_#{object_id.abs}"
5
+ Object.class_eval{ define_method(mname, &block) }
6
+ begin
7
+ ret = send(mname, *args)
8
+ ensure
9
+ Object.class_eval{ undef_method(mname) } rescue nil
10
+ end
11
+ ret
12
+ end
13
+ end
@@ -1,48 +1,65 @@
1
1
  require 'active_rdf'
2
2
 
3
- # Represents an RDF literal, optionally datatyped.
4
- # TODO: language tags
5
- class Literal
3
+ module Literal
6
4
  Namespace.register :xsd, 'http://www.w3.org/2001/XMLSchema#'
5
+ def xsd_type
6
+ case self
7
+ when String
8
+ XSD::string
9
+ when Integer
10
+ XSD::integer
11
+ when TrueClass, FalseClass
12
+ XSD::boolean
13
+ when DateTime, Date, Time
14
+ XSD::date
15
+ end
16
+ end
7
17
 
8
- attr_reader :value, :type, :language
9
- @value, @type, @language = nil, nil, nil
18
+ def self.typed(value, type)
19
+ case type
20
+ when XSD::string
21
+ String.new(value)
22
+ when XSD::date
23
+ DateTime.parse(value)
24
+ when XSD::boolean
25
+ value == 'true' or value == 1
26
+ when XSD::integer
27
+ value.to_i
28
+ end
29
+ end
10
30
 
11
- # Constructs literal with given datatype. If no datatype is given, automatic
12
- # conversion from Ruby to XSD datatype is tried.
13
- def initialize(value, type_or_language=nil)
14
- @value = value
15
-
16
- if type_or_language.nil?
17
- # deduce type from the given value
18
- @type = case value
19
- when String
20
- XSD::string
21
- when Date, Time, DateTime
22
- XSD::date
23
- when TrueClass, FalseClass
24
- XSD::boolean
25
- when Fixnum
26
- XSD::integer
27
- end
28
- elsif type_or_language[0..0] == "@"
29
- # a language tag has been given
30
- @language = type_or_language[1..type_or_language.length]
31
+ def to_ntriple
32
+ if $activerdf_without_xsdtype
33
+ "\"#{to_s}\""
31
34
  else
32
- # the type_or_language was not empty and did not start with a @ so it must be a data type
33
- @type = type_or_language
34
- end
35
+ "\"#{to_s}\"^^#{xsd_type}"
36
+ end
37
+ end
38
+ end
39
+
40
+ class String; include Literal; end
41
+ class Integer; include Literal; end
42
+ class DateTime; include Literal; end
43
+ class Date; include Literal; end
44
+ class Time; include Literal; end
45
+ class TrueClass; include Literal; end
46
+ class FalseClass; include Literal; end
47
+
48
+ class LocalizedString < String
49
+ include Literal
50
+ attr_reader :lang
51
+ def initialize value, lang=nil
52
+ super(value)
35
53
 
54
+ @lang = lang
55
+ @lang = lang[1..-1] if @lang[0..0] == '@'
36
56
  end
37
57
 
38
- # returns string serialisation of literal, e.g. "test"^^xsd:string
39
- def to_s
40
- if type
41
- "\"#{value}\"^^#{type.to_s}"
42
- elsif language
43
- "\"#{value}\"@#{language}"
58
+ def to_ntriple
59
+ if @lang
60
+ "\"#{to_s}\"@#@lang"
44
61
  else
45
- "\"value\""
62
+ super
46
63
  end
47
64
  end
48
65
  end
@@ -2,9 +2,7 @@ require 'active_rdf'
2
2
  require 'objectmanager/object_manager'
3
3
  require 'objectmanager/namespace'
4
4
  require 'queryengine/query'
5
-
6
- # TODO: finish removal of ObjectManager.construct_classes: make dynamic finders
7
- # accessible on instance level, and probably more stuff.
5
+ require 'instance_exec'
8
6
 
9
7
  module RDFS
10
8
  # Represents an RDF resource and manages manipulations of that resource,
@@ -28,7 +26,7 @@ module RDFS
28
26
  # allow Resource.new(other_resource)
29
27
  when RDFS::Resource
30
28
  uri.uri
31
- # allow Resource.new(<uri>) by stripping out <>
29
+ # allow Resource.new('<uri>') by stripping out <>
32
30
  when /^<([^>]*)>$/
33
31
  $1
34
32
  # allow Resource.new('uri')
@@ -55,21 +53,53 @@ module RDFS
55
53
  ##### start of instance-level code
56
54
  ##### ######
57
55
 
56
+ def abbreviation; [Namespace.prefix(uri).to_s, localname]; end
58
57
  # a resource is same as another if they both represent the same uri
59
- def ==(other)
58
+ def ==(other);
60
59
  other.respond_to?(:uri) ? other.uri == self.uri : false
61
60
  end
62
61
  alias_method 'eql?','=='
63
62
 
64
63
  # overriding hash to use uri.hash
65
64
  # needed for array.uniq
66
- def hash
67
- uri.hash
68
- end
65
+ def hash; uri.hash; end
69
66
 
70
67
  # overriding sort based on uri
71
- def <=>(other)
72
- uri <=> other.uri
68
+ def <=>(other); uri <=> other.uri; end
69
+ def to_ntriple; "<#{uri}>"; end
70
+ def self.to_ntriple; "<#{class_uri.uri}>"; end
71
+
72
+ def to_xml
73
+ base = Namespace.expand(Namespace.prefix(self),'').chop
74
+
75
+ xml = "<?xml version=\"1.0\"?>\n"
76
+ xml += "<rdf:RDF xmlns=\"#{base}\#\"\n"
77
+ Namespace.abbreviations.each { |p| uri = Namespace.expand(p,''); xml += " xmlns:#{p.to_s}=\"#{uri}\"\n" if uri != base + '#' }
78
+ xml += " xml:base=\"#{base}\">\n"
79
+
80
+ xml += "<rdf:Description rdf:about=\"\##{localname}\">\n"
81
+ direct_predicates.each do |p|
82
+ objects = Query.new.distinct(:o).where(self, p, :o).execute
83
+ objects.each do |obj|
84
+ prefix, localname = Namespace.prefix(p), Namespace.localname(p)
85
+ pred_xml = if prefix
86
+ "%s:%s" % [prefix, localname]
87
+ else
88
+ p.uri
89
+ end
90
+
91
+ case obj
92
+ when RDFS::Resource
93
+ xml += " <#{pred_xml} rdf:resource=\"#{obj.uri}\"/>\n"
94
+ when LocalizedString
95
+ xml += " <#{pred_xml} xml:lang=\"#{obj.lang}\">#{obj}</#{pred_xml}>\n"
96
+ else
97
+ xml += " <#{pred_xml} rdf:datatype=\"#{obj.xsd_type.uri}\">#{obj}</#{pred_xml}>\n"
98
+ end
99
+ end
100
+ end
101
+ xml += "</rdf:Description>\n"
102
+ xml += "</rdf:RDF>"
73
103
  end
74
104
 
75
105
  ##### #####
@@ -217,7 +247,11 @@ module RDFS
217
247
 
218
248
  # check possibility (5)
219
249
  if @predicates.include?(methodname)
220
- return predicate_invocation(@predicates[methodname], args, update, flatten)
250
+ if update
251
+ return set_predicate(@predicates[methodname], args)
252
+ else
253
+ return get_predicate(@predicates[methodname])
254
+ end
221
255
  end
222
256
 
223
257
  # check possibility (6)
@@ -229,16 +263,18 @@ module RDFS
229
263
 
230
264
  # catch the invocation on the namespace
231
265
  class <<namespace
232
- def method_missing(localname, *args)
233
- # check if updating or reading predicate value
234
- if localname.to_s[-1..-1] == '='
235
- # set value
236
- predicate = Namespace.lookup(@@uri, localname.to_s[0..-2])
237
- args.each { |value| FederationManager.add(@@subject, predicate, value) }
266
+ def method_missing(localname, *values)
267
+ update = localname.to_s[-1..-1] == '='
268
+ predicate = if update
269
+ Namespace.lookup(@@uri, localname.to_s[0..-2])
270
+ else
271
+ Namespace.lookup(@@uri, localname)
272
+ end
273
+
274
+ if update
275
+ @@subject.set_predicate(predicate, values)
238
276
  else
239
- # read value
240
- predicate = Namespace.lookup(@@uri, localname)
241
- Query.new.distinct(:o).where(@@subject, predicate, :o).execute(:flatten => @@flatten)
277
+ @@subject.get_predicate(predicate, @@flatten)
242
278
  end
243
279
  end
244
280
  private(:type)
@@ -255,7 +291,11 @@ module RDFS
255
291
  # checking possibility (1) and (3)
256
292
  candidates.each do |pred|
257
293
  if Namespace.localname(pred) == methodname
258
- return predicate_invocation(pred, args, update, flatten)
294
+ if update
295
+ return set_predicate(pred, args)
296
+ else
297
+ return get_predicate(pred, flatten)
298
+ end
259
299
  end
260
300
  end
261
301
 
@@ -357,12 +397,10 @@ module RDFS
357
397
  # returns all predicates that are directly defined for this resource
358
398
  def direct_predicates(distinct = true)
359
399
  if distinct
360
- q = Query.new.distinct(:p)
400
+ Query.new.distinct(:p).where(self, :p, :o).execute
361
401
  else
362
- q = Query.new.select(:p)
402
+ Query.new.select(:p).where(self, :p, :o).execute
363
403
  end
364
- q.where(self,:p, :o).execute
365
- #return (direct + direct.collect {|d| ancestors(d)}).flatten.uniq
366
404
  end
367
405
 
368
406
  def property_accessors
@@ -378,28 +416,44 @@ module RDFS
378
416
  "<#{uri}>"
379
417
  end
380
418
 
381
- ## TODO: ensure that we don't use this anywhere before removing it!!
382
- #def Resource.to_s
383
- # "<#{uri}>"
384
- #end
419
+ def set_predicate(predicate, values)
420
+ FederationManager.delete(self, predicate)
421
+ values.flatten.each {|v| FederationManager.add(self, predicate, v) }
422
+ values
423
+ end
385
424
 
386
- private
425
+ def get_predicate(predicate, flatten=false)
426
+ values = Query.new.distinct(:o).where(self, predicate, :o).execute(:flatten => flatten)
427
+
428
+ # TODO: fix '<<' for Fixnum values etc (we cannot use values.instance_eval
429
+ # because Fixnum cannot do instace_eval, they're not normal classes)
430
+ if values.is_a?(RDFS::Resource) and !values.nil?
431
+ # prepare returned values for accepting << later, eg. in
432
+ # eyal.foaf::knows << knud
433
+ #
434
+ # store @subject, @predicate in returned values
435
+ values.instance_exec(self, predicate) do |s,p|
436
+ @subj = s
437
+ @pred = p
438
+ end
387
439
 
440
+ # overwrite << to add triple to db
441
+ values.instance_eval do
442
+ def <<(value)
443
+ FederationManager.add(@subj, @pred, value)
444
+ end
445
+ end
446
+ end
447
+
448
+ values
449
+ end
450
+
451
+ private
388
452
  # def ancestors(predicate)
389
453
  # subproperty = Namespace.lookup(:rdfs,:subPropertyOf)
390
454
  # Query.new.distinct(:p).where(predicate, subproperty, :p).execute
391
455
  # end
392
456
 
393
- def predicate_invocation(predicate, args, update, flatten)
394
- if update
395
- args.each do |value|
396
- FederationManager.add(self, predicate, value)
397
- end
398
- args
399
- else
400
- Query.new.distinct(:o).where(self, predicate, :o).execute(:flatten => flatten)
401
- end
402
- end
403
457
 
404
458
  # returns all rdf:types of this resource but without a conversion to
405
459
  # Ruby classes (it returns an array of RDFS::Resources)
@@ -519,6 +573,6 @@ class DynamicFinderProxy
519
573
  # the initialize method so all return values are ignored, instead the proxy
520
574
  # itself is returned)
521
575
  @value = query.execute
522
- return value
576
+ return @value
523
577
  end
524
578
  end
@@ -7,6 +7,24 @@ require 'strscan'
7
7
 
8
8
  # ntriples parser
9
9
  class NTriplesParser
10
+ def self.parse_node input
11
+ case input
12
+ when MatchBNode
13
+ RDFS::Resource.new("http://www.activerdf.org/bnode/#{UUID.random_create}/#$1")
14
+ when MatchLiteral
15
+ value = fix_unicode($1)
16
+ if $2
17
+ Literal.typed(value, RDFS::Resource.new($2))
18
+ else
19
+ value
20
+ end
21
+ when MatchResource
22
+ RDFS::Resource.new($1)
23
+ else
24
+ nil
25
+ end
26
+ end
27
+
10
28
  # parses an input string of ntriples and returns a nested array of [s, p, o]
11
29
  # (which are in turn ActiveRDF objects)
12
30
  def self.parse(input)
@@ -19,31 +37,36 @@ class NTriplesParser
19
37
  scanner = StringScanner.new(triple)
20
38
  scanner.skip(/\s+/)
21
39
  while not scanner.eos?
22
- nodes << scanner.scan(Node)
40
+ nodes << scanner.scan(MatchNode)
23
41
  scanner.skip(/\s+/)
24
42
  scanner.terminate if nodes.size == 3
25
43
  end
26
44
 
27
45
  # handle bnodes if necessary (bnodes need to have uri generated)
28
46
  subject = case nodes[0]
29
- when BNode
47
+ when MatchBNode
30
48
  RDFS::Resource.new("http://www.activerdf.org/bnode/#{uuid}/#$1")
31
- when Resource
49
+ when MatchResource
32
50
  RDFS::Resource.new($1)
33
51
  end
34
52
 
35
53
  predicate = case nodes[1]
36
- when Resource
54
+ when MatchResource
37
55
  RDFS::Resource.new($1)
38
56
  end
39
57
 
40
58
  # handle bnodes and literals if necessary (literals need unicode fixing)
41
59
  object = case nodes[2]
42
- when BNode
60
+ when MatchBNode
43
61
  RDFS::Resource.new("http://www.activerdf.org/bnode/#{uuid}/#$1")
44
- when Literal
45
- fix_unicode($1)
46
- when Resource
62
+ when MatchLiteral
63
+ value = fix_unicode($1)
64
+ if $2
65
+ Literal.typed(value, RDFS::Resource.new($2))
66
+ else
67
+ value
68
+ end
69
+ when MatchResource
47
70
  RDFS::Resource.new($1)
48
71
  end
49
72
 
@@ -54,10 +77,10 @@ class NTriplesParser
54
77
 
55
78
  private
56
79
  # constants for extracting resources/literals from sql results
57
- Node = Regexp.union(/"(?:\\"|[^"])*"/,/_:\S*/,/<[^>]*>/)
58
- BNode = /_:(\S*)/
59
- Resource = /<([^>]*)>/
60
- Literal = /"((?:\\"|[^"])*)"/
80
+ MatchNode = Regexp.union(/"(?:\\"|[^"])*"(?:\^\^\S+)?/,/_:\S*/,/<[^>]*>/)
81
+ MatchBNode = /_:(\S*)/
82
+ MatchResource = /<([^>]*)>/
83
+ MatchLiteral = /"((?:\\"|[^"])*)"(?:\^\^<(\S+)>)?/
61
84
 
62
85
  # fixes unicode characters in literals (because we parse them wrongly somehow)
63
86
  def self.fix_unicode(str)
@@ -57,15 +57,10 @@ class Query2SPARQL
57
57
  end
58
58
 
59
59
  def self.construct_clause(term)
60
- if term.respond_to? :uri
61
- term.to_s
60
+ if term.is_a?(Symbol)
61
+ "?#{term}"
62
62
  else
63
- case term
64
- when Symbol
65
- '?' + term.to_s
66
- else
67
- term.to_s
68
- end
63
+ term.to_ntriple
69
64
  end
70
65
  end
71
66
 
@@ -16,38 +16,37 @@ class TestLiteral < Test::Unit::TestCase
16
16
  end
17
17
 
18
18
  def test_xsd_string
19
- # test with explicit datatype
20
- test = Literal.new('test', XSD::string)
21
- assert_equal '"test"^^<http://www.w3.org/2001/XMLSchema#string>', test.to_s
19
+ test = Literal.typed('test', XSD::string)
20
+ assert_equal '"test"^^<http://www.w3.org/2001/XMLSchema#string>', test.to_ntriple
22
21
  end
23
22
 
24
23
  def test_automatic_conversion
25
24
  # infer string
26
- test = Literal.new('test')
27
- assert_equal '"test"^^<http://www.w3.org/2001/XMLSchema#string>', test.to_s
25
+ test = 'test'
26
+ assert_equal '"test"^^<http://www.w3.org/2001/XMLSchema#string>', test.to_ntriple
28
27
 
29
28
  # infer integer
30
- test = Literal.new(18)
31
- assert_equal '"18"^^<http://www.w3.org/2001/XMLSchema#integer>', test.to_s
29
+ test = 18
30
+ assert_equal '"18"^^<http://www.w3.org/2001/XMLSchema#integer>', test.to_ntriple
32
31
 
33
32
  # infer boolean
34
- test = Literal.new(true)
35
- assert_equal '"true"^^<http://www.w3.org/2001/XMLSchema#boolean>', test.to_s
33
+ test = true
34
+ assert_equal '"true"^^<http://www.w3.org/2001/XMLSchema#boolean>', test.to_ntriple
36
35
  end
37
36
 
38
37
  def test_equality
39
- test1 = Literal.new('test')
40
- test2 = Literal.new('test', XSD::string)
41
- assert_equal test2.to_s, test1.to_s
38
+ test1 = 'test'
39
+ test2 = Literal.typed('test', XSD::string)
40
+ assert_equal test2.to_ntriple, test1.to_ntriple
42
41
  end
43
42
 
44
43
  def test_language_tag
45
- cat = Literal.new('cat')
46
- cat_en = Literal.new('cat', '@en')
47
- assert_equal '"cat"@en', cat_en.to_s
48
- assert_not_equal cat.to_s, cat_en.to_s
44
+ cat = 'cat'
45
+ cat_en = LocalizedString.new('cat', '@en')
46
+ assert_equal '"cat"@en', cat_en.to_ntriple
47
+ assert_not_equal cat.to_ntriple, cat_en.to_ntriple
49
48
 
50
- assert_equal '"dog"@en-GB', Literal.new('dog', '@en-GB').to_s
51
- assert_equal '"dog"@en@test', Literal.new('dog', '@en@test').to_s
49
+ assert_equal '"dog"@en-GB', LocalizedString.new('dog', '@en-GB').to_ntriple
50
+ assert_equal '"dog"@en@test', LocalizedString.new('dog', '@en@test').to_ntriple
52
51
  end
53
52
  end
@@ -65,4 +65,30 @@ class TestObjectManager < Test::Unit::TestCase
65
65
  assert_equal TEST::Person, RDFS::Resource.new('http://activerdf.org/test/Person')
66
66
  assert_equal RDFS::Resource.new('http://activerdf.org/test/Person'), TEST::Person
67
67
  end
68
+
69
+ def test_to_xml
70
+ get_adapter.load "#{File.dirname(__FILE__)}/../test_person_data.nt"
71
+ Namespace.register(:test, 'http://activerdf.org/test/')
72
+
73
+ eyal = RDFS::Resource.new 'http://activerdf.org/test/eyal'
74
+ eyal.age = 29
75
+ assert_equal 29, eyal.age
76
+ snippet =
77
+ '<rdf:Description rdf:about="#eyal">
78
+ <test:age rdf:datatype="http://www.w3.org/2001/XMLSchema#integer">29</test:age>
79
+ <test:eye rdf:datatype="http://www.w3.org/2001/XMLSchema#string">blue</test:eye>
80
+ <rdf:type rdf:resource="http://activerdf.org/test/Person"/>
81
+ <rdf:type rdf:resource="http://www.w3.org/2000/01/rdf-schema#Resource"/>
82
+ </rdf:Description>
83
+ </rdf:RDF>'
84
+ assert eyal.to_xml.include?(snippet)
85
+
86
+
87
+ url = 'http://gollem.swi.psy.uva.nl/cgi-bin/rdf-parser'
88
+ uri = URI.parse(url)
89
+ req = Net::HTTP::Post.new(url)
90
+ req.set_form_data('rdf' => eyal.to_xml)
91
+ res = Net::HTTP.new(uri.host, uri.port).start { |http| http.request(req) }
92
+ assert_match /RDF statement parsed successfully/, res.body, "SWI-Prolog failed to parse XML output"
93
+ end
68
94
  end
@@ -53,9 +53,9 @@ class TestResourceReading < Test::Unit::TestCase
53
53
 
54
54
  def test_eyal_age
55
55
  # triple exists '<eyal> age 27'
56
- assert_equal '27', @eyal.age
57
- assert_equal '27', @eyal.test::age
58
- assert_equal ['27'], @eyal.all_age
56
+ assert_equal 27, @eyal.age
57
+ assert_equal 27, @eyal.test::age
58
+ assert_equal [27], @eyal.all_age
59
59
 
60
60
  # Person has property car, but eyal has no value for it
61
61
  assert_equal nil, @eyal.car
@@ -19,12 +19,16 @@ class TestResourceWriting < Test::Unit::TestCase
19
19
  eyal = RDFS::Resource.new 'http://activerdf.org/test/eyal'
20
20
  assert_raises(ActiveRdfError) { eyal.age = 18 }
21
21
 
22
- assert_nothing_raised { eyal.ar::age = 100 }
23
- assert_equal '100', eyal.ar::age
24
- assert_equal ['100'], eyal.all_ar::age
22
+ eyal.ar::age = 100
23
+ assert_equal 100, eyal.ar::age
24
+ assert_equal [100], eyal.all_ar::age
25
25
 
26
- adapter.load "#{File.dirname(__FILE__)}/../test_person_data.nt"
27
- assert_nothing_raised { eyal.age = 18 }
28
- assert_equal ['100', '18', '27'], eyal.age
26
+ # << fails on Fixnums , because Ruby doesn't allow us to change behaviour of
27
+ # << on Fixnums
28
+ eyal.age << 18
29
+ assert_equal 100, eyal.age
30
+
31
+ eyal.ar::age = [100, 80]
32
+ assert_equal [100, 80], eyal.ar::age
29
33
  end
30
34
  end
@@ -51,6 +51,21 @@ EOF
51
51
  triples = NTriplesParser.parse(string)
52
52
 
53
53
  assert_equal 1, triples.size
54
- assert_equal literal, triples.first[2]
54
+ assert_equal literal, triples.first[2]
55
+ end
56
+
57
+ def test_datatypes
58
+ string =<<EOF
59
+ <s> <p> "blue" .
60
+ <s> <p> "29"^^<http://www.w3.org/2001/XMLSchema#integer> .
61
+ <s> <p> "false"^^<http://www.w3.org/2001/XMLSchema#boolean> .
62
+ <s> <p> "2002-10-10T00:00:00+13"^^<http://www.w3.org/2001/XMLSchema#date> .
63
+ EOF
64
+ triples = NTriplesParser.parse(string)
65
+ assert_equal 4, triples.size
66
+ assert_equal 'blue', triples[0][2]
67
+ assert_equal 29, triples[1][2]
68
+ assert_equal triples[2][2], false
69
+ assert_equal triples[3][2], DateTime.parse('2002-10-10T00:00:00+13')
55
70
  end
56
71
  end
@@ -8,22 +8,18 @@ require 'queryengine/query2sparql'
8
8
  require "#{File.dirname(__FILE__)}/../common"
9
9
 
10
10
  class TestQuery2Sparql < Test::Unit::TestCase
11
- def setup
12
- end
13
-
14
- def teardown
15
- end
11
+ def setup; end
12
+ def teardown; end
16
13
 
17
14
  def test_sparql_generation
18
-
19
15
  # TODO: write tests for distinct, ask
20
16
 
21
17
  query = Query.new
22
18
  query.select(:s)
23
- query.where(:s, RDFS::Resource.new('predicate'), '30')
19
+ query.where(:s, RDFS::Resource.new('predicate'), 30)
24
20
 
25
21
  generated = Query2SPARQL.translate(query)
26
- expected = "SELECT ?s WHERE { ?s <predicate> \"30\" . } "
22
+ expected = "SELECT ?s WHERE { ?s <predicate> \"30\"^^<http://www.w3.org/2001/XMLSchema#integer> . } "
27
23
  assert_equal expected, generated
28
24
 
29
25
  query = Query.new
@@ -33,13 +29,15 @@ class TestQuery2Sparql < Test::Unit::TestCase
33
29
  generated = Query2SPARQL.translate(query)
34
30
  expected = "SELECT ?s WHERE { ?s <foaf:age> ?a . ?a <rdf:type> <xsd:int> . } "
35
31
  assert_equal expected, generated
32
+ end
36
33
 
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
34
+ def test_sparql_distinct
35
+ query = Query.new
36
+ query.distinct(:s)
37
+ query.where(:s, RDFS::Resource.new('foaf:age'), :a)
38
+ generated = Query2SPARQL.translate(query)
39
+ expected = "SELECT DISTINCT ?s WHERE { ?s <foaf:age> ?a . } "
40
+ assert_equal expected, generated
43
41
  end
44
42
 
45
43
  def test_query_omnipotent
@@ -21,10 +21,10 @@ class TestQueryEngine < Test::Unit::TestCase
21
21
 
22
22
  query = Query.new
23
23
  query.select(:s)
24
- query.where(:s, RDFS::Resource.new('predicate'), '30')
24
+ query.where(:s, RDFS::Resource.new('predicate'), 30)
25
25
 
26
26
  generated = Query2SPARQL.translate(query)
27
- expected = "SELECT ?s WHERE { ?s <predicate> \"30\" . } "
27
+ expected = "SELECT ?s WHERE { ?s <predicate> \"30\"^^<http://www.w3.org/2001/XMLSchema#integer> . } "
28
28
  assert_equal expected, generated
29
29
 
30
30
  query = Query.new
@@ -42,11 +42,18 @@ class TestAdapter < Test::Unit::TestCase
42
42
  Namespace.register(:test, 'http://activerdf.org/test/')
43
43
  eyal = Namespace.lookup(:test, :eyal)
44
44
 
45
- assert_equal '27', eyal.age
46
- eyal.age = 30
47
-
48
- assert eyal.age.include?('30')
49
- assert eyal.age.include?('27')
45
+ assert_equal 1, eyal.all_age.size
46
+ assert_equal 27, eyal.age
47
+
48
+ # << doesn't work on Fixnums
49
+ eyal.age << 30
50
+ assert_equal 1, eyal.all_age.size
51
+ assert !eyal.all_age.include?(30)
52
+ assert eyal.all_age.include?(27)
53
+
54
+ eyal.age = 40
55
+ assert_equal 1, eyal.all_age.size
56
+ assert eyal.age == 40
50
57
  end
51
58
  end
52
59
 
@@ -1,9 +1,9 @@
1
1
  <http://activerdf.org/test/Person> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2000/01/rdf-schema#Class> .
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
- <http://activerdf.org/test/eyal> <http://activerdf.org/test/age> "27" .
4
+ <http://activerdf.org/test/eyal> <http://activerdf.org/test/age> "27"^^<http://www.w3.org/2001/XMLSchema#integer> .
5
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" .
6
+ <http://activerdf.org/test/other> <http://activerdf.org/test/age> "21"^^<http://www.w3.org/2001/XMLSchema#integer> .
7
7
  <http://activerdf.org/test/eyal> <http://activerdf.org/test/eye> "blue" .
8
8
  <http://activerdf.org/test/age> <http://www.w3.org/2000/01/rdf-schema#domain> <http://www.w3.org/2000/01/rdf-schema#Resource> .
9
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.4
3
3
  specification_version: 1
4
4
  name: activerdf
5
5
  version: !ruby/object:Gem::Version
6
- version: 1.6.8
7
- date: 2007-11-01 00:00:00 +01:00
6
+ version: 1.6.9
7
+ date: 2008-02-11 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
@@ -32,42 +32,41 @@ files:
32
32
  - LICENSE
33
33
  - README
34
34
  - CHANGELOG
35
+ - test/small-two.nt
36
+ - test/queryengine
37
+ - test/queryengine/test_query_engine.rb
38
+ - test/queryengine/test_ntriples_parser.rb
39
+ - test/queryengine/test_query2sparql.rb
40
+ - test/test_person_data.nt
35
41
  - test/federation
36
- - test/federation/test_federation_manager.rb
37
42
  - test/federation/test_connection_pool.rb
43
+ - test/federation/test_federation_manager.rb
44
+ - test/small-one.nt
45
+ - test/test_adapters.rb
46
+ - test/common.rb
38
47
  - test/objectmanager
39
- - test/objectmanager/test_resource_reading.rb
40
48
  - test/objectmanager/test_literal.rb
41
- - test/objectmanager/test_namespace.rb
42
49
  - test/objectmanager/test_object_manager.rb
50
+ - test/objectmanager/test_resource_reading.rb
43
51
  - test/objectmanager/test_resource_writing.rb
44
- - test/queryengine
45
- - test/queryengine/test_ntriples_parser.rb
46
- - test/queryengine/test_query.rb
47
- - test/queryengine/test_query2jars2.rb
48
- - test/queryengine/test_query2sparql.rb
49
- - test/queryengine/test_query_engine.rb
50
- - test/common.rb
51
- - test/test_adapters.rb
52
- - test/test_person_data.nt
53
- - test/small-one.nt
54
- - test/small-two.nt
52
+ - test/objectmanager/test_namespace.rb
55
53
  - lib/active_rdf
54
+ - lib/active_rdf/queryengine
55
+ - lib/active_rdf/queryengine/ntriples_parser.rb
56
+ - lib/active_rdf/queryengine/query.rb
57
+ - lib/active_rdf/queryengine/query2sparql.rb
58
+ - lib/active_rdf/queryengine/query2jars2.rb
56
59
  - lib/active_rdf/federation
60
+ - lib/active_rdf/federation/active_rdf_adapter.rb
57
61
  - lib/active_rdf/federation/connection_pool.rb
58
62
  - lib/active_rdf/federation/federation_manager.rb
59
- - lib/active_rdf/federation/active_rdf_adapter.rb
63
+ - lib/active_rdf/instance_exec.rb
60
64
  - lib/active_rdf/objectmanager
61
65
  - lib/active_rdf/objectmanager/resource.rb
62
- - lib/active_rdf/objectmanager/namespace.rb
63
66
  - lib/active_rdf/objectmanager/literal.rb
64
- - lib/active_rdf/objectmanager/object_manager.rb
65
67
  - lib/active_rdf/objectmanager/bnode.rb
66
- - lib/active_rdf/queryengine
67
- - lib/active_rdf/queryengine/query.rb
68
- - lib/active_rdf/queryengine/query2sparql.rb
69
- - lib/active_rdf/queryengine/ntriples_parser.rb
70
- - lib/active_rdf/queryengine/query2jars2.rb
68
+ - lib/active_rdf/objectmanager/namespace.rb
69
+ - lib/active_rdf/objectmanager/object_manager.rb
71
70
  - lib/active_rdf.rb
72
71
  - lib/active_rdf_log.rb
73
72
  - lib/active_rdf_helpers.rb
@@ -1,55 +0,0 @@
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
- query = Query.new
19
- query.select(:s)
20
- query.where(:s, RDFS::Resource.new('predicate'), '30')
21
- generated = Query2SPARQL.translate(query)
22
- expected = "SELECT ?s WHERE { ?s <predicate> \"30\" . } "
23
- assert_equal expected, generated
24
-
25
- query = Query.new
26
- query.select(:s)
27
- query.where(:s, RDFS::Resource.new('foaf:age'), :a)
28
- query.where(:a, RDFS::Resource.new('rdf:type'), RDFS::Resource.new('xsd:int'))
29
- generated = Query2SPARQL.translate(query)
30
- expected = "SELECT ?s WHERE { ?s <foaf:age> ?a . ?a <rdf:type> <xsd:int> . } "
31
- assert_equal expected, generated
32
- end
33
-
34
- def test_sparql_distinct
35
- query = Query.new
36
- query.distinct(:s)
37
- query.where(:s, RDFS::Resource.new('foaf:age'), :a)
38
- generated = Query2SPARQL.translate(query)
39
- expected = "SELECT DISTINCT ?s WHERE { ?s <foaf:age> ?a . } "
40
- assert_equal expected, generated
41
- end
42
-
43
- def test_query_omnipotent
44
- # can define multiple select clauses at once or separately
45
- q1 = Query.new.select(:s,:a)
46
- q2 = Query.new.select(:s).select(:a)
47
- assert_equal Query2SPARQL.translate(q1),Query2SPARQL.translate(q2)
48
- end
49
-
50
- def test_query_refuses_string_in_where_clause_subject_or_predicate
51
- assert_raises(ActiveRdfError)do
52
- Query.new.select(:s).where("http://test.org/uri",:p, :o).execute
53
- end
54
- end
55
- end
@@ -1,51 +0,0 @@
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