module WiseGopher::Base::Methods

instance methods for WiseGopher::Base

Public Class Methods

new(inputs = {}) click to toggle source
# File lib/wise_gopher/base.rb, line 90
def initialize(inputs = {})
  @inputs         = inputs
  @binds          = []
  @bind_symbol    = WiseGopher.postgresql? ? +"$1" : "?"
  @query_prepared = false

  self.class.ensure_all_params_are_given(inputs)

  prepare_query
end

Public Instance Methods

execute() click to toggle source
# File lib/wise_gopher/base.rb, line 101
def execute
  ensure_row_class_is_declared

  result = connection.exec_query(query.squish, query_class.to_s, @binds, prepare: true)

  ensure_all_columns_are_declared(result)

  result.entries.map { |entry| row_class.new(entry) }
end
prepare_query() click to toggle source
# File lib/wise_gopher/base.rb, line 111
def prepare_query
  return if @query_prepared

  prepare_raw_params

  prepare_params

  @query_prepared = true
end

Private Instance Methods

bind_collection_param(values, param) click to toggle source
# File lib/wise_gopher/base.rb, line 148
def bind_collection_param(values, param)
  bindings = values.map { use_bind_symbol }

  replace_placeholder(param.name, bindings.join(", "))

  values.each { |value| register_binding(value, param) }
end
bind_params(value, param) click to toggle source
# File lib/wise_gopher/base.rb, line 140
def bind_params(value, param)
  if value.is_a? Array
    bind_collection_param(value, param)
  else
    bind_single_param(value, param)
  end
end
bind_single_param(value, param) click to toggle source
# File lib/wise_gopher/base.rb, line 156
def bind_single_param(value, param)
  replace_placeholder(param.name, use_bind_symbol)

  register_binding(value, param)
end
connection() click to toggle source
# File lib/wise_gopher/base.rb, line 192
def connection
  ActiveRecord::Base.connection
end
ensure_all_columns_are_declared(result) click to toggle source
# File lib/wise_gopher/base.rb, line 186
def ensure_all_columns_are_declared(result)
  undeclared_columns = result.columns - row_class.columns.keys - row_class.ignored_columns

  raise UndeclaredColumns, undeclared_columns if undeclared_columns.any?
end
ensure_row_class_is_declared() click to toggle source
# File lib/wise_gopher/base.rb, line 182
def ensure_row_class_is_declared
  raise RowClassIsMissing unless row_class
end
prepare_params() click to toggle source
# File lib/wise_gopher/base.rb, line 123
def prepare_params
  query_class.params.each do |name, param|
    name  = name.to_sym
    value = @inputs[name]

    bind_params(value, param)
  end
end
prepare_raw_params() click to toggle source
# File lib/wise_gopher/base.rb, line 196
def prepare_raw_params
  query_class.raw_params.each do |name, param|
    name  = name.to_sym
    value = @inputs[name]

    replace_placeholder(name, param.to_s(value))
  end
end
query() click to toggle source
# File lib/wise_gopher/base.rb, line 136
def query
  @query ||= query_class::QUERY.dup
end
query_class() click to toggle source
# File lib/wise_gopher/base.rb, line 132
def query_class
  self.class
end
register_binding(value, param) click to toggle source
# File lib/wise_gopher/base.rb, line 166
def register_binding(value, param)
  @binds << param.build_bind(value)
end
replace_placeholder(name, value_to_insert) click to toggle source
# File lib/wise_gopher/base.rb, line 162
def replace_placeholder(name, value_to_insert)
  query.gsub!(/{{ ?#{name} ?}}/, value_to_insert)
end
use_bind_symbol() click to toggle source
# File lib/wise_gopher/base.rb, line 170
def use_bind_symbol
  if WiseGopher.postgresql?
    symbol = @bind_symbol.dup

    @bind_symbol.next!

    symbol
  else
    @bind_symbol
  end
end