diff --git a/app/services/hyrax/custom_queries/find_by_source_identifier.rb b/app/services/hyrax/custom_queries/find_by_source_identifier.rb new file mode 100644 index 00000000..6a7f77ea --- /dev/null +++ b/app/services/hyrax/custom_queries/find_by_source_identifier.rb @@ -0,0 +1,35 @@ +# frozen_string_literal: true + +module Hyrax + module CustomQueries + ## + # @see https://github.com/samvera/valkyrie/wiki/Queries#custom-queries + class FindBySourceIdentifier + def self.queries + [:find_by_source_identifier] + end + + def initialize(query_service:) + @query_service = query_service + end + + attr_reader :query_service + delegate :resource_factory, to: :query_service + delegate :orm_class, to: :resource_factory + + ## + # @param identifier String + def find_by_source_identifier(work_identifier:, source_identifier_value:) + sql_query = sql_by_source_identifier + query_service.run_query(sql_query, work_identifier, source_identifier_value).first + end + + def sql_by_source_identifier + <<-SQL + SELECT * FROM orm_resources + WHERE metadata -> ? ->> 0 = ?; + SQL + end + end + end +end diff --git a/app/services/wings/custom_queries/find_by_source_identifier.rb b/app/services/wings/custom_queries/find_by_source_identifier.rb new file mode 100644 index 00000000..630e1899 --- /dev/null +++ b/app/services/wings/custom_queries/find_by_source_identifier.rb @@ -0,0 +1,30 @@ +# frozen_string_literal: true + +module Wings + module CustomQueries + class FindBySourceIdentifier + # Custom query override specific to Wings + # Use: + # Hyrax.custom_queries.find_bulkrax_id(identifier: identifier, models: [ModelClass]) + + def self.queries + [:find_by_source_identifier] + end + + attr_reader :query_service + delegate :resource_factory, to: :query_service + + def initialize(query_service:) + @query_service = query_service + end + + def find_by_source_identifier(identifier:, use_valkyrie: true) + af_object = ActiveFedora::Base.where("bulkrax_identifier_sim:#{identifier}").first + + return af_object unless use_valkyrie + + resource_factory.to_resource(object: af_object) + end + end + end +end