aboutsummaryrefslogblamecommitdiffstats
path: root/lib/active_relation/sql.rb
blob: 99cfc66383fc8bdb5fefaecea166d053790ed859 (plain) (tree)
1
2
3
4
5
6
7
8
9


                     
                                                                            

       
                                                            
                  
                         
                     



                            






                                                                                                                             
                                   
                                                                







                                                                                 

                                      

         
                                   



                         






                              
                                   



                  

                                   
                                                              


         

                               
                                                         

         
                        
                                        

         


                            

     
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