valkyrie 2.1.1 → 2.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +33 -29
  3. data/.lando.yml +40 -0
  4. data/.rubocop.yml +4 -1
  5. data/.tool-versions +1 -1
  6. data/CHANGELOG.md +26 -0
  7. data/README.md +19 -47
  8. data/Rakefile +21 -20
  9. data/db/config.yml +3 -10
  10. data/lib/generators/valkyrie/resource_generator.rb +3 -3
  11. data/lib/valkyrie.rb +13 -13
  12. data/lib/valkyrie/change_set.rb +3 -3
  13. data/lib/valkyrie/id.rb +14 -14
  14. data/lib/valkyrie/indexers/access_controls_indexer.rb +17 -17
  15. data/lib/valkyrie/persistence/fedora/list_node.rb +43 -43
  16. data/lib/valkyrie/persistence/fedora/ordered_list.rb +90 -90
  17. data/lib/valkyrie/persistence/fedora/ordered_reader.rb +5 -5
  18. data/lib/valkyrie/persistence/fedora/permissive_schema.rb +1 -1
  19. data/lib/valkyrie/persistence/fedora/persister.rb +80 -82
  20. data/lib/valkyrie/persistence/fedora/persister/model_converter.rb +15 -15
  21. data/lib/valkyrie/persistence/fedora/persister/orm_converter.rb +38 -18
  22. data/lib/valkyrie/persistence/fedora/query_service.rb +38 -40
  23. data/lib/valkyrie/persistence/memory/persister.rb +33 -33
  24. data/lib/valkyrie/persistence/memory/query_service.rb +26 -30
  25. data/lib/valkyrie/persistence/postgres/orm_converter.rb +52 -52
  26. data/lib/valkyrie/persistence/postgres/query_service.rb +34 -34
  27. data/lib/valkyrie/persistence/shared/json_value_mapper.rb +1 -1
  28. data/lib/valkyrie/persistence/solr/model_converter.rb +337 -337
  29. data/lib/valkyrie/persistence/solr/orm_converter.rb +3 -3
  30. data/lib/valkyrie/persistence/solr/queries/find_members_query.rb +1 -1
  31. data/lib/valkyrie/persistence/solr/query_service.rb +12 -12
  32. data/lib/valkyrie/specs/shared_specs/persister.rb +2 -2
  33. data/lib/valkyrie/storage/fedora.rb +16 -16
  34. data/lib/valkyrie/storage_adapter.rb +11 -11
  35. data/lib/valkyrie/version.rb +1 -1
  36. data/tasks/dev.rake +14 -51
  37. data/valkyrie.gemspec +3 -4
  38. metadata +22 -33
  39. data/.docker-stack/valkyrie-development/docker-compose.yml +0 -53
  40. data/.docker-stack/valkyrie-test/docker-compose.yml +0 -53
  41. data/tasks/docker.rake +0 -31
@@ -251,46 +251,46 @@ module Valkyrie::Persistence::Postgres
251
251
 
252
252
  private
253
253
 
254
- def find_ordered_references_by(resource:, property:, model: nil)
255
- if model
256
- run_query(find_ordered_references_with_type_query, property, resource.id.to_s, model)
257
- else
258
- run_query(find_ordered_references_query, property, resource.id.to_s)
259
- end
254
+ def find_ordered_references_by(resource:, property:, model: nil)
255
+ if model
256
+ run_query(find_ordered_references_with_type_query, property, resource.id.to_s, model)
257
+ else
258
+ run_query(find_ordered_references_query, property, resource.id.to_s)
260
259
  end
260
+ end
261
261
 
262
- def find_unordered_references_by(resource:, property:, model: nil)
263
- if model
264
- run_query(find_references_with_type_query, property, resource.id.to_s, model)
265
- else
266
- run_query(find_references_query, property, resource.id.to_s)
267
- end
262
+ def find_unordered_references_by(resource:, property:, model: nil)
263
+ if model
264
+ run_query(find_references_with_type_query, property, resource.id.to_s, model)
265
+ else
266
+ run_query(find_references_query, property, resource.id.to_s)
268
267
  end
268
+ end
269
269
 
270
- # Determines whether or not an Object is a Valkyrie ID
271
- # @param [Object] id
272
- # @raise [ArgumentError]
273
- def validate_id(id)
274
- raise ArgumentError, 'id must be a Valkyrie::ID' unless id.is_a? Valkyrie::ID
275
- end
270
+ # Determines whether or not an Object is a Valkyrie ID
271
+ # @param [Object] id
272
+ # @raise [ArgumentError]
273
+ def validate_id(id)
274
+ raise ArgumentError, 'id must be a Valkyrie::ID' unless id.is_a? Valkyrie::ID
275
+ end
276
276
 
