active-fedora 3.2.0.pre1 → 3.2.0.pre2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (34) hide show
  1. data/Gemfile.lock +1 -1
  2. data/History.txt +3 -1
  3. data/lib/active_fedora.rb +3 -3
  4. data/lib/active_fedora/associations.rb +0 -2
  5. data/lib/active_fedora/associations/association_collection.rb +15 -1
  6. data/lib/active_fedora/associations/belongs_to_association.rb +5 -1
  7. data/lib/active_fedora/associations/has_and_belongs_to_many_association.rb +5 -1
  8. data/lib/active_fedora/base.rb +36 -92
  9. data/lib/active_fedora/datastream.rb +1 -2
  10. data/lib/active_fedora/file_management.rb +73 -0
  11. data/lib/active_fedora/metadata_datastream_helper.rb +3 -1
  12. data/lib/active_fedora/model.rb +6 -18
  13. data/lib/active_fedora/relationships.rb +634 -0
  14. data/lib/active_fedora/samples/special_thing.rb +4 -4
  15. data/lib/active_fedora/semantic_node.rb +97 -236
  16. data/lib/active_fedora/version.rb +1 -1
  17. data/spec/integration/base_file_management_spec.rb +1 -0
  18. data/spec/integration/base_spec.rb +114 -68
  19. data/spec/integration/full_featured_model_spec.rb +0 -1
  20. data/spec/integration/mods_article_integration_spec.rb +0 -1
  21. data/spec/integration/nokogiri_datastream_spec.rb +0 -1
  22. data/spec/integration/rels_ext_datastream_spec.rb +10 -7
  23. data/spec/integration/semantic_node_spec.rb +10 -16
  24. data/spec/samples/models/hydrangea_article.rb +1 -2
  25. data/spec/samples/oral_history_sample_model.rb +1 -1
  26. data/spec/unit/base_spec.rb +26 -16
  27. data/spec/unit/metadata_datastream_spec.rb +1 -0
  28. data/spec/unit/qualified_dublin_core_datastream_spec.rb +1 -0
  29. data/spec/unit/relationship_spec.rb +1 -0
  30. data/spec/unit/relationships_spec.rb +846 -0
  31. data/spec/unit/semantic_node_spec.rb +2 -338
  32. metadata +8 -7
  33. data/lib/active_fedora/relationships_helper.rb +0 -881
  34. data/spec/unit/relationships_helper_spec.rb +0 -800
@@ -39,9 +39,9 @@ class SpecialThing < ActiveFedora::Base
39
39
  #
40
40
 
41
41
  # This is an example of how you can add a custom relationship to a model
42
- # This will allow you to call .derivations on instances of the model to get a list of all of the _outbound_ "hasDerivation" relationships in the RELS-EXT datastream
43
- has_relationship "derivations", :has_derivation
42
+ # This will allow you to call .derivation on instances of the model to get the _outbound_ "hasDerivation" relationship in the RELS-EXT datastream
43
+ belongs_to :derivation, :property=>:has_derivation
44
44
 
45
45
  # This will allow you to call .inspirations on instances of the model to get a list of all of the objects that assert "hasDerivation" relationships pointing at this object
46
- has_relationship "inspirations", :has_derivation, :inbound => true
47
- end
46
+ has_many :inspirations, :property=>:has_derivation
47
+ end
@@ -4,6 +4,7 @@ module ActiveFedora
4
4
  extend ActiveSupport::Concern
5
5
  included do
6
6
  class_attribute :class_relationships, :internal_uri
7
+ class_attribute :class_relationships_desc
7
8
  self.class_relationships = {}
8
9
  end
9
10
  attr_accessor :relationships_loaded, :load_from_solr, :subject
@@ -32,6 +33,34 @@ module ActiveFedora
32
33
  rels_ext.dirty = true
33
34
  end
34
35
 
36
+ # Checks that this object is matches the model class passed in.
37
+ # It requires two steps to pass to return true
38
+ # 1. It has a hasModel relationship of the same model
39
+ # 2. kind_of? returns true for the model passed in
40
+ # This method can most often be used to detect if an object from Fedora that was created
41
+ # with a different model was then used to populate this object.
42
+ # @param [Class] the model class name to check if an object conforms_to that model
43
+ # @return [Boolean] true if this object conforms to the given model name
44
+ def conforms_to?(model_class)
45
+ if self.kind_of?(model_class)
46
+ #check has model and class match
47
+ mod = relationships.first(:predicate=>Predicates.find_graph_predicate(:has_model))
48
+ if mod
49
+ expected = ActiveFedora::ContentModel.pid_from_ruby_class(self.class)
50
+ if mod.object.to_s == expected
51
+ return true
52
+ else
53
+ raise "has_model relationship check failed for model #{model_class} raising exception, expected: '#{expected}' actual: '#{mod.object.to_s}'"
54
+ end
55
+ else
56
+ raise "has_model relationship does not exist for model #{model_class} check raising exception"
57
+ end
58
+ else
59
+ raise "kind_of? check failed for model #{model_class}, actual #{self.class} raising exception"
60
+ end
61
+ return false
62
+ end
63
+
35
64
  # Create an RDF statement
36
65
  # @param uri a string represending the subject
37
66
  # @param predicate a predicate symbol
@@ -120,40 +149,6 @@ module ActiveFedora
120
149
  return unless content.present?
121
150
  RelsExtDatastream.from_xml content, rels_ext
122
151
  end
123
-
124
- def relationships_from_class
125
- rels = {}
126
- self.class.relationships.each_pair do |subj, pred|
127
- rels[subj] = {}
128
- pred.each_key do |pred_key|
129
- rels[subj][pred_key] = []
130
- end
131
- end
132
- return rels
133
- end
134
-
135
- def load_inbound_relationship(name, predicate, opts={})
136
- opts = {:rows=>25}.merge(opts)
137
- query = self.class.inbound_relationship_query(self.pid,"#{name}")
138
- return [] if query.empty?
139
- solr_result = SolrService.instance.conn.query(query, :rows=>opts[:rows])
140
- if opts[:response_format] == :solr
141
- return solr_result
142
- else
143
- if opts[:response_format] == :id_array
144
- id_array = []
145
- solr_result.hits.each do |hit|
146
- id_array << hit[SOLR_DOCUMENT_ID]
147
- end
148
- return id_array
149
- elsif opts[:response_format] == :load_from_solr || self.load_from_solr
150
- return ActiveFedora::SolrService.reify_solr_results(solr_result,{:load_from_solr=>true})
151
- else
152
- return ActiveFedora::SolrService.reify_solr_results(solr_result)
153
- end
154
- end
155
- end
156
-
157
152
 
