Module: Rebel::SQLB
- Defined in:
- lib/rebel/sql.rb
Instance Method Summary collapse
- #and_clause(*clause) ⇒ Object
- #assign_clause(clause) ⇒ Object
- #by(*n) ⇒ Object
- #clause_term(left, right) ⇒ Object
- #count(*n) ⇒ Object
- #create_table(table_name, desc) ⇒ Object
- #delete_from(table_name, where: nil, inner: nil, left: nil, right: nil) ⇒ Object
- #drop_table(table_name) ⇒ Object
- #equal(l, r) ⇒ Object
- #escape_str(str) ⇒ Object
- #from?(from) ⇒ Boolean
-
#function(name, *args) ⇒ Object
(also: #fn)
Functions.
- #group?(group) ⇒ Boolean
- #inner?(join) ⇒ Boolean
- #inner_join(table, on: nil) ⇒ Object
- #insert_into(table_name, *rows) ⇒ Object
- #join(table, on: nil) ⇒ Object
- #left?(join) ⇒ Boolean
- #left_outer_join(table, on: nil) ⇒ Object
- #limit?(limit, offset) ⇒ Boolean
- #list(*items) ⇒ Object
-
#name(name = nil) ⇒ Object
Support.
- #name_or_value(item) ⇒ Object
- #names(*names) ⇒ Object
- #names_or_values(*items) ⇒ Object
- #order?(order) ⇒ Boolean
- #outer_join(table, on: nil) ⇒ Object
- #raw(str) ⇒ Object
- #right?(join) ⇒ Boolean
- #right_outer_join(table, on: nil) ⇒ Object
- #select(*fields, distinct: nil, from: nil, where: nil, inner: nil, left: nil, right: nil, group: nil, order: nil, limit: nil, offset: nil) ⇒ Object
- #truncate(table_name) ⇒ Object
- #update(table_name, set: nil, where: nil, inner: nil, left: nil, right: nil) ⇒ Object
- #value(v) ⇒ Object
- #values(*values) ⇒ Object
- #where?(*clause) ⇒ Boolean
Instance Method Details
#and_clause(*clause) ⇒ Object
344 345 346 347 348 349 350 351 352 353 354 |
# File 'lib/rebel/sql.rb', line 344 def and_clause(*clause) clause.map do |e| case e when Hash then and_clause(*e.to_a) when Array then clause_term(e[0], e[1]) when Raw then e.parens? when String then e else raise NotImplementedError, e.class end end.join(' AND ') end |
#assign_clause(clause) ⇒ Object
329 330 331 |
# File 'lib/rebel/sql.rb', line 329 def assign_clause(clause) list(clause.map { |k, v| equal(k, v) }) end |
#by(*n) ⇒ Object
248 249 250 |
# File 'lib/rebel/sql.rb', line 248 def by(*n) raw("BY #{names(*n)}") end |
#clause_term(left, right) ⇒ Object
333 334 335 336 337 338 339 340 341 342 |
# File 'lib/rebel/sql.rb', line 333 def clause_term(left, right) case right when Array name(left).in(*right) when nil name(left).is(name_or_value(right)) else name(left).eq(name_or_value(right)) end end |
#count(*n) ⇒ Object
252 253 254 |
# File 'lib/rebel/sql.rb', line 252 def count(*n) raw("COUNT(#{names(*n)})") end |
#create_table(table_name, desc) ⇒ Object
185 186 187 |
# File 'lib/rebel/sql.rb', line 185 def create_table(table_name, desc) raw %[CREATE TABLE #{name(table_name)} (#{list(desc.map { |k, v| "#{name(k)} #{v}" })})] end |
#delete_from(table_name, where: nil, inner: nil, left: nil, right: nil) ⇒ Object
227 228 229 230 231 232 233 234 235 |
# File 'lib/rebel/sql.rb', line 227 def delete_from(table_name, where: nil, inner: nil, left: nil, right: nil) raw [ "DELETE FROM #{name(table_name)}", inner?(inner), left?(left), right?(right), where?(where), ].join(' ') end |
#drop_table(table_name) ⇒ Object
189 190 191 |
# File 'lib/rebel/sql.rb', line 189 def drop_table(table_name) raw "DROP TABLE #{name(table_name)}" end |
#equal(l, r) ⇒ Object
325 326 327 |
# File 'lib/rebel/sql.rb', line 325 def equal(l, r) "#{name_or_value(l)} = #{name_or_value(r)}" end |
#escape_str(str) ⇒ Object
294 295 296 297 298 299 |
# File 'lib/rebel/sql.rb', line 294 def escape_str(str) str.dup.tap do |s| s.gsub!('\\') { @escaped_string_backslash } if @escaped_string_backslash s.gsub!(@string_quote) { @escaped_string_quote } end end |
#from?(from) ⇒ Boolean
356 357 358 |
# File 'lib/rebel/sql.rb', line 356 def from?(from) from ? "FROM #{name(from)}" : nil end |
#function(name, *args) ⇒ Object Also known as: fn
Functions
243 244 245 |
# File 'lib/rebel/sql.rb', line 243 def function(name, *args) raw("#{name}(#{names_or_values(*args)})") end |
#group?(group) ⇒ Boolean
376 377 378 |
# File 'lib/rebel/sql.rb', line 376 def group?(group) group ? "GROUP #{name(group)}" : nil end |
#inner?(join) ⇒ Boolean
364 365 366 |
# File 'lib/rebel/sql.rb', line 364 def inner?(join) join ? "INNER #{join}" : nil end |
#inner_join(table, on: nil) ⇒ Object
264 265 266 |
# File 'lib/rebel/sql.rb', line 264 def inner_join(table, on: nil) raw(inner? join(table, on: on)) end |
#insert_into(table_name, *rows) ⇒ Object
207 208 209 210 211 212 |
# File 'lib/rebel/sql.rb', line 207 def insert_into(table_name, *rows) raw [ "INSERT INTO #{name(table_name)} (#{names(*rows.first.keys)})", "VALUES #{list(rows.map { |r| "(#{values(*r.values)})" })}", ].join(' ') end |
#join(table, on: nil) ⇒ Object
256 257 258 |
# File 'lib/rebel/sql.rb', line 256 def join(table, on: nil) raw("JOIN #{name(table)}").on?(on) end |
#left?(join) ⇒ Boolean
368 369 370 |
# File 'lib/rebel/sql.rb', line 368 def left?(join) join ? "LEFT #{join}" : nil end |
#left_outer_join(table, on: nil) ⇒ Object
268 269 270 |
# File 'lib/rebel/sql.rb', line 268 def left_outer_join(table, on: nil) raw(left? outer_join(table, on: on)) end |
#limit?(limit, offset) ⇒ Boolean
384 385 386 |
# File 'lib/rebel/sql.rb', line 384 def limit?(limit, offset) limit ? "LIMIT #{value(limit)}" << (offset ? " OFFSET #{offset}" : "") : nil end |
#list(*items) ⇒ Object
290 291 292 |
# File 'lib/rebel/sql.rb', line 290 def list(*items) items.join(', ') end |
#name(name = nil) ⇒ Object
Support
278 279 280 281 282 283 284 |
# File 'lib/rebel/sql.rb', line 278 def name(name = nil) super() if name.nil? # workaround for pry and introspection return name if name.is_a?(Raw) return raw('*') if name == :* raw(name.to_s.split('.').map { |e| "#{@identifier_quote}#{e}#{@identifier_quote}" }.join('.')) end |
#name_or_value(item) ⇒ Object
317 318 319 |
# File 'lib/rebel/sql.rb', line 317 def name_or_value(item) item.is_a?(Symbol) ? name(item) : value(item) end |
#names(*names) ⇒ Object
286 287 288 |
# File 'lib/rebel/sql.rb', line 286 def names(*names) list(names.map { |k| name(k) }) end |
#names_or_values(*items) ⇒ Object
321 322 323 |
# File 'lib/rebel/sql.rb', line 321 def names_or_values(*items) list(items.map { |v| name_or_value(v) }) end |
#order?(order) ⇒ Boolean
380 381 382 |
# File 'lib/rebel/sql.rb', line 380 def order?(order) order ? "ORDER #{name(order)}" : nil end |
#outer_join(table, on: nil) ⇒ Object
260 261 262 |
# File 'lib/rebel/sql.rb', line 260 def outer_join(table, on: nil) raw("OUTER JOIN #{name(table)}").on?(on) end |
#raw(str) ⇒ Object
181 182 183 |
# File 'lib/rebel/sql.rb', line 181 def raw(str) Raw.new(str).tap { |r| r.instance_variable_set(:@sql, self) } end |
#right?(join) ⇒ Boolean
372 373 374 |
# File 'lib/rebel/sql.rb', line 372 def right?(join) join ? "RIGHT #{join}" : nil end |
#right_outer_join(table, on: nil) ⇒ Object
272 273 274 |
# File 'lib/rebel/sql.rb', line 272 def right_outer_join(table, on: nil) raw(right? outer_join(table, on: on)) end |
#select(*fields, distinct: nil, from: nil, where: nil, inner: nil, left: nil, right: nil, group: nil, order: nil, limit: nil, offset: nil) ⇒ Object
193 194 195 196 197 198 199 200 201 202 203 204 205 |
# File 'lib/rebel/sql.rb', line 193 def select(*fields, distinct: nil, from: nil, where: nil, inner: nil, left: nil, right: nil, group: nil, order: nil, limit: nil, offset: nil) raw [ "SELECT #{distinct ? "DISTINCT #{names(*distinct)}" : names(*fields)}", from?(from), inner?(inner), left?(left), right?(right), where?(where), group?(group), order?(order), limit?(limit, offset), ].compact.join(' ') end |
#truncate(table_name) ⇒ Object
237 238 239 |
# File 'lib/rebel/sql.rb', line 237 def truncate(table_name) raw "TRUNCATE #{name(table_name)}" end |
#update(table_name, set: nil, where: nil, inner: nil, left: nil, right: nil) ⇒ Object
214 215 216 217 218 219 220 221 222 223 224 225 |
# File 'lib/rebel/sql.rb', line 214 def update(table_name, set: nil, where: nil, inner: nil, left: nil, right: nil) raise ArgumentError if set.nil? raw [ "UPDATE #{name(table_name)}", "SET #{assign_clause(set)}", inner?(inner), left?(left), right?(right), where?(where), ].compact.join(' ') end |
#value(v) ⇒ Object
301 302 303 304 305 306 307 308 309 310 311 |
# File 'lib/rebel/sql.rb', line 301 def value(v) case v when Raw then v when String then raw "#{@string_quote}#{escape_str(v)}#{@string_quote}" when Integer then raw v.to_s when TrueClass, FalseClass then raw(v ? @true_literal : @false_literal) when Date, Time, DateTime then value(v.iso8601) when nil then raw 'NULL' else raise NotImplementedError, "#{v.class}: #{v.inspect}" end end |
#values(*values) ⇒ Object
313 314 315 |
# File 'lib/rebel/sql.rb', line 313 def values(*values) list(values.map { |v| value(v) }) end |
#where?(*clause) ⇒ Boolean
360 361 362 |
# File 'lib/rebel/sql.rb', line 360 def where?(*clause) clause.any? ? "WHERE #{and_clause(*clause)}" : nil end |