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 136proc { |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 139
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 143
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 38
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 98
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 88
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 67
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 93
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 108
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 118
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 130
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 124
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 113
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 56
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 83
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 78
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 103
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 maybe_visit o.comment, collector end