active-fedora 6.0.0.pre6 → 6.0.0.pre7

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.
@@ -18,7 +18,7 @@ Gem::Specification.new do |s|
18
18
  s.add_dependency('rsolr')
19
19
  s.add_dependency('om', '~> 1.8.0')
20
20
  s.add_dependency('nom-xml', '>=0.5.1')
21
- s.add_dependency('solrizer', '~>3.0.0.pre4')
21
+ s.add_dependency('solrizer', '~>3.0.0.pre6')
22
22
  s.add_dependency("activeresource", '>= 3.0.0')
23
23
  s.add_dependency("activesupport", '>= 3.0.0')
24
24
  s.add_dependency("builder", '~> 3.0.0')
@@ -12,24 +12,27 @@ module ActiveFedora
12
12
 
13
13
  autoload :AssociationCollection, 'active_fedora/associations/association_collection'
14
14
  autoload :AssociationProxy, 'active_fedora/associations/association_proxy'
15
+
16
+ # Clears out the association cache.
17
+ def clear_association_cache #:nodoc:
18
+ @association_cache.clear if persisted?
19
+ end
20
+
21
+ # :nodoc:
22
+ attr_reader :association_cache
23
+
15
24
  private
16
25
 
17
26
  # Returns the specified association instance if it responds to :loaded?, nil otherwise.
18
27
  def association_instance_get(name)
19
- ivar = "@#{name}"
20
- if instance_variable_defined?(ivar)
21
- association = instance_variable_get(ivar)
22
- association if association.respond_to?(:loaded?)
23
- end
28
+ @association_cache[name.to_sym]
24
29
  end
25
30
 
26
31
  # Set the specified association instance.
27
32
  def association_instance_set(name, association)
28
- instance_variable_set("@#{name}", association)
33
+ @association_cache[name] = association
29
34
  end
30
35
 
31
-
32
-
33
36
  module ClassMethods
34
37
 
35
38
  def has_many(association_id, options={})
@@ -180,7 +180,9 @@ module ActiveFedora
180
180
  end
181
181
 
182
182
  def construct_query
183
- @counter_query = @finder_query = ActiveFedora::SolrService.construct_query_for_rel(@reflection.options[:property], @owner.internal_uri)
183
+ clauses = {@reflection.options[:property] => @owner.internal_uri}
184
+ clauses[:has_model] = @reflection.class_name.constantize.to_class_uri if @reflection.class_name
185
+ @counter_query = @finder_query = ActiveFedora::SolrService.construct_query_for_rel(clauses)
184
186
  end
185
187
 
186
188
 
@@ -68,6 +68,7 @@ module ActiveFedora
68
68
  # the given namespace.
69
69
  def initialize(attrs = nil)
70
70
  attrs = {} if attrs.nil?
71
+ @association_cache = {}
71
72
  attributes = attrs.dup
72
73
  @inner_object = UnsavedDigitalObject.new(self.class, attributes.delete(:namespace), attributes.delete(:pid))
73
74
  self.relationships_loaded = true
@@ -80,6 +81,7 @@ module ActiveFedora
80
81
 
81
82
  # Reloads the object from Fedora.
82
83
  def reload
84
+ clear_association_cache
83
85
  init_with(self.class.find(self.pid).inner_object)
84
86
  end
85
87
 
@@ -94,6 +96,7 @@ module ActiveFedora
94
96
  # post.init_with(DigitalObject.find(pid))
95
97
  # post.properties.title # => 'hello world'
96
98
  def init_with(inner_obj)
99
+ @association_cache = {}
97
100
  @inner_object = inner_obj
98
101
  unless @inner_object.is_a? SolrDigitalObject
99
102
  @inner_object.original_class = self.class
@@ -304,8 +307,8 @@ module ActiveFedora
304
307
  c_time = Time.parse(c_time) unless c_time.is_a?(Time)
305
308
  m_time = modified_date
306
309
  m_time = Time.parse(m_time) unless m_time.is_a?(Time)
