module Data::Filtering

Public Instance Methods

apply_array_condition(column, value) click to toggle source
# File lib/tabulatr/data/filtering.rb, line 105
def apply_array_condition(column, value)
  @relation = @relation.where(column.table_name => { column.name => value })
end
apply_boolean_condition(column, value) click to toggle source
# File lib/tabulatr/data/filtering.rb, line 70
def apply_boolean_condition(column, value)
  @relation = @relation.where("#{column.col_options.filter_sql} = ?", Tabulatr::Utility.string_to_boolean(value))
end
apply_condition(n,v) click to toggle source
# File lib/tabulatr/data/filtering.rb, line 54
def apply_condition(n,v)
  # puts "FILTER: »#{n.filter.inspect}«, »#{n.filter.class}«"
  case n.filter
  when :checkbox then apply_boolean_condition(n, v)
  when :decimal  then apply_string_condition("#{n.col_options.filter_sql} = ?", v.to_f)
  when :integer, :enum  then apply_string_condition("#{n.col_options.filter_sql} = ?", v.to_i)
  when :enum_multiselect then apply_array_condition(n, v)
  when :exact, Hash, Array then apply_string_condition("#{n.col_options.filter_sql} = ?", v)
  when :like     then apply_like_condition(n, v['like'])
  when :date     then apply_date_condition(n, v['date'])
  when :range    then apply_range_condition(n, v)
  when :custom   then apply_custom_filter(n, v)
  else raise "Wrong filter type for #{n.name}: #{n.filter}"
  end
end
apply_custom_filter(filter, value) click to toggle source
# File lib/tabulatr/data/filtering.rb, line 109
def apply_custom_filter(filter, value)
  filter_result = self.instance_exec @relation, value, &filter.block
  handle_search_result(filter_result)
end
apply_date_condition(n, cond) click to toggle source
# File lib/tabulatr/data/filtering.rb, line 74
def apply_date_condition(n, cond)
  today = Date.today
  yesterday = today - 1.day
  case cond['simple']
  when 'none' then return
  when 'today' then date_in_between(today, today.at_end_of_day, n)
  when 'yesterday' then date_in_between(yesterday, yesterday.at_end_of_day, n)
  when 'this_week' then date_in_between(today.at_beginning_of_week.beginning_of_day,
                          today.at_end_of_week.end_of_day, n)
  when 'last_7_days' then date_in_between((today - 6.day).beginning_of_day, today.at_end_of_day, n)
  when 'this_month' then date_in_between(today.at_beginning_of_month.beginning_of_day,
                            today.at_end_of_month.end_of_day, n)
  when 'last_30_days' then date_in_between((today - 29.day).beginning_of_day, today.at_end_of_day, n)
  when 'from_to' then date_in_between((Date.parse(cond['from']) rescue nil), (Date.parse(cond['to']) rescue nil), n)
  end
end
apply_filters(filter_params) click to toggle source
# File lib/tabulatr/data/filtering.rb, line 44
def apply_filters(filter_params)
  return unless filter_params
  filter_params.permit!.to_hash.with_indifferent_access.each do |param|
    name, value = param
    next unless value.present?

    apply_condition(find_column(name), value)
  end
end
apply_like_condition(column, value) click to toggle source
# File lib/tabulatr/data/filtering.rb, line 95
def apply_like_condition(column, value)
  like ||= Tabulatr::Utility.like_statement
  apply_string_condition("#{column.col_options.filter_sql} #{like} ?", "%#{value}%") if value.present?
end
apply_range_condition(column, hash) click to toggle source
# File lib/tabulatr/data/filtering.rb, line 100
def apply_range_condition(column, hash)
  apply_string_condition("#{column.col_options.filter_sql} >= ?", "#{hash[:from]}")
  apply_string_condition("#{column.col_options.filter_sql} <= ?", "#{hash[:to]}")
end
apply_string_condition(replacement_string, value) click to toggle source
# File lib/tabulatr/data/filtering.rb, line 91
def apply_string_condition(replacement_string, value)
   @relation = @relation.where(replacement_string, value) if value.present?
end

Private Instance Methods

date_in_between(from, to, column) click to toggle source
# File lib/tabulatr/data/filtering.rb, line 138
def date_in_between(from, to, column)
  @relation = @relation.where("#{column.col_options.filter_sql} >= ?", from) if from.present?
  @relation = @relation.where("#{column.col_options.filter_sql} <= ?", to) if to.present?
end
execute_provided_search_block!(query) click to toggle source
# File lib/tabulatr/data/filtering.rb, line 116
def execute_provided_search_block!(query)
  if @search.arity == 1
    search_result = @search.(query)
  elsif @search.arity == 2
    search_result = @search.(query, @relation)
  else
    raise 'Search block needs either `query` or both `query` and `relation` block variables'
  end
  handle_search_result(search_result)
end
find_column(name) click to toggle source
# File lib/tabulatr/data/filtering.rb, line 143
def find_column(name)
  table_name, method_name = name.split(':').map(&:to_sym)
  table_columns.find { |c| c.table_name == table_name && c.name == method_name } ||
    filters.find { |f| f.name.to_sym == name.to_sym }
end
handle_search_result(search_result) click to toggle source
# File lib/tabulatr/data/filtering.rb, line 127
def handle_search_result(search_result)
  return if search_result.nil?
  if search_result.is_a?(ActiveRecord::Relation)
    @relation = search_result
  elsif search_result.is_a?(String) || search_result.is_a?(Hash) || search_result.is_a?(Array)
    @relation = @relation.where(search_result)
  else
    Tabulatr::UnexpectedSearchResultError.raise_error(search_result.class)
  end
end