active-fedora 2.3.4 → 2.3.7

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,13 +1,17 @@
1
+ require 'active_fedora/relationships_helper'
2
+
1
3
  module ActiveFedora
2
4
  module SemanticNode
3
5
  include MediaShelfClassLevelInheritableAttributes
4
- ms_inheritable_attributes :class_relationships, :internal_uri, :class_named_relationships_desc
5
6
 
6
- attr_accessor :internal_uri, :named_relationship_desc, :relationships_are_dirty, :load_from_solr
7
+ ms_inheritable_attributes :class_relationships, :internal_uri
8
+
9
+ attr_accessor :internal_uri, :relationships_are_dirty, :load_from_solr
7
10
 
8
11
 
9
12
  def self.included(klass)
10
13
  klass.extend(ClassMethods)
14
+ klass.send(:include, ActiveFedora::RelationshipsHelper)
11
15
  end
12
16
 
13
17
  def assert_kind_of(n, o,t)
@@ -39,23 +43,6 @@ module ActiveFedora
39
43
  relationships[subject][predicate] = []
40
44
  end
41
45
  end
42
-
43
- # ** EXPERIMENTAL **
44
- #
45
- # Internal method that ensures a relationship subject such as :self and :inbound
46
- # exist within the named_relationships_desc hash tracking named relationships metadata.
47
- # This method just calls the class method counterpart of this method.
48
- def register_named_subject(subject)
49
- self.class.register_named_subject(subject)
50
- end
51
-
52
- # ** EXPERIMENTAL **
53
- #
54
- # Internal method that adds relationship name and predicate pair to either an outbound (:self)
55
- # or inbound (:inbound) relationship types. This method just calls the class method counterpart of this method.
56
- def register_named_relationship(subject, name, predicate, opts)
57
- self.class.register_named_relationship(subject, name, predicate, opts)
58
- end
59
46
 
60
47
  # ** EXPERIMENTAL **
61
48
  #
@@ -89,7 +76,7 @@ module ActiveFedora
89
76
 
90
77
  def inbound_relationships(response_format=:uri)
91
78
  rel_values = {}
92
- inbound_named_relationship_predicates.each_pair do |name,predicate|
79
+ inbound_relationship_predicates.each_pair do |name,predicate|
93
80
  objects = self.send("#{name}",{:response_format=>response_format})
94
81
  items = []
95
82
  objects.each do |object|
@@ -134,266 +121,6 @@ module ActiveFedora
134
121
  return rels
135
122
  end
136
123
 
