From 8a5a9ca0012f44630ce01f1007f1047ed4c432af Mon Sep 17 00:00:00 2001 From: Bill Dueber Date: Fri, 30 Oct 2020 00:29:29 -0400 Subject: [PATCH 01/15] Do a test for mirlyn to branch, and set up fake data in requesty until we can get the real thing --- Gemfile | 3 + lib/spectrum/request/requesty.rb | 165 +++++++++++++++++++++---------- spectrum-json.gemspec | 1 + 3 files changed, 116 insertions(+), 53 deletions(-) diff --git a/Gemfile b/Gemfile index 35483a8..4fe54a4 100644 --- a/Gemfile +++ b/Gemfile @@ -10,5 +10,8 @@ gem 'aleph', gem 'spectrum-config', git: 'https://github.com/mlibrary/spectrum-config', branch: 'master' + +gem 'mlibrary_search_parser', path: '../mlibrary_search_parser' + # Specify your gem's dependencies in spectrum-json.gemspec gemspec diff --git a/lib/spectrum/request/requesty.rb b/lib/spectrum/request/requesty.rb index 02771f4..ae503e1 100644 --- a/lib/spectrum/request/requesty.rb +++ b/lib/spectrum/request/requesty.rb @@ -1,14 +1,16 @@ # frozen_string_literal: true +require 'mlibrary_search_parser' + module Spectrum module Request module Requesty extend ActiveSupport::Concern - FLINT = 'Flint' - FLINT_PROXY_PREFIX = 'http://libproxy.umflint.edu:2048/login?url=' + FLINT = 'Flint' + FLINT_PROXY_PREFIX = 'http://libproxy.umflint.edu:2048/login?url=' DEFAULT_PROXY_PREFIX = 'https://proxy.lib.umich.edu/login?url=' - INSTITUTION_KEY = 'dlpsInstitutionId' + INSTITUTION_KEY = 'dlpsInstitutionId' included do attr_accessor :request_id, :slice, :sort, :start @@ -23,49 +25,85 @@ def proxy_prefix DEFAULT_PROXY_PREFIX end + def is_mirlyn?(focus, data) + focus and + data['uid'] == 'mirlyn' and + data.has_key?('raw_query') and + data['raw_query'].match(/\S/) + end + def initialize(request = nil, focus = nil) @request = request @focus = focus - if (@data = get_data(@request)) - + @data = get_data(@request) + if (@data) bad_request 'Request json did not validate' unless Spectrum::Json::Schema.validate(:request, @data) - if @data - @uid = @data['uid'] - @start = @data['start'].to_i - @count = @data['count'].to_i - @page = @data['page'] - @tree = Spectrum::FieldTree.new(@data['field_tree']) - @facets = Spectrum::FacetList.new(@focus.default_facets.merge(@focus.filter_facets(@data['facets'] || {}))) - @sort = @data['sort'] - @settings = @data['settings'] - @request_id = @data['request_id'] - - if @page || @count == 0 - @page_size = @count - elsif @start < @count - @slice = [@start, @count] - @page_size = @start + @count - @page_number = 0 - else - last_record = @start + @count - @page_size = @count - @page_number = (@start / @page_size).floor - - while @page_number > 0 && @page_size * (@page_number + 1) < last_record - first_record = @page_size * @page_number - if @start - first_record < @page_number - @page_size = (last_record / @page_number).ceil - else - @page_size += (@start - first_record).floor - end - @page_number = (@start / @page_size).floor + ############################ + # Fake section + # ######################### + @data['raw_query'] = "title:dune AND author:herbert" + @parserconfig = { + 'qt' => 'standard', + 'search_field_default' => 'allfields', + 'search_fields' => { + 'title' => { + 'qf' => 'title_common_exact^1000 title_common^120 title_equiv^60 title_rest^30 series^10 series2^5', + 'pf' => 'serialTitle_common_exact^600 title_common_exact^500 title_l^150 title_common^100 title_a_exact^50 title_top^30 title_rest^20 series^3 series2^2' + }, + 'author' => { + 'qf' => 'author^10 author2^5 author_top^2 author_rest^1', + 'pf' => 'author^25000 author2^20000 author_top^5000 author_rest^1000' + } + } + } + @builder = MLibrarySearchParser::SearchBuilder.new(@parserconfig) + @is_mirlyn = is_mirlyn?(@focus, @data) + ############################## + ############################## + + + @uid = @data['uid'] + @start = @data['start'].to_i + @count = @data['count'].to_i + @page = @data['page'] + @tree = Spectrum::FieldTree.new(@data['field_tree']) + @facets = Spectrum::FacetList.new(@focus.default_facets.merge(@focus.filter_facets(@data['facets'] || {}))) + @sort = @data['sort'] + @settings = @data['settings'] + @request_id = @data['request_id'] + + @psearch = if @is_mirlyn + @builder.build(@data['raw_query']) + else + nil + end + + + if @page || @count == 0 + @page_size = @count + elsif @start < @count + @slice = [@start, @count] + @page_size = @start + @count + @page_number = 0 + else + last_record = @start + @count + @page_size = @count + @page_number = (@start / @page_size).floor + + while @page_number > 0 && @page_size * (@page_number + 1) < last_record + first_record = @page_size * @page_number + if @start - first_record < @page_number + @page_size = (last_record / @page_number).ceil + else + @page_size += (@start - first_record).floor end - @slice = [@start - @page_size * @page_number, @count] + @page_number = (@start / @page_size).floor end - - validate! + @slice = [@start - @page_size * @page_number, @count] end + + validate! end @page = (@page_number || 0) + 1 @@ -152,34 +190,55 @@ def fvf(_filter_map = {}) @focus ? @focus.fvf(@facets) : [] end - def query(query_map = {}, filter_map = {}) + + def mirlyn_query + lp = MLibrarySearchParser::Transformer::Solr::LocalParams.new(@psearch) + b = base_query.merge(lp.params) + b[:qt] = 'standard' + b + end + + def base_query(query_map = {}, filter_map = {}) { - q: @tree.query(query_map), - page: @page, - start: @start, - rows: @page_size, - fq: @facets.query(filter_map, (@focus&.value_map) || {}), - per_page: @page_size - }.merge(@tree.params(query_map)).tap do |ret| + page: @page, + start: @start, + rows: @page_size, + fq: @facets.query(filter_map, (@focus&.value_map) || {}), + per_page: @page_size + } + end + + def tree_query(query_map = {}, filter_map = {}) + base_query(query_map, filter_map).merge({ + q: @tree.query(query_map), + }).merge(@tree.params(query_map)).tap do |ret| if ret[:q].match(/ (AND|OR|NOT) /) ret[:q] = '+(' + ret[:q] + ')' end end end + def query(query_map = {}, filter_map = {}) + if @is_mirlyn + mirlyn_query + else + tree_query(query_map, filter_map) + end + end + def facets @facets end def spectrum ret = { - uid: @uid, - start: @start, - count: @count, - field_tree: @tree.spectrum, - facets: @facets.spectrum, - sort: @sort, - settings: @settings + uid: @uid, + start: @start, + count: @count, + field_tree: @tree.spectrum, + facets: @facets.spectrum, + sort: @sort, + settings: @settings } if @request_id ret.merge(request_id: @request_id) diff --git a/spectrum-json.gemspec b/spectrum-json.gemspec index 1ac704b..66961c6 100644 --- a/spectrum-json.gemspec +++ b/spectrum-json.gemspec @@ -47,4 +47,5 @@ Gem::Specification.new do |spec| spec.add_dependency 'execjs' spec.add_dependency 'rsolr' spec.add_dependency 'httparty' + end From 2409bfd36b448bf86ba62222e360ae348d041254 Mon Sep 17 00:00:00 2001 From: Bill Dueber Date: Fri, 30 Oct 2020 14:58:25 -0400 Subject: [PATCH 02/15] Try to get request from app --- lib/spectrum/request/requesty.rb | 47 ++++++++++---------------------- 1 file changed, 15 insertions(+), 32 deletions(-) diff --git a/lib/spectrum/request/requesty.rb b/lib/spectrum/request/requesty.rb index ae503e1..33b9e6e 100644 --- a/lib/spectrum/request/requesty.rb +++ b/lib/spectrum/request/requesty.rb @@ -39,26 +39,12 @@ def initialize(request = nil, focus = nil) if (@data) bad_request 'Request json did not validate' unless Spectrum::Json::Schema.validate(:request, @data) - ############################ - # Fake section - # ######################### - @data['raw_query'] = "title:dune AND author:herbert" - @parserconfig = { - 'qt' => 'standard', - 'search_field_default' => 'allfields', - 'search_fields' => { - 'title' => { - 'qf' => 'title_common_exact^1000 title_common^120 title_equiv^60 title_rest^30 series^10 series2^5', - 'pf' => 'serialTitle_common_exact^600 title_common_exact^500 title_l^150 title_common^100 title_a_exact^50 title_top^30 title_rest^20 series^3 series2^2' - }, - 'author' => { - 'qf' => 'author^10 author2^5 author_top^2 author_rest^1', - 'pf' => 'author^25000 author2^20000 author_top^5000 author_rest^1000' - } - } - } - @builder = MLibrarySearchParser::SearchBuilder.new(@parserconfig) @is_mirlyn = is_mirlyn?(@focus, @data) + if @is_mirlyn + @builder = MLibrarySearchParser::SearchBuilder.new(@focus.raw_config) + @psearch = @builder.build(@data['raw_query']) + end + ############################## ############################## @@ -73,12 +59,6 @@ def initialize(request = nil, focus = nil) @settings = @data['settings'] @request_id = @data['request_id'] - @psearch = if @is_mirlyn - @builder.build(@data['raw_query']) - else - nil - end - if @page || @count == 0 @page_size = @count @@ -110,6 +90,7 @@ def initialize(request = nil, focus = nil) @start ||= 0 @count ||= 0 @slice ||= [0, @count] + @tree ||= Spectrum::FieldTree::Empty.new @facets ||= Spectrum::FacetList.new(nil) @page_size ||= 0 @@ -144,7 +125,6 @@ def is_scholarly? def is_open_access? pseudo_facet?('is_open_access') end - def book_mark? @request.params['type'] == 'Record' && @request.params['id_field'] == 'BookMark' rescue StandardError @@ -192,10 +172,13 @@ def fvf(_filter_map = {}) def mirlyn_query - lp = MLibrarySearchParser::Transformer::Solr::LocalParams.new(@psearch) - b = base_query.merge(lp.params) - b[:qt] = 'standard' - b + lp = MLibrarySearchParser::Transformer::Solr::LocalParams.new(@psearch) + defaults = if lp.config['search_atr_defaults'] + lp.config['search_atr_defaults'] + else + {} + end + base_query.merge(defaults).merge(lp.params) end def base_query(query_map = {}, filter_map = {}) @@ -210,8 +193,8 @@ def base_query(query_map = {}, filter_map = {}) def tree_query(query_map = {}, filter_map = {}) base_query(query_map, filter_map).merge({ - q: @tree.query(query_map), - }).merge(@tree.params(query_map)).tap do |ret| + q: @tree.query(query_map), + }).merge(@tree.params(query_map)).tap do |ret| if ret[:q].match(/ (AND|OR|NOT) /) ret[:q] = '+(' + ret[:q] + ')' end From 621a02ed1c7c2ae9ea15770a17ef01a6ea480106 Mon Sep 17 00:00:00 2001 From: Albert Bertram Date: Tue, 3 Nov 2020 16:36:34 -0500 Subject: [PATCH 03/15] Ship messages from the query parser to pride. --- app/controllers/json_controller.rb | 2 +- lib/spectrum/request/null.rb | 4 ++++ lib/spectrum/request/record.rb | 4 ++++ lib/spectrum/request/requesty.rb | 21 +++++++++++++++++---- 4 files changed, 26 insertions(+), 5 deletions(-) diff --git a/app/controllers/json_controller.rb b/app/controllers/json_controller.rb index 2ce457f..82ffb94 100644 --- a/app/controllers/json_controller.rb +++ b/app/controllers/json_controller.rb @@ -285,7 +285,7 @@ def search_response { request: @request.spectrum, response: @response.spectrum, - messages: @messages.map(&:spectrum), + messages: (@messages + @request.messages).map(&:spectrum), total_available: @response.total_available, specialists: @specialists.spectrum, datastore: @datastore.spectrum, diff --git a/lib/spectrum/request/null.rb b/lib/spectrum/request/null.rb index 3922d5f..9ae5678 100644 --- a/lib/spectrum/request/null.rb +++ b/lib/spectrum/request/null.rb @@ -7,6 +7,10 @@ def proxy_prefix 'https://proxy.lib.umich.edu/login?url=' end + def messages + [] + end + def spectrum nil end diff --git a/lib/spectrum/request/record.rb b/lib/spectrum/request/record.rb index b496554..72a592a 100644 --- a/lib/spectrum/request/record.rb +++ b/lib/spectrum/request/record.rb @@ -14,6 +14,10 @@ def proxy_prefix DEFAULT_PROXY_PREFIX end + def messages + [] + end + def initialize(request) @request = request if request.params[:source] == 'summon' diff --git a/lib/spectrum/request/requesty.rb b/lib/spectrum/request/requesty.rb index 33b9e6e..bb44b4d 100644 --- a/lib/spectrum/request/requesty.rb +++ b/lib/spectrum/request/requesty.rb @@ -13,7 +13,7 @@ module Requesty INSTITUTION_KEY = 'dlpsInstitutionId' included do - attr_accessor :request_id, :slice, :sort, :start + attr_accessor :request_id, :slice, :sort, :start, :messages end def can_sort? @@ -33,9 +33,10 @@ def is_mirlyn?(focus, data) end def initialize(request = nil, focus = nil) - @request = request - @focus = focus - @data = get_data(@request) + @request = request + @focus = focus + @data = get_data(@request) + @messages = [] if (@data) bad_request 'Request json did not validate' unless Spectrum::Json::Schema.validate(:request, @data) @@ -43,6 +44,18 @@ def initialize(request = nil, focus = nil) if @is_mirlyn @builder = MLibrarySearchParser::SearchBuilder.new(@focus.raw_config) @psearch = @builder.build(@data['raw_query']) + @psearch.errors.each do |msg| + @messages << Spectrum::Response::Message.error( + summary: 'Query Parse Error', + details: msg.to_s + ) + end + @psearch.warnings.each do |msg| + @messages << Spectrum::Response::Message.warn( + summary: 'Query Parse Warning', + details: msg.to_s + ) + end end ############################## From 570d0f62dc4d57c4200eedecfa30d58691352927 Mon Sep 17 00:00:00 2001 From: Bill Dueber Date: Wed, 4 Nov 2020 09:57:00 -0500 Subject: [PATCH 04/15] Rename mirlyn stuff to new_parser --- Gemfile | 4 +++- lib/spectrum/request/requesty.rb | 28 +++++++++++++--------------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/Gemfile b/Gemfile index 4fe54a4..d05048e 100644 --- a/Gemfile +++ b/Gemfile @@ -11,7 +11,9 @@ gem 'spectrum-config', git: 'https://github.com/mlibrary/spectrum-config', branch: 'master' -gem 'mlibrary_search_parser', path: '../mlibrary_search_parser' +gem 'mlibrary_search_parser', + git: 'https://github.com/mlibrary/mlibrary_search_parser', + branch: 'master' # Specify your gem's dependencies in spectrum-json.gemspec gemspec diff --git a/lib/spectrum/request/requesty.rb b/lib/spectrum/request/requesty.rb index bb44b4d..601726b 100644 --- a/lib/spectrum/request/requesty.rb +++ b/lib/spectrum/request/requesty.rb @@ -25,7 +25,7 @@ def proxy_prefix DEFAULT_PROXY_PREFIX end - def is_mirlyn?(focus, data) + def is_new_parser?(focus, data) focus and data['uid'] == 'mirlyn' and data.has_key?('raw_query') and @@ -40,8 +40,8 @@ def initialize(request = nil, focus = nil) if (@data) bad_request 'Request json did not validate' unless Spectrum::Json::Schema.validate(:request, @data) - @is_mirlyn = is_mirlyn?(@focus, @data) - if @is_mirlyn + @is_new_parser = is_new_parser?(@focus, @data) + if @is_new_parser @builder = MLibrarySearchParser::SearchBuilder.new(@focus.raw_config) @psearch = @builder.build(@data['raw_query']) @psearch.errors.each do |msg| @@ -100,9 +100,9 @@ def initialize(request = nil, focus = nil) end @page = (@page_number || 0) + 1 - @start ||= 0 - @count ||= 0 - @slice ||= [0, @count] + @start ||= 0 + @count ||= 0 + @slice ||= [0, @count] @tree ||= Spectrum::FieldTree::Empty.new @facets ||= Spectrum::FacetList.new(nil) @@ -138,6 +138,7 @@ def is_scholarly? def is_open_access? pseudo_facet?('is_open_access') end + def book_mark? @request.params['type'] == 'Record' && @request.params['id_field'] == 'BookMark' rescue StandardError @@ -184,14 +185,10 @@ def fvf(_filter_map = {}) end - def mirlyn_query + def new_parser_query(query_map = {}, filter_map = {}) lp = MLibrarySearchParser::Transformer::Solr::LocalParams.new(@psearch) - defaults = if lp.config['search_atr_defaults'] - lp.config['search_atr_defaults'] - else - {} - end - base_query.merge(defaults).merge(lp.params) + defaults = lp.config['search_atr_defaults'] || {} + base_query(query_map, filter_map).merge(defaults).merge(lp.params) end def base_query(query_map = {}, filter_map = {}) @@ -204,6 +201,7 @@ def base_query(query_map = {}, filter_map = {}) } end + # Query derived from pride-based parser def tree_query(query_map = {}, filter_map = {}) base_query(query_map, filter_map).merge({ q: @tree.query(query_map), @@ -215,8 +213,8 @@ def tree_query(query_map = {}, filter_map = {}) end def query(query_map = {}, filter_map = {}) - if @is_mirlyn - mirlyn_query + if @is_new_parser + new_parser_query(query_map, filter_map) else tree_query(query_map, filter_map) end From 84371ab15e52d2ed3b15e077a1a7371159008626 Mon Sep 17 00:00:00 2001 From: Albert Bertram Date: Wed, 4 Nov 2020 14:28:25 -0500 Subject: [PATCH 05/15] Fix for travis. --- spectrum-json.gemspec | 1 + 1 file changed, 1 insertion(+) diff --git a/spectrum-json.gemspec b/spectrum-json.gemspec index 66961c6..061c19b 100644 --- a/spectrum-json.gemspec +++ b/spectrum-json.gemspec @@ -47,5 +47,6 @@ Gem::Specification.new do |spec| spec.add_dependency 'execjs' spec.add_dependency 'rsolr' spec.add_dependency 'httparty' + spec.add_dependency 'dotenv' end From 1d230789c622b70164e2f810c26a682a4cf73d92 Mon Sep 17 00:00:00 2001 From: Albert Bertram Date: Fri, 22 Jan 2021 15:23:49 -0500 Subject: [PATCH 06/15] Be able to show both the type of error and the error message --- lib/spectrum/request/requesty.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/spectrum/request/requesty.rb b/lib/spectrum/request/requesty.rb index 601726b..5c8a437 100644 --- a/lib/spectrum/request/requesty.rb +++ b/lib/spectrum/request/requesty.rb @@ -46,13 +46,13 @@ def initialize(request = nil, focus = nil) @psearch = @builder.build(@data['raw_query']) @psearch.errors.each do |msg| @messages << Spectrum::Response::Message.error( - summary: 'Query Parse Error', + summary: "Query Parse Error: #{msg.class}", details: msg.to_s ) end @psearch.warnings.each do |msg| @messages << Spectrum::Response::Message.warn( - summary: 'Query Parse Warning', + summary: "Query Parse Warning: #{msg.class}", details: msg.to_s ) end From 516d9b74ff9801920811705ddfd0098b70aea6f1 Mon Sep 17 00:00:00 2001 From: Albert Bertram Date: Tue, 26 Jan 2021 13:53:15 -0500 Subject: [PATCH 07/15] SEARCH-1276: Putting the new_parser? decision on the focus configuration. --- lib/spectrum/request/requesty.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/spectrum/request/requesty.rb b/lib/spectrum/request/requesty.rb index 5c8a437..ccc142f 100644 --- a/lib/spectrum/request/requesty.rb +++ b/lib/spectrum/request/requesty.rb @@ -27,7 +27,7 @@ def proxy_prefix def is_new_parser?(focus, data) focus and - data['uid'] == 'mirlyn' and + focus.new_parser? and data.has_key?('raw_query') and data['raw_query'].match(/\S/) end From 62a8fdc28e2ceeb0614bb1a7c9d7728d37fe54c1 Mon Sep 17 00:00:00 2001 From: Heymo Date: Fri, 12 Feb 2021 08:29:27 -0500 Subject: [PATCH 08/15] Added whitespaces --- lib/spectrum/facet_list.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/spectrum/facet_list.rb b/lib/spectrum/facet_list.rb index 56c5102..8d41cc3 100644 --- a/lib/spectrum/facet_list.rb +++ b/lib/spectrum/facet_list.rb @@ -46,13 +46,13 @@ def query(filter_map = {}, value_map = {}) end.join(' AND ') if key == 'date_of_publication' || original_key == 'date_of_publication' - value.match(/^before(\d+)$/) do |m| + value.match(/^before\s*(\d+)$/) do |m| value = "[* TO #{m[1]}]" end - value.match(/^after(\d+)$/) do |m| + value.match(/^after\s*(\d+)$/) do |m| value = "[#{m[1]} TO *]" end - value.match(/^(\d+)to(\d+)$/) do |m| + value.match(/^(\d+)\s*to\s*(\d+)$/) do |m| value = "[#{m[1]} TO #{m[2]}]" end end From 757aba5ce9879bf9f1015563294b47dabca1927c Mon Sep 17 00:00:00 2001 From: Albert Bertram Date: Mon, 15 Feb 2021 13:24:17 -0500 Subject: [PATCH 09/15] I forgot this was solr_escape()d --- lib/spectrum/facet_list.rb | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/spectrum/facet_list.rb b/lib/spectrum/facet_list.rb index 8d41cc3..1ccd269 100644 --- a/lib/spectrum/facet_list.rb +++ b/lib/spectrum/facet_list.rb @@ -46,13 +46,14 @@ def query(filter_map = {}, value_map = {}) end.join(' AND ') if key == 'date_of_publication' || original_key == 'date_of_publication' - value.match(/^before\s*(\d+)$/) do |m| + raw_value = value.gsub(/\\/, '') + raw_value.match(/^before\s*(\d+)$/) do |m| value = "[* TO #{m[1]}]" end - value.match(/^after\s*(\d+)$/) do |m| + raw_value.match(/^after\s*(\d+)$/) do |m| value = "[#{m[1]} TO *]" end - value.match(/^(\d+)\s*to\s*(\d+)$/) do |m| + raw_value.match(/^(\d+)\s*to\s*(\d+)$/) do |m| value = "[#{m[1]} TO #{m[2]}]" end end From 1a9443c4296d1d3fc5cc3510054e4b37b5bff154 Mon Sep 17 00:00:00 2001 From: Albert Bertram Date: Sun, 3 Jan 2021 14:41:37 -0500 Subject: [PATCH 10/15] Add ERB parsing to remaining YAML.load_file calls. --- lib/spectrum/json/railtie.rb | 2 +- lib/spectrum/policy/get_this.rb | 2 +- lib/spectrum/response/specialists.rb | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/spectrum/json/railtie.rb b/lib/spectrum/json/railtie.rb index 31b68f8..e7b240e 100644 --- a/lib/spectrum/json/railtie.rb +++ b/lib/spectrum/json/railtie.rb @@ -14,7 +14,7 @@ class Railtie < Rails::Railtie end config_data = if File.exist?(aleph_config_file = File.join(Rails.root, 'config', 'aleph.yml')) - YAML.load_file(aleph_config_file) + YAML.load(ERB.new(File.read(aleph_config_file)).result) else {} end diff --git a/lib/spectrum/policy/get_this.rb b/lib/spectrum/policy/get_this.rb index a5a5f65..8e9da88 100644 --- a/lib/spectrum/policy/get_this.rb +++ b/lib/spectrum/policy/get_this.rb @@ -102,7 +102,7 @@ class << self attr_reader :options def load_config(config_file) - @options = YAML.load_file(config_file).map do |option| + @options = YAML.load(ERB.new(File.read(config_file)).result).map do |option| Option.new(option) end end diff --git a/lib/spectrum/response/specialists.rb b/lib/spectrum/response/specialists.rb index 694a6a7..ab147cd 100644 --- a/lib/spectrum/response/specialists.rb +++ b/lib/spectrum/response/specialists.rb @@ -195,7 +195,7 @@ class Specialists class << self attr_reader :config, :logger, :cache def configure(file) - @config = YAML.load_file(file).map do |key, value| + @config = YAML.load(ERB.new(::File.read(file)).result).map do |key, value| if key == 'logger' @logger = value nil From 2c0b9ef4aeeaa4840a5a37b2c3147b5e0a9d466c Mon Sep 17 00:00:00 2001 From: Anthony Thomas Date: Wed, 3 Mar 2021 14:53:20 -0500 Subject: [PATCH 11/15] Fix typo --- lib/spectrum/request/requesty.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/spectrum/request/requesty.rb b/lib/spectrum/request/requesty.rb index ccc142f..10ab70b 100644 --- a/lib/spectrum/request/requesty.rb +++ b/lib/spectrum/request/requesty.rb @@ -187,7 +187,7 @@ def fvf(_filter_map = {}) def new_parser_query(query_map = {}, filter_map = {}) lp = MLibrarySearchParser::Transformer::Solr::LocalParams.new(@psearch) - defaults = lp.config['search_atr_defaults'] || {} + defaults = lp.config['search_attr_defaults'] || {} base_query(query_map, filter_map).merge(defaults).merge(lp.params) end From 3fe63a48d7908367b63ba694a61c15cf260bc8e7 Mon Sep 17 00:00:00 2001 From: Anthony Thomas Date: Wed, 3 Mar 2021 14:53:44 -0500 Subject: [PATCH 12/15] Might be minimal changes to fix specialist search on catalog only? --- lib/spectrum/response/specialists.rb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/spectrum/response/specialists.rb b/lib/spectrum/response/specialists.rb index ab147cd..dd94133 100644 --- a/lib/spectrum/response/specialists.rb +++ b/lib/spectrum/response/specialists.rb @@ -92,7 +92,8 @@ def fetch_records(query) fq: query[:fq], qq: '"' + RSolr.solr_escape(query[:q]) + '"', rows: rows.first, - fl: fields.first + fl: fields.first, + df: query[:df] || 'allfields' ) client.first.get('select', params: params) end @@ -236,6 +237,9 @@ def spectrum specialist_focus.facet_map ) return [] if query[:q] == '*:*' + if query[:clean_string] + query[:q] = query[:clean_string] + end begin results = engines.map do |engine| engine.find(query) From 4c82847e99b518914b7d33538a0501f3883fad7c Mon Sep 17 00:00:00 2001 From: Albert Bertram Date: Tue, 9 Mar 2021 12:00:39 -0500 Subject: [PATCH 13/15] Add structured data to the error messages. --- lib/spectrum/request/requesty.rb | 10 ++++++---- lib/spectrum/response/message.rb | 3 ++- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/lib/spectrum/request/requesty.rb b/lib/spectrum/request/requesty.rb index ccc142f..5a0605e 100644 --- a/lib/spectrum/request/requesty.rb +++ b/lib/spectrum/request/requesty.rb @@ -46,14 +46,16 @@ def initialize(request = nil, focus = nil) @psearch = @builder.build(@data['raw_query']) @psearch.errors.each do |msg| @messages << Spectrum::Response::Message.error( - summary: "Query Parse Error: #{msg.class}", - details: msg.to_s + summary: "Query Parse Error", + details: msg.details, + data: msg.to_h ) end @psearch.warnings.each do |msg| @messages << Spectrum::Response::Message.warn( - summary: "Query Parse Warning: #{msg.class}", - details: msg.to_s + summary: "Query Parse Warning", + details: msg.details, + data: msg.to_h, ) end end diff --git a/lib/spectrum/response/message.rb b/lib/spectrum/response/message.rb index 0dc97e1..97c0a03 100644 --- a/lib/spectrum/response/message.rb +++ b/lib/spectrum/response/message.rb @@ -9,6 +9,7 @@ def initialize(args = {}) @class = TYPES.include?(args[:class]) ? args[:class] : DEFAULT_TYPE @summary = args[:summary] @details = args[:details] + @data = args[:data] end class << self @@ -21,7 +22,7 @@ class << self end def spectrum - { class: @class, summary: @summary, details: @details } + { class: @class, summary: @summary, details: @details, data: @data } end end end From dfe86ee9466e3205159b844aef06e1b8645ae1f6 Mon Sep 17 00:00:00 2001 From: Anthony Thomas Date: Wed, 10 Mar 2021 12:30:57 -0500 Subject: [PATCH 14/15] Re-parse the original search for specialist search purposes The entire issue with specialist search has been that different datastores have different search fields. Sidestep all of that by simply re-parsing the original search using the specialist search config, which is always catalog search, which on this branch is always using new parser. --- lib/spectrum/request/requesty.rb | 12 ++++++++---- lib/spectrum/response/specialists.rb | 15 ++++++++------- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/lib/spectrum/request/requesty.rb b/lib/spectrum/request/requesty.rb index 6604f6b..bedf8e5 100644 --- a/lib/spectrum/request/requesty.rb +++ b/lib/spectrum/request/requesty.rb @@ -42,8 +42,7 @@ def initialize(request = nil, focus = nil) @is_new_parser = is_new_parser?(@focus, @data) if @is_new_parser - @builder = MLibrarySearchParser::SearchBuilder.new(@focus.raw_config) - @psearch = @builder.build(@data['raw_query']) + @psearch = build_psearch @psearch.errors.each do |msg| @messages << Spectrum::Response::Message.error( summary: "Query Parse Error", @@ -187,8 +186,8 @@ def fvf(_filter_map = {}) end - def new_parser_query(query_map = {}, filter_map = {}) - lp = MLibrarySearchParser::Transformer::Solr::LocalParams.new(@psearch) + def new_parser_query(query_map = {}, filter_map = {}, built_search = @psearch) + lp = MLibrarySearchParser::Transformer::Solr::LocalParams.new(built_search) defaults = lp.config['search_attr_defaults'] || {} base_query(query_map, filter_map).merge(defaults).merge(lp.params) end @@ -243,6 +242,11 @@ def spectrum end end + def build_psearch(focus = @focus) + @builder = MLibrarySearchParser::SearchBuilder.new(focus.raw_config) + @builder.build(@data['raw_query']) + end + private def bad_request(message) diff --git a/lib/spectrum/response/specialists.rb b/lib/spectrum/response/specialists.rb index dd94133..1378068 100644 --- a/lib/spectrum/response/specialists.rb +++ b/lib/spectrum/response/specialists.rb @@ -87,10 +87,9 @@ def client end def fetch_records(query) - params = focus.first.solr_params.merge( + params = focus.first.solr_params.merge(query).merge( q: query[:q], fq: query[:fq], - qq: '"' + RSolr.solr_escape(query[:q]) + '"', rows: rows.first, fl: fields.first, df: query[:df] || 'allfields' @@ -232,14 +231,16 @@ def engines def spectrum return [] if data[:request].instance_eval { @request&.env&.fetch('dlpsInstitutionId', nil)&.include?('Flint') } specialist_focus = Spectrum::Json.foci['mirlyn'] - query = data[:request].query( + # catalog/mirlyn is on new parser + # because diff datastores have diff search fields, + # we re-parse the original search under catalog config + psearch = data[:request].build_psearch(specialist_focus) + query = data[:request].new_parser_query( specialist_focus.fields, - specialist_focus.facet_map + specialist_focus.facet_map, + psearch ) return [] if query[:q] == '*:*' - if query[:clean_string] - query[:q] = query[:clean_string] - end begin results = engines.map do |engine| engine.find(query) From 5ed26738bf5ac3e1ffa789804dd9955367c3eddc Mon Sep 17 00:00:00 2001 From: Anthony Thomas Date: Fri, 12 Mar 2021 15:51:14 -0500 Subject: [PATCH 15/15] Remove extraneous stuff from specialist query params Now that we are merging the actual query into our solr params for the specialist search, don't need to copy q, fq, and df from the query. We do need rows and fields which are specific to specialist search --- lib/spectrum/response/specialists.rb | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/lib/spectrum/response/specialists.rb b/lib/spectrum/response/specialists.rb index 1378068..5f7142f 100644 --- a/lib/spectrum/response/specialists.rb +++ b/lib/spectrum/response/specialists.rb @@ -88,11 +88,8 @@ def client def fetch_records(query) params = focus.first.solr_params.merge(query).merge( - q: query[:q], - fq: query[:fq], rows: rows.first, - fl: fields.first, - df: query[:df] || 'allfields' + fl: fields.first ) client.first.get('select', params: params) end