class Yaqb::QueryBuilders::Filter

Constants

PREDICATES

Public Class Methods

new(scope, params, presenter) click to toggle source
# File lib/yaqb/query_builders/filter.rb, line 8
def initialize(scope, params, presenter)
  @scope = scope
  @filters = params['q'] || {}
  @presenter = presenter
end

Public Instance Methods

filter() click to toggle source
# File lib/yaqb/query_builders/filter.rb, line 14
def filter
  return @scope unless @filters.any?

  @filters = format_filters
  validate_filters
  build_filter_scope

  @scope
end

Private Instance Methods

build_filter_scope() click to toggle source
# File lib/yaqb/query_builders/filter.rb, line 36
def build_filter_scope
  @filters.each do |_key, data|
    @scope = send(data[:predicate], data[:column], data[:value])
  end
end
cont(column, value) click to toggle source
# File lib/yaqb/query_builders/filter.rb, line 46
def cont(column, value)
  @scope.where("#{column} LIKE ?", "%#{value}%")
end
end(column, value) click to toggle source
# File lib/yaqb/query_builders/filter.rb, line 58
def end(column, value)
  @scope.where("#{column} LIKE ?", "%#{value}")
end
eq(column, value) click to toggle source
# File lib/yaqb/query_builders/filter.rb, line 42
def eq(column, value)
  @scope.where(column => value)
end
error!(key, data) click to toggle source
# File lib/yaqb/query_builders/filter.rb, line 79
def error!(key, data)
  columns = @presenter.filter_attributes.join(', ')
  pred = PREDICATES.join(', ')

  raise Errors::QueryBuilderError.new("q[#{key}]=#{data[:value]}"),
        "Invalid Filter params. Allowed columns: (#{columns}), 'predicates': #{pred}"
end
format_filters() click to toggle source
# File lib/yaqb/query_builders/filter.rb, line 26
def format_filters
  @filters.each_with_object({}) do |(key, value), hash|
    hash[key] = {
      value: value,
      column: key.split('_')[0...-1].join('_'),
      predicate: key.split('_').last
    }
  end
end
gt(column, value) click to toggle source
# File lib/yaqb/query_builders/filter.rb, line 62
def gt(column, value)
  @scope.where("#{column} > ?", value)
end
lt(column, value) click to toggle source
# File lib/yaqb/query_builders/filter.rb, line 66
def lt(column, value)
  @scope.where("#{column} < ?", value)
end
notcont(column, value) click to toggle source
# File lib/yaqb/query_builders/filter.rb, line 50
def notcont(column, value)
  @scope.where("#{column} NOT LIKE ?", "%#{value}%")
end
start(column, value) click to toggle source
# File lib/yaqb/query_builders/filter.rb, line 54
def start(column, value)
  @scope.where("#{column} LIKE ?", "#{value}%")
end
validate_filters() click to toggle source
# File lib/yaqb/query_builders/filter.rb, line 70
def validate_filters
  attributes = @presenter.filter_attributes

  @filters.each do |key, data|
    error!(key, data) unless attributes.include?(data[:column])
    error!(key, data) unless PREDICATES.include?(data[:predicate])
  end
end