137
- # ** EXPERIMENTAL **
138
- #
139
- # Return array of objects for a given relationship name
140
- def named_relationship(name)
141
- rels = nil
142
- if inbound_relationship_names.include?(name)
143
- rels = named_relationships(false)[:inbound][name]
144
- elsif outbound_relationship_names.include?(name)
145
- rels = named_relationships[:self][name]
146
- end
147
- rels = [] if rels.nil?
148
- return rels
149
- end
150
-
151
- # ** EXPERIMENTAL **
152
- #
153
- # Gets the named relationships hash of subject=>name=>object_array
154
- # It has an optional parameter of outbound_only that defaults true.
155
- # If false it will include inbound relationships in the results.
156
- # Also, it will only reload outbound relationships if the relationships hash has changed
157
- # since the last time this method was called.
158
- def named_relationships(outbound_only=true)
159
- #make sure to update if relationships have been updated
160
- if @relationships_are_dirty == true
161
- @named_relationships = named_relationships_from_class()
162
- @relationships_are_dirty = false
163
- end
164
-
165
- #this will get called normally on first fetch if relationships are not dirty
166
- @named_relationships ||= named_relationships_from_class()
167
- outbound_only ? @named_relationships : @named_relationships.merge(:inbound=>named_inbound_relationships)
168
- end
169
-
170
- # ** EXPERIMENTAL **
171
- #
172
- # Gets named relationships from the class using the current relationships hash
173
- # and relationship name,predicate pairs.
174
- def named_relationships_from_class()
175
- rels = {}
176
- named_relationship_predicates.each_pair do |subj, names|
177
- if relationships.has_key?(subj)
178
- rels[subj] = {}
179
- names.each_pair do |name, predicate|
180
- rels[subj][name] = (relationships[subj].has_key?(predicate) ? relationships[subj][predicate] : [])
181
- end
182
- end
183
- end
184
- return rels
185
- end
186
-
187
- # ** EXPERIMENTAL **
188
- #
189
- # Return hash of named_relationships defined within other objects' RELS-EXT
190
- # It returns a hash of relationship name to arrays of objects. It requeries
191
- # solr each time this method is called.
192
- def named_inbound_relationships
193
- rels = {}
194
- if named_relationships_desc.has_key?(:inbound)&&!named_relationships_desc[:inbound].empty?()
195
- inbound_rels = inbound_relationships
196
-
197
- if named_relationship_predicates.has_key?(:inbound)
198
- named_relationship_predicates[:inbound].each do |name, predicate|
199
- rels[name] = inbound_rels.has_key?(predicate) ? inbound_rels[predicate] : []
200
- end
201
- end
202
- end
203
- return rels
204
- end
205
-
206
- # ** EXPERIMENTAL **
207
- #
208
- # Return hash of outbound relationship names and predicate pairs
209
- def outbound_named_relationship_predicates
210
- named_relationship_predicates.has_key?(:self) ? named_relationship_predicates[:self] : {}
211
- end
212
-
213
- # ** EXPERIMENTAL **
214
- #
215
- # Return hash of inbound relationship names and predicate pairs
216
- def inbound_named_relationship_predicates
217
- named_relationship_predicates.has_key?(:inbound) ? named_relationship_predicates[:inbound] : {}
218
- end
219
-
220
- # ** EXPERIMENTAL **
221
- #
222
- # Return hash of relationship names and predicate pairs
223
- def named_relationship_predicates
224
- @named_relationship_predicates ||= named_relationship_predicates_from_class
225
- end
226
-
227
- # ** EXPERIMENTAL **
228
- #
229
- # Return hash of relationship names and predicate pairs from class
230
- def named_relationship_predicates_from_class
231
- rels = {}
232
- named_relationships_desc.each_pair do |subj, names|
233
- rels[subj] = {}
234
- names.each_pair do |name, args|
235
- rels[subj][name] = args[:predicate]
236
- end
237
- end
238
- return rels
239
- end
240
-
241
- # ** EXPERIMENTAL **
242
- #
243
- # Return array all relationship names
244
- def relationship_names
245
- names = []
246
- named_relationships_desc.each_key do |subject|
247
- names = names.concat(named_relationships_desc[subject].keys)
248
- end
249
- names
250
- end
251
-
252
- # ** EXPERIMENTAL **
253
- #
254
- # Return array of relationship names for all named inbound relationships (coming from other objects' RELS-EXT and Solr)
255
- def inbound_relationship_names
256
- named_relationships_desc.has_key?(:inbound) ? named_relationships_desc[:inbound].keys : []
257
- end
258
-
259
- # ** EXPERIMENTAL **
260
- #
261
- # Return array of relationship names for all named outbound relationships (coming from this object's RELS-EXT)
262
- def outbound_relationship_names
263
- named_relationships_desc.has_key?(:self) ? named_relationships_desc[:self].keys : []
264
- end
265
-
266
- # ** EXPERIMENTAL **
267
- #
268
- # Return hash of named_relationships defined within this object's RELS-EXT
269
- # It returns a hash of relationship name to arrays of objects
270
- def named_outbound_relationships
271
- named_relationships_desc.has_key?(:self) ? named_relationships[:self] : {}
272
- end
273
-
274
- # ** EXPERIMENTAL **
275
- #
276
- # Returns true if the given relationship name is a named relationship
277
- # ====Parameters
278
- # name: Name of relationship
279
- # outbound_only: If false checks inbound relationships as well (defaults to true)
280
- def is_named_relationship?(name, outbound_only=true)
281
- if outbound_only
282
- outbound_relationship_names.include?(name)
283
- else
284
- (outbound_relationship_names.include?(name)||inbound_relationship_names.include?(name))
285
- end
286
- end
287
-
288
- # ** EXPERIMENTAL **
289
- #
290
- # Return hash that stores named relationship metadata defined by has_relationship calls
291
- # ====Example
292
- # For the following relationship
293
- #
294
- # has_relationship "audio_records", :has_part, :type=>AudioRecord
295
- # Results in the following returned by named_relationships_desc
296
- # {:self=>{"audio_records"=>{:type=>AudioRecord, :singular=>nil, :predicate=>:has_part, :inbound=>false}}}
297
- def named_relationships_desc
298
- @named_relationships_desc ||= named_relationships_desc_from_class
299
- end
300
-
301
- # ** EXPERIMENTAL **
302
- #
303
- # Get class instance variable named_relationships_desc that holds has_relationship metadata
304
- def named_relationships_desc_from_class
305
- self.class.named_relationships_desc
306
- end
307
-
308
- # ** EXPERIMENTAL **
309
- #
310
- # Return the value of :type for the relationship for name passed in.
311
- # It defaults to ActiveFedora::Base.
312
- def named_relationship_type(name)
313
- if is_named_relationship?(name,true)
314
- subject = outbound_relationship_names.include?(name)? :self : :inbound
315
- if named_relationships_desc[subject][name].has_key?(:type)
316
- return class_from_name(named_relationships_desc[subject][name][:type])
317
- end
318
- end
319
- return nil
320
- end
321
-
322
- # ** EXPERIMENTAL **
323
- #
324
- # Add an outbound relationship for given named relationship
325
- # See ActiveFedora::SemanticNode::ClassMethods.has_relationship
326
- def add_named_relationship(name, object)
327
- if is_named_relationship?(name,true)
328
- if named_relationships_desc[:self][name].has_key?(:type)
329
- klass = class_from_name(named_relationships_desc[:self][name][:type])
330
- unless klass.nil?
331
- (assert_kind_of_model 'object', object, klass)
332
- end
333
- end
334
- #r = ActiveFedora::Relationship.new({:subject=>:self,:predicate=>outbound_named_relationship_predicates[name],:object=>object})
335
- #add_relationship(r)
336
- add_relationship(outbound_named_relationship_predicates[name],object)
337
- else
338
- false
339
- end
340
- end
341
-
342
- # ** EXPERIMENTAL **
343
- #
344
- # Remove an object from the named relationship
345
- def remove_named_relationship(name, object)
346
- if is_named_relationship?(name,true)
347
- remove_relationship(outbound_named_relationship_predicates[name],object)
348
- else
349
- return false
350
- end
351
- end
352
-
353
- # ** EXPERIMENTAL **
354
- #
355
- # Throws an assertion error if kind_of_model? returns false for object and model_class
356
- # ====Parameters
357
- # name: Name of object (just label for output)
358
- # object: The object to test
359
- # model_class: The model class used to in kind_of_model? check on object
360
- def assert_kind_of_model(name, object, model_class)
361
- raise "Assertion failure: #{name}: #{object.pid} does not have model #{model_class}, it has model #{relationships[:self][:has_model]}" unless object.kind_of_model?(model_class)
362
- end
363
-
364
- # ** EXPERIMENTAL **
365
- #
366
- # Checks that this object is matches the model class passed in.
367
- # It requires two steps to pass to return true
368
- # 1. It has a hasModel relationship of the same model
369
- # 2. kind_of? returns true for the model passed in
370
- # This method can most often be used to detect if an object from Fedora that was created
371
- # with a different model was then used to populate this object.
372
- def kind_of_model?(model_class)
373
- if self.kind_of?(model_class)
374
- #check has model and class match
375
- if relationships[:self].has_key?(:has_model)
376
- r = ActiveFedora::Relationship.new(:subject=>:self, :predicate=>:has_model, :object=>ActiveFedora::ContentModel.pid_from_ruby_class(self.class))
377
- if relationships[:self][:has_model].first.to_s.eql?(r.object.to_s)
378
- return true
379
- else
380
- raise "has_model relationship check failed for model #{model_class} raising exception, expected: '#{r.object.to_s}' actual: '#{relationships[:self][:has_model].to_s}'"
381
- end
382
- else
383
- raise "has_model relationship does not exist for model #{model_class} check raising exception"
384
- end
385
- else
386
- raise "kind_of? check failed for model #{model_class}, actual #{self.class} raising exception"
387
- end
388
- return false
389
- end
390
-
391
- def class_from_name(name)
392
- klass = name.to_s.split('::').inject(Kernel) {|scope, const_name|
393
- scope.const_get(const_name)}
394
- (!klass.nil? && klass.is_a?(::Class)) ? klass : nil
395
- end
396
-
397
124
  # Creates a RELS-EXT datastream for insertion into a Fedora Object
