RuthThompson/elastic_queue

View on GitHub
lib/elastic_queue/query_options.rb

Summary

Maintainability
A
25 mins
Test Coverage
require 'elastic_queue/filters'
require 'elastic_queue/sorts'

module ElasticQueue
  class QueryOptions
    include Filters
    include Sorts

    attr_reader :filters, :sorts, :page, :search
    attr_accessor :per_page

    def initialize(options = {})
      @options = { per_page: 30, page: 1 }.merge(options)
      @filters = { and: [] }.with_indifferent_access
      @sorts = []
      self.per_page = @options[:per_page]
      self.page = @options[:page]
    end

    def add_filter(options)
      @filters[:and] += options_to_filters(options)
    end

    def add_sort(options)
      @sorts += options_to_sorts(options)
    end

    def add_search(string)
      @search = string
    end

    def from
      (page - 1) * per_page
    end

    def page=(num)
      @page = num.to_i unless num.blank?
    end

    def body
      b = {}
      b[:filter] = @filters unless @filters[:and].blank?
      b[:sort] = @sorts unless @sorts.blank?
      b[:query] = { query_string: { query: @search } } unless @search.blank?
      b
    end

    def percolator_body
      b = {}
      b[:filter] = @filters unless @filters[:and].blank?
      { query: { constant_score: b } }
    end
  end
end