class Baza::SqlQueries::Select

Public Class Methods

new(args) click to toggle source
# File lib/baza/sql_queries/select.rb, line 2
def initialize(args)
  @db = args.fetch(:db)
  @selects = []
  @froms = []
  @joins = []
  @wheres = []
  @groups = []
  @orders = []
end

Public Instance Methods

count() click to toggle source
# File lib/baza/sql_queries/select.rb, line 12
def count
  @count = true
  query.fetch.fetch(:count).to_i
ensure
  @count = false
end
current_page() click to toggle source
# File lib/baza/sql_queries/select.rb, line 19
def current_page
  @page || 1
end
each(&blk) click to toggle source
# File lib/baza/sql_queries/select.rb, line 87
def each(&blk)
  query(&blk)
end
each_row() { |row( db: db, table: first_from, data: data| ... } click to toggle source
# File lib/baza/sql_queries/select.rb, line 91
def each_row
  query do |data|
    yield Baza::Row.new(
      db: @db,
      table: first_from,
      data: data
    )
  end
end
from(arg) click to toggle source
# File lib/baza/sql_queries/select.rb, line 28
def from(arg)
  @froms << arg
  self
end
group(arg) click to toggle source
# File lib/baza/sql_queries/select.rb, line 43
def group(arg)
  @groups << arg
  self
end
join(arg) click to toggle source
# File lib/baza/sql_queries/select.rb, line 33
def join(arg)
  @joins << arg
  self
end
limit(limit) click to toggle source
# File lib/baza/sql_queries/select.rb, line 63
def limit(limit)
  @limit = limit
  self
end
offset(offset) click to toggle source
# File lib/baza/sql_queries/select.rb, line 68
def offset(offset)
  @offset = offset
  self
end
order(arg) click to toggle source
# File lib/baza/sql_queries/select.rb, line 48
def order(arg)
  @orders << arg
  self
end
page(number) click to toggle source
# File lib/baza/sql_queries/select.rb, line 53
def page(number)
  @page = number.try(:to_i) || 1
  self
end
per_page(number) click to toggle source
# File lib/baza/sql_queries/select.rb, line 58
def per_page(number)
  @per_page = number
  self
end
query(&blk) click to toggle source
# File lib/baza/sql_queries/select.rb, line 109
def query(&blk)
  @db.query(to_sql, &blk)
end
select(arg) click to toggle source
# File lib/baza/sql_queries/select.rb, line 23
def select(arg)
  @selects << arg
  self
end
to_a() click to toggle source
# File lib/baza/sql_queries/select.rb, line 77
def to_a
  each.to_a
end
to_enum() click to toggle source
# File lib/baza/sql_queries/select.rb, line 101
def to_enum
  Enumerator.new do |yielder|
    query do |data|
      yielder << data
    end
  end
end
to_sql() click to toggle source
# File lib/baza/sql_queries/select.rb, line 73
def to_sql
  "#{select_sql} #{from_sql} #{where_sql} #{group_sql} #{limit_sql}"
end
total_pages() click to toggle source
# File lib/baza/sql_queries/select.rb, line 81
def total_pages
  @per_page ||= 30
  per_page_value = @per_page
  (count.to_f / per_page_value.to_f).ceil
end
where(*args) click to toggle source
# File lib/baza/sql_queries/select.rb, line 38
def where(*args)
  @wheres << args
  self
end

Private Instance Methods

first_from() click to toggle source
# File lib/baza/sql_queries/select.rb, line 152
def first_from
  @first_from ||= @froms.first
end
from_sql() click to toggle source
# File lib/baza/sql_queries/select.rb, line 139
def from_sql
  sql = "FROM"

  first = true
  @froms.each do |from|
    sql << "," unless first
    first = false if first
    sql << " #{@db.quote_table(from)}"
  end

  sql
end
group_sql() click to toggle source
# File lib/baza/sql_queries/select.rb, line 187
def group_sql
  return if @groups.empty?
end
limit_sql() click to toggle source
# File lib/baza/sql_queries/select.rb, line 191
def limit_sql
  unless @count
    if @page
      @per_page ||= 30
      sql = "LIMIT #{@db.quote_value(@per_page)} OFFSET #{@per_page * (current_page - 1)}"
    elsif @limit
      sql = "LIMIT #{@db.quote_value(@limit)}"
      sql << ", #{@db.quote_value(@offset)}" if @offset
    end
  end

  sql
end
select_sql() click to toggle source
# File lib/baza/sql_queries/select.rb, line 115
def select_sql
  sql = "SELECT"

  if @count
    sql << " COUNT(*) AS count"
  elsif @selects.empty?
    sql << " *"
  else
    first = true
    @selects.each do |select|
      sql << "," unless first
      first = false if first

      if select.is_a?(Symbol)
        select << " #{@db.quote_column(select)}"
      else
        select << @db.quote_value(select)
      end
    end
  end

  sql
end
where_sql() click to toggle source
# File lib/baza/sql_queries/select.rb, line 156
def where_sql
  return if @wheres.empty?

  sql = " WHERE"

  first = true
  @wheres.each do |args|
    where = args.shift

    sql << " AND " unless first
    first = false if first

    if where.is_a?(Hash)
      where.each do |key, value|
        sql << "#{@db.quote_column(key)} = #{@db.quote_value(value)}"
      end
    elsif where.is_a?(String)
      sql_arg = where.clone
      args.each do |arg|
        sql_arg.sub!("?", @db.quote_value(arg))
      end

      sql << sql_arg
    else
      raise "Dont know what to do with that argument: #{where}"
    end
  end

  sql
end