diff --git a/config/database.yml b/config/database.yml index 865dc1c5b..bc235ae14 100644 --- a/config/database.yml +++ b/config/database.yml @@ -2,6 +2,7 @@ login: &login adapter: <%= ENV['DB_ADAPTER'] || 'postgresql' %> + schema_search_path: "public,shared_extensions" host: <%= ENV['DB_HOST'] %> username: <%= ENV['DB_USER'] %> password: <%= ENV['DB_PASSWORD'] %> diff --git a/config/fedora.yml b/config/fedora.yml index 399e0bf4e..102e80b50 100644 --- a/config/fedora.yml +++ b/config/fedora.yml @@ -18,3 +18,4 @@ production: password: fedoraAdmin url: http://<%= ENV['FCREPO_HOST'] || 'localhost' %>:<%= ENV['FCREPO_PORT'] || 8080 %>/<%= ENV['FCREPO_REST_PATH'] || 'rest' %> base_path: <%= ENV['FCREPO_BASE_PATH'] || '/prod' %> + request: { timeout: 600, open_timeout: 60} diff --git a/config/initializers/active_fedora_override.rb b/config/initializers/active_fedora_override.rb new file mode 100644 index 000000000..58ec7fe04 --- /dev/null +++ b/config/initializers/active_fedora_override.rb @@ -0,0 +1,11 @@ +# Based on https://github.com/samvera/hyrax/issues/4581#issuecomment-843085122 + +# Monkey-patch to short circuit ActiveModel::Dirty which attempts to load the whole master files ordered list when calling nodes_will_change! +# This leads to a stack level too deep exception when attempting to delete a master file from a media object on the manage files step. +# See https://github.com/samvera/active_fedora/pull/1312/commits/7c8bbbefdacefd655a2ca653f5950c991e1dc999#diff-28356c4daa0d55cbaf97e4269869f510R100-R103 +ActiveFedora::Aggregation::ListSource.class_eval do + def attribute_will_change!(attr) + return super unless attr == 'nodes' + attributes_changed_by_setter[:nodes] = true + end +end diff --git a/config/initializers/apartment.rb b/config/initializers/apartment.rb index e523b4cdf..a2647571d 100644 --- a/config/initializers/apartment.rb +++ b/config/initializers/apartment.rb @@ -39,6 +39,8 @@ # Any schemas added here will be available along with your selected Tenant. # # config.persistent_schemas = %w{ hstore } + config.persistent_schemas = ['shared_extensions'] + # <== PostgreSQL only options # diff --git a/lib/active_fedora/solr_service_decorator.rb b/lib/active_fedora/solr_service_decorator.rb new file mode 100644 index 000000000..b50a5749e --- /dev/null +++ b/lib/active_fedora/solr_service_decorator.rb @@ -0,0 +1,20 @@ +# frozen_string_literal: true + +# OVERRIDE: class ActiveFedora::SolrService from Fedora 12.1.1 +module ActiveFedora + module SolrServiceDecorator + # Get the count of records that match the query + # @param [String] query a solr query + # @param [Hash] args arguments to pass through to `args' param of SolrService.query + # (note that :rows will be overwritten to 0) + # @return [Integer] number of records matching + # + # OVERRIDE: use `post` rather than `get` to handle larger query sizes + def count(query, args = {}) + args = args.merge(rows: 0) + SolrService.post(query, args)['response']['numFound'].to_i + end + end +end + +ActiveFedora::SolrService.singleton_class.send(:prepend, ActiveFedora::SolrServiceDecorator) diff --git a/lib/tasks/db_enhancements.rake b/lib/tasks/db_enhancements.rake new file mode 100644 index 000000000..551db56c3 --- /dev/null +++ b/lib/tasks/db_enhancements.rake @@ -0,0 +1,24 @@ +# frozen_string_literal: true + +namespace :db do + desc 'Also create shared_extensions Schema' + task extensions: :environment do + # Create Schema + ActiveRecord::Base.connection.execute 'CREATE SCHEMA IF NOT EXISTS shared_extensions;' + # Enable Hstore + ActiveRecord::Base.connection.execute 'CREATE EXTENSION IF NOT EXISTS HSTORE SCHEMA shared_extensions;' + # Enable UUID-OSSP + ActiveRecord::Base.connection.execute 'CREATE EXTENSION IF NOT EXISTS "uuid-ossp" SCHEMA shared_extensions;' + ActiveRecord::Base.connection.execute 'CREATE EXTENSION IF NOT EXISTS "pgcrypto" SCHEMA shared_extensions;' + # Grant usage to public + ActiveRecord::Base.connection.execute 'GRANT usage ON SCHEMA shared_extensions to public;' + end +end + +Rake::Task["db:create"].enhance do + Rake::Task["db:extensions"].invoke +end + +Rake::Task["db:test:purge"].enhance do + Rake::Task["db:extensions"].invoke +end diff --git a/lib/wings/services/custom_queries/find_ids_by_model_decorator.rb b/lib/wings/services/custom_queries/find_ids_by_model_decorator.rb new file mode 100644 index 000000000..2edd1e108 --- /dev/null +++ b/lib/wings/services/custom_queries/find_ids_by_model_decorator.rb @@ -0,0 +1,42 @@ +# frozen_string_literal: true + +# OVERRIDE Hyrax 3.5 to use post instead of get for Solr requests + +module Wings + module CustomQueries + ## + # @see https://github.com/samvera/valkyrie/wiki/Queries#custom-queries + # @see Hyrax::CustomQueries::FindIdsByModel + module FindIdsByModelDecorator + ## + # @note uses solr to do the lookup + # + # @param model [Class] + # @param ids [Enumerable<#to_s>, Symbol] + # + # @return [Enumerable] + def find_ids_by_model(model:, ids: :all) + return enum_for(:find_ids_by_model, model: model, ids: ids) unless block_given? + model_name = ModelRegistry.lookup(model).model_name + + solr_query = "_query_:\"{!raw f=has_model_ssim}#{model_name}\"" + solr_response = ActiveFedora::SolrService.post(solr_query, fl: 'id', rows: @query_rows)['response'] + + loop do + response_docs = solr_response['docs'] + response_docs.select! { |doc| ids.include?(doc['id']) } unless ids == :all + + response_docs.each { |doc| yield doc['id'] } + + break if (solr_response['start'] + solr_response['docs'].count) >= solr_response['numFound'] + solr_response = ActiveFedora::SolrService.post(solr_query, + fl: 'id', + rows: @query_rows, + start: solr_response['start'] + @query_rows)['response'] + end + end + end + end +end + +Wings::CustomQueries::FindIdsByModel.prepend Wings::CustomQueries::FindIdsByModelDecorator