307
- Solrizer.set_field(solr_doc, 'system_create', c_time)
308
- Solrizer.set_field(solr_doc, 'system_modified', m_time)
310
+ Solrizer.set_field(solr_doc, 'system_create', c_time, :stored_sortable)
311
+ Solrizer.set_field(solr_doc, 'system_modified', m_time, :stored_sortable)
309
312
  Solrizer.set_field(solr_doc, 'active_fedora_model', self.class.inspect, :symbol)
310
313
  solr_doc.merge!(SOLR_DOCUMENT_ID.to_sym => pid)
311
314
  solrize_profile(solr_doc)
@@ -40,7 +40,7 @@ module ActiveFedora
40
40
  end
41
41
 
42
42
  def default_sort_params
43
- [ActiveFedora::SolrService.solr_name(:system_create, type: :date)+' asc']
43
+ [ActiveFedora::SolrService.solr_name(:system_create, :stored_sortable, type: :date)+' asc']
44
44
  end
45
45
 
46
46
  # Yields the found ActiveFedora::Base object to the passed block
@@ -149,7 +149,7 @@ module ActiveFedora
149
149
  # Return the solr clause that queries for this type of class
150
150
  def search_model_clause
151
151
  unless self == ActiveFedora::Base
152
- return ActiveFedora::SolrService.construct_query_for_rel(:has_model, self.to_class_uri)
152
+ return ActiveFedora::SolrService.construct_query_for_rel(:has_model => self.to_class_uri)
153
153
  end
154
154
  end
155
155
  end
@@ -94,8 +94,8 @@ module ActiveFedora
94
94
  options[:order] ||= sort if sort.present?
95
95
  end
96
96
 
97
-
98
97
  if options.present?
98
+ options = args.first unless args.empty?
99
99
  options = {conditions: options}
100
100
  apply_finder_options(options).all
101
101
  else
@@ -75,8 +75,13 @@ module ActiveFedora
75
75
  return uri.gsub(/(:)/, '\\:').gsub(/(\/)/, '\\/')
76
76
  end
77
77
 
78
- def self.construct_query_for_rel(predicate, target_uri)
79
- "#{solr_name(predicate, :symbol)}:#{escape_uri_for_query(target_uri)}"
78
+ # Create a query with a clause for each key, value
79
+ # @param [Hash] args key is the predicate, value is the target_uri
80
+ def self.construct_query_for_rel(args)
81
+ clauses = args.map do |predicate, target_uri|
82
+ "#{solr_name(predicate, :symbol)}:#{escape_uri_for_query(target_uri)}"
83
+ end
84
+ clauses.join(" AND ")
80
85
  end
81
86
 
82
87
  def self.query(query, args={})
@@ -1,3 +1,3 @@
1
1
  module ActiveFedora
2
- VERSION = "6.0.0.pre6"
2
+ VERSION = "6.0.0.pre7"
3
3
  end
@@ -0,0 +1,33 @@
1
+ require 'spec_helper'
2
+
3
+ describe "When two or more relationships share the same property" do
4
+ before do
5
+ class Book < ActiveFedora::Base
6
+ has_many :collections, :property=>:is_part_of, :class_name=>'Collection'
7
+ has_many :people, :property=>:is_part_of#, :class_name=>'Person'
8
+ end
9
+
10
+ class Person < ActiveFedora::Base
11
+ belongs_to :book, :property=>:is_part_of
12
+ end
13
+
14
+ class Collection < ActiveFedora::Base
15
+ belongs_to :book, :property=>:is_part_of
16
+ end
17
+
18
+ @book = Book.create!#(:collections=>[@collection1, @collection2], :people=>[@person1, @person2])
19
+ @person1 = Person.create!(:book=>@book)
20
+ @person2 = Person.create!(:book=>@book)
21
+ end
22
+ after do
23
+ Object.send(:remove_const, :Collection)
24
+ Object.send(:remove_const, :Person)
25
+ Object.send(:remove_const, :Book)
26
+ end
27
+
28
+ it "Should only return relationships of the correct class" do
29
+ @book.reload
30
+ @book.people.should == [@person1, @person2]
31
+ @book.collections.should == []
32
+ end
33
+ end
@@ -392,8 +392,8 @@ describe ActiveFedora::Base do
392
392
  @test_object.should_receive(:create_date).and_return("2012-03-04T03:12:02Z")