277
- # Determines whether or not a resource has been persisted
278
- # @param [Object] resource
279
- # @raise [ArgumentError]
280
- def ensure_persisted(resource)
281
- raise ArgumentError, 'resource is not saved' unless resource.persisted?
282
- end
277
+ # Determines whether or not a resource has been persisted
278
+ # @param [Object] resource
279
+ # @raise [ArgumentError]
280
+ def ensure_persisted(resource)
281
+ raise ArgumentError, 'resource is not saved' unless resource.persisted?
282
+ end
283
283
 
284
- # Accesses the data type in PostgreSQL used for the primary key
285
- # (For example, a UUID)
286
- # @see https://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/SchemaCache.html#method-i-columns_hash
287
- # @return [Symbol]
288
- def id_type
289
- @id_type ||= orm_class.columns_hash["id"].type
290
- end
284
+ # Accesses the data type in PostgreSQL used for the primary key
285
+ # (For example, a UUID)
286
+ # @see https://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/SchemaCache.html#method-i-columns_hash
287
+ # @return [Symbol]
288
+ def id_type
289
+ @id_type ||= orm_class.columns_hash["id"].type
290
+ end
291
291
 
292
- def ordered_property?(resource:, property:)
293
- resource.ordered_attribute?(property)
294
- end
292
+ def ordered_property?(resource:, property:)
293
+ resource.ordered_attribute?(property)
294
+ end
295
295
  end
296
296
  end
@@ -152,7 +152,7 @@ module Valkyrie::Persistence::Shared
152
152
  # Generates a Time object in the UTC from the datestamp string value
153
153
  # @return [Time]
154
154
  def result
155
- DateTime.iso8601(value).utc
155
+ DateTime.iso8601(value).new_offset(0)
156
156
  end
157
157
  end
158
158
  end
@@ -65,412 +65,412 @@ module Valkyrie::Persistence::Solr
65
65
 
66
66
  private
67
67
 
68
- # Maps Solr Document fields to attributes with single values
69
- # Filters for fields which store the Valkyrie resource type
70
- # @param [Hash] attribute_hash
71
- # @return [Hash]
72
- def add_single_values(attribute_hash)
73
- attribute_hash.select do |k, v|
74
- field = k.to_s.split("_").last
75
- property = k.to_s.gsub("_#{field}", "")
76
- next true if multivalued?(field)
77
- next false if property == "internal_resource"
78
- next false if v.length > 1
79
- true
80
- end
68
+ # Maps Solr Document fields to attributes with single values
69
+ # Filters for fields which store the Valkyrie resource type
70
+ # @param [Hash] attribute_hash
71
+ # @return [Hash]
72
+ def add_single_values(attribute_hash)
73
+ attribute_hash.select do |k, v|
74
+ field = k.to_s.split("_").last
75
+ property = k.to_s.gsub("_#{field}", "")
76
+ next true if multivalued?(field)
77
+ next false if property == "internal_resource"
78
+ next false if v.length > 1
79
+ true
81
80
  end
81
+ end
82
82
 
83
- # Determines whether or not a field is multivalued
84
- # @note this is tied to conventions in the Solr Schema
85
- # @see https://github.com/samvera-labs/valkyrie/blob/master/solr/config/schema.xml
86
- # @see https://lucene.apache.org/solr/guide/defining-fields.html#defining-fields
87
- # @param [String] field
88
- # @return [Boolean]
89
- def multivalued?(field)
90
- field.end_with?('m', 'mv')
91
- end
83
+ # Determines whether or not a field is multivalued
84
+ # @note this is tied to conventions in the Solr Schema
85
+ # @see https://github.com/samvera-labs/valkyrie/blob/master/solr/config/schema.xml
86
+ # @see https://lucene.apache.org/solr/guide/defining-fields.html#defining-fields
87
+ # @param [String] field
88
+ # @return [Boolean]
89
+ def multivalued?(field)
90
+ field.end_with?('m', 'mv')
91
+ end
92
92
 
93
- # If optimistic locking is enabled for this Valkyrie Resource, generates a Hash containing the locking token
94
- # @return [Hash]
95
- def lock_hash
96
- return {} unless resource.optimistic_locking_enabled? && lock_token.present?
97
- { _version_: lock_token }
98
- end
93
+ # If optimistic locking is enabled for this Valkyrie Resource, generates a Hash containing the locking token
94
+ # @return [Hash]
95
+ def lock_hash
96
+ return {} unless resource.optimistic_locking_enabled? && lock_token.present?
97
+ { _version_: lock_token }
98
+ end
99
99
 
100
- # Retrieves the lock token from the resource attributes
101
- # @return [String]
102
- def lock_token
103
- @lock_token ||= begin
104
- found_token = resource[Valkyrie::Persistence::Attributes::OPTIMISTIC_LOCK]
105
- .find { |token| token.adapter_id == resource_factory.adapter_id }
106
- return if found_token.nil?
107
- found_token.token
108
- end
100
+ # Retrieves the lock token from the resource attributes
101
+ # @return [String]
102
+ def lock_token
103
+ @lock_token ||= begin
104
+ found_token = resource[Valkyrie::Persistence::Attributes::OPTIMISTIC_LOCK]
105
+ .find { |token| token.adapter_id == resource_factory.adapter_id }
106
+ return if found_token.nil?
107
+ found_token.token
109
108
  end
