active-fedora 5.7.1 → 6.0.0.pre1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitmodules +1 -1
- data/Gemfile +2 -1
- data/History.txt +0 -14
- data/Rakefile +1 -2
- data/active-fedora.gemspec +2 -2
- data/lib/active_fedora.rb +1 -16
- data/lib/active_fedora/associations.rb +8 -11
- data/lib/active_fedora/associations/association_collection.rb +2 -4
- data/lib/active_fedora/associations/has_and_belongs_to_many_association.rb +3 -12
- data/lib/active_fedora/associations/has_many_association.rb +0 -4
- data/lib/active_fedora/base.rb +6 -6
- data/lib/active_fedora/config.rb +0 -7
- data/lib/active_fedora/datastream.rb +0 -37
- data/lib/active_fedora/datastream_collections.rb +0 -10
- data/lib/active_fedora/datastreams.rb +0 -17
- data/lib/active_fedora/digital_object.rb +1 -1
- data/lib/active_fedora/file_configurator.rb +0 -22
- data/lib/active_fedora/fixture_loader.rb +1 -1
- data/lib/active_fedora/nokogiri_datastream.rb +9 -51
- data/lib/active_fedora/qualified_dublin_core_datastream.rb +1 -1
- data/lib/active_fedora/querying.rb +8 -4
- data/lib/active_fedora/rdf_datastream.rb +10 -9
- data/lib/active_fedora/rdf_node.rb +1 -1
- data/lib/active_fedora/rdf_node/term_proxy.rb +9 -5
- data/lib/active_fedora/relation.rb +1 -1
- data/lib/active_fedora/rels_ext_datastream.rb +1 -8
- data/lib/active_fedora/semantic_node.rb +0 -35
- data/lib/active_fedora/simple_datastream.rb +1 -1
- data/lib/active_fedora/solr_service.rb +6 -8
- data/lib/active_fedora/version.rb +1 -1
- data/lib/tasks/active_fedora_dev.rake +11 -3
- data/solr/conf/schema.xml +10 -1
- data/spec/integration/base_spec.rb +2 -347
- data/spec/integration/complex_rdf_datastream_spec.rb +1 -1
- data/spec/integration/full_featured_model_spec.rb +1 -9
- data/spec/integration/ntriples_datastream_spec.rb +4 -4
- data/spec/integration/om_datastream_spec.rb +2 -1
- data/spec/integration/rels_ext_datastream_spec.rb +1 -89
- data/spec/integration/scoped_query_spec.rb +4 -4
- data/spec/samples/hydra-mods_article_datastream.rb +2 -2
- data/spec/spec_helper.rb +3 -0
- data/spec/unit/base_spec.rb +7 -81
- data/spec/unit/datastream_spec.rb +0 -25
- data/spec/unit/has_many_collection_spec.rb +2 -27
- data/spec/unit/ntriples_datastream_spec.rb +28 -39
- data/spec/unit/om_datastream_spec.rb +13 -13
- data/spec/unit/qualified_dublin_core_datastream_spec.rb +1 -1
- data/spec/unit/query_spec.rb +1 -24
- data/spec/unit/semantic_node_spec.rb +0 -2
- data/spec/unit/simple_datastream_spec.rb +2 -2
- data/spec/unit/solr_config_options_spec.rb +1 -1
- metadata +76 -57
- checksums.yaml +0 -7
- data/.travis.yml +0 -8
- data/lib/active_fedora/file_management.rb +0 -81
- data/lib/active_fedora/metadata_datastream_helper.rb +0 -43
- data/lib/active_fedora/named_relationships.rb +0 -99
- data/lib/active_fedora/relationships.rb +0 -663
- data/spec/integration/base_file_management_spec.rb +0 -24
- data/spec/integration/has_many_associations_spec.rb +0 -64
- data/spec/integration/metadata_datastream_helper_spec.rb +0 -100
- data/spec/integration/semantic_node_spec.rb +0 -457
- data/spec/unit/base_file_management_spec.rb +0 -95
- data/spec/unit/has_and_belongs_to_many_collection_spec.rb +0 -59
- data/spec/unit/relationships_spec.rb +0 -871
checksums.yaml
DELETED
@@ -1,7 +0,0 @@
|
|
1
|
-
---
|
2
|
-
SHA1:
|
3
|
-
metadata.gz: 3b46cdb4a2b08e962eb11208d25c8d1b62c20002
|
4
|
-
data.tar.gz: a2db62d6d3c49b475e8cf1dd1faf1c64bd5e2799
|
5
|
-
SHA512:
|
6
|
-
metadata.gz: c41953687706d6ee968dc502263d0cb3abc6fe66b32c74af20f0bf2f03d0cb8d8f8360c6684abf6938c2a8e6ef4012739038aea9ac8c1993a85436756d760008
|
7
|
-
data.tar.gz: c8ef58febdf589004777b45b83d079cce0df4beef6c35beebe4b4e7fbc50b7298535e8df56f8fc51a09744c72f83d47480027a5dd82de6b94a73d891b7c8a30a
|
data/.travis.yml
DELETED
@@ -1,81 +0,0 @@
|
|
1
|
-
module ActiveFedora
|
2
|
-
module FileManagement
|
3
|
-
extend ActiveSupport::Concern
|
4
|
-
extend Deprecation
|
5
|
-
self.deprecation_horizon = 'active-fedora 6.0'
|
6
|
-
|
7
|
-
included do
|
8
|
-
include ActiveFedora::Relationships
|
9
|
-
Deprecation.silence(ActiveFedora::Relationships::ClassMethods) do
|
10
|
-
has_relationship "collection_members", :has_collection_member
|
11
|
-
has_relationship "part_of", :is_part_of
|
12
|
-
has_bidirectional_relationship "parts", :has_part, :is_part_of
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
# List the objects that assert isPartOf pointing at this object _plus_ all objects that this object asserts hasPart for
|
17
|
-
# Note: Previous versions of ActiveFedora used hasCollectionMember to represent this type of relationship.
|
18
|
-
# To accommodate this, until active-fedora-1.3, .file_assets will also return anything that this asserts hasCollectionMember for and will output a warning in the logs.
|
19
|
-
#
|
20
|
-
# @param [Hash] opts -- same options as auto-generated methods for relationships (ie. :response_format)
|
21
|
-
# @return [Array of ActiveFedora objects, Array of PIDs, or Solr::Result] -- same options as auto-generated methods for relationships (ie. :response_format)
|
22
|
-
def file_objects(opts={})
|
23
|
-
cm_array = collection_members(:response_format=>:id_array)
|
24
|
-
|
25
|
-
if !cm_array.empty?
|
26
|
-
logger.warn "This object has collection member assertions. hasCollectionMember will no longer be used to track file_object relationships after active_fedora 1.3. Use isPartOf assertions in the RELS-EXT of child objects instead."
|
27
|
-
if opts[:response_format] == :solr || opts[:response_format] == :load_from_solr
|
28
|
-
logger.warn ":solr and :load_from_solr response formats for file_objects search only uses parts relationships (usage of hasCollectionMember is no longer supported)"
|
29
|
-
result = parts(opts)
|
30
|
-
else
|
31
|
-
cm_result = collection_members(opts)
|
32
|
-
parts_result = parts(opts)
|
33
|
-
ary = cm_result+parts_result
|
34
|
-
result = ary.uniq
|
35
|
-
end
|
36
|
-
else
|
37
|
-
result = parts(opts)
|
38
|
-
end
|
39
|
-
return result
|
40
|
-
end
|
41
|
-
|
42
|
-
# Add the given obj as a child to the current object using an inbound is_part_of relationship
|
43
|
-
#
|
44
|
-
# @param [ActiveFedora::Base,String] obj the object or the pid of the object to add
|
45
|
-
# @return [Boolean] whether saving the child object was successful
|
46
|
-
# @example This will add an is_part_of relationship to the child_object's RELS-EXT datastream pointing at parent_object
|
47
|
-
# parent_object.file_objects_append(child_object)
|
48
|
-
def file_objects_append(obj)
|
49
|
-
# collection_members_append(obj)
|
50
|
-
unless obj.kind_of? ActiveFedora::Base
|
51
|
-
begin
|
52
|
-
obj = ActiveFedora::Base.find(obj)
|
53
|
-
rescue ActiveFedora::ObjectNotFoundError
|
54
|
-
"You must provide either an ActiveFedora object or a valid pid to add it as a file object. You submitted #{obj.inspect}"
|
55
|
-
end
|
56
|
-
end
|
57
|
-
obj.add_relationship(:is_part_of, self)
|
58
|
-
obj.save
|
59
|
-
end
|
60
|
-
|
61
|
-
# Add the given obj as a collection member to the current object using an outbound has_collection_member relationship.
|
62
|
-
#
|
63
|
-
# @param [ActiveFedora::Base] obj the file to add
|
64
|
-
# @return [ActiveFedora::Base] obj returns self
|
65
|
-
# @example This will add a has_collection_member relationship to the parent_object's RELS-EXT datastream pointing at child_object
|
66
|
-
# parent_object.collection_members_append(child_object)
|
67
|
-
def collection_members_append(obj)
|
68
|
-
add_relationship(:has_collection_member, obj)
|
69
|
-
return self
|
70
|
-
end
|
71
|
-
|
72
|
-
def collection_members_remove()
|
73
|
-
# will rely on SemanticNode.remove_relationship once it is implemented
|
74
|
-
end
|
75
|
-
|
76
|
-
deprecation_deprecate :file_objects, :file_objects_append, :collection_members_append, :collection_members_remove
|
77
|
-
|
78
|
-
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
@@ -1,43 +0,0 @@
|
|
1
|
-
require 'solrizer/field_name_mapper'
|
2
|
-
|
3
|
-
module ActiveFedora::MetadataDatastreamHelper
|
4
|
-
extend Deprecation
|
5
|
-
self.deprecation_horizon = 'active-fedora 6.0'
|
6
|
-
|
7
|
-
attr_accessor :fields, :xml_loaded
|
8
|
-
|
9
|
-
module ClassMethods
|
10
|
-
|
11
|
-
#get the Class's field list
|
12
|
-
def fields
|
13
|
-
@@classFields
|
14
|
-
end
|
15
|
-
|
16
|
-
end
|
17
|
-
|
18
|
-
def self.included(klass)
|
19
|
-
klass.extend(ClassMethods)
|
20
|
-
klass.send(:include, Solrizer::FieldNameMapper)
|
21
|
-
end
|
22
|
-
|
23
|
-
def ensure_xml_loaded
|
24
|
-
return if xml_loaded
|
25
|
-
self.xml_loaded = true
|
26
|
-
if new?
|
27
|
-
## Load up the template
|
28
|
-
self.class.from_xml nil, self
|
29
|
-
else
|
30
|
-
self.class.from_xml content, self
|
31
|
-
end
|
32
|
-
end
|
33
|
-
deprecation_deprecate :ensure_xml_loaded
|
34
|
-
|
35
|
-
def serialize! # :nodoc:
|
36
|
-
if changed?
|
37
|
-
return unless xml_loaded or new?
|
38
|
-
self.content = self.to_xml
|
39
|
-
end
|
40
|
-
end
|
41
|
-
deprecation_deprecate :serialize!
|
42
|
-
|
43
|
-
end
|
@@ -1,99 +0,0 @@
|
|
1
|
-
module ActiveFedora
|
2
|
-
module NamedRelationships
|
3
|
-
extend ActiveSupport::Concern
|
4
|
-
extend Deprecation
|
5
|
-
self.deprecation_horizon = 'active-fedora 6.0'
|
6
|
-
|
7
|
-
included do
|
8
|
-
class_attribute :class_named_relationships_desc
|
9
|
-
self.class_named_relationships_desc = {}
|
10
|
-
end
|
11
|
-
|
12
|
-
# ** EXPERIMENTAL **
|
13
|
-
#
|
14
|
-
# Check to make sure a subject,name, and predicate triple does not already exist
|
15
|
-
# with the same subject but different name.
|
16
|
-
# This method is used to ensure conflicting has_relationship calls are not made because
|
17
|
-
# predicates cannot be reused across relationship names. Otherwise, the mapping of relationship name
|
18
|
-
# to predicate in RELS-EXT would be broken.
|
19
|
-
def named_predicate_exists_with_different_name?(subject,name,predicate)
|
20
|
-
if named_relationships_desc.has_key?(subject)
|
21
|
-
named_relationships_desc[subject].each_pair do |existing_name, args|
|
22
|
-
return true if !args[:predicate].nil? && args[:predicate] == predicate && existing_name != name
|
23
|
-
end
|
24
|
-
end
|
25
|
-
return false
|
26
|
-
end
|
27
|
-
|
28
|
-
# ** EXPERIMENTAL **
|
29
|
-
#
|
30
|
-
# Return hash that stores named relationship metadata defined by has_relationship calls
|
31
|
-
# ====Example
|
32
|
-
# For the following relationship
|
33
|
-
#
|
34
|
-
# has_relationship "audio_records", :has_part, :type=>AudioRecord
|
35
|
-
# Results in the following returned by named_relationships_desc
|
36
|
-
# {:self=>{"audio_records"=>{:type=>AudioRecord, :singular=>nil, :predicate=>:has_part, :inbound=>false}}}
|
37
|
-
def named_relationships_desc
|
38
|
-
@class_named_relationships_desc ||= Hash[:self => {}]
|
39
|
-
#class_named_relationships_desc
|
40
|
-
end
|
41
|
-
|
42
|
-
# ** EXPERIMENTAL **
|
43
|
-
#
|
44
|
-
# Internal method that ensures a relationship subject such as :self and :inbound
|
45
|
-
# exist within the named_relationships_desc hash tracking named relationships metadata.
|
46
|
-
def register_named_subject(subject)
|
47
|
-
unless named_relationships_desc.has_key?(subject)
|
48
|
-
named_relationships_desc[subject] = {}
|
49
|
-
end
|
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.
|
56
|
-
def register_named_relationship(subject, name, predicate, opts)
|
57
|
-
register_named_subject(subject)
|
58
|
-
opts.merge!({:predicate=>predicate})
|
59
|
-
named_relationships_desc[subject][name] = opts
|
60
|
-
end
|
61
|
-
|
62
|
-
# ** EXPERIMENTAL **
|
63
|
-
#
|
64
|
-
# Used in has_relationship call to create dynamic helper methods to
|
65
|
-
# append and remove objects to and from a named relationship
|
66
|
-
# ====Example
|
67
|
-
# For the following relationship
|
68
|
-
#
|
69
|
-
# has_relationship "audio_records", :has_part, :type=>AudioRecord
|
70
|
-
#
|
71
|
-
# Methods audio_records_append and audio_records_remove are created.
|
72
|
-
# Boths methods take an object that is kind_of? ActiveFedora::Base as a parameter
|
73
|
-
def create_named_relationship_methods(name)
|
74
|
-
append_method_name = "#{name.to_s.downcase}_append"
|
75
|
-
remove_method_name = "#{name.to_s.downcase}_remove"
|
76
|
-
self.send(:define_method,:"#{append_method_name}") {|object| add_named_relationship(name,object)}
|
77
|
-
self.send(:define_method,:"#{remove_method_name}") {|object| remove_named_relationship(name,object)}
|
78
|
-
end
|
79
|
-
|
80
|
-
# ** EXPERIMENTAL **
|
81
|
-
# Similar to +create_named_relationship_methods+ except we are merely creating an alias for outbound portion of bidirectional
|
82
|
-
#
|
83
|
-
# ====Example
|
84
|
-
# has_bidirectional_relationship "members", :has_collection_member, :is_member_of_collection
|
85
|
-
#
|
86
|
-
# Method members_outbound_append and members_outbound_remove added
|
87
|
-
# This method will create members_append which does same thing as members_outbound_append
|
88
|
-
# and will create members_remove which does same thing as members_outbound_remove
|
89
|
-
def create_bidirectional_named_relationship_methods(name,outbound_name)
|
90
|
-
append_method_name = "#{name.to_s.downcase}_append"
|
91
|
-
remove_method_name = "#{name.to_s.downcase}_remove"
|
92
|
-
self.send(:define_method,:"#{append_method_name}") {|object| add_named_relationship(outbound_name,object)}
|
93
|
-
self.send(:define_method,:"#{remove_method_name}") {|object| remove_named_relationship(outbound_name,object)}
|
94
|
-
end
|
95
|
-
|
96
|
-
|
97
|
-
deprecation_deprecate :named_predicate_exists_with_different_name?, :named_relationships_desc, :register_named_subject, :register_named_relationship, :create_named_relationship_methods, :create_bidirectional_named_relationship_methods
|
98
|
-
end
|
99
|
-
end
|
@@ -1,663 +0,0 @@
|
|
1
|
-
module ActiveFedora
|
2
|
-
module Relationships
|
3
|
-
extend ActiveSupport::Concern
|
4
|
-
extend Deprecation
|
5
|
-
self.deprecation_horizon = 'active-fedora 6.0'
|
6
|
-
|
7
|
-
|
8
|
-
# Return array of objects for a given relationship name
|
9
|
-
# @param [String] Name of relationship to find
|
10
|
-
# @return [Array] Returns array of objects linked via the relationship name given
|
11
|
-
#
|
12
|
-
# @deprecated find_relationship_by_name will be removed in active-fedora 6.0
|
13
|
-
def find_relationship_by_name(name)
|
14
|
-
rels = nil
|
15
|
-
if inbound_relationship_names.include?(name)
|
16
|
-
rels = relationships_by_name(false)[:inbound][name]
|
17
|
-
elsif outbound_relationship_names.include?(name)
|
18
|
-
rels = relationships_by_name[:self][name]
|
19
|
-
end
|
20
|
-
rels = [] if rels.nil?
|
21
|
-
return rels
|
22
|
-
end
|
23
|
-
|
24
|
-
# Return array of relationship names for all inbound relationships (coming from other objects' RELS-EXT and Solr)
|
25
|
-
# @return [Array] of inbound relationship names for relationships declared via has_relationship in the class
|
26
|
-
def inbound_relationship_names
|
27
|
-
relationships_desc.has_key?(:inbound) ? relationships_desc[:inbound].keys : []
|
28
|
-
end
|
29
|
-
|
30
|
-
# Return hash of relationships_by_name defined within other objects' RELS-EXT
|
31
|
-
# It returns a hash of relationship name to arrays of objects. It requeries
|
32
|
-
# solr each time this method is called.
|
33
|
-
# @return [Hash] Return hash of each relationship name mapped to an Array of objects linked to this object via inbound relationships
|
34
|
-
def inbound_relationships_by_name
|
35
|
-
rels = {}
|
36
|
-
if relationships_desc.has_key?(:inbound)&&!relationships_desc[:inbound].empty?()
|
37
|
-
inbound_rels = inbound_relationships
|
38
|
-
|
39
|
-
if relationship_predicates.has_key?(:inbound)
|
40
|
-
relationship_predicates[:inbound].each do |name, predicate|
|
41
|
-
rels[name] = inbound_rels.has_key?(predicate) ? inbound_rels[predicate] : []
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
45
|
-
return rels
|
46
|
-
end
|
47
|
-
|
48
|
-
|
49
|
-
# Call this method to return the query used against solr to retrieve any
|
50
|
-
# objects linked via the relationship name given.
|
51
|
-
#
|
52
|
-
# Instead of this method you can also use the helper method
|
53
|
-
# [relationship_name]_query, i.e. method "parts_query" for relationship "parts" to return the same value
|
54
|
-
# @param [String] The name of the relationship defined in the model
|
55
|
-
# @return [String] The query used when querying solr for objects for this relationship
|
56
|
-
# @example
|
57
|
-
# Class SampleAFObjRelationshipFilterQuery < ActiveFedora::Base
|
58
|
-
# #points to all parents linked via is_member_of
|
59
|
-
# has_relationship "parents", :is_member_of
|
60
|
-
# #returns only parents that have a level value set to "series"
|
61
|
-
# has_relationship "series_parents", :is_member_of, :solr_fq=>level_t:series"
|
62
|
-
# end
|
63
|
-
# s = SampleAFObjRelationshipFilterQuery.new
|
64
|
-
# obj = ActiveFedora::Base.new
|
65
|
-
# s.parents_append(obj)
|
66
|
-
# s.series_parents_query
|
67
|
-
# #=> "(id:changeme\\:13020 AND level_t:series)"
|
68
|
-
# SampleAFObjRelationshipFilterQuery.relationship_query("series_parents")
|
69
|
-
# #=> "(id:changeme\\:13020 AND level_t:series)"
|
70
|
-
def relationship_query(relationship_name)
|
71
|
-
query = ""
|
72
|
-
if self.class.is_bidirectional_relationship?(relationship_name)
|
73
|
-
predicate = outbound_relationship_predicates["#{relationship_name}_outbound"]
|
74
|
-
id_array = ids_for_outbound(predicate)
|
75
|
-
query = self.class.bidirectional_relationship_query(pid,relationship_name,id_array)
|
76
|
-
elsif outbound_relationship_names.include?(relationship_name)
|
77
|
-
predicate = outbound_relationship_predicates[relationship_name]
|
78
|
-
id_array = ids_for_outbound(predicate)
|
79
|
-
query = self.class.outbound_relationship_query(relationship_name,id_array)
|
80
|
-
elsif inbound_relationship_names.include?(relationship_name)
|
81
|
-
query = self.class.inbound_relationship_query(pid,relationship_name)
|
82
|
-
end
|
83
|
-
query
|
84
|
-
end
|
85
|
-
|
86
|
-
|
87
|
-
# Gets the relationships hash with subject mapped to relationship
|
88
|
-
# names instead of relationship predicates (unlike the "relationships" method in SemanticNode)
|
89
|
-
# It has an optional parameter of outbound_only that defaults true.
|
90
|
-
# If false it will include inbound relationships in the results.
|
91
|
-
# Also, it will only reload outbound relationships if the relationships hash has changed
|
92
|
-
# since the last time this method was called.
|
93
|
-
# @param [Boolean] if false it will include inbound relationships (defaults to true)
|
94
|
-
# @return [Hash] Returns a hash of subject name (:self or :inbound) mapped to nested hashs of each relationship name mapped to an Array of objects linked via the relationship
|
95
|
-
def relationships_by_name(outbound_only=true)
|
96
|
-
Deprecation.silence(ActiveFedora::Relationships) do
|
97
|
-
@relationships_by_name = relationships_by_name_from_class()
|
98
|
-
end
|
99
|
-
outbound_only ? @relationships_by_name : @relationships_by_name.merge(:inbound=>inbound_relationships_by_name)
|
100
|
-
end
|
101
|
-
|
102
|
-
# Gets relationships by name from the class using the current relationships hash
|
103
|
-
# and relationship name,predicate pairs.
|
104
|
-
# @return [Hash] returns the outbound relationships with :self mapped to nested hashs of each relationship name mapped to an Array of objects linked via the relationship
|
105
|
-
def relationships_by_name_from_class()
|
106
|
-
rels = {}
|
107
|
-
relationship_predicates.each_pair do |subj, names|
|
108
|
-
case subj
|
109
|
-
when :self
|
110
|
-
rels[:self] = {}
|
111
|
-
names.each_pair do |name, predicate|
|
112
|
-
set = []
|
113
|
-
res = relationships.query(:predicate => Predicates.find_graph_predicate(predicate))
|
114
|
-
res.each_object do |o|
|
115
|
-
set << o.to_s
|
116
|
-
end
|
117
|
-
rels[:self][name] = set
|
118
|
-
end
|
119
|
-
when :inbound
|
120
|
-
#nop
|
121
|
-
end
|
122
|
-
end
|
123
|
-
return rels
|
124
|
-
end
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
# Throws an assertion error if conforms_to? returns false for object and model_class
|
129
|
-
# @param [String] Name of object (just label for output)
|
130
|
-
# @param [ActiveFedora::Base] Expects to be an object that has ActiveFedora::Base as an ancestor of its class
|
131
|
-
# @param [Class] The model class used in conforms_to? check on object
|
132
|
-
def assert_conforms_to(name, object, model_class)
|
133
|
-
raise "Assertion failure: #{name}: #{object.pid} does not have model #{model_class}, it has model #{relationships[:self][:has_model]}" unless object.conforms_to?(model_class)
|
134
|
-
end
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
# Returns a Class symbol for the given string for the class name
|
139
|
-
# @param [String] the class name as a string
|
140
|
-
# @return [Class] the class as a Class object
|
141
|
-
def class_from_name(name)
|
142
|
-
klass = name.to_s.split('::').inject(Kernel) {|scope, const_name|
|
143
|
-
scope.const_get(const_name)}
|
144
|
-
(!klass.nil? && klass.is_a?(::Class)) ? klass : nil
|
145
|
-
end
|
146
|
-
|
147
|
-
# Return array of relationship names for all outbound relationships (coming from this object's RELS-EXT)
|
148
|
-
# @return [Array] of outbound relationship names for relationships declared via has_relationship in the class
|
149
|
-
def outbound_relationship_names
|
150
|
-
relationships_desc.has_key?(:self) ? relationships_desc[:self].keys : []
|
151
|
-
end
|
152
|
-
|
153
|
-
# Returns true if the given relationship name is a relationship
|
154
|
-
# @param [String] Name of relationship
|
155
|
-
# @param [Boolean] If false checks inbound relationships as well (defaults to true)
|
156
|
-
def is_relationship_name?(name, outbound_only=true)
|
157
|
-
Deprecation.silence(ActiveFedora::Relationships) do
|
158
|
-
if outbound_only
|
159
|
-
outbound_relationship_names.include?(name)
|
160
|
-
else
|
161
|
-
(outbound_relationship_names.include?(name)||inbound_relationship_names.include?(name))
|
162
|
-
end
|
163
|
-
end
|
164
|
-
end
|
165
|
-
|
166
|
-
|
167
|
-
def load_inbound_relationship(name, predicate, opts={})
|
168
|
-
opts = {:rows=>25}.merge(opts)
|
169
|
-
query = self.class.inbound_relationship_query(self.pid,"#{name}")
|
170
|
-
return [] if query.empty?
|
171
|
-
if opts[:response_format] == :solr
|
172
|
-
solr_result = SolrService.query query, :raw=>true, :rows=>opts[:rows]
|
173
|
-
return solr_result
|
174
|
-
else
|
175
|
-
solr_result = SolrService.query(query, :rows=>opts[:rows])
|
176
|
-
if opts[:response_format] == :id_array
|
177
|
-
id_array = []
|
178
|
-
solr_result.each do |hit|
|
179
|
-
id_array << hit[SOLR_DOCUMENT_ID]
|
180
|
-
end
|
181
|
-
return id_array
|
182
|
-
elsif opts[:response_format] == :load_from_solr || self.load_from_solr
|
183
|
-
return ActiveFedora::SolrService.reify_solr_results(solr_result,{:load_from_solr=>true})
|
184
|
-
else
|
185
|
-
return ActiveFedora::SolrService.reify_solr_results(solr_result)
|
186
|
-
end
|
187
|
-
end
|
188
|
-
end
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
def load_bidirectional(name, inbound_method_name, outbound_method_name, opts)
|
193
|
-
opts = {:rows=>25}.merge(opts)
|
194
|
-
if opts[:response_format] == :solr || opts[:response_format] == :load_from_solr
|
195
|
-
predicate = outbound_relationship_predicates["#{name}_outbound"]
|
196
|
-
outbound_id_array = ids_for_outbound(predicate)
|
197
|
-
query = self.class.bidirectional_relationship_query(self.pid,"#{name}",outbound_id_array)
|
198
|
-
solr_result = SolrService.query(query, :rows=>opts[:rows])
|
199
|
-
|
200
|
-
if opts[:response_format] == :solr
|
201
|
-
return solr_result
|
202
|
-
elsif opts[:response_format] == :load_from_solr || self.load_from_solr
|
203
|
-
return ActiveFedora::SolrService.reify_solr_results(solr_result,{:load_from_solr=>true})
|
204
|
-
else
|
205
|
-
return ActiveFedora::SolrService.reify_solr_results(solr_result)
|
206
|
-
end
|
207
|
-
else
|
208
|
-
ary = send(inbound_method_name,opts) + send(outbound_method_name, opts)
|
209
|
-
return ary.uniq
|
210
|
-
end
|
211
|
-
end
|
212
|
-
|
213
|
-
def load_outbound_relationship(name, predicate, opts={})
|
214
|
-
id_array = ids_for_outbound(predicate)
|
215
|
-
if opts[:response_format] == :id_array && !self.relationship_has_solr_filter_query?(:self,"#{name}")
|
216
|
-
return id_array
|
217
|
-
else
|
218
|
-
query = self.class.outbound_relationship_query(name,id_array)
|
219
|
-
solr_result = SolrService.query(query)
|
220
|
-
if opts[:response_format] == :solr
|
221
|
-
return solr_result
|
222
|
-
elsif opts[:response_format] == :id_array
|
223
|
-
return solr_result.map {|hit| hit[SOLR_DOCUMENT_ID] }
|
224
|
-
elsif opts[:response_format] == :load_from_solr || self.load_from_solr
|
225
|
-
return ActiveFedora::SolrService.reify_solr_results(solr_result,{:load_from_solr=>true})
|
226
|
-
else
|
227
|
-
return ActiveFedora::SolrService.reify_solr_results(solr_result)
|
228
|
-
end
|
229
|
-
end
|
230
|
-
end
|
231
|
-
|
232
|
-
# Check if a relationship has any solr query filters defined by has_relationship call
|
233
|
-
# @param [Symbol] subject to use such as :self or :inbound
|
234
|
-
# @param [String] relationship name
|
235
|
-
# @return [Boolean] true if the relationship has a query filter defined
|
236
|
-
def relationship_has_solr_filter_query?(subject, relationship_name)
|
237
|
-
relationships_desc.has_key?(subject) && relationships_desc[subject].has_key?(relationship_name) && relationships_desc[subject][relationship_name].has_key?(:solr_fq)
|
238
|
-
end
|
239
|
-
|
240
|
-
|
241
|
-
# Add an outbound relationship for given relationship name
|
242
|
-
# See ActiveFedora::SemanticNode::ClassMethods.has_relationship
|
243
|
-
# @param [String] Name of relationship
|
244
|
-
# @param [ActiveFedora::Base] object to add to the relationship (expects ActvieFedora::Base to be an ancestor)
|
245
|
-
# @return [Boolean] returns true if add operation successful
|
246
|
-
def add_relationship_by_name(name, object)
|
247
|
-
Deprecation.silence(ActiveFedora::Relationships) do
|
248
|
-
if is_relationship_name?(name,true)
|
249
|
-
if relationships_desc[:self][name].has_key?(:type)
|
250
|
-
klass = class_from_name(relationships_desc[:self][name][:type])
|
251
|
-
unless klass.nil?
|
252
|
-
(assert_conforms_to 'object', object, klass)
|
253
|
-
end
|
254
|
-
end
|
255
|
-
add_relationship(outbound_relationship_predicates[name],object)
|
256
|
-
else
|
257
|
-
false
|
258
|
-
end
|
259
|
-
end
|
260
|
-
end
|
261
|
-
|
262
|
-
# Remove an object for the given relationship name
|
263
|
-
# @param [String] Relationship name
|
264
|
-
# @param [ActiveFedora::Base] object to remove
|
265
|
-
# @return [Boolean] return true if remove operation successful
|
266
|
-
def remove_relationship_by_name(name, object)
|
267
|
-
if is_relationship_name?(name,true)
|
268
|
-
remove_relationship(outbound_relationship_predicates[name],object)
|
269
|
-
else
|
270
|
-
return false
|
271
|
-
end
|
272
|
-
end
|
273
|
-
|
274
|
-
deprecation_deprecate :find_relationship_by_name, :inbound_relationship_names, :inbound_relationships_by_name, :relationship_query, :relationships_by_name, :relationships_by_name_from_class, :assert_conforms_to, :class_from_name, :outbound_relationship_names, :is_relationship_name?, :load_inbound_relationship, :load_bidirectional, :load_outbound_relationship, :relationship_has_solr_filter_query?, :add_relationship_by_name, :remove_relationship_by_name
|
275
|
-
|
276
|
-
module ClassMethods
|
277
|
-
extend Deprecation
|
278
|
-
# Tests if the relationship name passed is in bidirectional
|
279
|
-
# @param [String] relationship name to test
|
280
|
-
# @return [Boolean]
|
281
|
-
def is_bidirectional_relationship?(relationship_name)
|
282
|
-
(relationships_desc.has_key?(:self)&&relationships_desc.has_key?(:inbound)&&relationships_desc[:self].has_key?("#{relationship_name}_outbound") && relationships_desc[:inbound].has_key?("#{relationship_name}_inbound"))
|
283
|
-
end
|
284
|
-
|
285
|
-
|
286
|
-
# Returns a solr query for retrieving objects specified in an outbound relationship.
|
287
|
-
# This method is mostly used by internal method calls.
|
288
|
-
# It utilizes any solr_fq value defined within a relationship to attach a query filter when
|
289
|
-
# querying solr on top of just the predicate being used.
|
290
|
-
# Because it is static it
|
291
|
-
# needs the pids defined within RELS-EXT for this relationship to be passed in.
|
292
|
-
# If you are calling this method directly to get the query you should use the
|
293
|
-
# ActiveFedora::SemanticNode.relationship_query instead or use the helper method
|
294
|
-
# [relationship_name]_query, i.e. method "parts_query" for relationship "parts". This
|
295
|
-
# method would only be called directly if you had something like an array of outbound pids
|
296
|
-
# already in something like a solr document for object that has these relationships.
|
297
|
-
# @param [String] The name of the relationship defined in the model
|
298
|
-
# @param [Array] An array of pids to include in the query
|
299
|
-
# @return [String]
|
300
|
-
# @example
|
301
|
-
# Class SampleAFObjRelationshipFilterQuery < ActiveFedora::Base
|
302
|
-
# #points to all parents linked via is_member_of
|
303
|
-
# has_relationship "parents", :is_member_of
|
304
|
-
# #returns only parents that have a level value set to "series"
|
305
|
-
# has_relationship "series_parents", :is_member_of, :solr_fq=>"level_t:series"
|
306
|
-
# end
|
307
|
-
# s = SampleAFObjRelationshipFilterQuery.new
|
308
|
-
# obj = ActiveFedora::Base.new
|
309
|
-
# s.series_parents_append(obj)
|
310
|
-
# s.series_parents_query
|
311
|
-
# #=> "(id:changeme\\:13020 AND level_t:series)"
|
312
|
-
# SampleAFObjRelationshipFilterQuery.outbound_relationship_query("series_parents",["id:changeme:13020"])
|
313
|
-
# #=> "(id:changeme\\:13020 AND level_t:series)"
|
314
|
-
def outbound_relationship_query(relationship_name,outbound_pids)
|
315
|
-
query = ActiveFedora::SolrService.construct_query_for_pids(outbound_pids)
|
316
|
-
subject = :self
|
317
|
-
if relationships_desc.has_key?(subject) && relationships_desc[subject].has_key?(relationship_name) && relationships_desc[subject][relationship_name].has_key?(:solr_fq)
|
318
|
-
solr_fq = relationships_desc[subject][relationship_name][:solr_fq]
|
319
|
-
unless query.empty?
|
320
|
-
#substitute in the filter query for each pid so that it is applied to each in the query
|
321
|
-
query_parts = query.split(/OR/)
|
322
|
-
query = ""
|
323
|
-
query_parts.each_with_index do |query_part,index|
|
324
|
-
query_part.strip!
|
325
|
-
query << " OR " if index > 0
|
326
|
-
query << "(#{query_part} AND #{solr_fq})"
|
327
|
-
end
|
328
|
-
else
|
329
|
-
query = solr_fq
|
330
|
-
end
|
331
|
-
end
|
332
|
-
query
|
333
|
-
end
|
334
|
-
|
335
|
-
|
336
|
-
# Returns a solr query for retrieving objects specified in an inbound relationship.
|
337
|
-
# This method is mostly used by internal method calls.
|
338
|
-
# It utilizes any solr_fq value defined within a relationship to attach a query filter
|
339
|
-
# on top of just the predicate being used. Because it is static it
|
340
|
-
# needs the pid of the object that has the inbound relationships passed in.
|
341
|
-
# If you are calling this method directly to get the query you should use the
|
342
|
-
# ActiveFedora::SemanticNode.relationship_query instead or use the helper method
|
343
|
-
# [relationship_name]_query, i.e. method "parts_query" for relationship "parts". This
|
344
|
-
# method would only be called directly if you were working only with Solr and already
|
345
|
-
# had the pid for the object in something like a solr document.
|
346
|
-
# @param [String] The pid for the object that has these inbound relationships
|
347
|
-
# @param [String] The name of the relationship defined in the model
|
348
|
-
# @return [String]
|
349
|
-
# @example
|
350
|
-
# Class SampleAFObjRelationshipFilterQuery < ActiveFedora::Base
|
351
|
-
# #returns all parts
|
352
|
-
# has_relationship "parts", :is_part_of, :inbound=>true
|
353
|
-
# #returns only parts that have level to "series"
|
354
|
-
# has_relationship "series_parts", :is_part_of, :inbound=>true, :solr_fq=>"level_t:series"
|
355
|
-
# end
|
356
|
-
# s = SampleAFObjRelationshipFilterQuery.new
|
357
|
-
# s.pid
|
358
|
-
# #=> id:changeme:13020
|
359
|
-
# s.series_parts_query
|
360
|
-
# #=> "is_part_of_s:info\\:fedora/changeme\\:13021 AND level_t:series"
|
361
|
-
# SampleAFObjRelationshipFilterQuery.inbound_relationship_query(s.pid,"series_parts")
|
362
|
-
# #=> "is_part_of_s:info\\:fedora/changeme\\:13021 AND level_t:series"
|
363
|
-
def inbound_relationship_query(pid,relationship_name)
|
364
|
-
query = ""
|
365
|
-
subject = :inbound
|
366
|
-
if relationships_desc.has_key?(subject) && relationships_desc[subject].has_key?(relationship_name)
|
367
|
-
predicate = relationships_desc[subject][relationship_name][:predicate]
|
368
|
-
query = ActiveFedora::SolrService.construct_query_for_rel(predicate => "info:fedora/#{pid}")
|
369
|
-
if relationships_desc.has_key?(subject) && relationships_desc[subject].has_key?(relationship_name) && relationships_desc[subject][relationship_name].has_key?(:solr_fq)
|
370
|
-
solr_fq = relationships_desc[subject][relationship_name][:solr_fq]
|
371
|
-
query << " AND " unless query.empty?
|
372
|
-
query << solr_fq
|
373
|
-
end
|
374
|
-
end
|
375
|
-
query
|
376
|
-
end
|
377
|
-
|
378
|
-
# Returns a solr query for retrieving objects specified in a bidirectional relationship.
|
379
|
-
# This method is mostly used by internal method calls.
|
380
|
-
# It usea of solr_fq value defined within a relationship to attach a query filter
|
381
|
-
# on top of just the predicate being used. Because it is static it
|
382
|
-
# needs the pids defined within RELS-EXT for the outbound relationship as well as the pid of the
|
383
|
-
# object for the inbound portion of the relationship.
|
384
|
-
# If you are calling this method directly to get the query you should use the
|
385
|
-
# ActiveFedora::SemanticNode.relationship_query instead or use the helper method
|
386
|
-
# [relationship_name]_query, i.e. method "bi_parts_query" for relationship "bi_parts". This
|
387
|
-
# method would only be called directly if you had something like an array of outbound pids
|
388
|
-
# already in something like a solr document for object that has these relationships.
|
389
|
-
# @param [String] The pid for the object that has these inbound relationships
|
390
|
-
# @param [String] The name of the relationship defined in the model
|
391
|
-
# @param [Array] An array of pids to include in the query
|
392
|
-
# @return [String]
|
393
|
-
# @example
|
394
|
-
# Class SampleAFObjRelationshipFilterQuery < ActiveFedora::Base
|
395
|
-
# has_bidirectional_relationship "bi_series_parts", :has_part, :is_part_of, :solr_fq=>"level_t:series"
|
396
|
-
# end
|
397
|
-
# s = SampleAFObjRelationshipFilterQuery.new
|
398
|
-
# obj = ActiveFedora::Base.new
|
399
|
-
# s.bi_series_parts_append(obj)
|
400
|
-
# s.pid
|
401
|
-
# #=> "changeme:13025"
|
402
|
-
# obj.pid
|
403
|
-
# #=> id:changeme:13026
|
404
|
-
# s.bi_series_parts_query
|
405
|
-
# #=> "(id:changeme\\:13026 AND level_t:series) OR (is_part_of_s:info\\:fedora/changeme\\:13025 AND level_t:series)"
|
406
|
-
# SampleAFObjRelationshipFilterQuery.bidirectional_relationship_query(s.pid,"series_parents",["id:changeme:13026"])
|
407
|
-
# #=> "(id:changeme\\:13026 AND level_t:series) OR (is_part_of_s:info\\:fedora/changeme\\:13025 AND level_t:series)"
|
408
|
-
def bidirectional_relationship_query(pid,relationship_name,outbound_pids)
|
409
|
-
outbound_query = outbound_relationship_query("#{relationship_name}_outbound",outbound_pids)
|
410
|
-
inbound_query = inbound_relationship_query(pid,"#{relationship_name}_inbound")
|
411
|
-
query = outbound_query # use outbound_query by default
|
412
|
-
if !inbound_query.empty?
|
413
|
-
query << " OR (" + inbound_relationship_query(pid,"#{relationship_name}_inbound") + ")"
|
414
|
-
end
|
415
|
-
return query
|
416
|
-
end
|
417
|
-
|
418
|
-
|
419
|
-
# Internal method that ensures a relationship subject such as :self and :inbound
|
420
|
-
# exist within the relationships_desc hash tracking relationships metadata.
|
421
|
-
# @param [Symbol] Subject name to register (will probably be something like :self or :inbound)
|
422
|
-
def register_relationship_desc_subject(subject)
|
423
|
-
unless relationships_desc.has_key?(subject)
|
424
|
-
relationships_desc[subject] = {}
|
425
|
-
end
|
426
|
-
end
|
427
|
-
|
428
|
-
# Internal method that adds relationship name and predicate pair to either an outbound (:self)
|
429
|
-
# or inbound (:inbound) relationship types. Refer to ActiveFedora::SemanticNode.has_relationship for information on what metadata will be persisted.
|
430
|
-
# @param [Symbol] Subject name to register
|
431
|
-
# @param [String] Name of relationship being registered
|
432
|
-
# @param [Symbol] Fedora ontology predicate to use
|
433
|
-
# @param [Hash] Any options passed to has_relationship such as :type, :solr_fq, etc.
|
434
|
-
def register_relationship_desc(subject, name, predicate, opts={})
|
435
|
-
register_relationship_desc_subject(subject)
|
436
|
-
opts.merge!({:predicate=>predicate})
|
437
|
-
relationships_desc[subject][name] = opts
|
438
|
-
end
|
439
|
-
|
440
|
-
# relationships are tracked as a hash of structure
|
441
|
-
# @example
|
442
|
-
# ds.relationships # => {:self=>{:has_model=>["afmodel:SimpleThing"],:has_part=>["demo:20"]},:inbound=>{:is_part_of=>["demo:6"]}
|
443
|
-
def relationships
|
444
|
-
@class_relationships ||= Hash[:self => {}]
|
445
|
-
end
|
446
|
-
|
447
|
-
|
448
|
-
def register_subject(subject)
|
449
|
-
if !relationships.has_key?(subject)
|
450
|
-
relationships[subject] = {}
|
451
|
-
end
|
452
|
-
end
|
453
|
-
|
454
|
-
def register_predicate(subject, predicate)
|
455
|
-
register_subject(subject)
|
456
|
-
if !relationships[subject].has_key?(predicate)
|
457
|
-
relationships[subject][predicate] = []
|
458
|
-
end
|
459
|
-
end
|
460
|
-
|
461
|
-
# Allows for a relationship to be treated like any other attribute of a model class. You define
|
462
|
-
# relationships in your model class using this method. You then have access to several
|
463
|
-
# helper methods to list, append, and remove objects from the list of relationships.
|
464
|
-
# ====Examples to define two relationships
|
465
|
-
# class AudioRecord < ActiveFedora::Base
|
466
|
-
#
|
467
|
-
# has_relationship "oral_history", :has_part, :inbound=>true, :type=>OralHistory
|
468
|
-
# # returns all similar audio
|
469
|
-
# has_relationship "similar_audio", :has_part, :type=>AudioRecord
|
470
|
-
# #returns only similar audio with format wav
|
471
|
-
# has_relationship "similar_audio_wav", :has_part, :solr_fq=>"format_t:wav"
|
472
|
-
#
|
473
|
-
# The first two parameters are required:
|
474
|
-
# name: relationship name
|
475
|
-
# predicate: predicate for the relationship
|
476
|
-
# opts:
|
477
|
-
# possible parameters
|
478
|
-
# :inbound => if true loads an external relationship via Solr (defaults to false)
|
479
|
-
# :type => The type of model to use when instantiated an object from the pid in this relationship (defaults to ActiveFedora::Base)
|
480
|
-
# :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)
|
481
|
-
#
|
482
|
-
# If inbound is true it expects the relationship to be defined by another object's RELS-EXT
|
483
|
-
# and to load that relationship from Solr. Otherwise, if inbound is true the relationship is stored in
|
484
|
-
# this object's RELS-EXT datastream
|
485
|
-
#
|
486
|
-
# 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
|
487
|
-
# and one is outbound as shown in the example above. A full list of possible predicates are defined by predicate_mappings
|
488
|
-
#
|
489
|
-
# For the oral_history relationship in the example above the following helper methods are created:
|
490
|
-
# oral_history: returns array of OralHistory objects that have this AudioRecord with predicate :has_part
|
491
|
-
# oral_history_ids: Return array of pids for OralHistory objects that have this AudioRecord with predicate :has_part
|
492
|
-
# oral_history_query: Return solr query that can be used to retrieve related objects as solr documents
|
493
|
-
#
|
494
|
-
# For the outbound relationship "similar_audio" there are two additional methods to append and remove objects from that relationship
|
495
|
-
# since it is managed internally:
|
496
|
-
# similar_audio: Return array of AudioRecord objects that have been added to similar_audio relationship
|
497
|
-
# similar_audio_ids: Return array of AudioRecord object pids that have been added to similar_audio relationship
|
498
|
-
# similar_audio_query: Return solr query that can be used to retrieve related objects as solr documents
|
499
|
-
# similar_audio_append: Add an AudioRecord object to the similar_audio relationship
|
500
|
-
# similar_audio_remove: Remove an AudioRecord from the similar_audio relationship
|
501
|
-
#
|
502
|
-
# @deprecated use ActiveFedora::Base.has_many or ActiveFedora::Base.belongs_to. has_relationship will be removed in active-fedora 6.0
|
503
|
-
def has_relationship(name, predicate, opts = {})
|
504
|
-
opts = {:singular => nil, :inbound => false}.merge(opts)
|
505
|
-
if opts[:inbound] == true
|
506
|
-
register_relationship_desc(:inbound, name, predicate, opts)
|
507
|
-
register_predicate(:inbound, predicate)
|
508
|
-
create_inbound_relationship_finders(name, predicate, opts)
|
509
|
-
else
|
510
|
-
#raise "Duplicate use of predicate for named outbound relationship \"#{predicate.inspect}\" not allowed" if named_predicate_exists_with_different_name?(:self,name,predicate)
|
511
|
-
register_relationship_desc(:self, name, predicate, opts)
|
512
|
-
register_predicate(:self, predicate)
|
513
|
-
create_relationship_name_methods(name)
|
514
|
-
create_outbound_relationship_finders(name, predicate, opts)
|
515
|
-
end
|
516
|
-
end
|
517
|
-
deprecation_deprecate :has_relationship
|
518
|
-
|
519
|
-
# Used in has_relationship call to create dynamic helper methods to
|
520
|
-
# append and remove objects to and from a relationship
|
521
|
-
# @param [String] relationship name to create helper methods for
|
522
|
-
# @example
|
523
|
-
# For the following relationship
|
524
|
-
#
|
525
|
-
# has_relationship "audio_records", :has_part, :type=>AudioRecord
|
526
|
-
#
|
527
|
-
# Methods audio_records_append and audio_records_remove are created.
|
528
|
-
# Boths methods take an object that is kind_of? ActiveFedora::Base as a parameter
|
529
|
-
#
|
530
|
-
# @deprecated create_relationship_name_methods will be removed in active-fedora 6.0
|
531
|
-
def create_relationship_name_methods(name)
|
532
|
-
append_method_name = "#{name.to_s.downcase}_append"
|
533
|
-
remove_method_name = "#{name.to_s.downcase}_remove"
|
534
|
-
|
535
|
-
self.send(:define_method,:"#{append_method_name}") {|object| Deprecation.silence(ActiveFedora::Relationships) { add_relationship_by_name(name,object) } }
|
536
|
-
self.send(:define_method,:"#{remove_method_name}") {|object| Deprecation.silence(ActiveFedora::Relationships) {remove_relationship_by_name(name,object) } }
|
537
|
-
end
|
538
|
-
|
539
|
-
|
540
|
-
# Generates relationship finders for predicates that point in both directions
|
541
|
-
#
|
542
|
-
# @param [String] name of the relationship method(s) to create
|
543
|
-
# @param [Symbol] outbound_predicate Predicate used in outbound relationships
|
544
|
-
# @param [Symbol] inbound_predicate Predicate used in inbound relationships
|
545
|
-
# @param [Hash] opts
|
546
|
-
#
|
547
|
-
# Example:
|
548
|
-
# has_bidirectional_relationship("parts", :has_part, :is_part_of)
|
549
|
-
#
|
550
|
-
# will create three instance methods: parts_outbound, and parts_inbound and parts
|
551
|
-
# the inbound and outbound methods are the same that would result from calling
|
552
|
-
# create_inbound_relationship_finders and create_outbound_relationship_finders
|
553
|
-
# The third method combines the results of both and handles generating appropriate
|
554
|
-
# solr queries where necessary.
|
555
|
-
#
|
556
|
-
# @deprecated use ActiveFedora::Base.has_and_belongs_to_many. has_bidirectional_relationship will be removed in active-fedora 6.0
|
557
|
-
def has_bidirectional_relationship(name, outbound_predicate, inbound_predicate, opts={})
|
558
|
-
create_bidirectional_relationship_finders(name, outbound_predicate, inbound_predicate, opts)
|
559
|
-
end
|
560
|
-
deprecation_deprecate :has_bidirectional_relationship
|
561
|
-
|
562
|
-
def create_inbound_relationship_finders(name, predicate, opts = {})
|
563
|
-
class_eval <<-END, __FILE__, __LINE__
|
564
|
-
def #{name}(opts={})
|
565
|
-
Deprecation.silence(ActiveFedora::Relationships) do
|
566
|
-
load_inbound_relationship('#{name}', '#{predicate}', opts)
|
567
|
-
end
|
568
|
-
end
|
569
|
-
def #{name}_ids
|
570
|
-
#{name}(:response_format => :id_array)
|
571
|
-
end
|
572
|
-
def #{name}_from_solr
|
573
|
-
#{name}(:response_format => :load_from_solr)
|
574
|
-
end
|
575
|
-
def #{name}_query
|
576
|
-
relationship_query("#{name}")
|
577
|
-
end
|
578
|
-
END
|
579
|
-
end
|
580
|
-
|
581
|
-
def create_outbound_relationship_finders(name, predicate, opts = {})
|
582
|
-
class_eval <<-END, __FILE__, __LINE__
|
583
|
-
def #{name}(opts={})
|
584
|
-
Deprecation.silence(ActiveFedora::Relationships) do
|
585
|
-
load_outbound_relationship(#{name.inspect}, #{predicate.inspect}, opts)
|
586
|
-
end
|
587
|
-
end
|
588
|
-
def #{name}_ids
|
589
|
-
#{name}(:response_format => :id_array)
|
590
|
-
end
|
591
|
-
def #{name}_from_solr
|
592
|
-
#{name}(:response_format => :load_from_solr)
|
593
|
-
end
|
594
|
-
def #{name}_query
|
595
|
-
relationship_query("#{name}")
|
596
|
-
end
|
597
|
-
END
|
598
|
-
end
|
599
|
-
|
600
|
-
|
601
|
-
|
602
|
-
# Generates relationship finders for predicates that point in both directions
|
603
|
-
# and registers predicate relationships for each direction.
|
604
|
-
#
|
605
|
-
# @param [String] name Name of the relationship method(s) to create
|
606
|
-
# @param [Symbol] outbound_predicate Predicate used in outbound relationships
|
607
|
-
# @param [Symbol] inbound_predicate Predicate used in inbound relationships
|
608
|
-
# @param [Hash] opts (optional)
|
609
|
-
# @deprecated create_bidirectional_relationship_finders will be removed in active-fedora 6.0
|
610
|
-
def create_bidirectional_relationship_finders(name, outbound_predicate, inbound_predicate, opts={})
|
611
|
-
inbound_method_name = name.to_s+"_inbound"
|
612
|
-
outbound_method_name = name.to_s+"_outbound"
|
613
|
-
Deprecation.silence(ActiveFedora::Relationships::ClassMethods) do
|
614
|
-
has_relationship(outbound_method_name, outbound_predicate, opts)
|
615
|
-
has_relationship(inbound_method_name, inbound_predicate, opts.merge!(:inbound=>true))
|
616
|
-
|
617
|
-
#create methods that mirror the outbound append and remove with our bidirectional name, assume just add and remove locally
|
618
|
-
create_bidirectional_relationship_name_methods(name,outbound_method_name)
|
619
|
-
|
620
|
-
end
|
621
|
-
|
622
|
-
class_eval <<-END, __FILE__, __LINE__
|
623
|
-
def #{name}(opts={})
|
624
|
-
Deprecation.silence(ActiveFedora::Relationships) do
|
625
|
-
load_bidirectional("#{name}", :#{inbound_method_name}, :#{outbound_method_name}, opts)
|
626
|
-
end
|
627
|
-
end
|
628
|
-
def #{name}_ids
|
629
|
-
#{name}(:response_format => :id_array)
|
630
|
-
end
|
631
|
-
def #{name}_from_solr
|
632
|
-
#{name}(:response_format => :load_from_solr)
|
633
|
-
end
|
634
|
-
def #{name}_query
|
635
|
-
relationship_query("#{name}")
|
636
|
-
end
|
637
|
-
END
|
638
|
-
end
|
639
|
-
deprecation_deprecate :create_bidirectional_relationship_finders
|
640
|
-
|
641
|
-
# Similar to +create_relationship_name_methods+ except it is used when an ActiveFedora::Base model class
|
642
|
-
# declares has_bidirectional_relationship. we are merely creating an alias for outbound portion of bidirectional
|
643
|
-
# @param [String] bidirectional relationship name
|
644
|
-
# @param [String] outbound relationship method name associated with the bidirectional relationship ([bidirectional_name]_outbound)
|
645
|
-
# @example
|
646
|
-
# has_bidirectional_relationship "members", :has_collection_member, :is_member_of_collection
|
647
|
-
#
|
648
|
-
# Method members_outbound_append and members_outbound_remove added
|
649
|
-
# This method will create members_append which does same thing as members_outbound_append
|
650
|
-
# and will create members_remove which does same thing as members_outbound_remove
|
651
|
-
#
|
652
|
-
# @deprecated create_bidirectional_relationship_name_methods will be removed in active-fedora 6.0
|
653
|
-
def create_bidirectional_relationship_name_methods(name,outbound_name)
|
654
|
-
append_method_name = "#{name.to_s.downcase}_append"
|
655
|
-
remove_method_name = "#{name.to_s.downcase}_remove"
|
656
|
-
self.send(:define_method,:"#{append_method_name}") {|object| add_relationship_by_name(outbound_name,object)}
|
657
|
-
self.send(:define_method,:"#{remove_method_name}") {|object| remove_relationship_by_name(outbound_name,object)}
|
658
|
-
end
|
659
|
-
deprecation_deprecate :create_bidirectional_relationship_name_methods
|
660
|
-
|
661
|
-
end
|
662
|
-
end
|
663
|
-
end
|