class SqlStmtLib::MysqlBuilder

Public Class Methods

new(data) click to toggle source
# File lib/sqlstmt/mysql/build.rb, line 5
def initialize(data)
  @data = data
end

Public Instance Methods

build_from_clause() click to toggle source
# File lib/sqlstmt/mysql/build.rb, line 92
def build_from_clause
  parts = ['FROM']
  parts << build_table_list
  parts << build_join_clause
  parts << build_where_clause
  parts << simple_clause('GROUP BY', @data.group_by)
  if @data.with_rollup
    parts << 'WITH ROLLUP'
  end
  if !@data.havings.empty?
    parts << "HAVING #{@data.havings.join(' AND ')}"
  end
  parts << simple_clause('ORDER BY', @data.order_by)
  parts << simple_clause('LIMIT', @data.limit)
  return combine_parts(parts)
end
build_join_clause() click to toggle source
# File lib/sqlstmt/mysql/build.rb, line 136
def build_join_clause
  return ' ' + @data.joins.map {|join| join_to_str(join)}.uniq.join(' ')
end
build_set_clause() click to toggle source
# File lib/sqlstmt/mysql/build.rb, line 109
def build_set_clause
  set_exprs = []
  @data.set_fields.each_with_index do |field, index|
    set_exprs << "#{field} = #{@data.set_values[index]}"
  end
  return set_exprs.join(', ')
end
build_stmt() click to toggle source
# File lib/sqlstmt/mysql/build.rb, line 9
def build_stmt
  method_name = "build_stmt_#{@data.stmt_type}"
  return send(method_name)
end
build_stmt_delete() click to toggle source
# File lib/sqlstmt/mysql/build.rb, line 70
def build_stmt_delete
  parts = ['DELETE']
  if !@data.tables_to_delete.empty?
    parts << @data.tables_to_delete.join(',')
  end
  parts << build_from_clause
  return combine_parts(parts)
end
build_stmt_insert() click to toggle source
# File lib/sqlstmt/mysql/build.rb, line 46
def build_stmt_insert
  parts = []
  if @data.replace
    parts << 'REPLACE'
  else
    parts << 'INSERT'
  end
  if @data.ignore
    parts << 'IGNORE'
  end
  parts << "INTO #{@data.into}"
  if !@data.set_fields.empty?
    field_list = @data.set_fields.join(',')
    parts << "(#{field_list})"
  end
  parts << shared_select(@data.set_values)
  if @data.on_duplicate
    parts << "ON DUPLICATE KEY UPDATE #{@data.on_duplicate}"
  elsif @data.ignore_duplicate
    parts << "ON DUPLICATE KEY UPDATE #{@data.ignore_duplicate} = #{@data.ignore_duplicate}"
  end
  return combine_parts(parts)
end
build_stmt_select() click to toggle source
# File lib/sqlstmt/mysql/build.rb, line 24
def build_stmt_select
  parts = []
  parts << shared_select(@data.gets)
  if @data.outfile
    parts << "INTO OUTFILE #{@data.outfile}"
  end
  return combine_parts(parts)
end
build_stmt_update() click to toggle source
# File lib/sqlstmt/mysql/build.rb, line 33
def build_stmt_update
  parts = [
    'UPDATE',
    build_table_list,
    build_join_clause,
    'SET',
    build_set_clause,
    build_where_clause,
    simple_clause('LIMIT', @data.limit),
  ]
  return combine_parts(parts)
end
build_table_list() click to toggle source
# File lib/sqlstmt/mysql/build.rb, line 124
def build_table_list
  return @data.tables.map {|table| table_to_str(table) }.join(',')
end
build_where_clause() click to toggle source
# File lib/sqlstmt/mysql/build.rb, line 140
def build_where_clause
  return @data.wheres.empty? ? '' : " WHERE #{@data.wheres.join(' AND ')}"
end
combine_parts(parts) click to toggle source
# File lib/sqlstmt/mysql/build.rb, line 14
def combine_parts(parts)
  parts.each do |str|
    str.strip!
  end
  parts.reject! do |str|
    str.nil? || str.empty?
  end
  return parts.join(' ')
end
join_to_str(join) click to toggle source
# File lib/sqlstmt/mysql/build.rb, line 132
def join_to_str(join)
  return [join.kwstr, join.table.str, join.on_expr].join(' ')
end
shared_select(fields) click to toggle source
# File lib/sqlstmt/mysql/build.rb, line 79
def shared_select(fields)
  parts = ['SELECT']
  if @data.straight_join
    parts << 'STRAIGHT_JOIN'
  end
  if @data.distinct
    parts << 'DISTINCT'
  end
  parts << fields.join(',')
  parts << build_from_clause
  return combine_parts(parts)
end
simple_clause(keywords, value) click to toggle source
# File lib/sqlstmt/mysql/build.rb, line 128
def simple_clause(keywords, value)
  return value ? " #{keywords} #{value}" : ''
end
table_to_str(table) click to toggle source
# File lib/sqlstmt/mysql/build.rb, line 117
def table_to_str(table)
  if table.index
    return "#{table.str} USE INDEX (#{table.index})"
  end
  return table.str
end