active-fedora 9.0.0.beta2 → 9.0.0.beta3
Sign up to get free protection for your applications and to get access to all the features.
- 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
|