machinio/solrb

View on GitHub
lib/solr/query/request/facet.rb

Summary

Maintainability
A
0 mins
Test Coverage
module Solr
  module Query
    class Request
      class Facet
        include Solr::Support::SchemaHelper

        TERMS_TYPE = :terms
        QUERY_TYPE = :query
        RANGE_TYPE = :range

        attr_reader :field,
                    :type,
                    :name,
                    :value,
                    :limit,
                    :filters,
                    :subfacets,
                    :gap,
                    :lower_bound,
                    :upper_bound,
                    :domain

        def initialize(field:, type:, name: nil, value: nil, filters: [], subfacets: [], options: {})
          if options[:limit].nil? && type == TERMS_TYPE
            raise ArgumentError, "Need to specify :limit option value for 'terms' facet type"
          end

          if options.values_at(:gap, :lower_bound, :upper_bound).any?(&:nil?) && type == RANGE_TYPE
            raise ArgumentError, "Need to specify :lower_bound, :upper_bound, :gap option values for 'range' facet type"
          end

          @field       = field
          @name        = name || field
          @type        = type
          @value       = value
          @filters     = filters
          @subfacets   = subfacets
          @limit       = options[:limit].to_i
          @gap         = options[:gap]
          @lower_bound = options[:lower_bound]
          @upper_bound = options[:upper_bound]
          @domain      = options[:domain]
        end

        def to_solr_h
          return { name.to_s => value } if type == QUERY_TYPE && value

          default_solr_h
        end

        protected

        def default_solr_h
          {
            "#{name}": {
              type: type,
              field: solarize_field(field),
              limit: limit,
              q: filters.any? ? filters.map(&:to_solr_s).join(' AND ') : nil,
              facet: subfacets.map(&:to_solr_h).reduce(&:merge),
              gap: gap,
              start: lower_bound,
              end: upper_bound,
              domain: domain
            }.compact
          }
        end
      end
    end
  end
end