Sha256: d82cc70ae55f9f69ae11f59f7057af2345fcbec0ef5173fe35b3a2e42487b50b

Contents?: true

Size: 1.34 KB

Versions: 2

Compression:

Stored size: 1.34 KB

Contents

module Esearch
  class Presenter

    # Base class for facets in results
    class Facet < self

      TYPE_KEY = '_type'.freeze

      # Build facet from raw
      #
      # @param [Hash] raw
      #
      # @return [Facet]
      #
      # @api private
      #
      def self.build(raw)
        type = raw.fetch(TYPE_KEY)
        get(type).new(raw)
      end

      # Get class for type
      #
      # @param [String] type
      #
      # @return [Class:Facet]
      #
      # @api private
      #
      def self.get(type)
        REGISTRY.fetch(type) do
          raise "Facet with type #{type.inspect} is not known"
        end
      end
      private_class_method :get

      # Enumerate aspects
      #
      # @return [Enumerable<Aspect>]
      #
      # @api private
      #
      def aspects
        util = self.class
        raw.fetch(util::FACET_KEY).map do |item|
          util::ASPECT_CLASS.new(item)
        end
      end
      memoize :aspects

    private

      # Facet that returns range counts
      class Range < self
        ASPECT_CLASS = Aspect::Range
        FACET_KEY = 'ranges'.freeze
      end

      # Facet that returns term counts
      class Terms < self
        ASPECT_CLASS = Aspect::Term
        FACET_KEY = 'terms'.freeze
      end

      REGISTRY = {
        'range' => Range,
        'terms' => Terms
      }.freeze

    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
esearch-0.2.1 lib/esearch/presenter/facet.rb
esearch-0.2.0 lib/esearch/presenter/facet.rb