109
+ end
110
110
 
111
- # Generates the Valkyrie Resource attribute Hash
112
- # @return [Hash]
113
- def attribute_hash
114
- properties.each_with_object({}) do |property, hsh|
115
- next if property == Valkyrie::Persistence::Attributes::OPTIMISTIC_LOCK
116
- attr = resource_attributes[property]
117
- mapper_val = SolrMapperValue.for(Property.new(property, attr)).result
118
- unless mapper_val.respond_to?(:apply_to)
119
- raise "Unable to cast #{resource_attributes[:internal_resource]}#" \
120
- "#{property} which has been set to an instance of '#{attr.class}'"
121
- end
122
- mapper_val.apply_to(hsh)
123
- end
111
+ # Generates the Valkyrie Resource attribute Hash
112
+ # @return [Hash]
113
+ def attribute_hash
114
+ properties.each_with_object({}) do |property, hsh|
115
+ next if property == Valkyrie::Persistence::Attributes::OPTIMISTIC_LOCK
116
+ attr = resource_attributes[property]
117
+ mapper_val = SolrMapperValue.for(Property.new(property, attr)).result
118
+ unless mapper_val.respond_to?(:apply_to)
119
+ raise "Unable to cast #{resource_attributes[:internal_resource]}#" \
120
+ "#{property} which has been set to an instance of '#{attr.class}'"
121
+ end
122
+ mapper_val.apply_to(hsh)
124
123
  end
124
+ end
125
125
 
126
- # Accesses the keys for the attributes on the Valkyrie Resource
127
- # @return [Array<Symbol>]
128
- def properties
129
- resource_attributes.keys - [:id, :created_at, :updated_at, :new_record]
130
- end
131
-
132
- # Access the attributes for the Valkyrie resources
133
- # @return [Hash]
134
- def resource_attributes
135
- @resource_attributes ||= resource.attributes
136
- end
137
-
138
- ##
139
- # A container resource for holding a `key`, `value, and `scope` of a value
140
- # in a resource together for casting.
141
- class Property
142
- attr_reader :key, :value, :scope
143
- # @param key [Symbol] Property identifier.
144
- # @param value [Object] Value or list of values which are underneath the
145
- # key.
146
- # @param scope [Object] The resource or point where the key and values
147
- # came from.
148
- def initialize(key, value, scope = [])
149
- @key = key
150
- @value = value
151
- @scope = scope
152
- end
126
+ # Accesses the keys for the attributes on the Valkyrie Resource
127
+ # @return [Array<Symbol>]
128
+ def properties
129
+ resource_attributes.keys - [:id, :created_at, :updated_at, :new_record]
130
+ end
131
+
132
+ # Access the attributes for the Valkyrie resources
133
+ # @return [Hash]
134
+ def resource_attributes
135
+ @resource_attributes ||= resource.attributes
136
+ end
137
+
138
+ ##
139
+ # A container resource for holding a `key`, `value, and `scope` of a value
140
+ # in a resource together for casting.
141
+ class Property
142
+ attr_reader :key, :value, :scope
143
+ # @param key [Symbol] Property identifier.
144
+ # @param value [Object] Value or list of values which are underneath the
145
+ # key.
146
+ # @param scope [Object] The resource or point where the key and values
147
+ # came from.
148
+ def initialize(key, value, scope = [])
149
+ @key = key
150
+ @value = value
151
+ @scope = scope
153
152
  end
153
+ end
154
154
 
155
- ##
156
- # Represents a key/value combination in the solr document, used for isolating logic around
157
- # how to apply a value to a hash.
158
- class SolrRow
159
- attr_reader :key, :fields, :values
160
- # @param key [Symbol] Solr key.
161
- # @param fields [Array<Symbol>] Field suffixes to index into.
162
- # @param values [Array] Values to index into the given fields.
163
- def initialize(key:, fields:, values:)
164
- @key = key
165
- @fields = Array.wrap(fields)
166
- @values = Array.wrap(values)
167
- end
155
+ ##
156
+ # Represents a key/value combination in the solr document, used for isolating logic around
157
+ # how to apply a value to a hash.
158
+ class SolrRow
159
+ attr_reader :key, :fields, :values
160
+ # @param key [Symbol] Solr key.
161
+ # @param fields [Array<Symbol>] Field suffixes to index into.
162
+ # @param values [Array] Values to index into the given fields.
163
+ def initialize(key:, fields:, values:)
164
+ @key = key
165
+ @fields = Array.wrap(fields)
166
+ @values = Array.wrap(values)
167
+ end
168
168
 
