activerdf 1.6 → 1.6.1

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,6 @@
1
+ == activerdf (1.6.1) Thu, 19 Apr 2007 22:57:01 +0100
2
+ * fix bug 107280: add support for full query options (including context) in dynamic finders
3
+
1
4
  == activerdf (1.6) Thu, 12 Apr 2007 23:12:40 +0100
2
5
  * no need for ObjectManager.construct_classes anymore (classes exist automagically after Namespace.register)
3
6
  * added resource.localname (alias for Namespace.localname(resource))
@@ -129,7 +129,15 @@ module RDFS
129
129
  if options.include? :where
130
130
  raise ActiveRdfError, "where clause should be hash of predicate => object" unless options[:where].is_a? Hash
131
131
  options[:where].each do |p,o|
132
- query.where(:s, p, o)
132
+ if options.include? :context
133
+ query.where(:s, p, o, options[:context])
134
+ else
135
+ query.where(:s, p, o)
136
+ end
137
+ end
138
+ else
139
+ if options[:context]
140
+ query.where(:s, :p, :o, options[:context])
133
141
  end
134
142
  end
135
143
 
@@ -402,6 +410,7 @@ class DynamicFinderProxy
402
410
  @where = nil
403
411
  @value = nil
404
412
  attr_reader :value
413
+ private(:type)
405
414
 
406
415
  # construct proxy from find_by text
407
416
  # foaf::name
@@ -457,18 +466,44 @@ class DynamicFinderProxy
457
466
 
458
467
  # construct and execute finder query
459
468
  def query(*args)
469
+ # extract options from args or use an empty hash (no options given)
470
+ options = args.last.is_a?(Hash) ? args.last : {}
471
+
472
+ # build query
460
473
  query = Query.new.distinct(:s)
461
474
  @where.each_with_index do |predicate, i|
462
- query.where(:s, predicate, args[i])
475
+ # specify where clauses, use context if given
476
+ if options[:context]
477
+ query.where(:s, predicate, args[i], options[:context])
478
+ else
479
+ query.where(:s, predicate, args[i])
480
+ end
463
481
  end
464
482
 
483
+ # use sort order if given
484
+ if options.include? :order
485
+ sort_predicate = options[:order]
486
+ query.sort(:sort_value)
487
+ # add sort predicate where clause unless we have it already
488
+ query.where(:s, sort_predicate, :sort_value) unless @where.include? sort_predicate
489
+ end
490
+
491
+ if options.include? :reverse_order
492
+ sort_predicate = options[:reverse_order]
493
+ query.reverse_sort(:sort_value)
494
+ query.where(:s, sort_predicate, :sort_value) unless @where.include? sort_predicate
495
+ end
496
+
497
+ query.limit(options[:limit]) if options[:limit]
498
+ query.offset(options[:offset]) if options[:offset]
499
+
465
500
  $activerdflog.debug "executing dynamic finder: #{query.to_sp}"
466
501
 
467
502
  # store the query results so that caller (Resource.method_missing) can
468
503
  # retrieve them (we cannot return them here, since we were invoked from
469
504
  # the initialize method so all return values are ignored, instead the proxy
470
505
  # itself is returned)
471
- @value = query.execute(:flatten => true)
506
+ @value = query.execute
472
507
  return value
473
508
  end
474
509
  end
@@ -88,16 +88,16 @@ class TestResourceReading < Test::Unit::TestCase
88
88
  end
89
89
 
90
90
  def test_find_methods
91
- assert_equal @eyal, RDFS::Resource.find_by_eye('blue')
92
- assert_equal @eyal, RDFS::Resource.find_by_test::eye('blue')
91
+ assert_equal [@eyal], RDFS::Resource.find_by_eye('blue')
92
+ assert_equal [@eyal], RDFS::Resource.find_by_test::eye('blue')
93
93
 
94
- assert_equal @eyal, RDFS::Resource.find_by_age(27)
95
- assert_equal @eyal, RDFS::Resource.find_by_test::age(27)
94
+ assert_equal [@eyal], RDFS::Resource.find_by_age(27)
95
+ assert_equal [@eyal], RDFS::Resource.find_by_test::age(27)
96
96
 
