Class: Arel::SelectManager
  
  
  
  
    
      Constant Summary
      collapse
    
    
      
        - STRING_OR_SYMBOL_CLASS =
          
        
 
        [Symbol, String]
 
      
    
  
  Instance Attribute Summary
  
  Attributes inherited from TreeManager
  #ast
  
    
      Instance Method Summary
      collapse
    
    
  
  
  
  
  
  
  
  
  
  Methods included from Crud
  #compile_delete, #compile_insert, #compile_update, #create_insert
  
  
  
  
  
  
  
  
  Methods inherited from TreeManager
  #to_dot, #to_sql, #where
  
  
  
  
  
  
  
  
  
  #coalesce, #create_and, #create_false, #create_join, #create_on, #create_string_join, #create_table_alias, #create_true, #grouping, #lower
  Constructor Details
  
    
  
  
    #initialize(table = nil)  ⇒ SelectManager 
  
  
  
  
    
Returns a new instance of SelectManager.
   
 
  
  
    
      
9
10
11
12
13
14 
     | 
    
      # File 'lib/arel/select_manager.rb', line 9
def initialize(table = nil)
  super()
  @ast = Nodes::SelectStatement.new
  @ctx = @ast.cores.last
  from table
end 
     | 
  
 
  
 
  
    Instance Method Details
    
      
  
  
    #as(other)  ⇒ Object 
  
  
  
  
    
      
50
51
52 
     | 
    
      # File 'lib/arel/select_manager.rb', line 50
def as(other)
  create_table_alias grouping(@ast), Nodes::SqlLiteral.new(other)
end 
     | 
  
 
    
      
  
  
    
      
247
248
249
250 
     | 
    
      # File 'lib/arel/select_manager.rb', line 247
def (*values)
  @ctx. = Nodes::Comment.new(values)
  self
end 
     | 
  
 
    
      
  
  
    #constraints  ⇒ Object 
  
  
  
  
    
      
26
27
28 
     | 
    
      # File 'lib/arel/select_manager.rb', line 26
def constraints
  @ctx.wheres
end 
     | 
  
 
    
      
  
  
    #distinct(value = true)  ⇒ Object 
  
  
  
  
    
      
156
157
158
159
160
161
162
163 
     | 
    
      # File 'lib/arel/select_manager.rb', line 156
def distinct(value = true)
  if value
    @ctx.set_quantifier = Arel::Nodes::Distinct.new
  else
    @ctx.set_quantifier = nil
  end
  self
end
     | 
  
 
    
      
  
  
    #distinct_on(value)  ⇒ Object 
  
  
  
  
    
      
165
166
167
168
169
170
171
172 
     | 
    
      # File 'lib/arel/select_manager.rb', line 165
def distinct_on(value)
  if value
    @ctx.set_quantifier = Arel::Nodes::DistinctOn.new(value)
  else
    @ctx.set_quantifier = nil
  end
  self
end
     | 
  
 
    
      
  
  
    #except(other)  ⇒ Object 
  
  
    Also known as:
    minus
    
  
  
  
    
      
208
209
210 
     | 
    
      # File 'lib/arel/select_manager.rb', line 208
def except(other)
  Nodes::Except.new ast, other.ast
end 
     | 
  
 
    
      
  
  
    #exists  ⇒ Object 
  
  
  
  
    
Produces an Arel::Nodes::Exists node
   
 
  
  
    
      
46
47
48 
     | 
    
      # File 'lib/arel/select_manager.rb', line 46
def exists
  Arel::Nodes::Exists.new @ast
end 
     | 
  
 
    
      
  
  
    #from(table)  ⇒ Object 
  
  
  
  
    
      
87
88
89
90
91
92
93
94
95
96
97
98 
     | 
    
      # File 'lib/arel/select_manager.rb', line 87
def from(table)
  table = Nodes::SqlLiteral.new(table) if String === table
  case table
  when Nodes::Join
    @ctx.source.right << table
  else
    @ctx.source.left = table
  end
  self
end
     | 
  
 
    
      
  
  
    #froms  ⇒ Object 
  
  
  
  
    
      
100
101
102 
     | 
    
      # File 'lib/arel/select_manager.rb', line 100
def froms
  @ast.cores.map { |x| x.from }.compact
end
     | 
  
 
    
      
  
  
    #group(*columns)  ⇒ Object 
  
  
  
  
    
      
76
77
78
79
80
81
82
83
84
85 
     | 
    
      # File 'lib/arel/select_manager.rb', line 76