169
- # @param hsh [Hash] The solr hash to apply to.
170
- # @return [Hash] The updated solr hash.
171
- def apply_to(hsh)
172
- return hsh if values.blank?
173
- fields.each do |field|
174
- hsh["#{key}_#{field}".to_sym] ||= []
175
- hsh["#{key}_#{field}".to_sym] += values
176
- end
177
- hsh
169
+ # @param hsh [Hash] The solr hash to apply to.
170
+ # @return [Hash] The updated solr hash.
171
+ def apply_to(hsh)
172
+ return hsh if values.blank?
173
+ fields.each do |field|
174
+ hsh["#{key}_#{field}".to_sym] ||= []
175
+ hsh["#{key}_#{field}".to_sym] += values
178
176
  end
177
+ hsh
179
178
  end
179
+ end
180
180
 
181
- ##
182
- # Wraps up multiple SolrRows to apply them all at once, while looking like
183
- # just one.
184
- class CompositeSolrRow
185
- attr_reader :solr_rows
181
+ ##
182
+ # Wraps up multiple SolrRows to apply them all at once, while looking like
183
+ # just one.
184
+ class CompositeSolrRow
185
+ attr_reader :solr_rows
186
186
 
187
- # @param [Array<Valkyrie::Persistence::Solr::Mapper::SolrRow>] solr_rows
188
- def initialize(solr_rows)
189
- @solr_rows = solr_rows
190
- end
187
+ # @param [Array<Valkyrie::Persistence::Solr::Mapper::SolrRow>] solr_rows
188
+ def initialize(solr_rows)
189
+ @solr_rows = solr_rows
190
+ end
191
191
 
192
- # Merge a Hash of attribute values into a logical row of Solr fields
193
- # @param [Hash] hsh
194
- # @see Valkyrie::Persistence::Solr::Mapper::SolrRow#apply_to
195
- def apply_to(hsh)
196
- solr_rows.each do |solr_row|
197
- solr_row.apply_to(hsh)
198
- end
199
- hsh
192
+ # Merge a Hash of attribute values into a logical row of Solr fields
193
+ # @param [Hash] hsh
194
+ # @see Valkyrie::Persistence::Solr::Mapper::SolrRow#apply_to
195
+ def apply_to(hsh)
196
+ solr_rows.each do |solr_row|
197
+ solr_row.apply_to(hsh)
200
198
  end
199
+ hsh
201
200
  end
201
+ end
202
202
 
203
- # Container for casting mappers.
204
- class SolrMapperValue < ::Valkyrie::ValueMapper
205
- end
203
+ # Container for casting mappers.
204
+ class SolrMapperValue < ::Valkyrie::ValueMapper
205
+ end
206
206
 
207
- # Casts {Boolean} values into a recognizable string in Solr.
208
- class BooleanPropertyValue < ::Valkyrie::ValueMapper
209
- SolrMapperValue.register(self)
207
+ # Casts {Boolean} values into a recognizable string in Solr.
208
+ class BooleanPropertyValue < ::Valkyrie::ValueMapper
209
+ SolrMapperValue.register(self)
210
210
 
211
- # Determines whether or not a Property value behaves like a boolean value
212
- # @param [Object] value
213
- # @return [Boolean]
214
- def self.handles?(value)
215
- value.is_a?(Property) && ([true, false].include? value.value)
216
- end
211
+ # Determines whether or not a Property value behaves like a boolean value
212
+ # @param [Object] value
213
+ # @return [Boolean]
214
+ def self.handles?(value)
215
+ value.is_a?(Property) && ([true, false].include? value.value)
216
+ end
217
217
 
218
- # Constructs a SolrRow object for a Property with a Boolean value
219
- # @note this prepends the string "boolean-" to the value indexed in Solr
220
- # @return [SolrRow]
221
- def result
222
- calling_mapper.for(Property.new(value.key, "boolean-#{value.value}")).result
223
- end
218
+ # Constructs a SolrRow object for a Property with a Boolean value
219
+ # @note this prepends the string "boolean-" to the value indexed in Solr
220
+ # @return [SolrRow]
221
+ def result
222
+ calling_mapper.for(Property.new(value.key, "boolean-#{value.value}")).result
224
223
  end
224
+ end
225
225
 
226
- # Casts nested resources into a JSON string in solr.
227
- class NestedObjectValue < ::Valkyrie::ValueMapper
228
- SolrMapperValue.register(self)
226
+ # Casts nested resources into a JSON string in solr.
227
+ class NestedObjectValue < ::Valkyrie::ValueMapper
228
+ SolrMapperValue.register(self)
229
229
 
230
- # Determines whether or not a Property value is a Hash
231
- # @param [Object] value
232
- # @return [Boolean]
233
- def self.handles?(value)
234
- value.value.is_a?(Hash) || value.value.is_a?(Valkyrie::Resource)
235
- end
230
+ # Determines whether or not a Property value is a Hash
231
+ # @param [Object] value
232
+ # @return [Boolean]
233
+ def self.handles?(value)
234
+ value.value.is_a?(Hash) || value.value.is_a?(Valkyrie::Resource)
235
+ end
236
236
 