398
125
  # @param [String] pid
399
126
  # @param [Hash] relationships (optional) @default self.relationships
@@ -448,17 +175,21 @@ module ActiveFedora
448
175
  end
449
176
  xml.to_s
450
177
  end
451
-
178
+
452
179
  module ClassMethods
453
-
180
+ #include ActiveFedora::RelationshipsHelper::ClassMethods
181
+
454
182
  # Allows for a relationship to be treated like any other attribute of a model class. You define
455
- # named relationships in your model class using this method. You then have access to several
183
+ # relationships in your model class using this method. You then have access to several
456
184
  # helper methods to list, append, and remove objects from the list of relationships.
457
185
  # ====Examples to define two relationships
458
186
  # class AudioRecord < ActiveFedora::Base
459
187
  #
460
188
  # has_relationship "oral_history", :has_part, :inbound=>true, :type=>OralHistory
189
+ # # returns all similar audio
461
190
  # has_relationship "similar_audio", :has_part, :type=>AudioRecord
191
+ # #returns only similar audio with format wav
192
+ # has_relationship "similar_audio_wav", :has_part, :solr_fq=>"format_t:wav"
462
193
  #
463
194
  # The first two parameters are required:
464
195
  # name: relationship name
@@ -467,6 +198,7 @@ module ActiveFedora
467
198
  # possible parameters