393
393
  @test_object.should_receive(:modified_date).and_return("2012-03-07T03:12:02Z")
394
394
  solr_doc = @test_object.to_solr
395
- solr_doc[ActiveFedora::SolrService.solr_name("system_create", type: :date)].should eql(["2012-03-04T03:12:02Z"])
396
- solr_doc[ActiveFedora::SolrService.solr_name("system_modified", type: :date)].should eql(["2012-03-07T03:12:02Z"])
395
+ solr_doc[ActiveFedora::SolrService.solr_name("system_create", :stored_sortable, type: :date)].should eql(["2012-03-04T03:12:02Z"])
396
+ solr_doc[ActiveFedora::SolrService.solr_name("system_modified", :stored_sortable, type: :date)].should eql(["2012-03-07T03:12:02Z"])
397
397
  solr_doc[:id].should eql("#{@test_object.pid}")
398
398
  end
399
399
 
@@ -3,8 +3,7 @@ require 'spec_helper'
3
3
  describe ActiveFedora::Associations::HasManyAssociation do
4
4
  it "should be able to replace the collection" do
5
5
  @owner = stub(:new_record? => false, :to_ary => nil, :internal_uri => 'info:fedora/changeme:99')
6
- @reflection = stub(:klass => mock.class, :options=>{:property=>'predicate'})
7
- #ac = ActiveFedora::Associations::AssociationCollection.new(@owner, @reflection)
6
+ @reflection = stub(:klass => mock.class, :options=>{:property=>'predicate'}, :class_name=> nil)
8
7
  ac = ActiveFedora::Associations::HasManyAssociation.new(@owner, @reflection)
9
8
  @target = [stub(:to_ary => nil, :new_record? => false, :remove_relationship=>true), stub(:to_ary => nil, :new_record? => false, :remove_relationship=>true), stub(:to_ary => nil, :new_record? => false, :remove_relationship=>true)]
10
9
  ac.target = @target
@@ -8,7 +8,7 @@ describe ActiveFedora::Base do
8
8
  end
9
9
  end
10
10
  @model_query = ActiveFedora::SolrService.solr_name("has_model", :symbol) + ":#{solr_uri("info:fedora/afmodel:SpecModel_Basic")}"
11
- @sort_query = ActiveFedora::SolrService.solr_name("system_create", type: :date) + ' asc'
11
+ @sort_query = ActiveFedora::SolrService.solr_name("system_create", :stored_sortable, type: :date) + ' asc'
12
12
  end
13
13
 
14
14
  after(:all) do
@@ -81,6 +81,28 @@ describe ActiveFedora::Base do
81
81
  }.and_return('response'=>{'docs'=>mock_docs})
82
82
  SpecModel::Basic.find({:foo=>'bar', :baz=>['quix','quack']}).should == ["Fake Object1", "Fake Object2"]
83
83
  end
84
+
85
+ it "should add options" do
86
+ SpecModel::Basic.should_receive(:find_one).with("changeme:30", nil).and_return("Fake Object1")
87
+ SpecModel::Basic.should_receive(:find_one).with("changeme:22", nil).and_return("Fake Object2")
88
+
89
+ mock_docs = [{"id" => "changeme:30"},{"id" => "changeme:22"}]
90
+ mock_docs.should_receive(:has_next?).and_return(false)
91
+ ActiveFedora::SolrService.instance.conn.should_receive(:paginate).with() { |page, rows, method, hash|
92
+ page == 1 &&
93
+ rows == 1000 &&
94
+ method == 'select' &&
95
+ hash[:params] &&
96
+ hash[:params][:fl] == 'id' &&
97
+ hash[:params][:sort] == [@sort_query] &&
98
+ hash[:params][:q].split(" AND ").include?(@model_query) &&
99
+ hash[:params][:q].split(" AND ").include?("foo:\"bar\"") &&
100
+ hash[:params][:q].split(" AND ").include?("baz:\"quix\"") &&
101
+ hash[:params][:q].split(" AND ").include?("baz:\"quack\"")
102
+ }.and_return('response'=>{'docs'=>mock_docs})
103
+ SpecModel::Basic.find({:foo=>'bar', :baz=>['quix','quack']}, :sort=>'title_t desc').should == ["Fake Object1", "Fake Object2"]
104
+ end
105
+
84
106
  end