237
- # Constructs a SolrRow object for a Property with a Hash value
238
- # @note this prepends the string "serialized-" to the value indexed in Solr
239
- # This is indexed as a stored multivalued text
240
- # @see https://lucene.apache.org/solr/guide/defining-fields.html#defining-fields
241
- # @see https://github.com/samvera-labs/valkyrie/blob/master/solr/config/schema.xml
242
- # @return [SolrRow]
243
- def result
244
- SolrRow.new(key: value.key, fields: ["tsim"], values: "serialized-#{value.value.to_json}")
245
- end
237
+ # Constructs a SolrRow object for a Property with a Hash value
238
+ # @note this prepends the string "serialized-" to the value indexed in Solr
239
+ # This is indexed as a stored multivalued text
240
+ # @see https://lucene.apache.org/solr/guide/defining-fields.html#defining-fields
241
+ # @see https://github.com/samvera-labs/valkyrie/blob/master/solr/config/schema.xml
242
+ # @return [SolrRow]
243
+ def result
244
+ SolrRow.new(key: value.key, fields: ["tsim"], values: "serialized-#{value.value.to_json}")
246
245
  end
246
+ end
247
247
 
248
- # Casts enumerable values one by one.
249
- class EnumerableValue < ::Valkyrie::ValueMapper
250
- SolrMapperValue.register(self)
248
+ # Casts enumerable values one by one.
249
+ class EnumerableValue < ::Valkyrie::ValueMapper
250
+ SolrMapperValue.register(self)
251
251
 
252
- # Determines whether or not a Property value is an Array
253
- # @param [Object] value
254
- # @return [Boolean]
255
- def self.handles?(value)
256
- value.is_a?(Property) && value.value.is_a?(Array)
257
- end
252
+ # Determines whether or not a Property value is an Array
253
+ # @param [Object] value
254
+ # @return [Boolean]
255
+ def self.handles?(value)
256
+ value.is_a?(Property) && value.value.is_a?(Array)
257
+ end
258
258
 
259
- # Constructs a CompositeSolrRow object for a set of Property values
260
- # @return [CompositeSolrRow]
261
- def result
262
- CompositeSolrRow.new(
263
- value.value.map do |val|
264
- calling_mapper.for(Property.new(value.key, val, value.value)).result
265
- end
266
- )
267
- end
259
+ # Constructs a CompositeSolrRow object for a set of Property values
260
+ # @return [CompositeSolrRow]
261
+ def result
262
+ CompositeSolrRow.new(
263
+ value.value.map do |val|
264
+ calling_mapper.for(Property.new(value.key, val, value.value)).result
265
+ end
266
+ )
268
267
  end
268
+ end
269
269
 
270
- # Skips nil values.
271
- class NilPropertyValue < ::Valkyrie::ValueMapper
272
- SolrMapperValue.register(self)
270
+ # Skips nil values.
271
+ class NilPropertyValue < ::Valkyrie::ValueMapper
272
+ SolrMapperValue.register(self)
273
273
 
274
- # Determines whether or not a Property value responds as nil
275
- # @param [Object] value
276
- # @return [Boolean]
277
- def self.handles?(value)
278
- value.is_a?(Property) && value.value.nil?
279
- end
274
+ # Determines whether or not a Property value responds as nil
275
+ # @param [Object] value
276
+ # @return [Boolean]
277
+ def self.handles?(value)
278
+ value.is_a?(Property) && value.value.nil?
279
+ end
280
280
 
281
- # Constructs a SolrRow object for a Property with a nil value
282
- # @return [SolrRow]
283
- def result
284
- SolrRow.new(key: value.key, fields: [], values: nil)
285
- end
281
+ # Constructs a SolrRow object for a Property with a nil value
282
+ # @return [SolrRow]
283
+ def result
284
+ SolrRow.new(key: value.key, fields: [], values: nil)
286
285
  end
286
+ end
287
287
 
288
- # Casts {Valkyrie::ID} values into a recognizable string in solr.
289
- class IDPropertyValue < ::Valkyrie::ValueMapper
290
- SolrMapperValue.register(self)
288
+ # Casts {Valkyrie::ID} values into a recognizable string in solr.
289
+ class IDPropertyValue < ::Valkyrie::ValueMapper
290
+ SolrMapperValue.register(self)
291
291
 
292
- # Determines whether or not a Property value is a Valkyrie ID
293
- # @param [Object] value
294
- # @return [Boolean]
295
- def self.handles?(value)
296
- value.is_a?(Property) && value.value.is_a?(::Valkyrie::ID)
297
- end
292
+ # Determines whether or not a Property value is a Valkyrie ID
293
+ # @param [Object] value
294
+ # @return [Boolean]
295
+ def self.handles?(value)
296
+ value.is_a?(Property) && value.value.is_a?(::Valkyrie::ID)
297
+ end
298
298
 