468
199
  # :inbound => if true loads an external relationship via Solr (defaults to false)
469
200
  # :type => The type of model to use when instantiated an object from the pid in this relationship (defaults to ActiveFedora::Base)
201
+ # :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)
470
202
  #
471
203
  # If inbound is true it expects the relationship to be defined by another object's RELS-EXT
472
204
  # and to load that relationship from Solr. Otherwise, if inbound is true the relationship is stored in
@@ -478,25 +210,27 @@ module ActiveFedora
478
210
  # For the oral_history relationship in the example above the following helper methods are created:
479
211
  # oral_history: returns array of OralHistory objects that have this AudioRecord with predicate :has_part
480
212
  # oral_history_ids: Return array of pids for OralHistory objects that have this AudioRecord with predicate :has_part
213
+ # oral_history_query: Return solr query that can be used to retrieve related objects as solr documents
481
214
  #
482
215
  # For the outbound relationship "similar_audio" there are two additional methods to append and remove objects from that relationship
483
216
  # since it is managed internally:
484
217
  # similar_audio: Return array of AudioRecord objects that have been added to similar_audio relationship
485
218
  # similar_audio_ids: Return array of AudioRecord object pids that have been added to similar_audio relationship
219
+ # similar_audio_query: Return solr query that can be used to retrieve related objects as solr documents
486
220
  # similar_audio_append: Add an AudioRecord object to the similar_audio relationship
487
221
  # similar_audio_remove: Remove an AudioRecord from the similar_audio relationship
488
222
  def has_relationship(name, predicate, opts = {})
489
223
  opts = {:singular => nil, :inbound => false}.merge(opts)
490
224
  if opts[:inbound] == true
491
- raise "Duplicate use of predicate for named inbound relationship not allowed" if named_predicate_exists_with_different_name?(:inbound,name,predicate)
492
- register_named_relationship(:inbound, name, predicate, opts)
225
+ #raise "Duplicate use of predicate for inbound relationship name not allowed" if predicate_exists_with_different_relationship_name?(:inbound,name,predicate)
226
+ register_relationship_desc(:inbound, name, predicate, opts)
493
227
  register_predicate(:inbound, predicate)
494
228
  create_inbound_relationship_finders(name, predicate, opts)
495
229
  else
496
- raise "Duplicate use of predicate for named outbound relationship not allowed" if named_predicate_exists_with_different_name?(:self,name,predicate)
497
- register_named_relationship(:self, name, predicate, opts)
230
+ #raise "Duplicate use of predicate for outbound relationship name not allowed" if predicate_exists_with_different_relationship_name?(:self,name,predicate)
231
+ register_relationship_desc(:self, name, predicate, opts)
498
232
  register_predicate(:self, predicate)
499
- create_named_relationship_methods(name)
233
+ create_relationship_name_methods(name)
500
234
  create_outbound_relationship_finders(name, predicate, opts)
501
235
  end
502
236
  end
@@ -519,96 +253,14 @@ module ActiveFedora
519
253
  def has_bidirectional_relationship(name, outbound_predicate, inbound_predicate, opts={})
520
254
  create_bidirectional_relationship_finders(name, outbound_predicate, inbound_predicate, opts)
521
255
  end
