aboutsummaryrefslogtreecommitdiffstats
path: root/lib/active_relation/primitives/attribute.rb
blob: 65ae12cf36787a506b5f17fed86049e1bc80ea85 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
module ActiveRelation
  module Primitives
    class Attribute
      include SqlBuilder
  
      attr_reader :relation, :name, :alias
  
      def initialize(relation, name, aliaz = nil)
        @relation, @name, @alias = relation, name, aliaz
      end
  
      def alias(aliaz = nil)
        aliaz ? Attribute.new(relation, name, aliaz) : @alias
      end
  
      def qualified_name
        "#{relation.table}.#{name}"
      end
  
      def qualify
        self.alias(qualified_name)
      end
  
      def ==(other)
        relation == other.relation and name == other.name and @alias == other.alias
      end

      module Predications
        include Predicates
        
        def equals(other)
          Equality.new(self, other)
        end
  
        def less_than(other)
          LessThan.new(self, other)
        end
  
        def less_than_or_equal_to(other)
          LessThanOrEqualTo.new(self, other)
        end
  
        def greater_than(other)
          GreaterThan.new(self, other)
        end
  
        def greater_than_or_equal_to(other)
          GreaterThanOrEqualTo.new(self, other)
        end
  
        def matches(regexp)
          Match.new(self, regexp)
        end
      end
      include Predications
      
      module Aggregations
        def count
          Aggregation.new(self, "COUNT")
        end
        
        def sum
          Aggregation.new(self, "SUM")
        end
        
        def maximum
          Aggregation.new(self, "MAX")
        end
        
        def minimum
          Aggregation.new(self, "MIN")
        end
        
        def average
          Aggregation.new(self, "AVG")
        end
      end
      include Aggregations
  
      def to_sql(options = {})
        "#{quote_table_name(relation.table)}.#{quote_column_name(name)}" + (options[:use_alias] && self.alias ? " AS #{self.alias.to_s.to_sql}" : "")
      end
    end
  end
end