97
- assert_equal @eyal, RDFS::Resource.find_by_age_and_eye(27, 'blue')
98
- assert_equal @eyal, RDFS::Resource.find_by_test::age_and_test::eye(27, 'blue')
99
- assert_equal @eyal, RDFS::Resource.find_by_test::age_and_eye(27, 'blue')
100
- assert_equal @eyal, RDFS::Resource.find_by_age_and_test::eye(27, 'blue')
97
+ assert_equal [@eyal], RDFS::Resource.find_by_age_and_eye(27, 'blue')
98
+ assert_equal [@eyal], RDFS::Resource.find_by_test::age_and_test::eye(27, 'blue')
99
+ assert_equal [@eyal], RDFS::Resource.find_by_test::age_and_eye(27, 'blue')
100
+ assert_equal [@eyal], RDFS::Resource.find_by_age_and_test::eye(27, 'blue')
101
101
  end
102
102
 
103
103
  # test for writing if no write adapter is defined (like only sparqls)
@@ -106,4 +106,32 @@ class TestResourceReading < Test::Unit::TestCase
106
106
  get_read_only_adapter
107
107
  assert_raises(ActiveRdfError) { @eyal.test::age = 18 }
108
108
  end
109
+
110
+ def test_finders_with_options
111
+ ConnectionPool.clear
112
+ adapter = get_adapter
113
+ file_one = "#{File.dirname(__FILE__)}/../small-one.nt"
114
+ file_two = "#{File.dirname(__FILE__)}/../small-two.nt"
115
+ adapter.load file_one
116
+ adapter.load file_two
117
+
118
+ one = RDFS::Resource.new("file:#{file_one}")
119
+ two = RDFS::Resource.new("file:#{file_two}")
120
+
121
+ assert_equal 2, RDFS::Resource.find.size
122
+ assert_equal 2, RDFS::Resource.find(:all).size
123
+ assert_equal 2, RDFS::Resource.find(:all, :limit => 10).size
124
+ assert_equal 1, RDFS::Resource.find(:all, :limit => 1).size
125
+ assert_equal 1, RDFS::Resource.find(:all, :context => one).size
126
+ assert_equal 1, RDFS::Resource.find(:all, :context => one, :limit => 1).size
127
+ assert_equal 0, RDFS::Resource.find(:all, :context => one, :limit => 0).size
128
+
129
+ assert_equal 1, RDFS::Resource.find_by_eye('blue').size
130
+ assert_equal 1, RDFS::Resource.find_by_eye('blue', :context => one).size
131
+ assert_equal 0, RDFS::Resource.find_by_eye('blue', :context => two).size
132
+
133
+ assert_equal 2, RDFS::Resource.find_by_rdf::type(RDFS::Resource).size
134
+ assert_equal 1, RDFS::Resource.find_by_rdf::type(RDFS::Resource, :context => one).size
135
+ assert_equal 1, RDFS::Resource.find_by_eye_and_rdf::type('blue', RDFS::Resource, :context => one).size
136
+ end
109
137
  end
data/test/small-one.nt ADDED
@@ -0,0 +1,2 @@
1
+ <eyal> <eye> "blue" .
2
+ <eyal> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2000/01/rdf-schema#Resource> .
data/test/small-two.nt ADDED
@@ -0,0 +1,2 @@
1
+ <ron> <eye> "green" .
2
+ <ron> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <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.6"
7
- date: 2007-04-12 00:00:00 +01:00
6
+ version: 1.6.1
7
+ date: 2007-04-19 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,6 +38,8 @@ files:
38
38
  - test/common.rb
39
39
  - test/test_adapters.rb
40
40
  - test/test_person_data.nt
41
+ - test/small-one.nt
42
+ - test/small-two.nt
41
43
  - test/federation/test_federation_manager.rb
42
44
  - test/federation/test_connection_pool.rb
43
45
  - test/objectmanager/test_resource_reading.rb