Class: SqlStmtLib::MysqlBuilder

Inherits:
Object
  • Object
show all
Defined in:
lib/sqlstmt/mysql/build.rb

Instance Method Summary collapse

Constructor Details

#initialize(data) ⇒ MysqlBuilder

Returns a new instance of MysqlBuilder.



5
6
7
# File 'lib/sqlstmt/mysql/build.rb', line 5

def initialize(data)
  @data = data
end

Instance Method Details

#build_from_clauseObject



92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
# 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_clauseObject



136
137
138
# 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_clauseObject



109
110
111
112
113
114
115
# 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_stmtObject



9
10
11
12
# 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_deleteObject



70
71
72
73
74
75
76
77
# 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_insertObject



46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# 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_selectObject



24
25
26
27
28
29
30
31
# 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_updateObject



33
34
35
36
37
38
39
40
41
42
43
44
# 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_listObject



124
125
126
# 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_clauseObject



140
141
142
# 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) ⇒ Object



14
15
16
17
18
19
20
21
22
# 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) ⇒ Object



132
133
134
# 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) ⇒ Object



79
80
81
82
83
84
85
86
87
88
89
90
# 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) ⇒ Object



128
129
130
# File 'lib/sqlstmt/mysql/build.rb', line 128

def simple_clause(keywords, value)
  return value ? " #{keywords} #{value}" : ''
end

#table_to_str(table) ⇒ Object



117
118
119
120
121
122
# 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