class UR::SabSearch

Constants

SEARCH_SERVICE_URL

Attributes

sab[R]
solr[R]
subjects[R]

Public Class Methods

new(sab_code, options = {}) click to toggle source
# File lib/ur/sab_search.rb, line 15
def initialize(sab_code, options = {})
  solr = RSolr.connect :url => SEARCH_SERVICE_URL
  @sab = UR::Sab.new(sab_code) unless sab_code.nil?

  response = solr.find({
    :indent => 'on',
    :qt => 'sab',
    'facet.mincount' => 1,
    'facet.limit' => -1,
    'facet.prefix' => sab_code,
    :q => '*:*',
  }.merge(options))

  # Expose the Solr response
  @solr = response

  facet_counts = Hash[*response['facet_counts']['facet_fields']['sab_subjects']]

  sorted_subjects = facet_counts.keys.sort { |l,r| r <=> l }
  reduced_facet_counts = {}

  sorted_subjects.each_index do |j|
    current_code = sorted_subjects[j]
    next_code    = sorted_subjects[j + 1]
    count        = facet_counts[current_code]

    if !next_code.nil? && current_code.match(next_code)
      if facet_counts[next_code] != count
        reduced_facet_counts[current_code] = count
      end
    else
      reduced_facet_counts[current_code] = count
    end
  end

  @subjects = reduced_facet_counts.map { |code, count|
      if (@sab.nil? && code.length == 1) ||
         (!@sab.nil? && code.length < @sab.code.length+2) ||
         (!@sab.nil? && code.match(/#{@sab.code}\.\d$/)) ||
         (!@sab.nil? && code.match(/#{@sab.code}\:\w{1,2}$/))
        sab = UR::Sab.new(code, count)
        sab if sab.text
      end
  }.compact.sort { |l,r| l.code <=> r.code }
end