module Rokaki::FilterModel::ClassMethods

Private Instance Methods

_build_basic_filter(key) click to toggle source
# File lib/rokaki/filter_model.rb, line 91
def _build_basic_filter(key)
  basic_filter = BasicFilter.new(
    keys: [key],
    prefix: filter_key_prefix,
    infix: filter_key_infix,
    like_semantics: @_like_semantics,
    i_like_semantics: @i_like_semantics,
    db: @_filter_db
  )
  basic_filter.call
  basic_filter
end
_build_nested_filter(filters_object) click to toggle source
# File lib/rokaki/filter_model.rb, line 111
def _build_nested_filter(filters_object)
  nested_filter = NestedFilter.new(
    filter_key_object: filters_object,
    prefix: filter_key_prefix,
    infix: filter_key_infix,
    like_semantics: @_like_semantics,
    i_like_semantics: @i_like_semantics,
    db: @_filter_db
  )
  nested_filter.call
  nested_filter
end
_chain_filter(key) click to toggle source
# File lib/rokaki/filter_model.rb, line 104
def _chain_filter(key)
  basic_filter = _build_basic_filter(key)
  class_eval basic_filter.filter_method, __FILE__, __LINE__ - 2

  @_chain_filters << basic_filter.filter_template
end
_chain_nested_filter(filters_object) click to toggle source
# File lib/rokaki/filter_model.rb, line 134
def _chain_nested_filter(filters_object)
  nested_filter = _build_nested_filter(filters_object)

  nested_filter.filter_methods.each do |filter_method|
    class_eval filter_method, __FILE__, __LINE__ - 2
  end

  nested_filter.filter_templates.each do |filter_template|
    @_chain_filters << filter_template
  end
end
_chain_nested_like_filter(filters_object) click to toggle source
# File lib/rokaki/filter_model.rb, line 124
def _chain_nested_like_filter(filters_object)
  filters_object.filter_methods.each do |filter_method|
    class_eval filter_method, __FILE__, __LINE__ - 2
  end

  filters_object.templates.each do |filter_template|
    @_chain_filters << filter_template
  end
end
define_results() click to toggle source

the model method is called to instatiate @model from the filter_model method

# File lib/rokaki/filter_model.rb, line 170
def define_results
  results_def = 'def results; @model || set_model;'
  @_chain_filters.each do |item|
    results_def += item
  end
  results_def += '@model;end;'
  class_eval results_def, __FILE__, __LINE__
end
filter(model, options) click to toggle source
# File lib/rokaki/filter_model.rb, line 39
def filter(model, options)
  filter_model(model)
  @filter_map_query_key = nil

  @_filter_db = options[:db] || :postgres
  @_filter_mode = options[:mode] || :and
  like(options[:like]) if options[:like]
  ilike(options[:ilike]) if options[:ilike]
  filters(*options[:match]) if options[:match]
end
filter_map(model, query_key, options) click to toggle source
# File lib/rokaki/filter_model.rb, line 28
def filter_map(model, query_key, options)
  filter_model(model)
  @filter_map_query_key = query_key

  @_filter_db = options[:db] || :postgres
  @_filter_mode = options[:mode] || :and
  like(options[:like]) if options[:like]
  ilike(options[:ilike]) if options[:ilike]
  filters(*options[:match]) if options[:match]
end
filter_model(model_class) click to toggle source
# File lib/rokaki/filter_model.rb, line 146
def filter_model(model_class)
  @model = (model_class.is_a?(Class) ? model_class : Object.const_get(model_class.capitalize))
  class_eval "def set_model; @model ||= #{@model}; end;"
end
filters(*filter_keys) click to toggle source
# File lib/rokaki/filter_model.rb, line 50
def filters(*filter_keys)
  if @filter_map_query_key
    define_filter_map(@filter_map_query_key, *filter_keys)
  else
    define_filter_keys(*filter_keys)
  end

  @_chain_filters ||= []
  filter_keys.each do |filter_key|
    # TODO: does the key need casting to an array here?
    _chain_filter(filter_key) unless filter_key.is_a? Hash
    _chain_nested_filter(filter_key) if filter_key.is_a? Hash
  end

  define_results # writes out all the generated filters
end
ilike(args) click to toggle source
# File lib/rokaki/filter_model.rb, line 159
def ilike(args)
  raise ArgumentError, 'argument mush be a hash' unless args.is_a? Hash
  @i_like_semantics = (@i_like_semantics || {}).merge(args)

  like_keys = LikeKeys.new(args)
  like_filters(like_keys, term_type: :ilike)
end
like(args) click to toggle source
# File lib/rokaki/filter_model.rb, line 151
def like(args)
  raise ArgumentError, 'argument mush be a hash' unless args.is_a? Hash
  @_like_semantics = (@_like_semantics || {}).merge(args)

  like_keys = LikeKeys.new(args)
  like_filters(like_keys, term_type: :like)
end
like_filters(like_keys, term_type: :like) click to toggle source
# File lib/rokaki/filter_model.rb, line 67
def like_filters(like_keys, term_type: :like)
  if @filter_map_query_key
    define_filter_map(@filter_map_query_key, *like_keys.call)
  else
    define_filter_keys(*like_keys.call)
  end

  @_chain_filters ||= []
  filter_map = []

  nested_like_filter = NestedLikeFilters.new(
    filter_key_object: like_keys,
    prefix: filter_key_prefix,
    infix: filter_key_infix,
    db: @_filter_db,
    type: term_type,
    or_key: or_key
  )
  nested_like_filter.call

  _chain_nested_like_filter(nested_like_filter)
  define_results # writes out all the generated filters
end