158
153
  def ids_for_outbound(predicate)
159
154
  (object_relations[predicate] || []).map do |o|
@@ -162,220 +157,86 @@ module ActiveFedora
162
157
  end
163
158
  end
164
159
 
165
- def load_bidirectional(name, inbound_method_name, outbound_method_name, opts)
166
- opts = {:rows=>25}.merge(opts)
167
- if opts[:response_format] == :solr || opts[:response_format] == :load_from_solr
168
- predicate = outbound_relationship_predicates["#{name}_outbound"]
169
- outbound_id_array = ids_for_outbound(predicate)
170
- query = self.class.bidirectional_relationship_query(self.pid,"#{name}",outbound_id_array)
171
- solr_result = SolrService.instance.conn.query(query, :rows=>opts[:rows])
172
-
173
- if opts[:response_format] == :solr
174
- return solr_result
175
- elsif opts[:response_format] == :load_from_solr || self.load_from_solr
176
- return ActiveFedora::SolrService.reify_solr_results(solr_result,{:load_from_solr=>true})
177
- else
178
- return ActiveFedora::SolrService.reify_solr_results(solr_result)
179
- end
180
- else
181
- ary = send(inbound_method_name,opts) + send(outbound_method_name, opts)
182
- return ary.uniq
183
- end
160
+ # Return hash that persists relationship metadata defined by has_relationship calls
161
+ # @return [Hash] Hash of relationship subject (:self or :inbound) mapped to nested hashs of each relationship name mapped to another hash relationship options
162
+ # @example For the following relationship
163
+ #
164
+ # has_relationship "audio_records", :has_part, :type=>AudioRecord
165
+ #
166
+ # Results in the following returned by relationships_desc
167
+ # {:self=>{"audio_records"=>{:type=>AudioRecord, :singular=>nil, :predicate=>:has_part, :inbound=>false}}}
168
+ def relationships_desc
169
+ @relationships_desc ||= self.class.relationships_desc
184
170
  end
185
171
 
186
- def load_outbound_relationship(name, predicate, opts={})
187
- id_array = ids_for_outbound(predicate)
188
- if opts[:response_format] == :id_array && !self.class.relationship_has_solr_filter_query?(:self,"#{name}")
189
- return id_array
190
- else
191
- query = self.class.outbound_relationship_query(name,id_array)
192
- solr_result = SolrService.instance.conn.query(query)
193
- if opts[:response_format] == :solr
194
- return solr_result
195
- elsif opts[:response_format] == :id_array
196
- id_array = []
197
- solr_result.hits.each do |hit|
198
- id_array << hit[SOLR_DOCUMENT_ID]
199
- end
200
- return id_array
201
- elsif opts[:response_format] == :load_from_solr || self.load_from_solr
202
- return ActiveFedora::SolrService.reify_solr_results(solr_result,{:load_from_solr=>true})
203
- else
204
- return ActiveFedora::SolrService.reify_solr_results(solr_result)
172
+ # Return hash of relationship names and predicate pairs (inbound and outbound).
173
+ # It retrieves this information via the relationships_desc hash in the class.
174
+ # @return [Hash] A hash of relationship names (inbound and outbound) mapped to predicates used
175
+ def relationship_predicates
176
+ return @relationship_predicates if @relationship_predicates
177
+ @relationship_predicates = {}
178
+ relationships_desc.each_pair do |subj, names|
179
+ @relationship_predicates[subj] = {}
180
+ names.each_pair do |name, args|
181
+ @relationship_predicates[subj][name] = args[:predicate]
205
182
  end
206
183
  end
184
+ @relationship_predicates
207
185
  end
