[:][c][o][n][d][i][t][i][o][n][s].[=][>].

Er, what? Why not just match for :conditions?
-----
Ryan Bigg
Freelancer
http://frozenplague.net







On 06/01/2009, at 10:03 AM, Ben wrote:

>
> If you are looking to improve your database performance, you might
> want to index your database, esspecially if it is large.  Here are
> some rake tasks that will look at your code and active record and
> automatically add indexes to your devel db.
>
> These two tasks are fairly rough drafts.  I am open to any input that
> would expand on what I have here.
>
> lib/tasks/db_indexing.rake
> (then run rake db_indexing:index_fks_in_model and rake
> db_indexing:index_sql_calls_in_app )
> ------
>
> require 'ActiveRecord'
> require(File.join(RAILS_ROOT, 'config', 'environment'))
>
> namespace :db_indexing do
>  desc "This task will search text files for rails queries and,
> checking for duplicates, generate sql that properly indexes these
> commands"
>  task :index_fks_in_model do
>    connection = ActiveRecord::Base.connection
>    connection.tables.each do |table|
>      begin
>        table_columns = eval(table.singularize.capitalize +
> ".column_names")
>        table_columns.each do |column_string|
>          if column_string.include?('_id')
>            connection.execute("CREATE INDEX " +  table + "_" +
> column_string + "_index" + "ON" + "#{table}(#{column_string});")
>          end
>        end
>        rescue
>      end
>    end
>    puts "Task completed"
>  end
>
>  desc "This task will iterate through the objects in your model and
> find out which columns end with _id and generate an sql commands to
> index these columns"
>  task :index_sql_calls_in_app do
>    connection = ActiveRecord::Base.connection
>    controller_files = File.join("**", "*_controller.rb")
>    helper_files = File.join("**", "*_helper.rb")
>    no_of_calls = 0
>    array_of_files = Dir.glob(controller_files).concat(Dir.glob
> (helper_files))
>    array_of_files.each do |file|
>      temp_f = File.new(file)
>      temp_f.each do |line|
>        if line.to_s.include?(":conditions")
>          array_of_columns_to_index = []
>          critical_string = line.to_s.match('([:][c][o][n][d][i][t][i]
> [o][n][s].[=][>].)\[.+\]')[0] if line.to_s.match('([:][c][o][n][d][i]
> [t][i][o][n][s].[=][>].)\[.+\]')
>          table = line.to_s.match('=.+')[0]
>          table = table[1, table.index('.') - 1]
>          table = table.chomp.strip
>          temp_string = ''
>          table.each_char do |char|
>            if char.downcase.to_s == char.to_s
>              temp_string = temp_string + char
>            else
>              temp_string = temp_string + '_' + char.downcase
>            end
>          end
>          table = temp_string[1, temp_string.length]
>          table = table.chomp.strip.downcase.pluralize
>          cs2  = critical_string.to_s.match('\[.+\]')[0] if
> critical_string.to_s.match('\[.+\]')
>          if cs2
>            cs3 = cs2[1, cs2.index(',') - 1] if cs2.index(',')
>          else
>          end
>          if cs3
>            cs3 = cs3[1,cs3.length - 2]
>            cs3.to_s.each(' ') do |tstr|
>              tstr = tstr.chomp.strip
>              tstr = tstr.downcase
>              if !tstr.match('\W') && tstr != 'and' && tstr != 'or' &&
> tstr != 'is' && tstr != '1' && tstr != 'null' && tstr != '0' && tstr !
> = 'id'
>                array_of_columns_to_index << tstr
>              end
>            end
>          end
>          index_name = table.to_s + "_"
>          index_string2 = ''
>          if array_of_columns_to_index.length > 0
>            array_of_columns_to_index.each do |column_to_index|
>              index_name = index_name + column_to_index + "_"
>              index_string2 = index_string2 + column_to_index + ','
>            end
>            index_string2 = index_string2[0,index_string2.length - 1]
>            index_name = index_name + 'index'
>            sql_command = "CREATE INDEX " + index_name + " ON " +
> table.to_s + "("  + index_string2 + ")" + ";"
>
>
>            begin
>              puts sql_command
>              connection.execute(sql_command)
>              rescue StandardError =>e
>              puts "ERROR"
> #              if !e.clean_message.to_s.include?("42000")
>                puts e.clean_message.to_s
>                puts e.backtrace
>  #            end
>            end
>          end
>        end
>
>      end
>    end
>    puts "Task completed"
>  end
>
>
> end
>
>
> ------
> >


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "Ruby 
on Rails: Talk" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/rubyonrails-talk?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to