522
-
523
- # ** EXPERIMENTAL **
524
- #
525
- # Check to make sure a subject,name, and predicate triple does not already exist
526
- # with the same subject but different name.
527
- # This method is used to ensure conflicting has_relationship calls are not made because
528
- # predicates cannot be reused across relationship names. Otherwise, the mapping of relationship name
529
- # to predicate in RELS-EXT would be broken.
530
- def named_predicate_exists_with_different_name?(subject,name,predicate)
531
- if named_relationships_desc.has_key?(subject)
532
- named_relationships_desc[subject].each_pair do |existing_name, args|
533
- return true if !args[:predicate].nil? && args[:predicate] == predicate && existing_name != name
534
- end
535
- end
536
- return false
537
- end
538
-
539
- # ** EXPERIMENTAL **
540
- #
541
- # Return hash that stores named relationship metadata defined by has_relationship calls
542
- # ====Example
543
- # For the following relationship
544
- #
545
- # has_relationship "audio_records", :has_part, :type=>AudioRecord
546
- # Results in the following returned by named_relationships_desc
547
- # {:self=>{"audio_records"=>{:type=>AudioRecord, :singular=>nil, :predicate=>:has_part, :inbound=>false}}}
548
- def named_relationships_desc
549
- @class_named_relationships_desc ||= Hash[:self => {}]
550
- end
551
-
552
- # ** EXPERIMENTAL **
553
- #
554
- # Internal method that ensures a relationship subject such as :self and :inbound
555
- # exist within the named_relationships_desc hash tracking named relationships metadata.
556
- def register_named_subject(subject)
557
- unless named_relationships_desc.has_key?(subject)
558
- named_relationships_desc[subject] = {}
559
- end
560
- end
561
-
562
- # ** EXPERIMENTAL **
563
- #
564
- # Internal method that adds relationship name and predicate pair to either an outbound (:self)
565
- # or inbound (:inbound) relationship types.
566
- def register_named_relationship(subject, name, predicate, opts)
567
- register_named_subject(subject)
568
- opts.merge!({:predicate=>predicate})
569
- named_relationships_desc[subject][name] = opts
570
- end
571
-
572
- # ** EXPERIMENTAL **
573
- #
574
- # Used in has_relationship call to create dynamic helper methods to
575
- # append and remove objects to and from a named relationship
576
- # ====Example
577
- # For the following relationship
578
- #
579
- # has_relationship "audio_records", :has_part, :type=>AudioRecord
580
- #
581
- # Methods audio_records_append and audio_records_remove are created.
582
- # Boths methods take an object that is kind_of? ActiveFedora::Base as a parameter
583
- def create_named_relationship_methods(name)
584
- append_method_name = "#{name.to_s.downcase}_append"
585
- remove_method_name = "#{name.to_s.downcase}_remove"
586
- self.send(:define_method,:"#{append_method_name}") {|object| add_named_relationship(name,object)}
587
- self.send(:define_method,:"#{remove_method_name}") {|object| remove_named_relationship(name,object)}
588
- end
589
-
590
- # ** EXPERIMENTAL **
591
- # Similar to +create_named_relationship_methods+ except we are merely creating an alias for outbound portion of bidirectional
592
- #
593
- # ====Example
594
- # has_bidirectional_relationship "members", :has_collection_member, :is_member_of_collection
595
- #
596
- # Method members_outbound_append and members_outbound_remove added
597
- # This method will create members_append which does same thing as members_outbound_append
598
- # and will create members_remove which does same thing as members_outbound_remove
599
- def create_bidirectional_named_relationship_methods(name,outbound_name)
600
- append_method_name = "#{name.to_s.downcase}_append"
601
- remove_method_name = "#{name.to_s.downcase}_remove"
602
- self.send(:define_method,:"#{append_method_name}") {|object| add_named_relationship(outbound_name,object)}
603
- self.send(:define_method,:"#{remove_method_name}") {|object| remove_named_relationship(outbound_name,object)}
604
- end
605
256
 
606
257
  def create_inbound_relationship_finders(name, predicate, opts = {})
607
258
  class_eval <<-END
608
259
  def #{name}(opts={})
609
260
  opts = {:rows=>25}.merge(opts)
610
- escaped_uri = self.internal_uri.gsub(/(:)/, '\\:')
611
- solr_result = SolrService.instance.conn.query("#{predicate}_s:\#{escaped_uri}", :rows=>opts[:rows])
261
+ query = self.class.inbound_relationship_query(self.pid,"#{name}")
262
+ return [] if query.empty?
263
+ solr_result = SolrService.instance.conn.query(query, :rows=>opts[:rows])
612
264
  if opts[:response_format] == :solr