85
107
  end
86
108
 
@@ -34,7 +34,7 @@ describe ActiveFedora do
34
34
 
35
35
  it "should be used by ActiveFedora::Base#find_with_conditions" do
36
36
  mock_response = mock("SolrResponse")
37
- ActiveFedora::SolrService.should_receive(:query).with("#{ActiveFedora::SolrService.solr_name("has_model", :symbol)}:info\\:fedora\\/afmodel\\:SolrSpecModel_Basic AND " + SOLR_DOCUMENT_ID + ':"changeme\\:30"', {:sort => ["#{ActiveFedora::SolrService.solr_name("system_create", type: :date)} asc"]}).and_return(mock_response)
37
+ ActiveFedora::SolrService.should_receive(:query).with("#{ActiveFedora::SolrService.solr_name("has_model", :symbol)}:info\\:fedora\\/afmodel\\:SolrSpecModel_Basic AND " + SOLR_DOCUMENT_ID + ':"changeme\\:30"', {:sort => ["#{ActiveFedora::SolrService.solr_name("system_create", :stored_sortable, type: :date)} asc"]}).and_return(mock_response)
38
38
 
39
39
  SolrSpecModel::Basic.find_with_conditions(:id=>"changeme:30").should equal(mock_response)
40
40
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active-fedora
3
3
  version: !ruby/object:Gem::Version
4
- version: 6.0.0.pre6
4
+ version: 6.0.0.pre7
5
5
  prerelease: 6
6
6
  platform: ruby
7
7
  authors:
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2013-01-27 00:00:00.000000000 Z
14
+ date: 2013-01-30 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: rsolr
@@ -68,7 +68,7 @@ dependencies:
68
68
  requirements:
69
69
  - - ~>
70
70
  - !ruby/object:Gem::Version
71
- version: 3.0.0.pre4
71
+ version: 3.0.0.pre6
72
72
  type: :runtime
73
73
  prerelease: false
74
74
  version_requirements: !ruby/object:Gem::Requirement
@@ -76,7 +76,7 @@ dependencies:
76
76
  requirements:
77
77
  - - ~>
78
78
  - !ruby/object:Gem::Version
79
- version: 3.0.0.pre4
79
+ version: 3.0.0.pre6
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: activeresource
82
82
  requirement: !ruby/object:Gem::Requirement
@@ -438,6 +438,7 @@ files:
438
438
  - spec/integration/datastreams_spec.rb
439
439
  - spec/integration/delete_all_spec.rb
440
440
  - spec/integration/full_featured_model_spec.rb
441
+ - spec/integration/has_many_associations_spec.rb
441
442
  - spec/integration/model_spec.rb
442
443
  - spec/integration/mods_article_integration_spec.rb
443
444
  - spec/integration/nested_attribute_spec.rb
@@ -594,6 +595,7 @@ test_files:
594
595
  - spec/integration/datastreams_spec.rb
595
596
  - spec/integration/delete_all_spec.rb
596
597
  - spec/integration/full_featured_model_spec.rb
598
+ - spec/integration/has_many_associations_spec.rb
597
599
  - spec/integration/model_spec.rb
598
600
  - spec/integration/mods_article_integration_spec.rb
599
601
  - spec/integration/nested_attribute_spec.rb