# File lib/arel/select_manager.rb, line 5 def initialize engine, table = nil super(engine) @ast = Nodes::SelectStatement.new @ctx = @ast.cores.last from table end
# File lib/arel/select_manager.rb, line 16 def constraints @ctx.wheres end
# File lib/arel/select_manager.rb, line 154 def except other Nodes::Except.new ast, other.ast end
Produces an Arel::Nodes::Exists node
# File lib/arel/select_manager.rb, line 27 def exists Arel::Nodes::Exists.new @ast end
# File lib/arel/select_manager.rb, line 70 def from table table = Nodes::SqlLiteral.new(table) if String === table # FIXME: this is a hack to support # test_with_two_tables_in_from_without_getting_double_quoted # from the AR tests. if @ctx.froms source = @ctx.froms if Nodes::SqlLiteral === table && Nodes::Join === source source.left = table table = source end end @ctx.froms = table self end
# File lib/arel/select_manager.rb, line 59 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
# File lib/arel/select_manager.rb, line 100 def having expr expr = Nodes::SqlLiteral.new(expr) if String === expr @ctx.having = Nodes::Having.new(expr) self end
FIXME: this method should go away
# File lib/arel/select_manager.rb, line 205 def insert values im = InsertManager.new @engine table = @ctx.froms primary_key_name = (primary_key = table.primary_key) && primary_key.name # FIXME: in AR tests values sometimes were Array and not Hash therefore is_a?(Hash) check is added primary_key_value = primary_key && values.is_a?(Hash) && values[primary_key] im.into table im.insert values # Oracle adapter needs primary key name to generate RETURNING ... INTO ... clause # for tables which assign primary key value using trigger. # RETURNING ... INTO ... clause will be added only if primary_key_value is nil # therefore it is necessary to pass primary key value as well @engine.connection.insert im.to_sql, 'AREL', primary_key_name, primary_key_value end
# File lib/arel/select_manager.rb, line 150 def intersect other Nodes::Intersect.new ast, other.ast end
# File lib/arel/select_manager.rb, line 88 def join relation, klass = Nodes::InnerJoin return self unless relation case relation when String, Nodes::SqlLiteral raise if relation.blank? from Nodes::StringJoin.new(@ctx.froms, relation) else from klass.new(@ctx.froms, relation, nil) end end
# File lib/arel/select_manager.rb, line 165 def join_sql return nil unless @ctx.froms viz = Visitors::JoinSql.new @engine Nodes::SqlLiteral.new viz.accept @ctx end
# File lib/arel/select_manager.rb, line 178 def joins manager if $VERBOSE warn "joins is deprecated and will be removed in 2.2" warn "please remove your call to joins from #{caller.first}" end manager.join_sql end
# File lib/arel/select_manager.rb, line 37 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
# File lib/arel/select_manager.rb, line 50 def locked @ast.lock end
# File lib/arel/select_manager.rb, line 54 def on *exprs @ctx.froms.constraint = Nodes::On.new(collapse(exprs)) self end
# File lib/arel/select_manager.rb, line 116 def order *expr # FIXME: We SHOULD NOT be converting these to SqlLiteral automatically @ast.orders.concat expr.map { |x| String === x || Symbol === x ? Nodes::SqlLiteral.new(x.to_s) : x } self end
# File lib/arel/select_manager.rb, line 172 def order_clauses Visitors::OrderClauses.new(@engine).accept(@ast).map { |x| Nodes::SqlLiteral.new x } end
# File lib/arel/select_manager.rb, line 124 def orders @ast.orders end
# File lib/arel/select_manager.rb, line 107 def project *projections # FIXME: converting these to SQLLiterals is probably not good, but # rails tests require it. @ctx.projections.concat projections.map { |x| [Symbol, String].include?(x.class) ? SqlLiteral.new(x.to_s) : x } self end
# File lib/arel/select_manager.rb, line 20 def skip amount @ast.offset = Nodes::Offset.new(amount) self end
# File lib/arel/select_manager.rb, line 159 def take limit @ast.limit = Nodes::Limit.new(limit) @ctx.top = Nodes::Top.new(limit) self end
# File lib/arel/select_manager.rb, line 12 def taken @ast.limit && @ast.limit.expr end
# File lib/arel/select_manager.rb, line 139 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
# File lib/arel/select_manager.rb, line 31 def where_clauses #warn "where_clauses is deprecated" if $VERBOSE to_sql = Visitors::ToSql.new @engine @ctx.wheres.map { |c| to_sql.accept c } end
# File lib/arel/select_manager.rb, line 132 def where_sql return if @ctx.wheres.empty? viz = Visitors::WhereSql.new @engine Nodes::SqlLiteral.new viz.accept @ctx end
# File lib/arel/select_manager.rb, line 128 def wheres Compatibility::Wheres.new @engine, @ctx.wheres end