module QldmuseumSearch
Public Instance Methods
Source
# File lib/qldmuseum_search.rb, line 39 def clean_field(value) text = TextUtil.squish(value) text.empty? ? nil : text end
Source
# File lib/qldmuseum_search.rb, line 76 def default_fetch lambda do |url| RabbotHttp.fetch(url, user_agent: QldmuseumConfig::USER_AGENT) end end
Source
# File lib/qldmuseum_search.rb, line 82 def fetch_json(url, fetch: nil) body = (fetch || default_fetch).call(url) JSON.parse(body) end
Source
# File lib/qldmuseum_search.rb, line 121 def lookup(query, fetch: nil) SearchLookup.format(search(query, fetch: fetch), report: QldmuseumReport) end
Source
# File lib/qldmuseum_search.rb, line 95 def merge_results(collections_results) items = collections_results.flat_map { |row| row[:items] } items.sort_by! { |row| -row[:rank] } total = collections_results.sum { |row| row[:total].to_i } { total: total, items: items } end
Source
# File lib/qldmuseum_search.rb, line 26 def parse_query(text) SearchQuery.parse(text, max_length: QldmuseumConfig::MAX_QUERY_LENGTH) end
Source
# File lib/qldmuseum_search.rb, line 54 def parse_record(record, collection:) { title: clean_field(record["Name Title"]) || "", registration: clean_field(record["Registration Number"]) || "", object_type: clean_field(record["Object Type"]) || "", place: place_for(record), collection: collection.to_s, url: clean_field(record["Image Reference"]) || "", rank: record["rank"].to_f } end
Source
# File lib/qldmuseum_search.rb, line 66 def parse_results(payload, collection:) data = payload.is_a?(String) ? JSON.parse(payload) : payload result = data.fetch("result", {}) total = result["total"].to_i items = Array(result["records"]).map { |row| parse_record(row, collection: collection) } .reject { |row| row[:title].empty? } { total: total, items: items } end
Source
# File lib/qldmuseum_search.rb, line 48 def place_for(record) clean_field(record["Primary Prod Place"]) || clean_field(record["Field Coll Place"]) || "" end
Source
# File lib/qldmuseum_search.rb, line 102 def search(query, fetch: nil, limit: QldmuseumConfig::MAX_RESULTS) parsed = parse_query(query) return { error: :usage } if parsed[:empty] fetch_fn = fetch || default_fetch collections_results = QldmuseumConfig::COLLECTIONS.map do |collection| search_collection(parsed[:query], collection: collection, fetch: fetch_fn, limit: limit) end merged = merge_results(collections_results) { query: parsed[:query], total: merged[:total], items: merged[:items].first(limit) } rescue StandardError { error: :fetch, query: parsed&.dig(:query) || query.to_s.strip } end
Source
# File lib/qldmuseum_search.rb, line 87 def search_collection(query, collection:, fetch:, limit: QldmuseumConfig::MAX_RESULTS) url = search_url(resource_id: collection[:resource_id], query: query, limit: limit) payload = fetch_json(url, fetch: fetch) return { total: 0, items: [] } unless payload["success"] parse_results(payload, collection: collection[:key]) end
Source
# File lib/qldmuseum_search.rb, line 30 def search_url(resource_id:, query:, limit: QldmuseumConfig::MAX_RESULTS) params = { resource_id: resource_id, q: query, limit: limit } "#{QldmuseumConfig::CKAN_BASE}/datastore_search?#{URI.encode_www_form(params)}" end
Source
# File lib/qldmuseum_search.rb, line 44 def truncate_text(text, max_length) TextUtil.truncate(text, max_length) end
Source
# File lib/qldmuseum_search.rb, line 22 def usage_message "Usage: !qldmuseum <query> — search Queensland Museum historical and ethnographic collections" end