299
- # Constructs a SolrRow object for the Property Valkyrie ID value
300
- # @note this prepends the string "id-" to the value indexed in Solr
301
- # @return [SolrRow]
302
- def result
303
- calling_mapper.for(Property.new(value.key, "id-#{value.value.id}")).result
304
- end
299
+ # Constructs a SolrRow object for the Property Valkyrie ID value
300
+ # @note this prepends the string "id-" to the value indexed in Solr
301
+ # @return [SolrRow]
302
+ def result
303
+ calling_mapper.for(Property.new(value.key, "id-#{value.value.id}")).result
305
304
  end
305
+ end
306
306
 
307
- # Casts {RDF::URI} values into a recognizable string in solr.
308
- class URIPropertyValue < ::Valkyrie::ValueMapper
309
- SolrMapperValue.register(self)
307
+ # Casts {RDF::URI} values into a recognizable string in solr.
308
+ class URIPropertyValue < ::Valkyrie::ValueMapper
309
+ SolrMapperValue.register(self)
310
310
 
311
- # Determines whether or not a Property value is a URI
312
- # @param [Object] value
313
- # @return [Boolean]
314
- def self.handles?(value)
315
- value.is_a?(Property) && value.value.is_a?(::RDF::URI)
316
- end
311
+ # Determines whether or not a Property value is a URI
312
+ # @param [Object] value
313
+ # @return [Boolean]
314
+ def self.handles?(value)
315
+ value.is_a?(Property) && value.value.is_a?(::RDF::URI)
316
+ end
317
317
 
318
- # Constructs a SolrRow object for the Property URI value
319
- # @note this prepends the string "uri-" to the value indexed in Solr
320
- # @return [SolrRow]
321
- def result
322
- calling_mapper.for(Property.new(value.key, "uri-#{value.value}")).result
323
- end
318
+ # Constructs a SolrRow object for the Property URI value
319
+ # @note this prepends the string "uri-" to the value indexed in Solr
320
+ # @return [SolrRow]
321
+ def result
322
+ calling_mapper.for(Property.new(value.key, "uri-#{value.value}")).result
324
323
  end
324
+ end
325
325
 
326
- # Casts {Integer} values into a recognizable string in Solr.
327
- class IntegerPropertyValue < ::Valkyrie::ValueMapper
328
- SolrMapperValue.register(self)
326
+ # Casts {Integer} values into a recognizable string in Solr.
327
+ class IntegerPropertyValue < ::Valkyrie::ValueMapper
328
+ SolrMapperValue.register(self)
329
329
 
330
- # Determines whether or not a Property value is an Integer
331
- # @param [Object] value
332
- # @return [Boolean]
333
- def self.handles?(value)
334
- value.is_a?(Property) && value.value.is_a?(Integer)
335
- end
330
+ # Determines whether or not a Property value is an Integer
331
+ # @param [Object] value
332
+ # @return [Boolean]
333
+ def self.handles?(value)
334
+ value.is_a?(Property) && value.value.is_a?(Integer)
335
+ end
336
336
 
337
- # Constructs a SolrRow object for the Property Integer value
338
- # @note this prepends the string "integer-" to the value indexed in Solr
339
- # @return [SolrRow]
340
- def result
341
- calling_mapper.for(Property.new(value.key, "integer-#{value.value}")).result
342
- end
337
+ # Constructs a SolrRow object for the Property Integer value
338
+ # @note this prepends the string "integer-" to the value indexed in Solr
339
+ # @return [SolrRow]
340
+ def result
341
+ calling_mapper.for(Property.new(value.key, "integer-#{value.value}")).result
343
342
  end
343
+ end
344
344
 
345
- # Casts {Float} values into a recognizable string in Solr.
346
- class FloatPropertyValue < ::Valkyrie::ValueMapper
347
- SolrMapperValue.register(self)
348
- def self.handles?(value)
349
- value.is_a?(Property) && value.value.is_a?(Float)
350
- end
345
+ # Casts {Float} values into a recognizable string in Solr.
346
+ class FloatPropertyValue < ::Valkyrie::ValueMapper
347
+ SolrMapperValue.register(self)
348
+ def self.handles?(value)
349
+ value.is_a?(Property) && value.value.is_a?(Float)
350
+ end
351
351
 
352
- def result
353
- calling_mapper.for(Property.new(value.key, "float-#{value.value}")).result
354
- end
352
+ def result
353
+ calling_mapper.for(Property.new(value.key, "float-#{value.value}")).result
355
354
  end
355
+ end
356
356
 
