Skip to content

Commit

Permalink
Merge pull request #245 from samvera-labs/extendable_query_services
Browse files Browse the repository at this point in the history
Add an extendable query interface.
  • Loading branch information
awead authored Oct 5, 2017
2 parents 2ea9704 + 8657d34 commit 9acd31a
Show file tree
Hide file tree
Showing 8 changed files with 73 additions and 1 deletion.
4 changes: 4 additions & 0 deletions lib/valkyrie/persistence/active_fedora/query_service.rb
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,10 @@ def find_references_by(resource:, property:)
def find_inverse_references_by(resource:, property:)
Valkyrie::Persistence::ActiveFedora::Queries::FindInverseReferencesQuery.new(resource, property).run
end

def custom_queries
@custom_queries ||= ::Valkyrie::Persistence::CustomQueryContainer.new(query_service: self)
end
end
end
end
1 change: 1 addition & 0 deletions valkyrie/lib/valkyrie/persistence.rb
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
# frozen_string_literal: true
module Valkyrie
module Persistence
require 'valkyrie/persistence/custom_query_container'
require 'valkyrie/persistence/memory'
require 'valkyrie/persistence/postgres'
require 'valkyrie/persistence/solr'
Expand Down
28 changes: 28 additions & 0 deletions valkyrie/lib/valkyrie/persistence/custom_query_container.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# frozen_string_literal: true
module Valkyrie::Persistence
class CustomQueryContainer
attr_reader :query_service, :query_handlers
def initialize(query_service:)
@query_service = query_service
@query_handlers = []
end

def register_query_handler(query_handler)
@query_handlers << query_handler
end

def method_missing(meth_name, *args, &block)
query_handler = find_query_handler(meth_name).new(query_service: query_service)
return super unless query_handler
query_handler.__send__(meth_name, *args, &block)
end

def find_query_handler(method)
query_handlers.find { |x| x.queries.include?(method) }
end

def respond_to_missing?(meth_name, _args)
find_query_handler(meth_name).present?
end
end
end
4 changes: 4 additions & 0 deletions valkyrie/lib/valkyrie/persistence/fedora/query_service.rb
Original file line number Diff line number Diff line change
Expand Up @@ -76,5 +76,9 @@ def find_inverse_references_by(resource:, property:)
find_by(id: id)
end
end

def custom_queries
@custom_queries ||= ::Valkyrie::Persistence::CustomQueryContainer.new(query_service: self)
end
end
end
7 changes: 6 additions & 1 deletion valkyrie/lib/valkyrie/persistence/memory/query_service.rb
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
# frozen_string_literal: true
module Valkyrie::Persistence::Memory
class QueryService
attr_reader :adapter
attr_reader :adapter, :query_handlers
delegate :cache, to: :adapter
# @param adapter [Valkyrie::Persistence::Memory::MetadataAdapter] The adapter which
# has the cache to query.
def initialize(adapter:)
@adapter = adapter
@query_handlers = []
end

# @param id [Valkyrie::ID] The ID to query for.
Expand Down Expand Up @@ -82,5 +83,9 @@ def find_parents(resource:)
def member_ids(resource:)
resource.member_ids || []
end

def custom_queries
@custom_queries ||= ::Valkyrie::Persistence::CustomQueryContainer.new(query_service: self)
end
end
end
4 changes: 4 additions & 0 deletions valkyrie/lib/valkyrie/persistence/postgres/query_service.rb
Original file line number Diff line number Diff line change
Expand Up @@ -81,5 +81,9 @@ def find_references_query
JOIN orm_resources member ON (b.member->>'id')::uuid = member.id WHERE a.id = ?
SQL
end

def custom_queries
@custom_queries ||= ::Valkyrie::Persistence::CustomQueryContainer.new(query_service: self)
end
end
end
4 changes: 4 additions & 0 deletions valkyrie/lib/valkyrie/persistence/solr/query_service.rb
Original file line number Diff line number Diff line change
Expand Up @@ -44,5 +44,9 @@ def find_references_by(resource:, property:)
def find_inverse_references_by(resource:, property:)
Valkyrie::Persistence::Solr::Queries::FindInverseReferencesQuery.new(resource: resource, property: property, connection: connection, resource_factory: resource_factory).run
end

def custom_queries
@custom_queries ||= ::Valkyrie::Persistence::CustomQueryContainer.new(query_service: self)
end
end
end
22 changes: 22 additions & 0 deletions valkyrie/lib/valkyrie/specs/shared_specs/queries.rb
Original file line number Diff line number Diff line change
Expand Up @@ -125,4 +125,26 @@ class SecondResource < Valkyrie::Resource
expect(query_service.find_parents(resource: child1).to_a).to eq []
end
end

describe ".register_query_handler" do
it "can register a query handler" do
class QueryHandler
def self.queries
[:find_by_user_id]
end

attr_reader :query_service
def initialize(query_service:)
@query_service = query_service
end

def find_by_user_id
1
end
end
query_service.custom_queries.register_query_handler(QueryHandler)
expect(query_service.custom_queries).to respond_to :find_by_user_id
expect(query_service.custom_queries.find_by_user_id).to eq 1
end
end
end

0 comments on commit 9acd31a

Please sign in to comment.