Class: Arel::Visitors::PostgreSQL
Do not use. This class is for internal use only.
Relationships & Source Files | |
Super Chains via Extension / Inclusion / Inheritance | |
Class Chain:
|
|
Instance Chain:
|
|
Inherits: |
Arel::Visitors::ToSql
|
Defined in: | activerecord/lib/arel/visitors/postgresql.rb |
Constant Summary
-
BIND_BLOCK =
private
# File 'activerecord/lib/arel/visitors/postgresql.rb', line 135proc { |i| "$#{i}" }
ToSql
- Inherited
Class Method Summary
Instance Attribute Summary
Instance Method Summary
- #bind_block private
-
#grouping_array_or_grouping_element(o, collector)
private
Utilized by GroupingSet, Cube & RollUp visitors to handle grouping aggregation semantics.
-
#prepare_update_statement(o)
private
In the simple case,
PostgreSQL
allows us to place FROM or JOINs directly into the UPDATE query. - #visit_Arel_Nodes_Cube(o, collector) private
- #visit_Arel_Nodes_DistinctOn(o, collector) private
- #visit_Arel_Nodes_DoesNotMatch(o, collector) private
- #visit_Arel_Nodes_GroupingElement(o, collector) private
- #visit_Arel_Nodes_GroupingSet(o, collector) private
- #visit_Arel_Nodes_InnerJoin(o, collector) private
- #visit_Arel_Nodes_IsDistinctFrom(o, collector) private
- #visit_Arel_Nodes_IsNotDistinctFrom(o, collector) private
- #visit_Arel_Nodes_Lateral(o, collector) private
- #visit_Arel_Nodes_Matches(o, collector) private
- #visit_Arel_Nodes_NotRegexp(o, collector) private
- #visit_Arel_Nodes_Regexp(o, collector) private
- #visit_Arel_Nodes_RollUp(o, collector) private
- #visit_Arel_Nodes_UpdateStatement(o, collector) private
ToSql
- Inherited
Visitor
- Inherited
Constructor Details
This class inherits a constructor from Arel::Visitors::ToSql
Instance Method Details
#bind_block (private)
[ GitHub ]# File 'activerecord/lib/arel/visitors/postgresql.rb', line 138
def bind_block; BIND_BLOCK; end
#grouping_array_or_grouping_element(o, collector) (private)
Utilized by GroupingSet, Cube & RollUp visitors to handle grouping aggregation semantics
# File 'activerecord/lib/arel/visitors/postgresql.rb', line 142
def grouping_array_or_grouping_element(o, collector) if o.expr.is_a? Array collector << "( " visit o.expr, collector collector << " )" else visit o.expr, collector end end
#prepare_update_statement(o) (private)
In the simple case, PostgreSQL
allows us to place FROM or JOINs directly into the UPDATE query. However, this does not allow for LIMIT, OFFSET and ORDER. To support these, we must use a subquery.
# File 'activerecord/lib/arel/visitors/postgresql.rb', line 37
def prepare_update_statement(o) if o.key && has_join_sources?(o) && !has_group_by_and_having?(o) && !has_limit_or_offset_or_orders?(o) # Join clauses cannot reference the target table, so alias the # updated table, place the entire relation in the FROM clause, and # add a self-join (which requires the primary key) stmt = o.clone stmt.relation, stmt.wheres = o.relation.clone, o.wheres.clone stmt.relation.right = [stmt.relation.left, *stmt.relation.right] stmt.relation.left = stmt.relation.left.alias("__active_record_update_alias") Array.wrap(o.key).each do |key| stmt.wheres << key.eq(stmt.relation.left[key.name]) end stmt else super end end
#visit_Arel_Nodes_Cube(o, collector) (private)
[ GitHub ]# File 'activerecord/lib/arel/visitors/postgresql.rb', line 97
def visit_Arel_Nodes_Cube(o, collector) collector << "CUBE" grouping_array_or_grouping_element o, collector end
#visit_Arel_Nodes_DistinctOn(o, collector) (private)
[ GitHub ]# File 'activerecord/lib/arel/visitors/postgresql.rb', line 87
def visit_Arel_Nodes_DistinctOn(o, collector) collector << "DISTINCT ON ( " visit(o.expr, collector) << " )" end
#visit_Arel_Nodes_DoesNotMatch(o, collector) (private)
[ GitHub ]# File 'activerecord/lib/arel/visitors/postgresql.rb', line 66
def visit_Arel_Nodes_DoesNotMatch(o, collector) op = o.case_sensitive ? " NOT LIKE " : " NOT ILIKE " collector = infix_value o, collector, op if o.escape collector << " ESCAPE " visit o.escape, collector else collector end end
#visit_Arel_Nodes_GroupingElement(o, collector) (private)
[ GitHub ]# File 'activerecord/lib/arel/visitors/postgresql.rb', line 92
def visit_Arel_Nodes_GroupingElement(o, collector) collector << "( " visit(o.expr, collector) << " )" end
#visit_Arel_Nodes_GroupingSet(o, collector) (private)
[ GitHub ]# File 'activerecord/lib/arel/visitors/postgresql.rb', line 107
def visit_Arel_Nodes_GroupingSet(o, collector) collector << "GROUPING SETS" grouping_array_or_grouping_element o, collector end
#visit_Arel_Nodes_InnerJoin(o, collector) (private)
[ GitHub ]# File 'activerecord/lib/arel/visitors/postgresql.rb', line 117
def visit_Arel_Nodes_InnerJoin(o, collector) return super if o.right collector << "CROSS JOIN " visit o.left, collector end
#visit_Arel_Nodes_IsDistinctFrom(o, collector) (private)
[ GitHub ]# File 'activerecord/lib/arel/visitors/postgresql.rb', line 129
def visit_Arel_Nodes_IsDistinctFrom(o, collector) collector = visit o.left, collector collector << " IS DISTINCT FROM " visit o.right, collector end
#visit_Arel_Nodes_IsNotDistinctFrom(o, collector) (private)
[ GitHub ]# File 'activerecord/lib/arel/visitors/postgresql.rb', line 123
def visit_Arel_Nodes_IsNotDistinctFrom(o, collector) collector = visit o.left, collector collector << " IS NOT DISTINCT FROM " visit o.right, collector end
#visit_Arel_Nodes_Lateral(o, collector) (private)
[ GitHub ]# File 'activerecord/lib/arel/visitors/postgresql.rb', line 112
def visit_Arel_Nodes_Lateral(o, collector) collector << "LATERAL " grouping_parentheses o.expr, collector end
#visit_Arel_Nodes_Matches(o, collector) (private)
[ GitHub ]# File 'activerecord/lib/arel/visitors/postgresql.rb', line 55
def visit_Arel_Nodes_Matches(o, collector) op = o.case_sensitive ? " LIKE " : " ILIKE " collector = infix_value o, collector, op if o.escape collector << " ESCAPE " visit o.escape, collector else collector end end
#visit_Arel_Nodes_NotRegexp(o, collector) (private)
[ GitHub ]# File 'activerecord/lib/arel/visitors/postgresql.rb', line 82
def visit_Arel_Nodes_NotRegexp(o, collector) op = o.case_sensitive ? " !~ " : " !~* " infix_value o, collector, op end
#visit_Arel_Nodes_Regexp(o, collector) (private)
[ GitHub ]# File 'activerecord/lib/arel/visitors/postgresql.rb', line 77
def visit_Arel_Nodes_Regexp(o, collector) op = o.case_sensitive ? " ~ " : " ~* " infix_value o, collector, op end
#visit_Arel_Nodes_RollUp(o, collector) (private)
[ GitHub ]# File 'activerecord/lib/arel/visitors/postgresql.rb', line 102
def visit_Arel_Nodes_RollUp(o, collector) collector << "ROLLUP" grouping_array_or_grouping_element o, collector end
#visit_Arel_Nodes_UpdateStatement(o, collector) (private)
[ GitHub ]# File 'activerecord/lib/arel/visitors/postgresql.rb', line 7
def visit_Arel_Nodes_UpdateStatement(o, collector) collector.retryable = false o = prepare_update_statement(o) collector << "UPDATE " # UPDATE with JOIN is in the form of: # # UPDATE t1 AS __active_record_update_alias # SET .. # FROM t1 JOIN t2 ON t2.join_id = t1.join_id .. # WHERE t1.id = __active_record_update_alias.id AND .. if has_join_sources?(o) collector = visit o.relation.left, collector collect_nodes_for o.values, collector, " SET " collector << " FROM " collector = inject_join o.relation.right, collector, " " else collector = visit o.relation, collector collect_nodes_for o.values, collector, " SET " end collect_nodes_for o.wheres, collector, " WHERE ", " AND " collect_nodes_for o.orders, collector, " ORDER BY " maybe_visit o.limit, collector end