357
- # Casts {DateTime} values into a recognizable string in Solr.
358
- class DateTimePropertyValue < ::Valkyrie::ValueMapper
359
- SolrMapperValue.register(self)
357
+ # Casts {DateTime} values into a recognizable string in Solr.
358
+ class DateTimePropertyValue < ::Valkyrie::ValueMapper
359
+ SolrMapperValue.register(self)
360
360
 
361
- # Determines whether or not a Property value is a DateTime or Time
362
- # @param [Object] value
363
- # @return [Boolean]
364
- def self.handles?(value)
365
- value.is_a?(Property) && (value.value.is_a?(Time) || value.value.is_a?(DateTime))
366
- end
361
+ # Determines whether or not a Property value is a DateTime or Time
362
+ # @param [Object] value
363
+ # @return [Boolean]
364
+ def self.handles?(value)
365
+ value.is_a?(Property) && (value.value.is_a?(Time) || value.value.is_a?(DateTime))
366
+ end
367
367
 
368
- # Constructs a SolrRow object for a datestamp derived from the value
369
- # @note this prepends the string "datetime-" to the value indexed in Solr
370
- # @return [SolrRow]
371
- def result
372
- calling_mapper.for(Property.new(value.key, "datetime-#{JSON.parse(to_datetime(value.value).to_json)}")).result
373
- end
368
+ # Constructs a SolrRow object for a datestamp derived from the value
369
+ # @note this prepends the string "datetime-" to the value indexed in Solr
370
+ # @return [SolrRow]
371
+ def result
372
+ calling_mapper.for(Property.new(value.key, "datetime-#{JSON.parse(to_datetime(value.value).to_json)}")).result
373
+ end
374
374
 
375
- private
375
+ private
376
376
 
377
- # Converts a value to a UTC timestamp if it is a DateTime or behaves like a Time value
378
- # @param [Object] value
379
- # @return [Time]
380
- def to_datetime(value)
381
- return value.utc if value.is_a?(DateTime)
382
- return value.to_datetime.utc if value.respond_to?(:to_datetime)
383
- end
377
+ # Converts a value to a UTC timestamp if it is a DateTime or behaves like a Time value
378
+ # @param [Object] value
379
+ # @return [Time]
380
+ def to_datetime(value)
381
+ return value.new_offset(0) if value.is_a?(DateTime)
382
+ return value.to_datetime.new_offset(0) if value.respond_to?(:to_datetime)
384
383
  end
384
+ end
385
385
 
386
- # Handles casting language-tagged strings when there are both
387
- # language-tagged and non-language-tagged strings in Solr. Assumes English
388
- # for non-language-tagged strings.
389
- class SharedStringPropertyValue < ::Valkyrie::ValueMapper
390
- SolrMapperValue.register(self)
386
+ # Handles casting language-tagged strings when there are both
387
+ # language-tagged and non-language-tagged strings in Solr. Assumes English
388
+ # for non-language-tagged strings.
389
+ class SharedStringPropertyValue < ::Valkyrie::ValueMapper
390
+ SolrMapperValue.register(self)
391
391
 
392
- # Determines whether or not a Property value is a String whether or not the Property has an RDF literal specifying the language tag
393
- # @param [Object] value
394
- # @return [Boolean]
395
- def self.handles?(value)
396
- value.is_a?(Property) && value.value.is_a?(String) && value.scope.find { |x| x.is_a?(::RDF::Literal) }.present?
397
- end
392
+ # Determines whether or not a Property value is a String whether or not the Property has an RDF literal specifying the language tag
393
+ # @param [Object] value
394
+ # @return [Boolean]
395
+ def self.handles?(value)
396
+ value.is_a?(Property) && value.value.is_a?(String) && value.scope.find { |x| x.is_a?(::RDF::Literal) }.present?
397
+ end
398
398
 
399
- # Constructs a CompositeSolrRow object with the language-tagged literal value
400
- # @return [CompositeSolrRow]
401
- def result
402
- CompositeSolrRow.new(
403
- [
404
- calling_mapper.for(Property.new(value.key, value.value)).result,
405
- calling_mapper.for(Property.new("#{value.key}_lang", "eng")).result,
406
- calling_mapper.for(Property.new("#{value.key}_type", "http://www.w3.org/1999/02/22-rdf-syntax-ns#langString")).result
407
- ]
408
- )
409
- end
399
+ # Constructs a CompositeSolrRow object with the language-tagged literal value
400
+ # @return [CompositeSolrRow]
401
+ def result
402
+ CompositeSolrRow.new(
403
+ [
404
+ calling_mapper.for(Property.new(value.key, value.value)).result,
405
+ calling_mapper.for(Property.new("#{value.key}_lang", "eng")).result,
406
+ calling_mapper.for(Property.new("#{value.key}_type", "http://www.w3.org/1999/02/22-rdf-syntax-ns#langString")).result
407
+ ]
408
+ )
410
409
  end
410
+ end
411
411
 
