Module: Sequel::MySQL::DatasetMethods
- Included in:
- DataObjects::MySQL::Dataset, JDBC::MySQL::Dataset, Dataset
- Defined in:
- lib/sequel/adapters/shared/mysql.rb
Overview
Dataset methods shared by datasets that use MySQL databases.
Constant Summary collapse
- BOOL_TRUE =
'1'.freeze
- BOOL_FALSE =
'0'.freeze
- TIMESTAMP_FORMAT =
"'%Y-%m-%d %H:%M:%S'".freeze
- COMMA_SEPARATOR =
', '.freeze
- SELECT_CLAUSE_ORDER =
%w'distinct columns from join where group having compounds order limit'.freeze
Instance Method Summary collapse
-
#complex_expression_sql(op, args) ⇒ Object
MySQL specific syntax for LIKE/REGEXP searches, as well as string concatenation.
-
#delete_sql ⇒ Object
MySQL supports ORDER and LIMIT clauses in DELETE statements.
-
#full_text_search(cols, terms, opts = {}) ⇒ Object
Adds full text filter.
-
#full_text_sql(cols, term, opts = {}) ⇒ Object
MySQL specific full text search syntax.
-
#having(*cond, &block) ⇒ Object
MySQL allows HAVING clause on ungrouped datasets.
-
#insert_ignore ⇒ Object
Sets up multi_insert or import to use INSERT IGNORE.
-
#join_table(type, table, expr = nil, table_alias = {}) ⇒ Object
Transforms an CROSS JOIN to an INNER JOIN if the expr is not nil.
-
#join_type_sql(join_type) ⇒ Object
Transforms :natural_inner to NATURAL LEFT JOIN and straight to STRAIGHT_JOIN.
-
#multi_insert_sql(columns, values) ⇒ Object
MySQL specific syntax for inserting multiple values at once.
-
#on_duplicate_key_update(*args) ⇒ Object
Sets up multi_insert or import to use ON DUPLICATE KEY UPDATE If you pass no arguments, ALL fields will be updated with the new values.
-
#quoted_identifier(c) ⇒ Object
MySQL uses the nonstandard ‘ (backtick) for quoting identifiers.
-
#replace_sql(*values) ⇒ Object
MySQL specific syntax for REPLACE (aka UPSERT, or update if exists, insert if it doesn’t).
-
#supports_distinct_on? ⇒ Boolean
does not support DISTINCT ON.
-
#supports_intersect_except? ⇒ Boolean
MySQL does not support INTERSECT or EXCEPT.
-
#update_sql(values) ⇒ Object
MySQL supports ORDER and LIMIT clauses in UPDATE statements.
Instance Method Details
#complex_expression_sql(op, args) ⇒ Object
MySQL specific syntax for LIKE/REGEXP searches, as well as string concatenation.
207 208 209 210 211 212 213 214 215 216 217 218 219 220 |
# File 'lib/sequel/adapters/shared/mysql.rb', line 207 def complex_expression_sql(op, args) case op when :~, :'!~', :'~*', :'!~*', :LIKE, :'NOT LIKE', :ILIKE, :'NOT ILIKE' "(#{literal(args.at(0))} #{'NOT ' if [:'NOT LIKE', :'NOT ILIKE', :'!~', :'!~*'].include?(op)}#{[:~, :'!~', :'~*', :'!~*'].include?(op) ? 'REGEXP' : 'LIKE'} #{'BINARY ' if [:~, :'!~', :LIKE, :'NOT LIKE'].include?(op)}#{literal(args.at(1))})" when :'||' if args.length > 1 "CONCAT(#{args.collect{|a| literal(a)}.join(', ')})" else literal(args.at(0)) end else super(op, args) end end |
#delete_sql ⇒ Object
MySQL supports ORDER and LIMIT clauses in DELETE statements.
223 224 225 226 227 228 |
# File 'lib/sequel/adapters/shared/mysql.rb', line 223 def delete_sql sql = super sql << " ORDER BY #{expression_list(opts[:order])}" if opts[:order] sql << " LIMIT #{opts[:limit]}" if opts[:limit] sql end |
#full_text_search(cols, terms, opts = {}) ⇒ Object
Adds full text filter
231 232 233 |
# File 'lib/sequel/adapters/shared/mysql.rb', line 231 def full_text_search(cols, terms, opts = {}) filter(full_text_sql(cols, terms, opts)) end |
#full_text_sql(cols, term, opts = {}) ⇒ Object
MySQL specific full text search syntax.
236 237 238 |
# File 'lib/sequel/adapters/shared/mysql.rb', line 236 def full_text_sql(cols, term, opts = {}) "MATCH #{literal(Array(cols))} AGAINST (#{literal(Array(term).join(' '))}#{" IN BOOLEAN MODE" if opts[:boolean]})" end |
#having(*cond, &block) ⇒ Object
MySQL allows HAVING clause on ungrouped datasets.
241 242 243 |
# File 'lib/sequel/adapters/shared/mysql.rb', line 241 def having(*cond, &block) _filter(:having, *cond, &block) end |
#insert_ignore ⇒ Object
Sets up multi_insert or import to use INSERT IGNORE. Useful if you have a unique key and want to just skip inserting rows that violate the unique key restriction.
Example:
dataset.insert_ignore.multi_insert(
[{:name => 'a', :value => 1}, {:name => 'b', :value => 2}]
)
INSERT IGNORE INTO tablename (name, value) VALUES (a, 1), (b, 2)
275 276 277 |
# File 'lib/sequel/adapters/shared/mysql.rb', line 275 def insert_ignore clone(:insert_ignore=>true) end |
#join_table(type, table, expr = nil, table_alias = {}) ⇒ Object
Transforms an CROSS JOIN to an INNER JOIN if the expr is not nil. Raises an error on use of :full_outer type, since MySQL doesn’t support it.
247 248 249 250 251 |
# File 'lib/sequel/adapters/shared/mysql.rb', line 247 def join_table(type, table, expr=nil, table_alias={}) type = :inner if (type == :cross) && !expr.nil? raise(Sequel::Error, "MySQL doesn't support FULL OUTER JOIN") if type == :full_outer super(type, table, expr, table_alias) end |
#join_type_sql(join_type) ⇒ Object
Transforms :natural_inner to NATURAL LEFT JOIN and straight to STRAIGHT_JOIN.
255 256 257 258 259 260 261 |
# File 'lib/sequel/adapters/shared/mysql.rb', line 255 def join_type_sql(join_type) case join_type when :straight then 'STRAIGHT_JOIN' when :natural_inner then 'NATURAL LEFT JOIN' else super end end |
#multi_insert_sql(columns, values) ⇒ Object
MySQL specific syntax for inserting multiple values at once.
308 309 310 311 |
# File 'lib/sequel/adapters/shared/mysql.rb', line 308 def multi_insert_sql(columns, values) values = values.map {|r| literal(Array(r))}.join(COMMA_SEPARATOR) ["#{insert_sql_base}#{source_list(@opts[:from])} (#{identifier_list(columns)}) VALUES #{values}#{insert_sql_suffix}"] end |
#on_duplicate_key_update(*args) ⇒ Object
Sets up multi_insert or import to use ON DUPLICATE KEY UPDATE If you pass no arguments, ALL fields will be updated with the new values. If you pass the fields you want then ONLY those field will be updated.
Useful if you have a unique key and want to update inserting rows that violate the unique key restriction.
Examples:
dataset.on_duplicate_key_update.multi_insert(
[{:name => 'a', :value => 1}, {:name => 'b', :value => 2}]
)
INSERT INTO tablename (name, value) VALUES (a, 1), (b, 2) ON DUPLICATE KEY UPDATE name=VALUES(name), value=VALUES(value)
dataset.on_duplicate_key_update(:value).multi_insert(
[{:name => 'a', :value => 1}, {:name => 'b', :value => 2}]
)
INSERT INTO tablename (name, value) VALUES (a, 1), (b, 2) ON DUPLICATE KEY UPDATE value=VALUES(value)
303 304 305 |
# File 'lib/sequel/adapters/shared/mysql.rb', line 303 def on_duplicate_key_update(*args) clone(:on_duplicate_key_update => args) end |
#quoted_identifier(c) ⇒ Object
MySQL uses the nonstandard ‘ (backtick) for quoting identifiers.
314 315 316 |
# File 'lib/sequel/adapters/shared/mysql.rb', line 314 def quoted_identifier(c) "`#{c}`" end |
#replace_sql(*values) ⇒ Object
MySQL specific syntax for REPLACE (aka UPSERT, or update if exists, insert if it doesn’t).
320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 |
# File 'lib/sequel/adapters/shared/mysql.rb', line 320 def replace_sql(*values) from = source_list(@opts[:from]) if values.empty? "REPLACE INTO #{from} DEFAULT VALUES" else values = values[0] if values.size == 1 case values when Array if values.empty? "REPLACE INTO #{from} DEFAULT VALUES" else "REPLACE INTO #{from} VALUES #{literal(values)}" end when Hash if values.empty? "REPLACE INTO #{from} DEFAULT VALUES" else fl, vl = [], [] values.each {|k, v| fl << literal(k.is_a?(String) ? k.to_sym : k); vl << literal(v)} "REPLACE INTO #{from} (#{fl.join(COMMA_SEPARATOR)}) VALUES (#{vl.join(COMMA_SEPARATOR)})" end when Dataset "REPLACE INTO #{from} #{literal(values)}" else if values.respond_to?(:values) replace_sql(values.values) else "REPLACE INTO #{from} VALUES (#{literal(values)})" end end end end |
#supports_distinct_on? ⇒ Boolean
does not support DISTINCT ON
355 356 357 |
# File 'lib/sequel/adapters/shared/mysql.rb', line 355 def supports_distinct_on? false end |
#supports_intersect_except? ⇒ Boolean
MySQL does not support INTERSECT or EXCEPT
360 361 362 |
# File 'lib/sequel/adapters/shared/mysql.rb', line 360 def supports_intersect_except? false end |
#update_sql(values) ⇒ Object
MySQL supports ORDER and LIMIT clauses in UPDATE statements.
365 366 367 368 369 370 |
# File 'lib/sequel/adapters/shared/mysql.rb', line 365 def update_sql(values) sql = super sql << " ORDER BY #{expression_list(opts[:order])}" if opts[:order] sql << " LIMIT #{opts[:limit]}" if opts[:limit] sql end |