208
-
209
- module ClassMethods
210
- # Allows for a relationship to be treated like any other attribute of a model class. You define
211
- # relationships in your model class using this method. You then have access to several
212
- # helper methods to list, append, and remove objects from the list of relationships.
213
- # ====Examples to define two relationships
214
- # class AudioRecord < ActiveFedora::Base
215
- #
216
- # has_relationship "oral_history", :has_part, :inbound=>true, :type=>OralHistory
217
- # # returns all similar audio
218
- # has_relationship "similar_audio", :has_part, :type=>AudioRecord
219
- # #returns only similar audio with format wav
220
- # has_relationship "similar_audio_wav", :has_part, :solr_fq=>"format_t:wav"
221
- #
222
- # The first two parameters are required:
223
- # name: relationship name
224
- # predicate: predicate for the relationship
225
- # opts:
226
- # possible parameters
227
- # :inbound => if true loads an external relationship via Solr (defaults to false)
228
- # :type => The type of model to use when instantiated an object from the pid in this relationship (defaults to ActiveFedora::Base)
229
- # :solr_fq => Define a solr query here if you want to filter out some objects in your relationship (must be a properly formatted solr query)
230
- #
231
- # If inbound is true it expects the relationship to be defined by another object's RELS-EXT
232
- # and to load that relationship from Solr. Otherwise, if inbound is true the relationship is stored in
233
- # this object's RELS-EXT datastream
234
- #
235
- # Word of caution - The same predicate may not be used twice for two inbound or two outbound relationships. However, it may be used twice if one is inbound
236
- # and one is outbound as shown in the example above. A full list of possible predicates are defined by predicate_mappings
237
- #
238
- # For the oral_history relationship in the example above the following helper methods are created:
239
- # oral_history: returns array of OralHistory objects that have this AudioRecord with predicate :has_part
240
- # oral_history_ids: Return array of pids for OralHistory objects that have this AudioRecord with predicate :has_part
241
- # oral_history_query: Return solr query that can be used to retrieve related objects as solr documents
242
- #
243
- # For the outbound relationship "similar_audio" there are two additional methods to append and remove objects from that relationship
244
- # since it is managed internally:
245
- # similar_audio: Return array of AudioRecord objects that have been added to similar_audio relationship
246
- # similar_audio_ids: Return array of AudioRecord object pids that have been added to similar_audio relationship
247
- # similar_audio_query: Return solr query that can be used to retrieve related objects as solr documents
248
- # similar_audio_append: Add an AudioRecord object to the similar_audio relationship
249
- # similar_audio_remove: Remove an AudioRecord from the similar_audio relationship
250
- def has_relationship(name, predicate, opts = {})
251
- opts = {:singular => nil, :inbound => false}.merge(opts)
252
- if opts[:inbound] == true
253
- #raise "Duplicate use of predicate for inbound relationship name not allowed" if predicate_exists_with_different_relationship_name?(:inbound,name,predicate)
254
- register_relationship_desc(:inbound, name, predicate, opts)
255
- register_predicate(:inbound, predicate)
256
- create_inbound_relationship_finders(name, predicate, opts)
257
- else
258
- #raise "Duplicate use of predicate for named outbound relationship \"#{predicate.inspect}\" not allowed" if named_predicate_exists_with_different_name?(:self,name,predicate)
259
- register_relationship_desc(:self, name, predicate, opts)
260
- register_predicate(:self, predicate)
261
- create_relationship_name_methods(name)
262
- create_outbound_relationship_finders(name, predicate, opts)
263
- end
264
- end
265
-
266
- # Generates relationship finders for predicates that point in both directions
267
- #
268
- # @param [String] name of the relationship method(s) to create
269
- # @param [Symbol] outbound_predicate Predicate used in outbound relationships
270
- # @param [Symbol] inbound_predicate Predicate used in inbound relationships
271
- # @param [Hash] opts
272
- #
273
- # Example:
274
- # has_bidirectional_relationship("parts", :has_part, :is_part_of)
275
- #
276
- # will create three instance methods: parts_outbound, and parts_inbound and parts
277
- # the inbound and outbound methods are the same that would result from calling
278
- # create_inbound_relationship_finders and create_outbound_relationship_finders
279
- # The third method combines the results of both and handles generating appropriate
280
- # solr queries where necessary.
281
- def has_bidirectional_relationship(name, outbound_predicate, inbound_predicate, opts={})
282
- create_bidirectional_relationship_finders(name, outbound_predicate, inbound_predicate, opts)
283
- end
284
-
285
-
286
- # relationships are tracked as a hash of structure
287
- # @example
288
- # ds.relationships # => {:self=>{:has_model=>["afmodel:SimpleThing"],:has_part=>["demo:20"]},:inbound=>{:is_part_of=>["demo:6"]}
289
- def relationships
290
- @class_relationships ||= Hash[:self => {}]
291
- end
292
-
293
-
294
- def register_subject(subject)
295
- if !relationships.has_key?(subject)
296
- relationships[subject] = {}
297
- end
298
- end
299
-
300
- def register_predicate(subject, predicate)
301
- register_subject(subject)
302
- if !relationships[subject].has_key?(predicate)
303
- relationships[subject][predicate] = []
304
- end
305
- end
306
186
 
187
+ # Return hash of outbound relationship names and predicate pairs
188
+ # @return [Hash] A hash of outbound relationship names mapped to predicates used
189
+ def outbound_relationship_predicates
190
+ relationship_predicates.has_key?(:self) ? relationship_predicates[:self] : {}
191
+ end
307
192
 
