Module: Sequel::MySQL::DatasetMethods
- Included in:
- DataObjects::MySQL::Dataset, JDBC::MySQL::Dataset, Dataset, Sequel::Mysql2::Dataset, Swift::MySQL::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
- COMMA_SEPARATOR =
', '.freeze
- FOR_SHARE =
' LOCK IN SHARE MODE'.freeze
- SQL_CALC_FOUND_ROWS =
' SQL_CALC_FOUND_ROWS'.freeze
- DELETE_CLAUSE_METHODS =
Dataset.clause_methods(:delete, %w'from where order limit')
- INSERT_CLAUSE_METHODS =
Dataset.clause_methods(:insert, %w'ignore into columns values on_duplicate_key_update')
- SELECT_CLAUSE_METHODS =
Dataset.clause_methods(:select, %w'distinct calc_found_rows columns from join where group having compounds order limit lock')
- UPDATE_CLAUSE_METHODS =
Dataset.clause_methods(:update, %w'table set where order limit')
Instance Method Summary collapse
-
#calc_found_rows ⇒ Object
Sets up the select methods to use SQL_CALC_FOUND_ROWS option.
-
#complex_expression_sql(op, args) ⇒ Object
MySQL specific syntax for LIKE/REGEXP searches, as well as string concatenation.
-
#distinct(*args) ⇒ Object
Use GROUP BY instead of DISTINCT ON if arguments are provided.
-
#for_share ⇒ Object
Return a cloned dataset which will use LOCK IN SHARE MODE to lock returned rows.
-
#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 the insert methods to use INSERT IGNORE.
-
#join_table(type, table, expr = nil, table_alias = {}, &block) ⇒ 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 the insert methods to use ON DUPLICATE KEY UPDATE If you pass no arguments, ALL fields will be updated with the new values.
-
#provides_accurate_rows_matched? ⇒ Boolean
MySQL uses the number of rows actually modified in the update, instead of the number of matched by the filter.
-
#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
MySQL can emulate DISTINCT ON with its non-standard GROUP BY implementation, though the rows returned cannot be made deterministic through ordering.
-
#supports_intersect_except? ⇒ Boolean
MySQL does not support INTERSECT or EXCEPT.
-
#supports_modifying_joins? ⇒ Boolean
MySQL supports modifying joined datasets.
-
#supports_ordered_distinct_on? ⇒ Boolean
MySQL’s DISTINCT ON emulation using GROUP BY does not respect the queries ORDER BY clause.
-
#supports_timestamp_usecs? ⇒ Boolean
MySQL does support fractional timestamps in literal timestamps, but it ignores them.
Instance Method Details
#calc_found_rows ⇒ Object
Sets up the select methods to use SQL_CALC_FOUND_ROWS option.
dataset.calc_found_rows.limit(10)
# SELECT SQL_CALC_FOUND_ROWS * FROM table LIMIT 10
376 377 378 |
# File 'lib/sequel/adapters/shared/mysql.rb', line 376 def calc_found_rows clone(:calc_found_rows => true) end |
#complex_expression_sql(op, args) ⇒ Object
MySQL specific syntax for LIKE/REGEXP searches, as well as string concatenation.
343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 |
# File 'lib/sequel/adapters/shared/mysql.rb', line 343 def complex_expression_sql(op, args) case op when :IN, :"NOT IN" ds = args.at(1) if ds.is_a?(Sequel::Dataset) && ds.opts[:limit] super(op, [args.at(0), ds.from_self]) else super end 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 when :'B~' "CAST(~#{literal(args.at(0))} AS SIGNED INTEGER)" else super(op, args) end end |
#distinct(*args) ⇒ Object
Use GROUP BY instead of DISTINCT ON if arguments are provided.
368 369 370 |
# File 'lib/sequel/adapters/shared/mysql.rb', line 368 def distinct(*args) args.empty? ? super : group(*args) end |
#for_share ⇒ Object
Return a cloned dataset which will use LOCK IN SHARE MODE to lock returned rows.
381 382 383 |
# File 'lib/sequel/adapters/shared/mysql.rb', line 381 def for_share lock_style(:share) end |
#full_text_search(cols, terms, opts = {}) ⇒ Object
Adds full text filter
386 387 388 |
# File 'lib/sequel/adapters/shared/mysql.rb', line 386 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.
391 392 393 |
# File 'lib/sequel/adapters/shared/mysql.rb', line 391 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.
396 397 398 |
# File 'lib/sequel/adapters/shared/mysql.rb', line 396 def having(*cond, &block) _filter(:having, *cond, &block) end |
#insert_ignore ⇒ Object
Sets up the insert methods to use INSERT IGNORE. Useful if you have a unique key and want to just skip inserting rows that violate the unique key restriction.
dataset.insert_ignore.multi_insert(
[{:name => 'a', :value => 1}, {:name => 'b', :value => 2}]
)
# INSERT IGNORE INTO tablename (name, value) VALUES (a, 1), (b, 2)
426 427 428 |
# File 'lib/sequel/adapters/shared/mysql.rb', line 426 def insert_ignore clone(:insert_ignore=>true) end |
#join_table(type, table, expr = nil, table_alias = {}, &block) ⇒ 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.
402 403 404 405 406 |
# File 'lib/sequel/adapters/shared/mysql.rb', line 402 def join_table(type, table, expr=nil, table_alias={}, &block) 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, &block) end |
#join_type_sql(join_type) ⇒ Object
Transforms :natural_inner to NATURAL LEFT JOIN and straight to STRAIGHT_JOIN.
410 411 412 413 414 415 416 |
# File 'lib/sequel/adapters/shared/mysql.rb', line 410 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.
454 455 456 |
# File 'lib/sequel/adapters/shared/mysql.rb', line 454 def multi_insert_sql(columns, values) [insert_sql(columns, LiteralString.new('VALUES ' + values.map {|r| literal(Array(r))}.join(COMMA_SEPARATOR)))] end |
#on_duplicate_key_update(*args) ⇒ Object
Sets up the insert methods 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.
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)
449 450 451 |
# File 'lib/sequel/adapters/shared/mysql.rb', line 449 def on_duplicate_key_update(*args) clone(:on_duplicate_key_update => args) end |
#provides_accurate_rows_matched? ⇒ Boolean
MySQL uses the number of rows actually modified in the update, instead of the number of matched by the filter.
460 461 462 |
# File 'lib/sequel/adapters/shared/mysql.rb', line 460 def provides_accurate_rows_matched? false end |
#quoted_identifier(c) ⇒ Object
MySQL uses the nonstandard ‘ (backtick) for quoting identifiers.
465 466 467 |
# File 'lib/sequel/adapters/shared/mysql.rb', line 465 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).
471 472 473 |
# File 'lib/sequel/adapters/shared/mysql.rb', line 471 def replace_sql(*values) clone(:replace=>true).insert_sql(*values) end |
#supports_distinct_on? ⇒ Boolean
MySQL can emulate DISTINCT ON with its non-standard GROUP BY implementation, though the rows returned cannot be made deterministic through ordering.
477 478 479 |
# File 'lib/sequel/adapters/shared/mysql.rb', line 477 def supports_distinct_on? true end |
#supports_intersect_except? ⇒ Boolean
MySQL does not support INTERSECT or EXCEPT
482 483 484 |
# File 'lib/sequel/adapters/shared/mysql.rb', line 482 def supports_intersect_except? false end |
#supports_modifying_joins? ⇒ Boolean
MySQL supports modifying joined datasets
487 488 489 |
# File 'lib/sequel/adapters/shared/mysql.rb', line 487 def true end |
#supports_ordered_distinct_on? ⇒ Boolean
MySQL’s DISTINCT ON emulation using GROUP BY does not respect the queries ORDER BY clause.
493 494 495 |
# File 'lib/sequel/adapters/shared/mysql.rb', line 493 def supports_ordered_distinct_on? false end |
#supports_timestamp_usecs? ⇒ Boolean
MySQL does support fractional timestamps in literal timestamps, but it ignores them. Also, using them seems to cause problems on 1.9. Since they are ignored anyway, not using them is probably best.
500 501 502 |
# File 'lib/sequel/adapters/shared/mysql.rb', line 500 def false end |