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
- COMMA_SEPARATOR =
', '.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 columns from join where group having compounds order limit')
- UPDATE_CLAUSE_METHODS =
Dataset.clause_methods(:update, %w'table set where order limit')
Instance Method Summary collapse
-
#complex_expression_sql(op, args) ⇒ Object
MySQL specific syntax for LIKE/REGEXP searches, as well as string concatenation.
-
#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.
-
#supports_modifying_joins? ⇒ Boolean
MySQL supports modifying joined datasets.
-
#supports_timestamp_usecs? ⇒ Boolean
MySQL does support fractional timestamps in literal timestamps, but it ignores them.
Instance Method Details
#complex_expression_sql(op, args) ⇒ Object
MySQL specific syntax for LIKE/REGEXP searches, as well as string concatenation.
212 213 214 215 216 217 218 219 220 221 222 223 224 225 |
# File 'lib/sequel/adapters/shared/mysql.rb', line 212 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 |
#full_text_search(cols, terms, opts = {}) ⇒ Object
Adds full text filter
228 229 230 |
# File 'lib/sequel/adapters/shared/mysql.rb', line 228 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.
233 234 235 |
# File 'lib/sequel/adapters/shared/mysql.rb', line 233 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.
238 239 240 |
# File 'lib/sequel/adapters/shared/mysql.rb', line 238 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)
272 273 274 |
# File 'lib/sequel/adapters/shared/mysql.rb', line 272 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.
244 245 246 247 248 |
# File 'lib/sequel/adapters/shared/mysql.rb', line 244 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.
252 253 254 255 256 257 258 |
# File 'lib/sequel/adapters/shared/mysql.rb', line 252 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.
305 306 307 |
# File 'lib/sequel/adapters/shared/mysql.rb', line 305 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 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)
300 301 302 |
# File 'lib/sequel/adapters/shared/mysql.rb', line 300 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.
310 311 312 |
# File 'lib/sequel/adapters/shared/mysql.rb', line 310 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).
316 317 318 |
# File 'lib/sequel/adapters/shared/mysql.rb', line 316 def replace_sql(*values) clone(:replace=>true).insert_sql(*values) end |
#supports_distinct_on? ⇒ Boolean
does not support DISTINCT ON
321 322 323 |
# File 'lib/sequel/adapters/shared/mysql.rb', line 321 def supports_distinct_on? false end |
#supports_intersect_except? ⇒ Boolean
MySQL does not support INTERSECT or EXCEPT
326 327 328 |
# File 'lib/sequel/adapters/shared/mysql.rb', line 326 def supports_intersect_except? false end |
#supports_modifying_joins? ⇒ Boolean
MySQL supports modifying joined datasets
331 332 333 |
# File 'lib/sequel/adapters/shared/mysql.rb', line 331 def true 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.
338 339 340 |
# File 'lib/sequel/adapters/shared/mysql.rb', line 338 def false end |