active-fedora 3.2.0.pre1 → 3.2.0.pre2

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.
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