Sha256: 23094f468d96a0e84363693333c50399791d721e23c607d52348ee4508d272f4

Contents?: true

Size: 1.78 KB

Versions: 5

Compression:

Stored size: 1.78 KB

Contents

class Card
  # Class for generating CQL based on filter params
  class FilterQuery
    def initialize filter_keys_with_values, extra_cql={}
      @filter_cql = Hash.new { |h, k| h[k] = [] }
      @rules = yield if block_given?
      @rules ||= {}
      @filter_keys_with_values = filter_keys_with_values
      @extra_cql = extra_cql
      prepare_filter_cql
    end

    def add_to_cql key, value
      @filter_cql[key] << value
    end

    def add_rule key, value
      return unless value.present?
      case @rules[key]
      when Symbol
        send("#{@rules[key]}_rule", key, value)
      when Proc
        @rules[key].call(key, value).each do |cql_key, val|
          @filter_cql[cql_key] << val
        end
      else
        send("#{key}_cql", value)
      end
    end

    def to_cql
      @cql = {}
      @filter_cql.each do |cql_key, values|
        next if values.empty?
        case cql_key
        when :right_plus, :left_plus, :type
          merge_using_and cql_key, values
        else
          merge_using_array cql_key, values
        end
      end
      @cql.merge @extra_cql
    end

    private

    def prepare_filter_cql
      @filter_keys_with_values.each do |key, values|
        add_rule key, values
      end
    end

    def merge_using_array cql_key, values
      @cql[cql_key] = values.one? ? values.first : values
    end

    def merge_using_and cql_key, values
      hash = build_nested_hash cql_key, values
      @cql.deep_merge! hash
    end

    # nest values with the same key using :and
    def build_nested_hash key, values
      return { key => values[0] } if values.one?
      val = values.pop
      { key => val, and: build_nested_hash(key, values) }
    end

    def name_cql name
      return unless name.present?
      @filter_cql[:name] = ["match", name]
    end
  end
end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
card-mod-search-0.11.4 lib/card/filter_query.rb
card-mod-search-0.11.3 lib/card/filter_query.rb
card-mod-search-0.11.2 lib/card/filter_query.rb
card-mod-search-0.11.1 lib/card/filter_query.rb
card-mod-search-0.11.0 lib/card/filter_query.rb