def group(*columns)
  columns.each do |column|
        column = Nodes::SqlLiteral.new(column) if String === column
    column = Nodes::SqlLiteral.new(column.to_s) if Symbol === column
    @ctx.groups.push Nodes::Group.new column
  end
  self
end
     | 
  
 
    
      
  
  
    #having(expr)  ⇒ Object 
  
  
  
  
    
      
121
122
123
124 
     | 
    
      # File 'lib/arel/select_manager.rb', line 121
def having(expr)
  @ctx.havings << expr
  self
end 
     | 
  
 
    
      
  
  
    #initialize_copy(other)  ⇒ Object 
  
  
  
  
    
      
16
17
18
19 
     | 
    
      # File 'lib/arel/select_manager.rb', line 16
def initialize_copy(other)
  super
  @ctx = @ast.cores.last
end 
     | 
  
 
    
      
  
  
    #intersect(other)  ⇒ Object 
  
  
  
  
    
      
204
205
206 
     | 
    
      # File 'lib/arel/select_manager.rb', line 204
def intersect(other)
  Nodes::Intersect.new ast, other.ast
end 
     | 
  
 
    
      
  
  
    #join(relation, klass = Nodes::InnerJoin)  ⇒ Object 
  
  
  
  
    
      
104
105
106
107
108
109
110
111
112
113
114
115 
     | 
    
      # File 'lib/arel/select_manager.rb', line 104
def join(relation, klass = Nodes::InnerJoin)
  return self unless relation
  case relation
  when String, Nodes::SqlLiteral
    raise EmptyJoinError if relation.empty?
    klass = Nodes::StringJoin
  end
  @ctx.source.right << create_join(relation, nil, klass)
  self
end
     | 
  
 
    
      
  
  
    #join_sources  ⇒ Object 
  
  
  
  
    
      
239
240
241 
     | 
    
      # File 'lib/arel/select_manager.rb', line 239
def join_sources
  @ctx.source.right
end 
     | 
  
 
    
      
  
  
    #lateral(table_name = nil)  ⇒ Object 
  
  
  
  
    
      
213
214
215
216 
     | 
    
      # File 'lib/arel/select_manager.rb', line 213
def lateral(table_name = nil)
  base = table_name.nil? ? ast : as(table_name)
  Nodes::Lateral.new(base)
end 
     | 
  
 
    
      
  
  
    #limit  ⇒ Object 
  
  
    Also known as:
    taken
    
  
  
  
    
      
21
22
23 
     | 
    
      # File 'lib/arel/select_manager.rb', line 21
def limit
  @ast.limit && @ast.limit.expr
end 
     | 
  
 
    
      
  
  
    #lock(locking = Arel.sql("FOR UPDATE"))  ⇒ Object 
  
  
  
  
    
      
54
55
56
57
58
59
60
61
62
63
64
65 
     | 
    
      # File 'lib/arel/select_manager.rb', line 54
def lock(locking = Arel.sql("FOR UPDATE"))
  case locking
  when true
    locking = Arel.sql("FOR UPDATE")
  when Arel::Nodes::SqlLiteral
  when String
    locking = Arel.sql locking
  end
  @ast.lock = Nodes::Lock.new(locking)
  self
end
     | 
  
 
    
      
  
  
    #locked  ⇒ Object 
  
  
  
  
    
      
67
68
69 
     | 
    
      # File 'lib/arel/select_manager.rb', line 67
def locked
  @ast.lock
end 
     | 
  
 
    
      
  
  
    #offset  ⇒ Object 
  
  
  
  
    
      
30
31
32 
     | 
    
      # File 'lib/arel/select_manager.rb', line 30
def offset
  @ast.offset && @ast.offset.expr
end 
     | 
  
 
    
      
  
  
    #on(*exprs)  ⇒ Object 
  
  
  
  
    
      
71
72
73
74 
     | 
    
      # File 'lib/arel/select_manager.rb', line 71
def on(*exprs)
  @ctx.source.right.last.right = Nodes::On.new(collapse(exprs))
  self
end 
     | 
  
 
    
      
  
  
    #optimizer_hints(*hints)  ⇒ Object 
  
  
  
  
    
      
149
150
151
152
153
154 
     | 
    
      # File 'lib/arel/select_manager.rb', line 149
def optimizer_hints(*hints)
  unless hints.empty?
    @ctx.optimizer_hints = Arel::Nodes::OptimizerHints.new(hints)
  end
  self
