class IronBank::QueryBuilder

A query builder helps buidling a syntaxically correct query using ZOQL.

Attributes

conditions[R]
fields[R]
object[R]

Public Class Methods

new(object, fields, conditions) click to toggle source
# File lib/iron_bank/query_builder.rb, line 22
def initialize(object, fields, conditions)
  @object     = object
  @fields     = fields
  @conditions = conditions
end
zoql(object, fields, conditions = {}) click to toggle source
# File lib/iron_bank/query_builder.rb, line 9
def self.zoql(object, fields, conditions = {})
  new(object, fields, conditions).zoql
end

Public Instance Methods

zoql() click to toggle source
# File lib/iron_bank/query_builder.rb, line 13
def zoql
  query = "select #{query_fields} from #{object}"
  conditions.empty? ? query : "#{query} where #{query_conditions}"
end

Private Instance Methods

current_filter(field, value) click to toggle source
# File lib/iron_bank/query_builder.rb, line 55
def current_filter(field, value)
  if value.is_a?(Array)
    range_query_builder(field, value)
  elsif [true, false].include? value
    "#{field}=#{value}"
  else
    "#{field}='#{value}'"
  end
end
ensure_range_single_condition() click to toggle source
# File lib/iron_bank/query_builder.rb, line 65
def ensure_range_single_condition
  return if conditions.count <= 1
  return unless conditions.values.any? { |value| value.is_a?(Array) }

  raise "Filter ranges must be used in isolation."
end
hash_query_conditions() click to toggle source
# File lib/iron_bank/query_builder.rb, line 47
def hash_query_conditions
  conditions.each.with_object([]) do |(field, value), filters|
    # TODO: sanitize the value
    field = IronBank::Utils.camelize(field)
    filters << current_filter(field, value)
  end.join(" AND ")
end
query_conditions() click to toggle source
# File lib/iron_bank/query_builder.rb, line 32
def query_conditions
  ensure_range_single_condition

  case conditions
  when Hash
    hash_query_conditions
  end
end
query_fields() click to toggle source
# File lib/iron_bank/query_builder.rb, line 28
def query_fields
  fields.join(",")
end
range_query_builder(field, value) click to toggle source
# File lib/iron_bank/query_builder.rb, line 41
def range_query_builder(field, value)
  value.each.with_object([]) do |option, range_query|
    range_query << "#{field}='#{option}'"
  end.join(" OR ")
end