412
- # Handles casting strings.
413
- class StringPropertyValue < ::Valkyrie::ValueMapper
414
- SolrMapperValue.register(self)
412
+ # Handles casting strings.
413
+ class StringPropertyValue < ::Valkyrie::ValueMapper
414
+ SolrMapperValue.register(self)
415
415
 
416
- # Determines whether or not a Property value is a String
417
- # @param [Object] value
418
- # @return [Boolean]
419
- def self.handles?(value)
420
- value.is_a?(Property) && value.value.is_a?(String)
421
- end
416
+ # Determines whether or not a Property value is a String
417
+ # @param [Object] value
418
+ # @return [Boolean]
419
+ def self.handles?(value)
420
+ value.is_a?(Property) && value.value.is_a?(String)
421
+ end
422
422
 
423
- # Constructs a SolrRow object with the String values and Solr field settings
424
- # @return [SolrRow]
425
- def result
426
- SolrRow.new(key: value.key, fields: fields, values: value.value)
427
- end
423
+ # Constructs a SolrRow object with the String values and Solr field settings
424
+ # @return [SolrRow]
425
+ def result
426
+ SolrRow.new(key: value.key, fields: fields, values: value.value)
427
+ end
428
428
 
429
- # Generates the Solr fields used during the indexing
430
- # String are normally indexed using the following:
431
- # - stored text
432
- # - stored english text
433
- # - stored single string
434
- # - multivalued string
435
- # - stored multivalued text
436
- # - stored multivalued english text
437
- # If the string is greater than 1000 characters in length, it is only indexed as a stored multivalued text
438
- # @see https://lucene.apache.org/solr/guide/defining-fields.html#defining-fields
439
- # @see https://github.com/samvera-labs/valkyrie/blob/master/solr/config/schema.xml
440
- # @return [Array<Symbol>]
441
- def fields
442
- if value.value.length > 1000
443
- [:tsim]
444
- else
445
- [:tsim, :ssim, :tesim, :tsi, :ssi, :tesi]
446
- end
429
+ # Generates the Solr fields used during the indexing
430
+ # String are normally indexed using the following:
431
+ # - stored text
432
+ # - stored english text
433
+ # - stored single string
434
+ # - multivalued string
435
+ # - stored multivalued text
436
+ # - stored multivalued english text
437
+ # If the string is greater than 1000 characters in length, it is only indexed as a stored multivalued text
438
+ # @see https://lucene.apache.org/solr/guide/defining-fields.html#defining-fields
439
+ # @see https://github.com/samvera-labs/valkyrie/blob/master/solr/config/schema.xml
440
+ # @return [Array<Symbol>]
441
+ def fields
442
+ if value.value.length > 1000
443
+ [:tsim]
444
+ else
445
+ [:tsim, :ssim, :tesim, :tsi, :ssi, :tesi]
447
446
  end
448
447
  end
448
+ end
449
449
 
450
- # Handles casting language-typed {RDF::Literal}s
451
- class LiteralPropertyValue < ::Valkyrie::ValueMapper
452
- SolrMapperValue.register(self)
450
+ # Handles casting language-typed {RDF::Literal}s
451
+ class LiteralPropertyValue < ::Valkyrie::ValueMapper
452
+ SolrMapperValue.register(self)
453
453
 
454
- # Determines whether or not a Property value is an RDF literal
455
- # @param [Object] value
456
- # @return [Boolean]
457
- def self.handles?(value)
458
- value.is_a?(Property) && value.value.is_a?(::RDF::Literal)
459
- end
454
+ # Determines whether or not a Property value is an RDF literal
455
+ # @param [Object] value
456
+ # @return [Boolean]
457
+ def self.handles?(value)
458
+ value.is_a?(Property) && value.value.is_a?(::RDF::Literal)
459
+ end
460
460
 
461
- # Constructs a CompositeSolrRow object with the language-tagged literal value
462
- # @return [CompositeSolrRow]
463
- def result
464
- key = value.key
465
- val = value.value
466
- CompositeSolrRow.new(
467
- [
468
- calling_mapper.for(Property.new(key, val.to_s)).result,
469
- calling_mapper.for(Property.new("#{key}_lang", val.language.to_s)).result,
470
- calling_mapper.for(Property.new("#{key}_type", val.datatype.to_s)).result
471
- ]
472
- )
473
- end
461
+ # Constructs a CompositeSolrRow object with the language-tagged literal value
462
+ # @return [CompositeSolrRow]
463
+ def result
464
+ key = value.key
465
+ val = value.value
466
+ CompositeSolrRow.new(
467
+ [
468
+ calling_mapper.for(Property.new(key, val.to_s)).result,
469
+ calling_mapper.for(Property.new("#{key}_lang", val.language.to_s)).result,
470
+ calling_mapper.for(Property.new("#{key}_type", val.datatype.to_s)).result
471
+ ]
472
+ )
474
473
  end
474
+ end
475
475
  end
476
476
  end