lib/gizzard/mysql.rb in gizzard-0.3.0 vs lib/gizzard/mysql.rb in gizzard-0.4.0
- old
+ new
@@ -28,11 +28,57 @@
def force_index(indexes)
from("#{table_name} FORCE INDEX(#{Array(indexes).join(', ')})")
end
+ def joins_with_use_index(relation_name, indexes)
+ joins_with_index_hint(relation_name, indexes, join_type: :inner_join, hint: :use)
+ end
+
+ def joins_with_force_index(relation_name, indexes)
+ joins_with_index_hint(relation_name, indexes, join_type: :inner_join, hint: :force)
+ end
+
+ def left_outer_joins_with_use_index(relation_name, indexes)
+ joins_with_index_hint(relation_name, indexes, join_type: :left_outer_join, hint: :use)
+ end
+
+ def left_outer_joins_with_force_index(relation_name, indexes)
+ joins_with_index_hint(relation_name, indexes, join_type: :left_outer_join, hint: :force)
+ end
+
def lock_in_share
lock('LOCK IN SHARE MODE')
+ end
+
+ private
+
+ def joins_with_index_hint(relation_name, indexes, join_type: :inner_join, hint: :use)
+ relation = reflections[relation_name.to_s]
+ join_table_name = relation.klass.table_name
+
+ join = case join_type
+ when :inner_join
+ 'INNER JOIN'
+ when :left_outer_join
+ 'LEFT OUTER JOIN'
+ else
+ raise
+ end
+
+ index_hint = case hint
+ when :use
+ 'USE INDEX'
+ when :force
+ 'FORCE INDEX'
+ else
+ raise
+ end
+
+ c = connection
+ joins <<-SQL
+ #{join} #{c.quote_table_name(join_table_name)} #{index_hint} (#{Array(indexes).join(', ')}) ON #{c.quote_table_name(table_name)}.#{c.quote_column_name(relation.association_primary_key)} = #{c.quote_table_name(join_table_name)}.#{c.quote_column_name(relation.foreign_key)}
+ SQL
end
end
def to_id
id