class Arel::SelectManager

Constants

STRING_OR_SYMBOL_CLASS

Public Class Methods

new(engine, table = nil) click to toggle source
Calls superclass method Arel::TreeManager.new
# File lib/arel/select_manager.rb, line 9
def initialize engine, table = nil
  super(engine)
  @ast   = Nodes::SelectStatement.new
  @ctx    = @ast.cores.last
  from table
end

Public Instance Methods

as(other) click to toggle source
# File lib/arel/select_manager.rb, line 50
def as other
  create_table_alias grouping(@ast), Nodes::SqlLiteral.new(other)
end
constraints() click to toggle source
# File lib/arel/select_manager.rb, line 26
def constraints
  @ctx.wheres
end
distinct(value = true) click to toggle source
# File lib/arel/select_manager.rb, line 149
def distinct(value = true)
  if value
    @ctx.set_quantifier = Arel::Nodes::Distinct.new
  else
    @ctx.set_quantifier = nil
  end
  self
end
distinct_on(value) click to toggle source
# File lib/arel/select_manager.rb, line 158
def distinct_on(value)
  if value
    @ctx.set_quantifier = Arel::Nodes::DistinctOn.new(value)
  else
    @ctx.set_quantifier = nil
  end
  self
end
except(other) click to toggle source
# File lib/arel/select_manager.rb, line 201
def except other
  Nodes::Except.new ast, other.ast
end
Also aliased as: minus
exists() click to toggle source

Produces an Arel::Nodes::Exists node

# File lib/arel/select_manager.rb, line 46
def exists
  Arel::Nodes::Exists.new @ast
end
from(table) click to toggle source
# 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() click to toggle source
# File lib/arel/select_manager.rb, line 100
def froms
  @ast.cores.map { |x| x.from }.compact
end
group(*columns) click to toggle source
# File lib/arel/select_manager.rb, line 76
def group *columns
  columns.each do |column|
    # FIXME: backwards compat
    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(*exprs) click to toggle source
# File lib/arel/select_manager.rb, line 121
def having *exprs
  @ctx.having = Nodes::Having.new(collapse(exprs, @ctx.having))
  self
end
initialize_copy(other) click to toggle source
Calls superclass method Arel::TreeManager#initialize_copy
# File lib/arel/select_manager.rb, line 16
def initialize_copy other
  super
  @ctx = @ast.cores.last
end
intersect(other) click to toggle source
# File lib/arel/select_manager.rb, line 197
def intersect other
  Nodes::Intersect.new ast, other.ast
end
join(relation, klass = Nodes::InnerJoin) click to toggle source
# 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 if relation.empty?
    klass = Nodes::StringJoin
  end

  @ctx.source.right << create_join(relation, nil, klass)
  self
end
join_sources() click to toggle source
# File lib/arel/select_manager.rb, line 229
def join_sources
  @ctx.source.right
end
limit() click to toggle source
# File lib/arel/select_manager.rb, line 21
def limit
  @ast.limit && @ast.limit.expr
end
Also aliased as: taken
limit=(limit)
Alias for: take
lock(locking = Arel.sql('FOR UPDATE')) click to toggle source
# 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() click to toggle source
# File lib/arel/select_manager.rb, line 67
def locked
  @ast.lock
end
minus(other)
Alias for: except
offset() click to toggle source
# File lib/arel/select_manager.rb, line 30
def offset
  @ast.offset && @ast.offset.expr
end
offset=(amount)
Alias for: skip
on(*exprs) click to toggle source
# File lib/arel/select_manager.rb, line 71
def on *exprs
  @ctx.source.right.last.right = Nodes::On.new(collapse(exprs))
  self
end
order(*expr) click to toggle source
# File lib/arel/select_manager.rb, line 167
def order *expr
  # FIXME: We SHOULD NOT be converting these to SqlLiteral automatically
  @ast.orders.concat expr.map { |x|
    STRING_OR_SYMBOL_CLASS.include?(x.class) ? Nodes::SqlLiteral.new(x.to_s) : x
  }
  self
end
orders() click to toggle source
# File lib/arel/select_manager.rb, line 175
def orders
  @ast.orders
end
outer_join(relation) click to toggle source
# File lib/arel/select_manager.rb, line 117
def outer_join relation
  join(relation, Nodes::OuterJoin)
end
project(*projections) click to toggle source
# File lib/arel/select_manager.rb, line 132
def project *projections
  # FIXME: converting these to SQLLiterals is probably not good, but
  # rails tests require it.
  @ctx.projections.concat projections.map { |x|
    STRING_OR_SYMBOL_CLASS.include?(x.class) ? Nodes::SqlLiteral.new(x.to_s) : x
  }
  self
end
projections() click to toggle source
# File lib/arel/select_manager.rb, line 141
def projections
  @ctx.projections
end
projections=(projections) click to toggle source
# File lib/arel/select_manager.rb, line 145
def projections= projections
  @ctx.projections = projections
end
skip(amount) click to toggle source
# 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
Also aliased as: offset=
source() click to toggle source
# File lib/arel/select_manager.rb, line 233
def source
  @ctx.source
end
take(limit) click to toggle source
# File lib/arel/select_manager.rb, line 217
def take limit
  if limit
    @ast.limit = Nodes::Limit.new(limit)
    @ctx.top   = Nodes::Top.new(limit)
  else
    @ast.limit = nil
    @ctx.top   = nil
  end
  self
end
Also aliased as: limit=
taken()
Alias for: limit
union(operation, other = nil) click to toggle source
# File lib/arel/select_manager.rb, line 186
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() click to toggle source
# File lib/arel/select_manager.rb, line 179
def where_sql
  return if @ctx.wheres.empty?

  viz = Visitors::WhereSql.new @engine.connection
  Nodes::SqlLiteral.new viz.accept(@ctx, Collectors::SQLString.new).value
end
window(name) click to toggle source
# File lib/arel/select_manager.rb, line 126
def window name
  window = Nodes::NamedWindow.new(name)
  @ctx.windows.push window
  window
end
with(*subqueries) click to toggle source
# File lib/arel/select_manager.rb, line 206
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

Private Instance Methods

collapse(exprs, existing = nil) click to toggle source
# File lib/arel/select_manager.rb, line 250
def collapse exprs, existing = nil
  exprs = exprs.unshift(existing.expr) if existing
  exprs = exprs.compact.map { |expr|
    if String === expr
      # FIXME: Don't do this automatically
      Arel.sql(expr)
    else
      expr
    end
  }

  if exprs.length == 1
    exprs.first
  else
    create_and exprs
  end
end