valkyrie 2.0.2 → 2.1.0
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/.circleci/config.yml +0 -24
- data/Appraisals +0 -4
- data/CHANGELOG.md +65 -0
- data/README.md +2 -2
- data/db/schema.rb +0 -40
- data/gemfiles/activerecord_5_2.gemfile +2 -0
- data/gemfiles/activerecord_6_0.gemfile +2 -0
- data/lib/valkyrie.rb +20 -2
- data/lib/valkyrie/id.rb +16 -1
- data/lib/valkyrie/logging.rb +72 -0
- data/lib/valkyrie/persistence/composite_persister.rb +1 -1
- data/lib/valkyrie/persistence/fedora.rb +2 -0
- data/lib/valkyrie/persistence/fedora/list_node.rb +3 -6
- data/lib/valkyrie/persistence/fedora/metadata_adapter.rb +2 -2
- data/lib/valkyrie/persistence/fedora/permissive_schema.rb +2 -2
- data/lib/valkyrie/persistence/fedora/persister.rb +2 -1
- data/lib/valkyrie/persistence/fedora/query_service.rb +20 -17
- data/lib/valkyrie/persistence/memory/query_service.rb +32 -10
- data/lib/valkyrie/persistence/postgres/query_service.rb +66 -13
- data/lib/valkyrie/persistence/solr/persister.rb +4 -17
- data/lib/valkyrie/persistence/solr/queries/find_all_query.rb +6 -0
- data/lib/valkyrie/persistence/solr/query_service.rb +33 -44
- data/lib/valkyrie/persistence/solr/repository.rb +2 -1
- data/lib/valkyrie/rdf_patches.rb +2 -2
- data/lib/valkyrie/resource.rb +10 -2
- data/lib/valkyrie/specs/shared_specs/persister.rb +3 -3
- data/lib/valkyrie/specs/shared_specs/queries.rb +112 -9
- data/lib/valkyrie/storage/fedora.rb +1 -1
- data/lib/valkyrie/storage_adapter.rb +5 -2
- data/lib/valkyrie/types.rb +2 -0
- data/lib/valkyrie/version.rb +1 -1
- data/solr/config/solrconfig.xml +0 -10
- data/valkyrie.gemspec +1 -0
- metadata +17 -4
- data/db/seeds.rb +0 -8
- data/gemfiles/activerecord_5_1.gemfile +0 -10
@@ -6,8 +6,8 @@ module Valkyrie::Persistence::Fedora
|
|
6
6
|
#
|
7
7
|
# @example Passing in a mapping
|
8
8
|
# schema = Valkyrie::Persistence::Fedora::PermissiveSchema.new(member_ids:
|
9
|
-
# RDF::URI("http://
|
10
|
-
# schema.predicate_for(resource: Resource.new, property: :member_ids) # => RDF::URI<"http://
|
9
|
+
# RDF::URI("http://example.com/member_ids"))
|
10
|
+
# schema.predicate_for(resource: Resource.new, property: :member_ids) # => RDF::URI<"http://example.com/member_ids">
|
11
11
|
# schema.predicate_for(resource: Resource.new, property: :unknown) # => RDF::URI<"http://example.com/predicate/unknown">
|
12
12
|
class PermissiveSchema
|
13
13
|
URI_PREFIX = 'http://example.com/predicate/'
|
@@ -64,11 +64,12 @@ module Valkyrie::Persistence::Fedora
|
|
64
64
|
# (see Valkyrie::Persistence::Memory::Persister#wipe!)
|
65
65
|
# Deletes Fedora repository resource *and* the tombstone resources which remain
|
66
66
|
# @see https://wiki.duraspace.org/display/FEDORA4x/RESTful+HTTP+API#RESTfulHTTPAPI-RedDELETEDeletearesource
|
67
|
+
# @see Valkyrie::Logging for details concerning log suppression.
|
67
68
|
def wipe!
|
68
69
|
connection.delete(base_path)
|
69
70
|
connection.delete("#{base_path}/fcr:tombstone")
|
70
71
|
rescue => error
|
71
|
-
Valkyrie.logger.debug("Failed to wipe Fedora for some reason: #{error}") unless error.is_a?(::Ldp::NotFound)
|
72
|
+
Valkyrie.logger.debug("Failed to wipe Fedora for some reason: #{error}", logging_context: "Valkyrie::Persistence::Fedora::Persister#wipe") unless error.is_a?(::Ldp::NotFound)
|
72
73
|
end
|
73
74
|
|
74
75
|
# Creates the root LDP Container for the connection with Fedora
|
@@ -86,11 +86,18 @@ module Valkyrie::Persistence::Fedora
|
|
86
86
|
end
|
87
87
|
end
|
88
88
|
|
89
|
+
# (see Valkyrie::Persistence::Memory::QueryService#count_all_of_model)
|
90
|
+
def count_all_of_model(model:)
|
91
|
+
find_all_of_model(model: model).count
|
92
|
+
end
|
93
|
+
|
89
94
|
# (see Valkyrie::Persistence::Memory::QueryService#find_references_by)
|
90
|
-
def find_references_by(resource:, property:)
|
91
|
-
(resource[property] || []).select { |x| x.is_a?(Valkyrie::ID) }.lazy.map do |id|
|
95
|
+
def find_references_by(resource:, property:, model: nil)
|
96
|
+
objects = (resource[property] || []).select { |x| x.is_a?(Valkyrie::ID) }.lazy.map do |id|
|
92
97
|
find_by(id: id)
|
93
98
|
end
|
99
|
+
return objects unless model
|
100
|
+
objects.select { |obj| obj.is_a?(model) }
|
94
101
|
end
|
95
102
|
|
96
103
|
# Retrieves the RDF graph for the LDP container for a resource
|
@@ -111,15 +118,16 @@ module Valkyrie::Persistence::Fedora
|
|
111
118
|
# Find all resources referencing a given resource (e. g. parents)
|
112
119
|
# *This is done by iterating through the ID of each resource referencing the resource in the query, and requesting each resource over the HTTP*
|
113
120
|
# *Also, an initial request is made to find the URIs of the resources referencing the resource in the query*
|
114
|
-
def find_inverse_references_by(resource: nil, id: nil, property:)
|
121
|
+
def find_inverse_references_by(resource: nil, id: nil, property:, model: nil)
|
115
122
|
raise ArgumentError, "Provide resource or id" unless resource || id
|
116
123
|
ensure_persisted(resource) if resource
|
117
124
|
resource ||= find_by(id: id)
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
125
|
+
ids = find_inverse_reference_ids_by_unordered(resource: resource, property: property).uniq
|
126
|
+
objects_from_unordered = ids.lazy.map { |ref_id| find_by(id: ref_id) }
|
127
|
+
objects_from_ordered = find_inverse_references_by_ordered(resource: resource, property: property, ignore_ids: ids)
|
128
|
+
objects = [objects_from_unordered, objects_from_ordered].lazy.flat_map(&:lazy)
|
129
|
+
return objects unless model
|
130
|
+
objects.select { |obj| obj.is_a?(model) }
|
123
131
|
end
|
124
132
|
|
125
133
|
# (see Valkyrie::Persistence::Memory::QueryService#custom_queries)
|
@@ -129,18 +137,17 @@ module Valkyrie::Persistence::Fedora
|
|
129
137
|
|
130
138
|
private
|
131
139
|
|
132
|
-
def
|
140
|
+
def find_inverse_reference_ids_by_unordered(resource:, property:)
|
133
141
|
content = content_with_inbound(id: resource.id)
|
134
142
|
property_uri = adapter.schema.predicate_for(property: property, resource: nil)
|
135
|
-
|
136
|
-
ids.uniq!
|
137
|
-
ids.lazy.map { |id| find_by(id: id) }
|
143
|
+
content.graph.query([nil, property_uri, adapter.id_to_uri(resource.id)]).map(&:subject).map { |x| x.to_s.gsub(/#.*/, '') }.map { |x| adapter.uri_to_id(x) }
|
138
144
|
end
|
139
145
|
|
140
|
-
def find_inverse_references_by_ordered(resource:, property:)
|
146
|
+
def find_inverse_references_by_ordered(resource:, property:, ignore_ids: [])
|
141
147
|
content = content_with_inbound(id: resource.id)
|
142
148
|
ids = content.graph.query([nil, ::RDF::Vocab::ORE.proxyFor, adapter.id_to_uri(resource.id)]).map(&:subject).map { |x| x.to_s.gsub(/#.*/, '') }.map { |x| adapter.uri_to_id(x) }
|
143
149
|
ids.uniq!
|
150
|
+
ids.delete_if { |id| ignore_ids.include? id }
|
144
151
|
ids.lazy.map { |id| find_by(id: id) }.select { |o| o[property].include?(resource.id) }
|
145
152
|
end
|
146
153
|
|
@@ -169,9 +176,5 @@ module Valkyrie::Persistence::Fedora
|
|
169
176
|
def ensure_persisted(resource)
|
170
177
|
raise ArgumentError, 'resource is not saved' unless resource.persisted?
|
171
178
|
end
|
172
|
-
|
173
|
-
def ordered_property?(resource:, property:)
|
174
|
-
resource.ordered_attribute?(property)
|
175
|
-
end
|
176
179
|
end
|
177
180
|
end
|
@@ -1,9 +1,9 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
module Valkyrie::Persistence::Memory
|
3
|
+
# Query Service for the memory metadata adapter.
|
4
|
+
# @see Valkyrie::Persistence::Memory
|
5
|
+
# @note Documentation for Query Services in general is maintained here.
|
3
6
|
class QueryService
|
4
|
-
# Query Service for the memory metadata adapter.
|
5
|
-
# @see Valkyrie::Persistence::Memory
|
6
|
-
# @note Documentation for Query Services in general is maintained here.
|
7
7
|
attr_reader :adapter, :query_handlers
|
8
8
|
delegate :cache, to: :adapter
|
9
9
|
|
@@ -27,7 +27,9 @@ module Valkyrie::Persistence::Memory
|
|
27
27
|
cache[id] || raise(::Valkyrie::Persistence::ObjectNotFoundError)
|
28
28
|
end
|
29
29
|
|
30
|
-
# Get a single resource by `alternate_identifier`.
|
30
|
+
# Get a single resource by `alternate_identifier`. Alternate identifiers are identifiers (like NOIDs,
|
31
|
+
# DOIs, ARKs, etc.) that are not the system-generated ID, but might be used to identify a resource in an
|
32
|
+
# application (e.g., to make shorter URLs).
|
31
33
|
# @param alternate_identifier [Valkyrie::ID] The alternate identifier to query for.
|
32
34
|
# @raise [Valkyrie::Persistence::ObjectNotFoundError] Raised when the alternate identifier
|
33
35
|
# isn't in the persistence backend.
|
@@ -73,9 +75,17 @@ module Valkyrie::Persistence::Memory
|
|
73
75
|
end
|
74
76
|
end
|
75
77
|
|
78
|
+
# Count all objects of a given model.
|
79
|
+
# @param model [Class] Class to query for.
|
80
|
+
# @return integer. Count objects in the persistence backend
|
81
|
+
# with the given class.
|
82
|
+
def count_all_of_model(model:)
|
83
|
+
cache.values.select { |obj| obj.is_a?(model) }.count
|
84
|
+
end
|
85
|
+
|
76
86
|
# Get all members of a given resource.
|
77
87
|
# @param resource [Valkyrie::Resource] Model whose members are being searched for.
|
78
|
-
# @param model [Class]
|
88
|
+
# @param model [Class] Filter results to include only instances of this model. (optional)
|
79
89
|
# @return [Array<Valkyrie::Resource>] child objects of type `model` referenced by
|
80
90
|
# `resource`'s `member_ids` method. Returned in order.
|
81
91
|
def find_members(resource:, model: nil)
|
@@ -90,9 +100,10 @@ module Valkyrie::Persistence::Memory
|
|
90
100
|
# @param resource [Valkyrie::Resource] Model whose property is being searched.
|
91
101
|
# @param property [Symbol] Property which, on the `resource`, contains {Valkyrie::ID}s which are
|
92
102
|
# to be de-referenced.
|
103
|
+
# @param model [Class] Filter results to include only instances of this model. (optional)
|
93
104
|
# @return [Array<Valkyrie::Resource>] All objects which are referenced by the
|
94
105
|
# `property` property on `resource`. Not necessarily in order.
|
95
|
-
def find_references_by(resource:, property:)
|
106
|
+
def find_references_by(resource:, property:, model: nil)
|
96
107
|
refs = Array.wrap(resource[property]).map do |id|
|
97
108
|
begin
|
98
109
|
find_by(id: id)
|
@@ -101,25 +112,31 @@ module Valkyrie::Persistence::Memory
|
|
101
112
|
end
|
102
113
|
end.reject(&:nil?)
|
103
114
|
refs.uniq! unless ordered_property?(resource: resource, property: property)
|
104
|
-
refs
|
115
|
+
return refs unless model
|
116
|
+
refs.select { |obj| obj.is_a?(model) }
|
105
117
|
end
|
106
118
|
|
107
119
|
# Get all resources which link to a resource with a given property.
|
108
120
|
# @param resource [Valkyrie::Resource] The resource which is being referenced by
|
109
|
-
# other resources.
|
121
|
+
# other resources. Requires either resource or id parameter to be specified.
|
122
|
+
# @param id [Valkyrie::ID] ID of the resource which is being reference by other
|
123
|
+
# resources. Requires either resource or id parameter to be specified.
|
110
124
|
# @param property [Symbol] The property which, on other resources, is
|
111
125
|
# referencing the given `resource`
|
126
|
+
# @param model [Class] Filter results to include only instances of this model. (optional)
|
112
127
|
# @raise [ArgumentError] Raised when the ID is not in the persistence backend.
|
113
128
|
# @return [Array<Valkyrie::Resource>] All resources in the persistence backend
|
114
129
|
# which have the ID of the given `resource` in their `property` property. Not
|
115
130
|
# in order.
|
116
|
-
def find_inverse_references_by(resource: nil, id: nil, property:)
|
131
|
+
def find_inverse_references_by(resource: nil, id: nil, property:, model: nil)
|
117
132
|
raise ArgumentError, "Provide resource or id" unless resource || id
|
118
133
|
ensure_persisted(resource) if resource
|
119
134
|
id ||= resource.id
|
120
|
-
find_all.select do |obj|
|
135
|
+
result = find_all.select do |obj|
|
121
136
|
Array.wrap(obj[property]).include?(id)
|
122
137
|
end
|
138
|
+
return result unless model
|
139
|
+
result.select { |obj| obj.is_a?(model) }
|
123
140
|
end
|
124
141
|
|
125
142
|
# Find all parents of a given resource.
|
@@ -148,10 +165,15 @@ module Valkyrie::Persistence::Memory
|
|
148
165
|
resource.member_ids || []
|
149
166
|
end
|
150
167
|
|
168
|
+
# Determine whether or not a value is a Valkyrie ID
|
169
|
+
# @param [Object] id
|
170
|
+
# @return [Boolean]
|
151
171
|
def validate_id(id)
|
152
172
|
raise ArgumentError, 'id must be a Valkyrie::ID' unless id.is_a? Valkyrie::ID
|
153
173
|
end
|
154
174
|
|
175
|
+
# Ensure that a given Valkyrie Resource has been persisted
|
176
|
+
# @param [Valkyrie::Resource] resource
|
155
177
|
def ensure_persisted(resource)
|
156
178
|
raise ArgumentError, 'resource is not saved' unless resource.persisted?
|
157
179
|
end
|
@@ -35,6 +35,13 @@ module Valkyrie::Persistence::Postgres
|
|
35
35
|
end
|
36
36
|
end
|
37
37
|
|
38
|
+
# Count all records for a specific resource type
|
39
|
+
# @param [Class] model
|
40
|
+
# @return integer
|
41
|
+
def count_all_of_model(model:)
|
42
|
+
orm_class.where(internal_resource: model.to_s).count
|
43
|
+
end
|
44
|
+
|
38
45
|
# Find a record using a Valkyrie ID, and map it to a Valkyrie Resource
|
39
46
|
# @param [Valkyrie::ID, String] id
|
40
47
|
# @return [Valkyrie::Resource]
|
@@ -94,30 +101,28 @@ module Valkyrie::Persistence::Postgres
|
|
94
101
|
find_inverse_references_by(resource: resource, property: :member_ids)
|
95
102
|
end
|
96
103
|
|
97
|
-
#
|
98
|
-
|
99
|
-
# @param [String] property
|
100
|
-
# @return [Array<Valkyrie::Resource>]
|
101
|
-
def find_references_by(resource:, property:)
|
104
|
+
# (see Valkyrie::Persistence::Memory::QueryService#find_references_by)
|
105
|
+
def find_references_by(resource:, property:, model: nil)
|
102
106
|
return [] if resource.id.blank? || resource[property].blank?
|
103
107
|
# only return ordered if needed to avoid performance penalties
|
104
108
|
if ordered_property?(resource: resource, property: property)
|
105
|
-
|
109
|
+
find_ordered_references_by(resource: resource, property: property, model: model)
|
106
110
|
else
|
107
|
-
|
111
|
+
find_unordered_references_by(resource: resource, property: property, model: model)
|
108
112
|
end
|
109
113
|
end
|
110
114
|
|
111
|
-
#
|
112
|
-
|
113
|
-
# @param [String] property
|
114
|
-
# @return [Array<Valkyrie::Resource>]
|
115
|
-
def find_inverse_references_by(resource: nil, id: nil, property:)
|
115
|
+
# (see Valkyrie::Persistence::Memory::QueryService#find_inverse_references_by)
|
116
|
+
def find_inverse_references_by(resource: nil, id: nil, property:, model: nil)
|
116
117
|
raise ArgumentError, "Provide resource or id" unless resource || id
|
117
118
|
ensure_persisted(resource) if resource
|
118
119
|
id ||= resource.id
|
119
120
|
internal_array = "{\"#{property}\": [{\"id\": \"#{id}\"}]}"
|
120
|
-
|
121
|
+
if model
|
122
|
+
run_query(find_inverse_references_with_type_query, internal_array, model)
|
123
|
+
else
|
124
|
+
run_query(find_inverse_references_query, internal_array)
|
125
|
+
end
|
121
126
|
end
|
122
127
|
|
123
128
|
# Execute a query in SQL for resource records and map them to Valkyrie
|
@@ -180,6 +185,21 @@ module Valkyrie::Persistence::Postgres
|
|
180
185
|
SQL
|
181
186
|
end
|
182
187
|
|
188
|
+
# Generate the SQL query for retrieving member resources in PostgreSQL using a
|
189
|
+
# JSON object literal (e. g. { "alternate_ids": [{"id": "d6e88f80-41b3-4dbf-a2a0-cd79e20f6d10"}] }).
|
190
|
+
# and resource type as arguments
|
191
|
+
# @see https://guides.rubyonrails.org/active_record_querying.html#array-conditions
|
192
|
+
# This uses JSON functions in order to retrieve JSON property values
|
193
|
+
# @see https://www.postgresql.org/docs/current/static/functions-json.html
|
194
|
+
# @return [String]
|
195
|
+
def find_inverse_references_with_type_query
|
196
|
+
<<-SQL
|
197
|
+
SELECT * FROM orm_resources WHERE
|
198
|
+
metadata @> ?
|
199
|
+
AND internal_resource = ?
|
200
|
+
SQL
|
201
|
+
end
|
202
|
+
|
183
203
|
# Generate the SQL query for retrieving member resources in PostgreSQL using a
|
184
204
|
# JSON object literal and resource ID as arguments.
|
185
205
|
# @see https://guides.rubyonrails.org/active_record_querying.html#array-conditions
|
@@ -197,6 +217,14 @@ module Valkyrie::Persistence::Postgres
|
|
197
217
|
SQL
|
198
218
|
end
|
199
219
|
|
220
|
+
def find_references_with_type_query
|
221
|
+
<<-SQL
|
222
|
+
SELECT DISTINCT member.* FROM orm_resources a,
|
223
|
+
jsonb_array_elements(a.metadata->?) AS b(member)
|
224
|
+
JOIN orm_resources member ON (b.member->>'id')::#{id_type} = member.id WHERE a.id = ? AND member.internal_resource = ?
|
225
|
+
SQL
|
226
|
+
end
|
227
|
+
|
200
228
|
def find_ordered_references_query
|
201
229
|
<<-SQL
|
202
230
|
SELECT member.* FROM orm_resources a,
|
@@ -206,6 +234,15 @@ module Valkyrie::Persistence::Postgres
|
|
206
234
|
SQL
|
207
235
|
end
|
208
236
|
|
237
|
+
def find_ordered_references_with_type_query
|
238
|
+
<<-SQL
|
239
|
+
SELECT member.* FROM orm_resources a,
|
240
|
+
jsonb_array_elements(a.metadata->?) WITH ORDINALITY AS b(member, member_pos)
|
241
|
+
JOIN orm_resources member ON (b.member->>'id')::#{id_type} = member.id WHERE a.id = ? AND member.internal_resource = ?
|
242
|
+
ORDER BY b.member_pos
|
243
|
+
SQL
|
244
|
+
end
|
245
|
+
|
209
246
|
# Constructs a Valkyrie::Persistence::CustomQueryContainer using this query service
|
210
247
|
# @return [Valkyrie::Persistence::CustomQueryContainer]
|
211
248
|
def custom_queries
|
@@ -214,6 +251,22 @@ module Valkyrie::Persistence::Postgres
|
|
214
251
|
|
215
252
|
private
|
216
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
|
260
|
+
end
|
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
|
268
|
+
end
|
269
|
+
|
217
270
|
# Determines whether or not an Object is a Valkyrie ID
|
218
271
|
# @param [Object] id
|
219
272
|
# @raise [ArgumentError]
|
@@ -14,35 +14,22 @@ module Valkyrie::Persistence::Solr
|
|
14
14
|
@adapter = adapter
|
15
15
|
end
|
16
16
|
|
17
|
-
#
|
18
|
-
# @note Fields are saved using Solr's dynamic fields functionality.
|
19
|
-
# If the text has length > 1000, it is stored as *_tsim
|
20
|
-
# otherwise it's stored as *_tsim, *_ssim, and *_tesim
|
21
|
-
# e.g., a field called 'title' would be stored as 3 solr fields:
|
22
|
-
# 'title_tsim'
|
23
|
-
# 'title_ssim'
|
24
|
-
# 'title_tesim'
|
25
|
-
# @param [Valkyrie::Resource] resource
|
26
|
-
# @return [Valkyrie::Resource] the persisted resource
|
17
|
+
# (see Valkyrie::Persistence::Memory::Persister#save)
|
27
18
|
def save(resource:)
|
28
19
|
repository([resource]).persist.first
|
29
20
|
end
|
30
21
|
|
31
|
-
#
|
32
|
-
# @param [Array<Valkyrie::Resource>] resources
|
33
|
-
# @return [Valkyrie::Resource] the set of persisted resources
|
22
|
+
# (see Valkyrie::Persistence::Memory::Persister#save_all)
|
34
23
|
def save_all(resources:)
|
35
24
|
repository(resources).persist
|
36
25
|
end
|
37
26
|
|
38
|
-
#
|
39
|
-
# @param [Valkyrie::Resource] resource
|
40
|
-
# @return [Valkyrie::Resource] the deleted resource
|
27
|
+
# (see Valkyrie::Persistence::Memory::Persister#delete)
|
41
28
|
def delete(resource:)
|
42
29
|
repository([resource]).delete.first
|
43
30
|
end
|
44
31
|
|
45
|
-
#
|
32
|
+
# (see Valkyrie::Persistence::Memory::Persister#wipe!)
|
46
33
|
def wipe!
|
47
34
|
connection.delete_by_query("*:*")
|
48
35
|
connection.commit
|
@@ -33,6 +33,12 @@ module Valkyrie::Persistence::Solr::Queries
|
|
33
33
|
end
|
34
34
|
end
|
35
35
|
|
36
|
+
# Queries without making Resrouces and returns the RSolr page_total value
|
37
|
+
# @return [Integer]
|
38
|
+
def count
|
39
|
+
connection.get("select", params: { q: query })["response"]["numFound"].to_s.to_i
|
40
|
+
end
|
41
|
+
|
36
42
|
# Generates the Solr query for retrieving all Documents in the index
|
37
43
|
# If a model is specified for the query, it is scoped to that Valkyrie resource type
|
38
44
|
# @return [String]
|
@@ -12,27 +12,21 @@ module Valkyrie::Persistence::Solr
|
|
12
12
|
@adapter = adapter
|
13
13
|
end
|
14
14
|
|
15
|
-
#
|
16
|
-
# @param [Valkyrie::ID] id
|
17
|
-
# @return [Valkyrie::Resource]
|
15
|
+
# (see Valkyrie::Persistence::Memory::QueryService#find_by)
|
18
16
|
def find_by(id:)
|
19
17
|
id = Valkyrie::ID.new(id.to_s) if id.is_a?(String)
|
20
18
|
validate_id(id)
|
21
19
|
Valkyrie::Persistence::Solr::Queries::FindByIdQuery.new(id, connection: connection, resource_factory: resource_factory).run
|
22
20
|
end
|
23
21
|
|
24
|
-
#
|
25
|
-
# @param [Valkyrie::ID] alternate_identifier
|
26
|
-
# @return [Valkyrie::Resource]
|
22
|
+
# (see Valkyrie::Persistence::Memory::QueryService#find_by_alternate_identifier)
|
27
23
|
def find_by_alternate_identifier(alternate_identifier:)
|
28
24
|
alternate_identifier = Valkyrie::ID.new(alternate_identifier.to_s) if alternate_identifier.is_a?(String)
|
29
25
|
validate_id(alternate_identifier)
|
30
26
|
Valkyrie::Persistence::Solr::Queries::FindByAlternateIdentifierQuery.new(alternate_identifier, connection: connection, resource_factory: resource_factory).run
|
31
27
|
end
|
32
28
|
|
33
|
-
#
|
34
|
-
# @param [Array<Valkyrie::ID>] ids
|
35
|
-
# @return [Array<Valkyrie::Resource>]
|
29
|
+
# (see Valkyrie::Persistence::Memory::QueryService#find_many_by_ids)
|
36
30
|
def find_many_by_ids(ids:)
|
37
31
|
ids.map! do |id|
|
38
32
|
id = Valkyrie::ID.new(id.to_s) if id.is_a?(String)
|
@@ -42,29 +36,29 @@ module Valkyrie::Persistence::Solr
|
|
42
36
|
Valkyrie::Persistence::Solr::Queries::FindManyByIdsQuery.new(ids, connection: connection, resource_factory: resource_factory).run
|
43
37
|
end
|
44
38
|
|
45
|
-
#
|
46
|
-
# @return [Array<Valkyrie::Resource>]
|
39
|
+
# (see Valkyrie::Persistence::Memory::QueryService#find_all)
|
47
40
|
def find_all
|
48
41
|
Valkyrie::Persistence::Solr::Queries::FindAllQuery.new(connection: connection, resource_factory: resource_factory).run
|
49
42
|
end
|
50
43
|
|
51
|
-
#
|
52
|
-
# @param [Class, String] model the Valkyrie::Resource Class
|
53
|
-
# @return [Array<Valkyrie::Resource>]
|
44
|
+
# (see Valkyrie::Persistence::Memory::QueryService#find_all_of_model)
|
54
45
|
def find_all_of_model(model:)
|
55
46
|
Valkyrie::Persistence::Solr::Queries::FindAllQuery.new(connection: connection, resource_factory: resource_factory, model: model).run
|
56
47
|
end
|
57
48
|
|
58
|
-
#
|
59
|
-
# @param [Valkyrie::Resource
|
60
|
-
# @return
|
49
|
+
# Count all of the Valkyrie Resources of a model persisted in the Solr index
|
50
|
+
# @param [Class, String] model the Valkyrie::Resource Class
|
51
|
+
# @return integer
|
52
|
+
def count_all_of_model(model:)
|
53
|
+
Valkyrie::Persistence::Solr::Queries::FindAllQuery.new(connection: connection, resource_factory: resource_factory, model: model).count
|
54
|
+
end
|
55
|
+
|
56
|
+
# (see Valkyrie::Persistence::Memory::QueryService#find_parents)
|
61
57
|
def find_parents(resource:)
|
62
58
|
find_inverse_references_by(resource: resource, property: :member_ids)
|
63
59
|
end
|
64
60
|
|
65
|
-
#
|
66
|
-
# @param [Valkyrie::Resource] parent resource
|
67
|
-
# @return [Array<Valkyrie::Resource>] member resources
|
61
|
+
# (see Valkyrie::Persistence::Memory::QueryService#find_members)
|
68
62
|
def find_members(resource:, model: nil)
|
69
63
|
Valkyrie::Persistence::Solr::Queries::FindMembersQuery.new(
|
70
64
|
resource: resource,
|
@@ -74,51 +68,46 @@ module Valkyrie::Persistence::Solr
|
|
74
68
|
).run
|
75
69
|
end
|
76
70
|
|
77
|
-
#
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
71
|
+
# (see Valkyrie::Persistence::Memory::QueryService#find_references_by)
|
72
|
+
def find_references_by(resource:, property:, model: nil)
|
73
|
+
result =
|
74
|
+
if ordered_property?(resource: resource, property: property)
|
75
|
+
Valkyrie::Persistence::Solr::Queries::FindOrderedReferencesQuery.new(resource: resource, property: property, connection: connection, resource_factory: resource_factory).run
|
76
|
+
else
|
77
|
+
Valkyrie::Persistence::Solr::Queries::FindReferencesQuery.new(resource: resource, property: property, connection: connection, resource_factory: resource_factory).run
|
78
|
+
end
|
79
|
+
return result unless model
|
80
|
+
result.select { |obj| obj.is_a?(model) }
|
87
81
|
end
|
88
82
|
|
89
|
-
#
|
90
|
-
|
91
|
-
# @param [Valkyrie::Resource] referenced resource
|
92
|
-
# @param [Symbol, String] property
|
93
|
-
# @return [Array<Valkyrie::Resource>] related resources
|
94
|
-
def find_inverse_references_by(resource: nil, id: nil, property:)
|
83
|
+
# (see Valkyrie::Persistence::Memory::QueryService#find_inverse_references_by)
|
84
|
+
def find_inverse_references_by(resource: nil, id: nil, property:, model: nil)
|
95
85
|
raise ArgumentError, "Provide resource or id" unless resource || id
|
96
86
|
ensure_persisted(resource) if resource
|
97
87
|
id ||= resource.id
|
98
|
-
Valkyrie::Persistence::Solr::Queries::FindInverseReferencesQuery.new(id: id, property: property, connection: connection, resource_factory: resource_factory).run
|
88
|
+
result = Valkyrie::Persistence::Solr::Queries::FindInverseReferencesQuery.new(id: id, property: property, connection: connection, resource_factory: resource_factory).run
|
89
|
+
return result unless model
|
90
|
+
result.select { |obj| obj.is_a?(model) }
|
99
91
|
end
|
100
92
|
|
101
|
-
#
|
102
|
-
# @return [Valkyrie::Persistence::CustomQueryContainer]
|
93
|
+
# (see Valkyrie::Persistence::Memory::QueryService#custom_queries)
|
103
94
|
def custom_queries
|
104
95
|
@custom_queries ||= ::Valkyrie::Persistence::CustomQueryContainer.new(query_service: self)
|
105
96
|
end
|
106
97
|
|
107
98
|
private
|
108
99
|
|
109
|
-
#
|
110
|
-
# @param [Object] id
|
111
|
-
# @return [Boolean]
|
100
|
+
# (see Valkyrie::Persistence::Memory::QueryService#validate_id)
|
112
101
|
def validate_id(id)
|
113
102
|
raise ArgumentError, 'id must be a Valkyrie::ID' unless id.is_a? Valkyrie::ID
|
114
103
|
end
|
115
104
|
|
116
|
-
#
|
117
|
-
# @param [Valkyrie::Resource] resource
|
105
|
+
# (see Valkyrie::Persistence::Memory::QueryService#ensure_persisted)
|
118
106
|
def ensure_persisted(resource)
|
119
107
|
raise ArgumentError, 'resource is not saved' unless resource.persisted?
|
120
108
|
end
|
121
109
|
|
110
|
+
# (see Valkyrie::Persistence::Memory::QueryService#ordered_property?)
|
122
111
|
def ordered_property?(resource:, property:)
|
123
112
|
resource.ordered_attribute?(property)
|
124
113
|
end
|