module ActiveRelation module Sql module Quoting delegate :quote_table_name, :quote_column_name, :quote, :to => :engine end # module Formatting Context / Strategy # unit test me!!! class Strategy attr_reader :engine include Quoting def initialize(engine) @engine = engine end end class Projection < Strategy def attribute(relation_name, attribute_name, aliaz) "#{quote_table_name(relation_name)}.#{quote_column_name(attribute_name)}" + (aliaz ? " AS #{quote(aliaz.to_s)}" : "") end def select(select_sql, aliaz) "(#{select_sql})" + (aliaz ? " AS #{quote(aliaz)}" : "") end end class Predicate < Strategy def attribute(relation_name, attribute_name, aliaz) "#{quote_table_name(relation_name)}.#{quote_column_name(attribute_name)}" end def scalar(scalar, column = nil) quote(scalar, column) end def select(select_sql, aliaz) "(#{select_sql})" end end class Selection < Strategy def scalar(scalar) scalar end end class Relation < Strategy def select(select_sql, aliaz) select_sql end end class Aggregation < Strategy def select(select_sql, aliaz) "(#{select_sql}) AS #{engine.quote_table_name(aliaz)}" end end class Attribute < Predicate def initialize(attribute) @attribute, @engine = attribute, attribute.engine end def scalar(scalar) quote(scalar, @attribute.column) end end class Scalar < Predicate end end end