active-fedora 9.0.0.beta2 → 9.0.0.beta3
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.
- checksums.yaml +4 -4
- data/config/jetty.yml +1 -1
- data/lib/active_fedora.rb +11 -3
- data/lib/active_fedora/associations/association_scope.rb +2 -2
- data/lib/active_fedora/associations/belongs_to_association.rb +2 -2
- data/lib/active_fedora/associations/collection_association.rb +13 -13
- data/lib/active_fedora/associations/has_and_belongs_to_many_association.rb +2 -2
- data/lib/active_fedora/associations/rdf.rb +2 -2
- data/lib/active_fedora/cleaner.rb +2 -6
- data/lib/active_fedora/fedora.rb +18 -0
- data/lib/active_fedora/fedora_attributes.rb +4 -4
- data/lib/active_fedora/file.rb +7 -0
- data/lib/active_fedora/fixity_service.rb +9 -1
- data/lib/active_fedora/indexing_service.rb +2 -7
- data/lib/active_fedora/loadable_from_json.rb +4 -0
- data/lib/active_fedora/om_datastream.rb +0 -4
- data/lib/active_fedora/qualified_dublin_core_datastream.rb +1 -1
- data/lib/active_fedora/query_result_builder.rb +56 -0
- data/lib/active_fedora/querying.rb +1 -1
- data/lib/active_fedora/rdf.rb +2 -1
- data/lib/active_fedora/rdf/fcrepo.rb +323 -9
- data/lib/active_fedora/rdf/fcrepo4.rb +7 -0
- data/lib/active_fedora/rdf/indexing.rb +1 -1
- data/lib/active_fedora/rdf/project_hydra.rb +12 -0
- data/lib/active_fedora/reflection.rb +4 -1
- data/lib/active_fedora/relation/finder_methods.rb +4 -4
- data/lib/active_fedora/simple_datastream.rb +11 -12
- data/lib/active_fedora/solr_instance_loader.rb +1 -1
- data/lib/active_fedora/solr_query_builder.rb +57 -0
- data/lib/active_fedora/solr_service.rb +22 -48
- data/lib/active_fedora/version.rb +1 -1
- data/lib/active_fedora/versionable.rb +12 -13
- data/spec/integration/associations_spec.rb +6 -6
- data/spec/integration/attributes_spec.rb +22 -6
- data/spec/integration/base_spec.rb +2 -2
- data/spec/integration/collection_association_spec.rb +9 -0
- data/spec/integration/file_spec.rb +30 -0
- data/spec/integration/full_featured_model_spec.rb +1 -1
- data/spec/integration/ntriples_datastream_spec.rb +5 -5
- data/spec/integration/om_datastream_spec.rb +1 -1
- data/spec/integration/{solr_service_spec.rb → query_result_builder_spec.rb} +5 -7
- data/spec/integration/relation_delegation_spec.rb +3 -3
- data/spec/integration/scoped_query_spec.rb +11 -11
- data/spec/integration/solr_instance_loader_spec.rb +8 -0
- data/spec/integration/versionable_spec.rb +32 -14
- data/spec/unit/base_spec.rb +3 -3
- data/spec/unit/indexing_service_spec.rb +2 -2
- data/spec/unit/ntriples_datastream_spec.rb +16 -16
- data/spec/unit/om_datastream_spec.rb +7 -7
- data/spec/unit/qualified_dublin_core_datastream_spec.rb +1 -1
- data/spec/unit/query_result_builder_spec.rb +39 -0
- data/spec/unit/query_spec.rb +2 -2
- data/spec/unit/rdf_vocab_spec.rb +30 -0
- data/spec/unit/simple_datastream_spec.rb +2 -2
- data/spec/unit/solr_config_options_spec.rb +1 -1
- data/spec/unit/solr_query_builder_spec.rb +20 -0
- data/spec/unit/solr_service_spec.rb +2 -53
- metadata +11 -4
@@ -32,7 +32,7 @@ module ActiveFedora
|
|
32
32
|
return nil unless config # punt on index names for deep nodes!
|
33
33
|
if behaviors = config.behaviors
|
34
34
|
behaviors.each do |behavior|
|
35
|
-
result = ActiveFedora::
|
35
|
+
result = ActiveFedora::SolrQueryBuilder.solr_name(apply_prefix(field, file_path), behavior, type: config.type)
|
36
36
|
return result if Solrizer::DefaultDescriptors.send(behavior).evaluate_suffix(:text).stored?
|
37
37
|
end
|
38
38
|
raise RuntimeError "no stored fields were found"
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require 'rdf'
|
3
|
+
class ActiveFedora::RDF::ProjectHydra < ::RDF::StrictVocabulary("http://projecthydra.org/ns/relations#")
|
4
|
+
property :hasProfile,
|
5
|
+
label: "Has Profile".freeze,
|
6
|
+
subPropertyOf: "info:fedora/fedora-system:def/relations-external#fedoraRelationship".freeze,
|
7
|
+
type: "rdf:Property".freeze
|
8
|
+
property :isGovernedBy,
|
9
|
+
label: "Is Governed By".freeze,
|
10
|
+
subPropertyOf: "info:fedora/fedora-system:def/relations-external#fedoraRelationship".freeze,
|
11
|
+
type: "rdf:Property".freeze
|
12
|
+
end
|
@@ -192,7 +192,10 @@ module ActiveFedora
|
|
192
192
|
end
|
193
193
|
|
194
194
|
def solr_key
|
195
|
-
|
195
|
+
@solr_key ||= begin
|
196
|
+
predicate_string = predicate.fragment || predicate.to_s.rpartition(/\//).last
|
197
|
+
ActiveFedora::SolrQueryBuilder.solr_name(predicate_string, :symbol)
|
198
|
+
end
|
196
199
|
end
|
197
200
|
|
198
201
|
def check_validity!
|
@@ -178,7 +178,7 @@ module ActiveFedora
|
|
178
178
|
if where_values.empty?
|
179
179
|
load_from_fedora(id, cast)
|
180
180
|
else
|
181
|
-
conditions = where_values + [ActiveFedora::
|
181
|
+
conditions = where_values + [ActiveFedora::SolrQueryBuilder.raw_query(SOLR_DOCUMENT_ID, id)]
|
182
182
|
query = conditions.join(" AND ".freeze)
|
183
183
|
to_enum(:find_each, query, {}).to_a.first
|
184
184
|
end
|
@@ -204,7 +204,7 @@ module ActiveFedora
|
|
204
204
|
|
205
205
|
# TODO just use has_model
|
206
206
|
def has_model_value(resource)
|
207
|
-
Ldp::Orm.new(resource).value(::RDF::
|
207
|
+
Ldp::Orm.new(resource).value(ActiveFedora::RDF::Fcrepo::Model.hasModel).first.to_s
|
208
208
|
end
|
209
209
|
|
210
210
|
def find_with_ids(ids, cast)
|
@@ -259,7 +259,7 @@ module ActiveFedora
|
|
259
259
|
# if the key is a property name, turn it into a solr field
|
260
260
|
if @klass.delegated_attributes.key?(key)
|
261
261
|
# TODO Check to see if `key' is a possible solr field for this class, if it isn't try :searchable instead
|
262
|
-
key = ActiveFedora::
|
262
|
+
key = ActiveFedora::SolrQueryBuilder.solr_name(key, :stored_searchable, type: :string)
|
263
263
|
end
|
264
264
|
|
265
265
|
if value.empty?
|
@@ -278,7 +278,7 @@ module ActiveFedora
|
|
278
278
|
# The concrete class could could be any subclass of @klass or @klass itself
|
279
279
|
unless @klass == ActiveFedora::Base
|
280
280
|
clauses = ([@klass] + @klass.descendants).map do |k|
|
281
|
-
ActiveFedora::
|
281
|
+
ActiveFedora::SolrQueryBuilder.construct_query_for_rel(has_model: k.to_s)
|
282
282
|
end
|
283
283
|
clauses.size == 1 ? clauses.first : "(#{clauses.join(" OR ")})"
|
284
284
|
end
|
@@ -27,15 +27,15 @@ module ActiveFedora
|
|
27
27
|
|
28
28
|
# This method generates the various accessor and mutator methods on self for the datastream metadata attributes.
|
29
29
|
# each field will have the 2 magic methods:
|
30
|
-
# name=(arg)
|
31
|
-
# name
|
30
|
+
# name=(arg)
|
31
|
+
# name
|
32
32
|
#
|
33
33
|
#
|
34
34
|
# 'datatype' is a datatype, currently :string, :integer and :date are supported.
|
35
35
|
#
|
36
36
|
# opts is an options hash, which will affect the generation of the xml representation of this datastream.
|
37
37
|
#
|
38
|
-
# Currently supported modifiers:
|
38
|
+
# Currently supported modifiers:
|
39
39
|
# For +SimpleDatastream+:
|
40
40
|
# :element_attrs =>{:foo=>:bar} - hash of xml element attributes
|
41
41
|
# :xml_node => :nodename - The xml node to be used to represent this object (in dcterms namespace)
|
@@ -45,8 +45,8 @@ module ActiveFedora
|
|
45
45
|
#
|
46
46
|
#There is quite a good example of this class in use in spec/examples/oral_history.rb
|
47
47
|
#
|
48
|
-
#!! Careful: If you declare two fields that correspond to the same xml node without any qualifiers to differentiate them,
|
49
|
-
#you will end up replicating the values in the underlying datastream, resulting in mysterious dubling, quadrupling, etc.
|
48
|
+
#!! Careful: If you declare two fields that correspond to the same xml node without any qualifiers to differentiate them,
|
49
|
+
#you will end up replicating the values in the underlying datastream, resulting in mysterious dubling, quadrupling, etc.
|
50
50
|
#whenever you edit the field's values.
|
51
51
|
def field(name, datatype=:string, opts={})
|
52
52
|
fields ||= {}
|
@@ -59,9 +59,8 @@ module ActiveFedora
|
|
59
59
|
self.class.terminology.add_term(term)
|
60
60
|
term.generate_xpath_queries!
|
61
61
|
end
|
62
|
-
|
63
62
|
end
|
64
|
-
|
63
|
+
|
65
64
|
def update_indexed_attributes(params={}, opts={})
|
66
65
|
raise "can't modify frozen #{self.class}" if frozen?
|
67
66
|
# if the params are just keys, not an array, make then into an array.
|
@@ -75,7 +74,7 @@ module ActiveFedora
|
|
75
74
|
end
|
76
75
|
super(new_params, opts)
|
77
76
|
end
|
78
|
-
|
77
|
+
|
79
78
|
|
80
79
|
def self.xml_template
|
81
80
|
Nokogiri::XML::Document.parse("<fields/>")
|
@@ -85,10 +84,10 @@ module ActiveFedora
|
|
85
84
|
@fields.each do |field_key, field_info|
|
86
85
|
next if field_key == :location ## FIXME HYDRA-825
|
87
86
|
things = send(field_key)
|
88
|
-
if things
|
89
|
-
field_symbol = ActiveFedora::
|
90
|
-
things.val.each do |val|
|
91
|
-
::Solrizer::Extractor.insert_solr_field_value(solr_doc, field_symbol, val.to_s )
|
87
|
+
if things
|
88
|
+
field_symbol = ActiveFedora::SolrQueryBuilder.solr_name(field_key, type: field_info[:type])
|
89
|
+
things.val.each do |val|
|
90
|
+
::Solrizer::Extractor.insert_solr_field_value(solr_doc, field_symbol, val.to_s )
|
92
91
|
end
|
93
92
|
end
|
94
93
|
end
|
@@ -51,7 +51,7 @@ module ActiveFedora
|
|
51
51
|
end
|
52
52
|
|
53
53
|
def active_fedora_class
|
54
|
-
@active_fedora_class ||= ActiveFedora::
|
54
|
+
@active_fedora_class ||= ActiveFedora::QueryResultBuilder.class_from_solr_document(solr_doc)
|
55
55
|
end
|
56
56
|
|
57
57
|
def profile_json
|
@@ -0,0 +1,57 @@
|
|
1
|
+
module ActiveFedora
|
2
|
+
module SolrQueryBuilder
|
3
|
+
# Construct a solr query for a list of ids
|
4
|
+
# This is used to get a solr response based on the list of ids in an object's RELS-EXT relationhsips
|
5
|
+
# If the id_array is empty, defaults to a query of "id:NEVER_USE_THIS_ID", which will return an empty solr response
|
6
|
+
# @param [Array] id_array the ids that you want included in the query
|
7
|
+
def self.construct_query_for_ids(id_array)
|
8
|
+
q = id_array.reject { |x| x.blank? }.map { |id| raw_query(SOLR_DOCUMENT_ID, id) }
|
9
|
+
q.empty? ? "id:NEVER_USE_THIS_ID" : q.join(" OR ".freeze)
|
10
|
+
end
|
11
|
+
|
12
|
+
# Create a raw query clause suitable for sending to solr as an fq element
|
13
|
+
# @param [String] key
|
14
|
+
# @param [String] value
|
15
|
+
def self.raw_query(key, value)
|
16
|
+
"_query_:\"{!raw f=#{key}}#{value.gsub('"', '\"')}\""
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.solr_name(*args)
|
20
|
+
Solrizer.default_field_mapper.solr_name(*args)
|
21
|
+
end
|
22
|
+
|
23
|
+
# Create a query with a clause for each key, value
|
24
|
+
# @param [Hash, Array<Array<String>>] args key is the predicate, value is the target_uri
|
25
|
+
# @param [String] join_with ('AND') the value we're joining the clauses with
|
26
|
+
# @example
|
27
|
+
# construct_query_for_rel [[:has_model, "info:fedora/afmodel:ComplexCollection"], [:has_model, "info:fedora/afmodel:ActiveFedora_Base"]], 'OR'
|
28
|
+
# # => _query_:"{!raw f=has_model_ssim}info:fedora/afmodel:ComplexCollection" OR _query_:"{!raw f=has_model_ssim}info:fedora/afmodel:ActiveFedora_Base"
|
29
|
+
#
|
30
|
+
# construct_query_for_rel [[Book.reflect_on_association(:library), "foo/bar/baz"]]
|
31
|
+
def self.construct_query_for_rel(field_pairs, join_with = 'AND')
|
32
|
+
field_pairs = field_pairs.to_a if field_pairs.kind_of? Hash
|
33
|
+
|
34
|
+
clauses = pairs_to_clauses(field_pairs.reject { |_, target_uri| target_uri.blank? })
|
35
|
+
clauses.empty? ? "id:NEVER_USE_THIS_ID" : clauses.join(" #{join_with} ".freeze)
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
# Given an list of 2 element lists, transform to a list of solr clauses
|
40
|
+
def self.pairs_to_clauses(pairs)
|
41
|
+
pairs.map do |field, target_uri|
|
42
|
+
raw_query(solr_field(field), target_uri)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
# @param [String, ActiveFedora::Relation] field
|
47
|
+
# @return [String] the corresponding solr field for the string
|
48
|
+
def self.solr_field(field)
|
49
|
+
case field
|
50
|
+
when ActiveFedora::Reflection::AssociationReflection
|
51
|
+
field.solr_key
|
52
|
+
else
|
53
|
+
solr_name(field, :symbol)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -35,55 +35,30 @@ module ActiveFedora
|
|
35
35
|
end
|
36
36
|
|
37
37
|
def lazy_reify_solr_results(solr_results, opts = {})
|
38
|
-
|
39
|
-
|
40
|
-
yielder.yield(reify_solr_result(hit, opts))
|
41
|
-
end
|
42
|
-
end
|
38
|
+
Deprecation.warn SolrService, "SolrService.lazy_reify_solr_results is deprecated. Use QueryResultBuilder.lazy_reify_solr_results instead. This will be removed in active-fedora 10.0"
|
39
|
+
QueryResultBuilder.lazy_reify_solr_results(solr_results, opts)
|
43
40
|
end
|
44
41
|
|
45
42
|
def reify_solr_results(solr_results, opts = {})
|
46
|
-
|
43
|
+
Deprecation.warn SolrService, "SolrService.reify_solr_results is deprecated. Use QueryResultBuilder.reify_solr_results instead. This will be removed in active-fedora 10.0"
|
44
|
+
QueryResultBuilder.reify_solr_results(solr_results, opts)
|
47
45
|
end
|
48
46
|
|
49
47
|
def reify_solr_result(hit, opts = {})
|
50
|
-
|
51
|
-
|
48
|
+
Deprecation.warn SolrService, "SolrService.reify_solr_result is deprecated. Use QueryResultBuilder.reify_solr_result instead. This will be removed in active-fedora 10.0"
|
49
|
+
QueryResultBuilder.reify_solr_result(hit, opts)
|
52
50
|
end
|
53
51
|
|
54
52
|
#Returns all possible classes for the solr object
|
55
53
|
def classes_from_solr_document(hit, opts = {})
|
56
|
-
|
57
|
-
|
58
|
-
classes = []
|
59
|
-
|
60
|
-
hit[HAS_MODEL_SOLR_FIELD].each { |value| classes << Model.from_class_uri(value) }
|
61
|
-
|
62
|
-
classes.compact
|
54
|
+
Deprecation.warn SolrService, "SolrService.classes_from_solr_document is deprecated. Use QueryResultBuilder.classes_from_solr_document instead. This will be removed in active-fedora 10.0"
|
55
|
+
QueryResultBuilder.classes_from_solr_document(hit, opts)
|
63
56
|
end
|
64
57
|
|
65
58
|
#Returns the best singular class for the solr object
|
66
59
|
def class_from_solr_document(hit, opts = {})
|
67
|
-
|
68
|
-
|
69
|
-
Array(hit[HAS_MODEL_SOLR_FIELD]).each do |value|
|
70
|
-
|
71
|
-
model_value = Model.from_class_uri(value)
|
72
|
-
|
73
|
-
if model_value
|
74
|
-
|
75
|
-
# Set as the first model in case opts[:class] was nil
|
76
|
-
best_model_match ||= model_value
|
77
|
-
|
78
|
-
# If there is an inheritance structure, use the most specific case.
|
79
|
-
if best_model_match > model_value
|
80
|
-
best_model_match = model_value
|
81
|
-
end
|
82
|
-
end
|
83
|
-
end
|
84
|
-
|
85
|
-
ActiveFedora::Base.logger.warn "Could not find a model for #{hit["id"]}, defaulting to ActiveFedora::Base" unless best_model_match if ActiveFedora::Base.logger
|
86
|
-
best_model_match || ActiveFedora::Base
|
60
|
+
Deprecation.warn SolrService, "SolrService.class_from_solr_document is deprecated. Use QueryResultBuilder.class_from_solr_document instead. This will be removed in active-fedora 10.0"
|
61
|
+
QueryResultBuilder.class_from_solr_document(hit, opts)
|
87
62
|
end
|
88
63
|
|
89
64
|
# Construct a solr query for a list of ids
|
@@ -91,24 +66,26 @@ module ActiveFedora
|
|
91
66
|
# If the id_array is empty, defaults to a query of "id:NEVER_USE_THIS_ID", which will return an empty solr response
|
92
67
|
# @param [Array] id_array the ids that you want included in the query
|
93
68
|
def construct_query_for_ids(id_array)
|
94
|
-
|
95
|
-
|
69
|
+
Deprecation.warn SolrService, "SolrService.construct_query_for_ids is deprecated. Use SolrQueryBuilder.construct_query_for_ids instead. This will be removed in active-fedora 10.0"
|
70
|
+
SolrQueryBuilder.construct_query_for_ids(id_array)
|
96
71
|
end
|
97
72
|
|
98
73
|
def construct_query_for_pids(id_array)
|
99
74
|
Deprecation.warn SolrService, "construct_query_for_pids is deprecated and will be removed in active-fedora 10.0"
|
100
|
-
construct_query_for_ids(id_array)
|
75
|
+
SolrQueryBuilder.construct_query_for_ids(id_array)
|
101
76
|
end
|
102
77
|
|
103
78
|
# Create a raw query clause suitable for sending to solr as an fq element
|
104
79
|
# @param [String] key
|
105
80
|
# @param [String] value
|
106
81
|
def raw_query(key, value)
|
107
|
-
"
|
82
|
+
Deprecation.warn SolrService, "SolrService.raw_query is deprecated. Use SolrQueryBuilder.raw_query instead. This will be removed in active-fedora 10.0"
|
83
|
+
SolrQueryBuilder.raw_query(key, value)
|
108
84
|
end
|
109
85
|
|
110
86
|
def solr_name(*args)
|
111
|
-
|
87
|
+
Deprecation.warn SolrService, "SolrService.solr_name is deprecated. Use SolrQueryBuilder.solr_name instead. This will be removed in active-fedora 10.0"
|
88
|
+
SolrQueryBuilder.solr_name(*args)
|
112
89
|
end
|
113
90
|
|
114
91
|
# Create a query with a clause for each key, value
|
@@ -117,12 +94,11 @@ module ActiveFedora
|
|
117
94
|
# @example
|
118
95
|
# construct_query_for_rel [[:has_model, "info:fedora/afmodel:ComplexCollection"], [:has_model, "info:fedora/afmodel:ActiveFedora_Base"]], 'OR'
|
119
96
|
# # => _query_:"{!raw f=has_model_ssim}info:fedora/afmodel:ComplexCollection" OR _query_:"{!raw f=has_model_ssim}info:fedora/afmodel:ActiveFedora_Base"
|
97
|
+
#
|
98
|
+
# construct_query_for_rel [[Book.reflect_on_association(:library), "foo/bar/baz"]]
|
120
99
|
def construct_query_for_rel(field_pairs, join_with = 'AND')
|
121
|
-
|
122
|
-
|
123
|
-
clauses = field_pairs.reject{ |_, target_uri| target_uri.blank? }.
|
124
|
-
map { |predicate, target_uri| raw_query(solr_name(predicate, :symbol), target_uri) }
|
125
|
-
clauses.empty? ? "id:NEVER_USE_THIS_ID" : clauses.join(" #{join_with} ".freeze)
|
100
|
+
Deprecation.warn SolrService, "SolrService.construct_query_for_rel is deprecated. Use SolrQueryBuilder.construct_query_for_rel instead. This will be removed in active-fedora 10.0"
|
101
|
+
SolrQueryBuilder.construct_query_for_rel(field_pairs, join_with)
|
126
102
|
end
|
127
103
|
|
128
104
|
def query(query, args={})
|
@@ -157,10 +133,8 @@ module ActiveFedora
|
|
157
133
|
def commit
|
158
134
|
SolrService.instance.conn.commit
|
159
135
|
end
|
160
|
-
end
|
161
|
-
|
162
|
-
HAS_MODEL_SOLR_FIELD = solr_name("has_model", :symbol).freeze
|
163
136
|
|
137
|
+
end
|
164
138
|
end #SolrService
|
165
139
|
class SolrNotInitialized < StandardError;end
|
166
140
|
end #ActiveFedora
|
@@ -20,23 +20,18 @@ module ActiveFedora
|
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
23
|
-
# Returns an array of
|
24
|
-
# our own version label and excludes auto-snapshot versions from Fedora.
|
23
|
+
# Returns an array of uris matching our own version label, excluding auto-snapshot versions from Fedora.
|
25
24
|
def versions
|
26
25
|
results = versions_graph.query([nil, ::RDF::URI.new('http://fedora.info/definitions/v4/repository#hasVersionLabel'), nil])
|
27
|
-
numbered_versions(results)
|
26
|
+
numbered_versions(results).map { |v| version_uri(v.to_s) }
|
28
27
|
end
|
29
28
|
|
30
29
|
def versions_graph
|
31
30
|
@versions_graph ||= ::RDF::Graph.new << ::RDF::Reader.for(:ttl).new(versions_request)
|
32
31
|
end
|
33
32
|
|
34
|
-
def versions_url
|
35
|
-
uri + '/fcr:versions'
|
36
|
-
end
|
37
|
-
|
38
33
|
def create_version
|
39
|
-
resp = ActiveFedora.fedora.connection.post(
|
34
|
+
resp = ActiveFedora.fedora.connection.post(versions_uri, nil, {slug: version_name})
|
40
35
|
@versions_graph = nil
|
41
36
|
resp.success?
|
42
37
|
end
|
@@ -44,14 +39,14 @@ module ActiveFedora
|
|
44
39
|
# This method does not rely on the internal versionable flag of the object, instead
|
45
40
|
# it queries Fedora directly to figure out if there are versions for the resource.
|
46
41
|
def has_versions?
|
47
|
-
ActiveFedora.fedora.connection.head(
|
42
|
+
ActiveFedora.fedora.connection.head(versions_uri)
|
48
43
|
true
|
49
44
|
rescue Ldp::NotFound
|
50
45
|
false
|
51
46
|
end
|
52
47
|
|
53
48
|
def restore_version label
|
54
|
-
resp = ActiveFedora.fedora.connection.patch(
|
49
|
+
resp = ActiveFedora.fedora.connection.patch(version_uri(label), nil)
|
55
50
|
@versions_graph = nil
|
56
51
|
reload
|
57
52
|
refresh_attributes if self.respond_to?("refresh_attributes")
|
@@ -62,7 +57,7 @@ module ActiveFedora
|
|
62
57
|
|
63
58
|
def versions_request
|
64
59
|
resp = begin
|
65
|
-
ActiveFedora.fedora.connection.get(
|
60
|
+
ActiveFedora.fedora.connection.get(versions_uri)
|
66
61
|
rescue Ldp::NotFound
|
67
62
|
return ''
|
68
63
|
end
|
@@ -74,10 +69,14 @@ module ActiveFedora
|
|
74
69
|
resp.body
|
75
70
|
end
|
76
71
|
|
77
|
-
def
|
78
|
-
|
72
|
+
def versions_uri
|
73
|
+
uri + '/fcr:versions'
|
79
74
|
end
|
80
75
|
|
76
|
+
def version_uri label
|
77
|
+
versions_uri + '/' + label
|
78
|
+
end
|
79
|
+
|
81
80
|
def version_name
|
82
81
|
if versions.empty?
|
83
82
|
"version1"
|
@@ -483,8 +483,8 @@ describe ActiveFedora::Base do
|
|
483
483
|
Object.send(:remove_const, :MediaObject)
|
484
484
|
end
|
485
485
|
|
486
|
-
it "it should find the predicate" do
|
487
|
-
expect(MediaObject.new.association(:baubles).send(:
|
486
|
+
it "it should find the reflection that bears the predicate" do
|
487
|
+
expect(MediaObject.new.association(:baubles).send(:find_reflection)).to eq Bauble.reflect_on_association(:media_object)
|
488
488
|
end
|
489
489
|
end
|
490
490
|
|
@@ -503,8 +503,8 @@ describe ActiveFedora::Base do
|
|
503
503
|
Object.send(:remove_const, :MediaObject)
|
504
504
|
end
|
505
505
|
|
506
|
-
it "it should find the predicate" do
|
507
|
-
expect(MediaObject.new.association(:parts).send(:
|
506
|
+
it "it should find the reflection that bears the predicate" do
|
507
|
+
expect(MediaObject.new.association(:parts).send(:find_reflection)).to eq MasterFile.reflect_on_association(:media_object)
|
508
508
|
end
|
509
509
|
end
|
510
510
|
|
@@ -523,8 +523,8 @@ describe ActiveFedora::Base do
|
|
523
523
|
Object.send(:remove_const, :MediaObject)
|
524
524
|
end
|
525
525
|
|
526
|
-
it "it should find the predicate" do
|
527
|
-
expect(MediaObject.new.association(:baubles).send(:
|
526
|
+
it "it should find the reflection that bears the predicate" do
|
527
|
+
expect(MediaObject.new.association(:baubles).send(:find_reflection)).to eq MediaObject.reflect_on_association(:baubles)
|
528
528
|
end
|
529
529
|
end
|
530
530
|
|
@@ -6,6 +6,7 @@ describe "delegating attributes" do
|
|
6
6
|
set_terminology do |t|
|
7
7
|
t.root(path: "fields")
|
8
8
|
t.depositor index_as: [:symbol, :stored_searchable]
|
9
|
+
t.wrangler index_as: [:facetable]
|
9
10
|
end
|
10
11
|
end
|
11
12
|
class TitledObject < ActiveFedora::Base
|
@@ -17,6 +18,7 @@ describe "delegating attributes" do
|
|
17
18
|
class RdfObject < ActiveFedora::Base
|
18
19
|
contains 'foo', class_name: 'PropertiesDatastream'
|
19
20
|
has_attributes :depositor, datastream: :foo, multiple: false
|
21
|
+
has_attributes :wrangler, datastream: :foo, multiple: true
|
20
22
|
property :resource_type, predicate: ::RDF::DC.type do |index|
|
21
23
|
index.as :stored_searchable, :facetable
|
22
24
|
end
|
@@ -47,7 +49,7 @@ describe "delegating attributes" do
|
|
47
49
|
end
|
48
50
|
end
|
49
51
|
|
50
|
-
context "with
|
52
|
+
context "with multiple datastreams" do
|
51
53
|
|
52
54
|
subject { RdfObject.create }
|
53
55
|
|
@@ -71,22 +73,36 @@ describe "delegating attributes" do
|
|
71
73
|
end
|
72
74
|
|
73
75
|
describe "setting attributes" do
|
74
|
-
|
75
|
-
after do
|
76
|
-
expect(subject.depositor).to eql("foo")
|
77
|
-
expect(subject.resource_type).to eql(["bar"])
|
78
|
-
end
|
76
|
+
|
79
77
|
specify "using strings for keys" do
|
80
78
|
subject["depositor"] = "foo"
|
81
79
|
subject["resource_type"] = "bar"
|
82
80
|
subject.save
|
81
|
+
expect(subject.depositor).to eql("foo")
|
82
|
+
expect(subject.resource_type).to eql(["bar"])
|
83
83
|
end
|
84
84
|
specify "using symbols for keys" do
|
85
85
|
subject[:depositor] = "foo"
|
86
86
|
subject[:resource_type] = "bar"
|
87
87
|
subject.save
|
88
|
+
expect(subject.depositor).to eql("foo")
|
89
|
+
expect(subject.resource_type).to eql(["bar"])
|
88
90
|
end
|
89
91
|
|
92
|
+
# TODO: bug logged in issue #540
|
93
|
+
describe "using shift", pending: "has_changed? not returning true" do
|
94
|
+
specify "with rdf properties" do
|
95
|
+
subject.resource_type << "bar"
|
96
|
+
subject.save
|
97
|
+
expect(subject.resource_type).to eql(["bar"])
|
98
|
+
end
|
99
|
+
specify "with om terms" do
|
100
|
+
subject.wrangler << "bar"
|
101
|
+
subject.save
|
102
|
+
expect(subject.wrangler).to eql(["bar"])
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
90
106
|
end
|
91
107
|
|
92
108
|
end
|