308
- def create_inbound_relationship_finders(name, predicate, opts = {})
309
- class_eval <<-END, __FILE__, __LINE__
310
- def #{name}(opts={})
311
- load_inbound_relationship('#{name}', '#{predicate}', opts)
312
- end
313
- def #{name}_ids
314
- #{name}(:response_format => :id_array)
315
- end
316
- def #{name}_from_solr
317
- #{name}(:response_format => :load_from_solr)
318
- end
319
- def #{name}_query
320
- relationship_query("#{name}")
321
- end
322
- END
323
- end
324
-
325
- def create_outbound_relationship_finders(name, predicate, opts = {})
326
- class_eval <<-END, __FILE__, __LINE__
327
- def #{name}(opts={})
328
- load_outbound_relationship(#{name.inspect}, #{predicate.inspect}, opts)
329
- end
330
- def #{name}_ids
331
- #{name}(:response_format => :id_array)
332
- end
333
- def #{name}_from_solr
334
- #{name}(:response_format => :load_from_solr)
335
- end
336
- def #{name}_query
337
- relationship_query("#{name}")
338
- end
339
- END
340
- end
341
-
193
+ # Return hash of inbound relationship names and predicate pairs
194
+ # @return [Hash] A hash of inbound relationship names mapped to predicates used
195
+ def inbound_relationship_predicates
196
+ relationship_predicates.has_key?(:inbound) ? relationship_predicates[:inbound] : {}
197
+ end
342
198
 
343
199
 
344
- # Generates relationship finders for predicates that point in both directions
345
- # and registers predicate relationships for each direction.
200
+ module ClassMethods
201
+ # Return hash that persists relationship metadata defined by has_relationship calls. If you implement a child class of ActiveFedora::Base it will inherit
202
+ # the relationship descriptions defined there by merging in the class
203
+ # instance variable values. It will also do this for any level of
204
+ # ancestors.
205
+ # @return [Hash] Hash of relationship subject (:self or :inbound) mapped to nested hashs of each relationship name mapped to another hash relationship options
206
+ # @example
207
+ # For the following relationship
346
208
  #
347
- # @param [String] name Name of the relationship method(s) to create
348
- # @param [Symbol] outbound_predicate Predicate used in outbound relationships
349
- # @param [Symbol] inbound_predicate Predicate used in inbound relationships
350
- # @param [Hash] opts (optional)
351
- def create_bidirectional_relationship_finders(name, outbound_predicate, inbound_predicate, opts={})
352
- inbound_method_name = name.to_s+"_inbound"
353
- outbound_method_name = name.to_s+"_outbound"
354
- has_relationship(outbound_method_name, outbound_predicate, opts)
355
- has_relationship(inbound_method_name, inbound_predicate, opts.merge!(:inbound=>true))
356
-
357
- #create methods that mirror the outbound append and remove with our bidirectional name, assume just add and remove locally
358
- create_bidirectional_relationship_name_methods(name,outbound_method_name)
359
-
360
- class_eval <<-END, __FILE__, __LINE__
361
- def #{name}(opts={})
362
- load_bidirectional("#{name}", :#{inbound_method_name}, :#{outbound_method_name}, opts)
363
- end
364
- def #{name}_ids
365
- #{name}(:response_format => :id_array)
366
- end
367
- def #{name}_from_solr
368
- #{name}(:response_format => :load_from_solr)
369
- end
370
- def #{name}_query
371
- relationship_query("#{name}")
209
+ # has_relationship "audio_records", :has_part, :type=>AudioRecord
210
+ #
211
+ # Results in the following returned by relationships_desc
212
+ # {:self=>{"audio_records"=>{:type=>AudioRecord, :singular=>nil, :predicate=>:has_part, :inbound=>false}}}
213
+ def relationships_desc
214
+ #get any relationship descriptions from superclasses
215
+ if @class_relationships_desc.nil?
216
+ @class_relationships_desc ||= Hash[:self => {}]
217
+
218
+ #get super classes
219
+ super_klasses = []
220
+ #insert in reverse order so the child overwrites anything in parent
221
+ super_klass = self.superclass
222
+ while !super_klass.nil?
223
+ super_klasses.insert(0,super_klass)
224
+ super_klass = super_klass.superclass
225
+ end
226
+
227
+ super_klasses.each do |super_klass|
228
+ if super_klass.respond_to?(:relationships_desc)
229
+ super_rels = super_klass.relationships_desc
230
+ super_rels.each_pair do |subject,rels|
231
+ @class_relationships_desc[subject] = {} unless @class_relationships_desc.has_key?(subject)
232
+ @class_relationships_desc[subject].merge!(rels)
233
+ end
234
+ end
235
+ end
372
236
  end
373
- END
237
+ @class_relationships_desc
374
238
  end
375
-
376
-
239
+
377
240
  end
378
241
  end
379
-
380
-
381
242
  end
@@ -1,3 +1,3 @@
1
1
  module ActiveFedora
2
- VERSION = "3.2.0.pre1"
2
+ VERSION = "3.2.0.pre2"
3
3
  end
@@ -13,6 +13,7 @@ describe ActiveFedora::Base do
13
13
  end
14
14
 
15
15
  it "should persist and re-load collection members" do
16
+ ActiveSupport::Deprecation.stubs(:warn)
16
17
  container_copy = ActiveFedora::Base.load_instance(@test_container.pid)
17
18
  container_copy.collection_members(:response_format=>:id_array).should == ["foo:2"]
18
19
  end
@@ -1,35 +1,5 @@
1
1
  require 'spec_helper'
2
2
 
3
- class MockAFBaseRelationship < ActiveFedora::Base
4
- has_relationship "testing", :has_part, :type=>MockAFBaseRelationship
5
- has_relationship "testing2", :has_member, :type=>MockAFBaseRelationship
6
- has_relationship "testing_inbound", :has_part, :type=>MockAFBaseRelationship, :inbound=>true
7
- has_relationship "testing_inbound2", :has_member, :type=>MockAFBaseRelationship, :inbound=>true
8
- has_bidirectional_relationship "testing_bidirectional", :has_collection_member, :is_member_of_collection
9
- #next 2 used to test objects on opposite end of bidirectional relationship
10
- has_relationship "testing_inbound3", :has_collection_member, :inbound=>true
11
- has_relationship "testing3", :is_member_of_collection
12
- end
13
-
14
- class MockAFBaseFromSolr < ActiveFedora::Base
15
- has_relationship "testing", :has_part, :type=>MockAFBaseFromSolr
16
- has_relationship "testing2", :has_member, :type=>MockAFBaseFromSolr
17
- has_relationship "testing_inbound", :has_part, :type=>MockAFBaseFromSolr, :inbound=>true
18
- has_relationship "testing_inbound2", :has_member, :type=>MockAFBaseFromSolr, :inbound=>true
19
-
20
- has_metadata :name => "properties", :type => ActiveFedora::MetadataDatastream do |m|
21
- m.field "holding_id", :string
22
- end
23
-
24
- has_metadata :name => "descMetadata", :type => ActiveFedora::QualifiedDublinCoreDatastream do |m|
25
- m.field "created", :date, :xml_node => "created"
26
- m.field "language", :string, :xml_node => "language"
27
- m.field "creator", :string, :xml_node => "creator"
28
- # Created remaining fields
29
- m.field "geography", :string, :xml_node => "geography"
30
- m.field "title", :string, :xml_node => "title"
31
- end
32
- end
33
3
 
34
4
  describe "Datastreams synched together" do
35
5
  before do
@@ -57,6 +27,40 @@ end
57
27
 
58
28
 
59
29
  describe ActiveFedora::Base do
30
+ before :all do
31
+ ActiveSupport::Deprecation.stubs(:warn).with("Deprecation: Relationships will not be included by default in the next version. To use has_relationship add 'include ActiveFedora::Relationships' to your model")
32
+ class MockAFBaseRelationship < ActiveFedora::Base
33
+ include ActiveFedora::FileManagement
34
+ has_relationship "testing", :has_part, :type=>MockAFBaseRelationship
35
+ has_relationship "testing2", :has_member, :type=>MockAFBaseRelationship
36
+ has_relationship "testing_inbound", :has_part, :type=>MockAFBaseRelationship, :inbound=>true
37
+ has_relationship "testing_inbound2", :has_member, :type=>MockAFBaseRelationship, :inbound=>true
38
+ has_bidirectional_relationship "testing_bidirectional", :has_collection_member, :is_member_of_collection
39
+ #next 2 used to test objects on opposite end of bidirectional relationship
40
+ has_relationship "testing_inbound3", :has_collection_member, :inbound=>true
41
+ has_relationship "testing3", :is_member_of_collection
42
+ end
43
+
44
+ class MockAFBaseFromSolr < ActiveFedora::Base
45
+ has_relationship "testing", :has_part, :type=>MockAFBaseFromSolr
46
+ has_relationship "testing2", :has_member, :type=>MockAFBaseFromSolr
47
+ has_relationship "testing_inbound", :has_part, :type=>MockAFBaseFromSolr, :inbound=>true
48
+ has_relationship "testing_inbound2", :has_member, :type=>MockAFBaseFromSolr, :inbound=>true
49
+
50
+ has_metadata :name => "properties", :type => ActiveFedora::MetadataDatastream do |m|
51
+ m.field "holding_id", :string
52
+ end
53
+
54
+ has_metadata :name => "descMetadata", :type => ActiveFedora::QualifiedDublinCoreDatastream do |m|
55
+ m.field "created", :date, :xml_node => "created"
56
+ m.field "language", :string, :xml_node => "language"
57
+ m.field "creator", :string, :xml_node => "creator"
58
+ # Created remaining fields
59
+ m.field "geography", :string, :xml_node => "geography"
60
+ m.field "title", :string, :xml_node => "title"
61
+ end
62
+ end
63
+ end
60
64
 
61
65
  before(:all) do
62
66
  ActiveFedora::SolrService.register(ActiveFedora.solr_config[:url])
@@ -324,37 +328,40 @@ describe ActiveFedora::Base do
324
328
  describe '#delete' do
325
329
  it 'if inbound relationships exist should remove relationships from those inbound targets as well when deleting this object' do
326
330
  @test_object2 = MockAFBaseRelationship.new
327
- # @test_object2.new_object = true
328
331
  @test_object2.save
329
332
  @test_object3 = MockAFBaseRelationship.new
330
- # @test_object3.new_object = true
331
333
  @test_object3.save
332
334
  @test_object4 = MockAFBaseRelationship.new
333
- # @test_object4.new_object = true
334
335
  @test_object4.save
335
336
  @test_object5 = MockAFBaseRelationship.new
336
- # @test_object5.new_object = true
337
337
  @test_object5.save
338
338
  #append to relationship by 'testing'
339
339
  @test_object2.add_relationship_by_name("testing",@test_object3)
340
340
  @test_object2.add_relationship_by_name("testing2",@test_object4)
341
341
  @test_object5.add_relationship_by_name("testing",@test_object2)
342
- @test_object5.add_relationship_by_name("testing2",@test_object3)
342
+ #@test_object5.add_relationship_by_name("testing2",@test_object3)
343
343
  @test_object2.save
344
344
  @test_object5.save
345
- #check inbound correct, testing goes to :has_part and testing2 goes to :has_member
346
- @test_object2.relationships_by_name(false).should == {:inbound=>{"testing_inbound3"=>[], "testing_bidirectional_inbound"=>[], "parts_inbound"=>[], "testing_inbound"=>[@test_object5.internal_uri], "testing_inbound2"=>[]}, :self=>{"testing2"=>[@test_object4.internal_uri], "collection_members"=>[], "testing3"=>[], "part_of"=>[], "testing"=>[@test_object3.internal_uri], "parts_outbound"=>[@test_object3.internal_uri], "testing_bidirectional_outbound"=>[]}}
347
- @test_object3.relationships_by_name(false).should == {:inbound=>{"testing_inbound3"=>[], "testing_bidirectional_inbound"=>[], "parts_inbound"=>[], "testing_inbound"=>[@test_object2.internal_uri], "testing_inbound2"=>[@test_object5.internal_uri]}, :self=>{"testing2"=>[], "collection_members"=>[], "testing3"=>[], "part_of"=>[], "testing"=>[], "parts_outbound"=>[], "testing_bidirectional_outbound"=>[]}}
348
- @test_object4.relationships_by_name(false).should == {:inbound=>{"testing_inbound3"=>[], "testing_bidirectional_inbound"=>[], "parts_inbound"=>[], "testing_inbound"=>[], "testing_inbound2"=>[@test_object2.internal_uri]}, :self=>{"testing2"=>[], "collection_members"=>[], "testing3"=>[], "part_of"=>[], "testing"=>[], "parts_outbound"=>[], "testing_bidirectional_outbound"=>[]}}
349
- @test_object5.relationships_by_name(false).should == {:inbound=>{"testing_inbound3"=>[], "testing_bidirectional_inbound"=>[], "parts_inbound"=>[], "testing_inbound"=>[], "testing_inbound2"=>[]}, :self=>{"testing2"=>[@test_object3.internal_uri], "collection_members"=>[], "testing3"=>[], "part_of"=>[], "testing"=>[@test_object2.internal_uri], "parts_outbound"=>[@test_object2.internal_uri], "testing_bidirectional_outbound"=>[]}}
345
+ #check that the inbound relationships on test_object3 and test_object4 were eliminated
346
+ #testing goes to :has_part and testing2 goes to :has_member
347
+ @test_object2.relationships_by_name(false)[:inbound]["testing_inbound"].should == [@test_object5.internal_uri]
348
+ @test_object2.relationships_by_name(false)[:self]["parts_outbound"].should == [@test_object3.internal_uri]
349
+ @test_object2.relationships_by_name(false)[:self]["testing"].should == [@test_object3.internal_uri]
350
+
351
+ @test_object3.relationships_by_name(false)[:inbound]["testing_inbound"].should == [@test_object2.internal_uri]
352
+ @test_object4.relationships_by_name(false)[:inbound]["testing_inbound2"].should == [@test_object2.internal_uri]
353
+
354
+ @test_object5.relationships_by_name(false)[:self]["testing"].should == [@test_object2.internal_uri]
355
+
350
356
  @test_object2.delete
351
357
  #need to reload since removed from rels_ext in memory
352
358
  @test_object5 = MockAFBaseRelationship.load_instance(@test_object5.pid)
353
359
 
354
360
  #check any test_object2 inbound rels gone from source
355
- @test_object3.relationships_by_name(false).should == {:inbound=>{"testing_inbound3"=>[], "testing_bidirectional_inbound"=>[], "parts_inbound"=>[], "testing_inbound"=>[], "testing_inbound2"=>[@test_object5.internal_uri]}, :self=>{"testing2"=>[], "collection_members"=>[], "testing3"=>[], "part_of"=>[], "testing"=>[], "parts_outbound"=>[], "testing_bidirectional_outbound"=>[]}}
356
- @test_object4.relationships_by_name(false).should == {:inbound=>{"testing_inbound3"=>[], "testing_bidirectional_inbound"=>[], "parts_inbound"=>[], "testing_inbound"=>[], "testing_inbound2"=>[]}, :self=>{"testing2"=>[], "collection_members"=>[], "testing3"=>[], "part_of"=>[], "testing"=>[], "parts_outbound"=>[], "testing_bidirectional_outbound"=>[]}}
357
- @test_object5.relationships_by_name(false).should == {:inbound=>{"testing_inbound3"=>[], "testing_bidirectional_inbound"=>[], "parts_inbound"=>[], "testing_inbound"=>[], "testing_inbound2"=>[]}, :self=>{"testing2"=>[@test_object3.internal_uri], "collection_members"=>[], "testing3"=>[], "part_of"=>[], "testing"=>[], "parts_outbound"=>[], "testing_bidirectional_outbound"=>[]}}
361
+ @test_object3.relationships_by_name(false)[:inbound]["testing_inbound"].should == []
362
+
363
+ @test_object4.relationships_by_name(false)[:inbound]["testing_inbound2"].should == []
364
+ @test_object5.relationships_by_name(false)[:self]["testing"].should == []
358
365
  end
359
366
  end
360
367
 
@@ -496,15 +503,38 @@ describe ActiveFedora::Base do
496
503
  @test_object2.save
497
504
  @test_object5.save
498
505
  #check inbound correct, testing goes to :has_part and testing2 goes to :has_member
499
- @test_object2.relationships_by_name(false).should == {:inbound=>{"testing_inbound3"=>[], "testing_bidirectional_inbound"=>[], "parts_inbound"=>[], "testing_inbound"=>[@test_object5.internal_uri], "testing_inbound2"=>[]}, :self=>{"testing2"=>[@test_object4.internal_uri], "collection_members"=>[], "testing3"=>[], "part_of"=>[], "testing"=>[@test_object3.internal_uri], "parts_outbound"=>[@test_object3.internal_uri], "testing_bidirectional_outbound"=>[]}}
500
- @test_object3.relationships_by_name(false).should == {:inbound=>{"testing_inbound3"=>[], "testing_bidirectional_inbound"=>[], "parts_inbound"=>[], "testing_inbound"=>[@test_object2.internal_uri], "testing_inbound2"=>[@test_object5.internal_uri]}, :self=>{"testing2"=>[], "collection_members"=>[], "testing3"=>[], "part_of"=>[], "testing"=>[], "parts_outbound"=>[], "testing_bidirectional_outbound"=>[]}}
501
- @test_object4.relationships_by_name(false).should == {:inbound=>{"testing_inbound3"=>[], "testing_bidirectional_inbound"=>[], "parts_inbound"=>[], "testing_inbound"=>[], "testing_inbound2"=>[@test_object2.internal_uri]}, :self=>{"testing2"=>[], "collection_members"=>[], "testing3"=>[], "part_of"=>[], "testing"=>[], "parts_outbound"=>[], "testing_bidirectional_outbound"=>[]}}
502
- @test_object5.relationships_by_name(false).should == {:inbound=>{"testing_inbound3"=>[], "testing_bidirectional_inbound"=>[], "parts_inbound"=>[], "testing_inbound"=>[], "testing_inbound2"=>[]}, :self=>{"testing2"=>[@test_object3.internal_uri], "collection_members"=>[], "testing3"=>[], "part_of"=>[], "testing"=>[@test_object2.internal_uri], "parts_outbound"=>[@test_object2.internal_uri], "testing_bidirectional_outbound"=>[]}}
506
+ @test_object2.relationships_by_name(false)[:self]["testing"].should == [@test_object3.internal_uri]
507
+ @test_object2.relationships_by_name(false)[:self]["testing2"].should == [@test_object4.internal_uri]
508
+ @test_object2.relationships_by_name(false)[:self]["parts_outbound"].should == [@test_object3.internal_uri]
509
+ @test_object2.relationships_by_name(false)[:inbound]["testing_inbound"].should == [@test_object5.internal_uri]
510
+
511
+ @test_object3.relationships_by_name(false)[:inbound]["testing_inbound"].should == [@test_object2.internal_uri]
512
+ @test_object3.relationships_by_name(false)[:inbound]["testing_inbound2"].should == [@test_object5.internal_uri]
513
+
514
+ @test_object4.relationships_by_name(false)[:inbound]["testing_inbound2"].should == [@test_object2.internal_uri]
515
+
516
+ @test_object5.relationships_by_name(false)[:self]["testing"].should == [@test_object2.internal_uri]
517
+ @test_object5.relationships_by_name(false)[:self]["testing2"].should == [@test_object3.internal_uri]
518
+ @test_object5.relationships_by_name(false)[:self]["parts_outbound"].should == [@test_object2.internal_uri]
519
+
503
520
  #all inbound should now be empty if no parameter supplied to relationships
504
- @test_object2.relationships_by_name.should == {:self=>{"testing2"=>[@test_object4.internal_uri], "collection_members"=>[], "testing3"=>[], "part_of"=>[], "testing"=>[@test_object3.internal_uri], "parts_outbound"=>[@test_object3.internal_uri], "testing_bidirectional_outbound"=>[]}}
505
- @test_object3.relationships_by_name.should == {:self=>{"testing2"=>[], "collection_members"=>[], "testing3"=>[], "part_of"=>[], "testing"=>[], "parts_outbound"=>[], "testing_bidirectional_outbound"=>[]}}
506
- @test_object4.relationships_by_name.should == {:self=>{"testing2"=>[], "collection_members"=>[], "testing3"=>[], "part_of"=>[], "testing"=>[], "parts_outbound"=>[], "testing_bidirectional_outbound"=>[]}}
507
- @test_object5.relationships_by_name.should == {:self=>{"testing2"=>[@test_object3.internal_uri], "collection_members"=>[], "testing3"=>[], "part_of"=>[], "testing"=>[@test_object2.internal_uri], "parts_outbound"=>[@test_object2.internal_uri], "testing_bidirectional_outbound"=>[]}}
521
+ @test_object2.relationships_by_name[:self]["testing"].should == [@test_object3.internal_uri]
522
+ @test_object2.relationships_by_name[:self]["testing2"].should == [@test_object4.internal_uri]
523
+ @test_object2.relationships_by_name[:self]["parts_outbound"].should == [@test_object3.internal_uri]
524
+ @test_object2.relationships_by_name.should_not have_key :inbound
525
+
526
+ @test_object3.relationships_by_name.should_not have_key :inbound
527
+ @test_object4.relationships_by_name.should_not have_key :inbound
528
+
529
+
530
+ @test_object5.relationships_by_name[:self]["testing"].should == [@test_object2.internal_uri]
531
+ @test_object5.relationships_by_name[:self]["testing2"].should == [@test_object3.internal_uri]
532
+ @test_object5.relationships_by_name[:self]["parts_outbound"].should == [@test_object2.internal_uri]
533
+ @test_object5.relationships_by_name.should_not have_key :inbound
534
+ # @test_object2.relationships_by_name.should == {:self=>{"testing2"=>[@test_object4.internal_uri], "collection_members"=>[], "testing3"=>[], "part_of"=>[], "testing"=>[@test_object3.internal_uri], "parts_outbound"=>[@test_object3.internal_uri], "testing_bidirectional_outbound"=>[]}}
535
+ # @test_object3.relationships_by_name.should == {:self=>{"testing2"=>[], "collection_members"=>[], "testing3"=>[], "part_of"=>[], "testing"=>[], "parts_outbound"=>[], "testing_bidirectional_outbound"=>[]}}
536
+ # @test_object4.relationships_by_name.should == {:self=>{"testing2"=>[], "collection_members"=>[], "testing3"=>[], "part_of"=>[], "testing"=>[], "parts_outbound"=>[], "testing_bidirectional_outbound"=>[]}}
537
+ # @test_object5.relationships_by_name.should == {:self=>{"testing2"=>[@test_object3.internal_uri], "collection_members"=>[], "testing3"=>[], "part_of"=>[], "testing"=>[@test_object2.internal_uri], "parts_outbound"=>[@test_object2.internal_uri], "testing_bidirectional_outbound"=>[]}}
508
538
  end
509
539
  end
510
540
 
@@ -530,10 +560,19 @@ describe ActiveFedora::Base do
530
560
  @test_object2.save
531
561
  @test_object5.save
532
562
  #check inbound correct, testing goes to :has_part and testing2 goes to :has_member
533
- @test_object2.relationships_by_name(false).should == {:inbound=>{"testing_inbound3"=>[], "testing_bidirectional_inbound"=>[], "parts_inbound"=>[], "testing_inbound"=>[@test_object5.internal_uri], "testing_inbound2"=>[]}, :self=>{"testing2"=>[@test_object4.internal_uri], "collection_members"=>[], "testing3"=>[], "part_of"=>[], "testing"=>[@test_object3.internal_uri], "parts_outbound"=>[@test_object3.internal_uri], "testing_bidirectional_outbound"=>[]}}
534
- @test_object3.relationships_by_name(false).should == {:inbound=>{"testing_inbound3"=>[], "testing_bidirectional_inbound"=>[], "parts_inbound"=>[], "testing_inbound"=>[@test_object2.internal_uri], "testing_inbound2"=>[@test_object5.internal_uri]}, :self=>{"testing2"=>[], "collection_members"=>[], "testing3"=>[], "part_of"=>[], "testing"=>[], "parts_outbound"=>[], "testing_bidirectional_outbound"=>[]}}
535
- @test_object4.relationships_by_name(false).should == {:inbound=>{"testing_inbound3"=>[], "testing_bidirectional_inbound"=>[], "parts_inbound"=>[], "testing_inbound"=>[], "testing_inbound2"=>[@test_object2.internal_uri]}, :self=>{"testing2"=>[], "collection_members"=>[], "testing3"=>[], "part_of"=>[], "testing"=>[], "parts_outbound"=>[], "testing_bidirectional_outbound"=>[]}}
536
- @test_object5.relationships_by_name(false).should == {:inbound=>{"testing_inbound3"=>[], "testing_bidirectional_inbound"=>[], "parts_inbound"=>[], "testing_inbound"=>[], "testing_inbound2"=>[]}, :self=>{"testing2"=>[@test_object3.internal_uri], "collection_members"=>[], "testing3"=>[], "part_of"=>[], "testing"=>[@test_object2.internal_uri], "parts_outbound"=>[@test_object2.internal_uri], "testing_bidirectional_outbound"=>[]}}
563
+ @test_object2.relationships_by_name(false)[:self]["testing"].should == [@test_object3.internal_uri]
564
+ @test_object2.relationships_by_name(false)[:self]["testing2"].should == [@test_object4.internal_uri]
565
+ @test_object2.relationships_by_name(false)[:self]["parts_outbound"].should == [@test_object3.internal_uri]
566
+ @test_object2.relationships_by_name(false)[:inbound]["testing_inbound"].should == [@test_object5.internal_uri]
567
+
568
+ @test_object3.relationships_by_name(false)[:inbound]["testing_inbound"].should == [@test_object2.internal_uri]
569
+ @test_object3.relationships_by_name(false)[:inbound]["testing_inbound2"].should == [@test_object5.internal_uri]
570
+
571
+ @test_object4.relationships_by_name(false)[:inbound]["testing_inbound2"].should == [@test_object2.internal_uri]
572
+
573
+ @test_object5.relationships_by_name(false)[:self]["testing"].should == [@test_object2.internal_uri]
574
+ @test_object5.relationships_by_name(false)[:self]["testing2"].should == [@test_object3.internal_uri]
575
+ @test_object5.relationships_by_name(false)[:self]["parts_outbound"].should == [@test_object2.internal_uri]
537
576
  end
538
577
  end
539
578
 
@@ -559,23 +598,30 @@ describe ActiveFedora::Base do
559
598
  @test_object2.save
560
599
  @test_object5.save
561
600
  #check inbound correct, testing goes to :has_part and testing2 goes to :has_member
562
- @test_object2.relationships_by_name(false).should == {:self=>{"testing"=>[@test_object3.internal_uri],
563
- "testing2"=>[@test_object4.internal_uri],
564
- "testing_bidirectional_outbound"=>[],"testing3"=>[],
565
- "collection_members"=>[], "part_of"=>[], "parts_outbound"=>[@test_object3.internal_uri]},
566
- :inbound=>{"testing_inbound"=>[@test_object5.internal_uri],"testing_inbound2"=>[],
567
- "testing_bidirectional_inbound"=>[],"testing_inbound3"=>[], "parts_inbound"=>[]}}
568
- @test_object3.relationships_by_name(false).should == {:inbound=>{"testing_inbound3"=>[], "testing_bidirectional_inbound"=>[], "parts_inbound"=>[], "testing_inbound"=>[@test_object2.internal_uri], "testing_inbound2"=>[@test_object5.internal_uri]}, :self=>{"testing2"=>[], "collection_members"=>[], "testing3"=>[], "part_of"=>[], "testing"=>[], "parts_outbound"=>[], "testing_bidirectional_outbound"=>[]}}
569
- @test_object4.relationships_by_name(false).should == {:inbound=>{"testing_inbound3"=>[], "testing_bidirectional_inbound"=>[], "parts_inbound"=>[], "testing_inbound"=>[], "testing_inbound2"=>[@test_object2.internal_uri]}, :self=>{"testing2"=>[], "collection_members"=>[], "testing3"=>[], "part_of"=>[], "testing"=>[], "parts_outbound"=>[], "testing_bidirectional_outbound"=>[]}}
570
- @test_object5.relationships_by_name(false).should == {:inbound=>{"testing_inbound3"=>[], "testing_bidirectional_inbound"=>[], "parts_inbound"=>[], "testing_inbound"=>[], "testing_inbound2"=>[]}, :self=>{"testing2"=>[@test_object3.internal_uri], "collection_members"=>[], "testing3"=>[], "part_of"=>[], "testing"=>[@test_object2.internal_uri], "parts_outbound"=>[@test_object2.internal_uri], "testing_bidirectional_outbound"=>[]}}
601
+ @test_object2.relationships_by_name(false)[:self]["testing"].should == [@test_object3.internal_uri]
602
+ @test_object2.relationships_by_name(false)[:self]["testing2"].should == [@test_object4.internal_uri]
603
+ @test_object2.relationships_by_name(false)[:self]["parts_outbound"].should == [@test_object3.internal_uri]
604
+ @test_object2.relationships_by_name(false)[:inbound]["testing_inbound"].should == [@test_object5.internal_uri]
605
+
606
+ @test_object3.relationships_by_name(false)[:inbound]["testing_inbound"].should == [@test_object2.internal_uri]
607
+ @test_object3.relationships_by_name(false)[:inbound]["testing_inbound2"].should == [@test_object5.internal_uri]
608
+
609
+ @test_object4.relationships_by_name(false)[:inbound]["testing_inbound2"].should == [@test_object2.internal_uri]
610
+
611
+ @test_object5.relationships_by_name(false)[:self]["testing"].should == [@test_object2.internal_uri]
612
+ @test_object5.relationships_by_name(false)[:self]["testing2"].should == [@test_object3.internal_uri]
613
+ @test_object5.relationships_by_name(false)[:self]["parts_outbound"].should == [@test_object2.internal_uri]
614
+
571
615
  @test_object2.remove_relationship_by_name("testing",@test_object3.internal_uri)
572
616
  @test_object2.save
573
617
  #check now removed for both outbound and inbound
574
- @test_object2.relationships_by_name(false).should == {:inbound=>{"testing_inbound3"=>[], "testing_bidirectional_inbound"=>[], "parts_inbound"=>[], "testing_inbound"=>[@test_object5.internal_uri], "testing_inbound2"=>[]}, :self=>{"testing2"=>[@test_object4.internal_uri], "collection_members"=>[], "testing3"=>[], "part_of"=>[], "testing"=>[], "parts_outbound"=>[], "testing_bidirectional_outbound"=>[]}}
618
+ @test_object2.relationships_by_name(false)[:self]["testing"].should == []
619
+ @test_object2.relationships_by_name(false)[:self]["testing2"].should == [@test_object4.internal_uri]
620
+ @test_object2.relationships_by_name(false)[:self]["parts_outbound"].should == []
621
+ @test_object2.relationships_by_name(false)[:inbound]["testing_inbound"].should == [@test_object5.internal_uri]
575
622
 
576
- @test_object3.inbound_relationships[:has_part].should be_nil
577
-
578
- @test_object3.relationships_by_name(false).should == {:inbound=>{"testing_inbound3"=>[], "testing_bidirectional_inbound"=>[], "parts_inbound"=>[], "testing_inbound"=>[], "testing_inbound2"=>[@test_object5.internal_uri]}, :self=>{"testing2"=>[], "collection_members"=>[], "testing3"=>[], "part_of"=>[], "testing"=>[], "parts_outbound"=>[], "testing_bidirectional_outbound"=>[]}}
623
+ @test_object3.relationships_by_name(false)[:inbound]["testing_inbound"].should == []
624
+ @test_object3.relationships_by_name(false)[:inbound]["testing_inbound2"].should == [@test_object5.internal_uri]
579
625
  end
580
626
  end
581
627