613
265
  return solr_result
614
266
  else
@@ -631,6 +283,9 @@ module ActiveFedora
631
283
  def #{name}_from_solr
632
284
  #{name}(:response_format => :load_from_solr)
633
285
  end
286
+ def #{name}_query
287
+ relationship_query("#{name}")
288
+ end
634
289
  END
635
290
  end
636
291
 
@@ -643,13 +298,19 @@ module ActiveFedora
643
298
  id_array << rel.gsub("info:fedora/", "")
644
299
  end
645
300
  end
646
- if opts[:response_format] == :id_array
301
+ if opts[:response_format] == :id_array && !self.class.relationship_has_solr_filter_query?(:self,"#{name}")
647
302
  return id_array
648
303
  else
649
- query = ActiveFedora::SolrService.construct_query_for_pids(id_array)
304
+ query = self.class.outbound_relationship_query("#{name}",id_array)
650
305
  solr_result = SolrService.instance.conn.query(query)
651
306
  if opts[:response_format] == :solr
652
307
  return solr_result
308
+ elsif opts[:response_format] == :id_array
309
+ id_array = []
310
+ solr_result.hits.each do |hit|
311
+ id_array << hit[SOLR_DOCUMENT_ID]
312
+ end
313
+ return id_array
653
314
  elsif opts[:response_format] == :load_from_solr || self.load_from_solr
654
315
  return ActiveFedora::SolrService.reify_solr_results(solr_result,{:load_from_solr=>true})
655
316
  else
@@ -663,6 +324,9 @@ module ActiveFedora
663
324
  def #{name}_from_solr
664
325
  #{name}(:response_format => :load_from_solr)
665
326
  end
327
+ def #{name}_query
328
+ relationship_query("#{name}")
329
+ end
666
330
  END
667
331
  end
668
332
 
@@ -680,18 +344,21 @@ module ActiveFedora
680
344
  has_relationship(inbound_method_name, inbound_predicate, opts.merge!(:inbound=>true))
681
345
 
682
346
  #create methods that mirror the outbound append and remove with our bidirectional name, assume just add and remove locally
683
- create_bidirectional_named_relationship_methods(name,outbound_method_name)
347
+ create_bidirectional_relationship_name_methods(name,outbound_method_name)
684
348
 
685
349
  class_eval <<-END
686
350
  def #{name}(opts={})
687
351
  opts = {:rows=>25}.merge(opts)
688
352
  if opts[:response_format] == :solr || opts[:response_format] == :load_from_solr
689
- escaped_uri = self.internal_uri.gsub(/(:)/, '\\:')
690
- query = "#{inbound_predicate}_s:\#{escaped_uri}"
691
-
692
- outbound_id_array = #{outbound_method_name}(:response_format=>:id_array)
693
- query = query + " OR " + ActiveFedora::SolrService.construct_query_for_pids(outbound_id_array)
694
-
353
+ outbound_id_array = []
354
+ predicate = outbound_relationship_predicates["#{name}_outbound"]
355
+ if !outbound_relationships[predicate].nil?
356
+ outbound_relationships[predicate].each do |rel|
357
+ outbound_id_array << rel.gsub("info:fedora/", "")
358
+ end
359
+ end
360
+ #outbound_id_array = #{outbound_method_name}(:response_format=>:id_array)
361
+ query = self.class.bidirectional_relationship_query(self.pid,"#{name}",outbound_id_array)
695
362
  solr_result = SolrService.instance.conn.query(query, :rows=>opts[:rows])
696
363
 
697
364
  if opts[:response_format] == :solr
@@ -712,6 +379,9 @@ module ActiveFedora
712
379
  def #{name}_from_solr
713
380
  #{name}(:response_format => :load_from_solr)
714
381
  end
382
+ def #{name}_query
383
+ relationship_query("#{name}")
384
+ end
715
385
  END
716
386
  end
717
387
 
@@ -735,7 +405,7 @@ module ActiveFedora
735
405
  relationships[subject][predicate] = []
736
406
  end
737
407
  end
738
-
408
+
739
409
  #alias_method :register_target, :register_object
740
410
 
741
411
  # Creates a RELS-EXT datastream for insertion into a Fedora Object