lib/arel/engines/sql/relations/table.rb in arel-0.4.0 vs lib/arel/engines/sql/relations/table.rb in arel-1.0.0.rc1

- old
+ new

@@ -1,84 +1,96 @@ module Arel class Table include Relation, Recursion::BaseCase - cattr_accessor :engine, :tables - attr_reader :name, :engine, :table_alias, :options + @@engine = nil + @@tables = nil + class << self # FIXME: Do we really need these? + def engine; @@engine; end + def engine= e; @@engine = e; end + def tables; @@tables; end + def tables= e; @@tables = e; end + end + + attr_reader :name, :engine, :table_alias, :options, :christener + attr_reader :table_exists + alias :table_exists? :table_exists + def initialize(name, options = {}) @name = name.to_s @table_exists = nil + @table_alias = nil + @christener = Sql::Christener.new + @attributes = nil + @matching_attributes = nil if options.is_a?(Hash) @options = options @engine = options[:engine] || Table.engine - @table_alias = options[:as].to_s if options[:as].present? && options[:as].to_s != @name + + if options[:as] + as = options[:as].to_s + @table_alias = as unless as == @name + end else @engine = options # Table.new('foo', engine) end if @engine.connection begin require "arel/engines/sql/compilers/#{@engine.adapter_name.downcase}_compiler" - @@tables ||= engine.tables rescue LoadError - raise "#{@engine.adapter_name} is not supported by Arel." + begin + # try to load an externally defined compiler, in case this adapter has defined the compiler on its own. + require "#{@engine.adapter_name.downcase}/arel_compiler" + rescue LoadError + raise "#{@engine.adapter_name} is not supported by Arel." + end end + + @@tables ||= engine.connection.tables + @table_exists = @@tables.include?(name) || + @engine.connection.table_exists?(name) end end def as(table_alias) Table.new(name, options.merge(:as => table_alias)) end - def table_exists? - if @table_exists - true - else - @table_exists = @@tables.include?(name) || engine.table_exists?(name) - end - end - def attributes - return @attributes if defined?(@attributes) + return @attributes if @attributes if table_exists? - @attributes ||= begin - attrs = columns.collect do |column| - Sql::Attributes.for(column).new(column, self, column.name.to_sym) - end - Header.new(attrs) + attrs = columns.collect do |column| + Sql::Attributes.for(column).new(column, self, column.name.to_sym) end + @attributes = Header.new(attrs) else Header.new end end - def eql?(other) - self == other - end - - def hash - @hash ||= :name.hash - end - def column_for(attribute) has_attribute?(attribute) and columns.detect { |c| c.name == attribute.name.to_s } end def columns - @columns ||= engine.columns(name, "#{name} Columns") + @columns ||= engine.connection.columns(name, "#{name} Columns") end def reset @columns = nil @attributes = Header.new([]) end - def ==(other) - Table === other and - name == other.name and - table_alias == other.table_alias + private + def matching_attributes + @matching_attributes ||= Hash[attributes.map { |a| [a.root, true] }] + end + + def has_attribute?(attribute) + matching_attributes.key? attribute.root end end end def Table(name, engine = Arel::Table.engine)