class DBLeftovers::Index

Just a struct to hold all the info for one index:

Attributes

column_names[RW]
index_function[RW]
index_name[RW]
table_name[RW]
unique[RW]
using_clause[RW]
where_clause[RW]

Public Class Methods

new(table_name, column_names, opts={}) click to toggle source
# File lib/db_leftovers/index.rb, line 8
def initialize(table_name, column_names, opts={})
  opts = {
    :where => nil,
    :function => nil,
    :unique => false,
    :using => nil
  }.merge(opts)
  opts.keys.each do |k|
    raise "Unknown option: #{k}" unless [:where, :function, :unique, :using, :name].include?(k)
  end
  if column_names.is_a?(String) and opts[:function].nil?
    opts[:function] = column_names
    column_names = []
  end
  @table_name = table_name.to_s
  @column_names = [column_names].flatten.map{|x| x.to_s}
  @where_clause = opts[:where]
  @index_function = opts[:function]
  @using_clause = opts[:using]
  @unique = !!opts[:unique]
  @index_name = (opts[:name] || choose_name(@table_name, @column_names, @index_function)).to_s

  raise "Indexes need a table!" unless @table_name
  raise "Indexes need at least column or an expression!" unless (@column_names.any? or @index_function)
  raise "Can't have both columns and an expression!" if (@column_names.size > 0 and @index_function)
end

Public Instance Methods

equals(other) click to toggle source
# File lib/db_leftovers/index.rb, line 39
def equals(other)
  other.table_name == table_name and
  other.column_names == column_names and
  other.index_name == index_name and
  other.where_clause == where_clause and
  other.index_function == index_function and
  other.using_clause == using_clause and
  other.unique == unique
end
to_s() click to toggle source
# File lib/db_leftovers/index.rb, line 49
def to_s
  "<#{@index_name}: #{@table_name}.[#{column_names.join(",")}] unique=#{@unique}, where=#{@where_clause}, function=#{@index_function}, using=#{@using_clause}>"
end
unique?() click to toggle source
# File lib/db_leftovers/index.rb, line 35
def unique?
  !!@unique
end

Private Instance Methods

choose_name(table_name, column_names, index_function) click to toggle source
# File lib/db_leftovers/index.rb, line 55
def choose_name(table_name, column_names, index_function)
  topic = if column_names.any?
            column_names.join("_and_")
          else
            index_function
          end
  ret = "index_#{table_name}_on_#{topic}"
  ret = ret.gsub(/[^a-zA-Z0-9]/, '_').
            gsub(/__+/, '_').
            gsub(/^_/, '').
            gsub(/_$/, '')
  # Max length in Postgres is 63; in MySQL 64:
  ret[0,63]
end