class Card::FilterQuery

Class for generating CQL based on filter params

Public Class Methods

new(filter_keys_with_values, extra_cql={}) { || ... } click to toggle source
# File lib/card/filter_query.rb, line 4
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

Public Instance Methods

add_rule(key, value) click to toggle source
# File lib/card/filter_query.rb, line 17
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
add_to_cql(key, value) click to toggle source
# File lib/card/filter_query.rb, line 13
def add_to_cql key, value
  @filter_cql[key] << value
end
to_cql() click to toggle source
# File lib/card/filter_query.rb, line 32
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 Instance Methods

build_nested_hash(key, values) click to toggle source

nest values with the same key using :and

# File lib/card/filter_query.rb, line 65
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
merge_using_and(cql_key, values) click to toggle source
# File lib/card/filter_query.rb, line 59
def merge_using_and cql_key, values
  hash = build_nested_hash cql_key, values
  @cql.deep_merge! hash
end
merge_using_array(cql_key, values) click to toggle source
# File lib/card/filter_query.rb, line 55
def merge_using_array cql_key, values
  @cql[cql_key] = values.one? ? values.first : values
end
name_cql(name) click to toggle source
# File lib/card/filter_query.rb, line 72
def name_cql name
  return unless name.present?

  @filter_cql[:name] = ["match", name]
end
prepare_filter_cql() click to toggle source
# File lib/card/filter_query.rb, line 49
def prepare_filter_cql
  @filter_keys_with_values.each do |key, values|
    add_rule key, values
  end
end