end
     | 
  
 
    
      
  
  
    #order(*expr)  ⇒ Object 
  
  
  
  
    
      
174
175
176
177
178
179
180 
     | 
    
      # File 'lib/arel/select_manager.rb', line 174
def order(*expr)
    @ast.orders.concat expr.map { |x|
    STRING_OR_SYMBOL_CLASS.include?(x.class) ? Nodes::SqlLiteral.new(x.to_s) : x
  }
  self
end
     | 
  
 
    
      
  
  
    #orders  ⇒ Object 
  
  
  
  
    
      
182
183
184 
     | 
    
      # File 'lib/arel/select_manager.rb', line 182
def orders
  @ast.orders
end 
     | 
  
 
    
      
  
  
    #outer_join(relation)  ⇒ Object 
  
  
  
  
    
      
117
118
119 
     | 
    
      # File 'lib/arel/select_manager.rb', line 117
def outer_join(relation)
  join(relation, Nodes::OuterJoin)
end 
     | 
  
 
    
      
  
  
    #project(*projections)  ⇒ Object 
  
  
  
  
    
      
132
133
134
135
136
137
138
139 
     | 
    
      # File 'lib/arel/select_manager.rb', line 132
def project(*projections)
      @ctx.projections.concat projections.map { |x|
    STRING_OR_SYMBOL_CLASS.include?(x.class) ? Nodes::SqlLiteral.new(x.to_s) : x
  }
  self
end
     | 
  
 
    
      
  
  
    #projections  ⇒ Object 
  
  
  
  
    
      
141
142
143 
     | 
    
      # File 'lib/arel/select_manager.rb', line 141
def projections
  @ctx.projections
end 
     | 
  
 
    
      
  
  
    #projections=(projections)  ⇒ Object 
  
  
  
  
    
      
145
146
147 
     | 
    
      # File 'lib/arel/select_manager.rb', line 145
def projections=(projections)
  @ctx.projections = projections
end 
     | 
  
 
    
      
  
  
    #skip(amount)  ⇒ Object 
  
  
    Also known as:
    offset=
    
  
  
  
    
      
34
35
36
37
38
39
40
41 
     | 
    
      # File 'lib/arel/select_manager.rb', line 34
def skip(amount)
  if amount
    @ast.offset = Nodes::Offset.new(amount)
  else
    @ast.offset = nil
  end
  self
end
     | 
  
 
    
      
  
  
    #source  ⇒ Object 
  
  
  
  
    
      
243
244
245 
     | 
    
      # File 'lib/arel/select_manager.rb', line 243
def source
  @ctx.source
end 
     | 
  
 
    
      
  
  
    #take(limit)  ⇒ Object 
  
  
    Also known as:
    limit=
    
  
  
  
    
      
229
230
231
232
233
234
235
236 
     | 
    
      # File 'lib/arel/select_manager.rb', line 229
def take(limit)
  if limit
    @ast.limit = Nodes::Limit.new(limit)
  else
    @ast.limit = nil
  end
  self
end
     | 
  
 
    
      
  
  
    #union(operation, other = nil)  ⇒ Object 
  
  
  
  
    
      
193
194
195
196
197
198
199
200
201
202 
     | 
    
      # File 'lib/arel/select_manager.rb', line 193
def union(operation, other = nil)
  if other
    node_class = Nodes.const_get("Union#{operation.to_s.capitalize}")
  else
    other = operation
    node_class = Nodes::Union
  end
  node_class.new self.ast, other.ast
end
     | 
  
 
    
      
  
  
    #where_sql(engine = Table.engine)  ⇒ Object 
  
  
  
 
    
      
  
  
    #window(name)  ⇒ Object 
  
  
  
  
    
      
126
127
128
129
130 
     | 
    
      # File 'lib/arel/select_manager.rb', line 126
def window(name)
  window = Nodes::NamedWindow.new(name)
  @ctx.windows.push window
  window
end 
     | 
  
 
    
      
  
  
    #with(*subqueries)  ⇒ Object 
  
  
  
  
    
      
218
219
220
221
222
223
224
225
226
227 
     | 
    
      # File 'lib/arel/select_manager.rb', line 218
def with(*subqueries)
  if subqueries.first.is_a? Symbol
    node_class = Nodes.const_get("With#{subqueries.shift.to_s.capitalize}")
  else
    node_class = Nodes::With
  end
  @ast.with = node_class.new(subqueries.flatten)
  self
end
     |