lib/ridgepole/dsl_parser.rb in ridgepole-0.8.3 vs lib/ridgepole/dsl_parser.rb in ridgepole-0.8.4

- old
+ new

@@ -6,25 +6,43 @@ @options = options end def parse(dsl, opts = {}) definition, execute = Context.eval(dsl, opts) - check_orphan_index(definition) - check_orphan_foreign_key(definition) + check_definition(definition) [definition, execute] end private - def check_orphan_index(definition) + def check_definition(definition) definition.each do |table_name, attrs| - raise "Table `#{table_name}` to create the index is not defined: #{attrs[:indices].keys.join(',')}" if attrs[:indices] && !(attrs[:definition]) + check_orphan_index(table_name, attrs) + check_orphan_foreign_key(table_name, attrs) + check_foreign_key_without_index(table_name, attrs) end end - def check_orphan_foreign_key(definition) - definition.each do |table_name, attrs| - raise "Table `#{table_name}` to create the foreign key is not defined: #{attrs[:foreign_keys].keys.join(',')}" if attrs[:foreign_keys] && !(attrs[:definition]) + def check_orphan_index(table_name, attrs) + raise "Table `#{table_name}` to create the index is not defined: #{attrs[:indices].keys.join(',')}" if attrs[:indices] && !(attrs[:definition]) + end + + def check_orphan_foreign_key(table_name, attrs) + raise "Table `#{table_name}` to create the foreign key is not defined: #{attrs[:foreign_keys].keys.join(',')}" if attrs[:foreign_keys] && !(attrs[:definition]) + end + + def check_foreign_key_without_index(table_name, attrs) + return unless attrs[:foreign_keys] + return unless attrs[:options][:options]&.include?('ENGINE=InnoDB') + + attrs[:foreign_keys].each do |_, foreign_key_attrs| + fk_index = foreign_key_attrs[:options][:column] || "#{foreign_key_attrs[:to_table].singularize}_id" + next if attrs[:indices]&.any? { |_k, v| v[:column_name].first == fk_index } + + Ridgepole::Logger.instance.warn(<<-MSG) +[WARNING] Table `#{table_name}` has a foreign key on `#{fk_index}` column, but doesn't have any indexes on the column. + Although an index will be added automatically by InnoDB, please add an index explicitly for your future operations. + MSG end end end end