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