postgresql.rb 3.4 KB
Newer Older
O
ojab 已提交
1
# frozen_string_literal: true
M
Matthew Draper 已提交
2

M
Matthew Draper 已提交
3
module Arel # :nodoc: all
A
Aaron Patterson 已提交
4 5
  module Visitors
    class PostgreSQL < Arel::Visitors::ToSql
6
      private
M
Matthew Draper 已提交
7 8 9 10 11 12 13 14 15
        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
16
        end
17

M
Matthew Draper 已提交
18 19 20 21 22 23 24 25 26
        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
27
        end
28

M
Matthew Draper 已提交
29 30 31 32
        def visit_Arel_Nodes_Regexp(o, collector)
          op = o.case_sensitive ? " ~ " : " ~* "
          infix_value o, collector, op
        end
33

M
Matthew Draper 已提交
34 35 36 37
        def visit_Arel_Nodes_NotRegexp(o, collector)
          op = o.case_sensitive ? " !~ " : " !~* "
          infix_value o, collector, op
        end
38

M
Matthew Draper 已提交
39 40 41 42
        def visit_Arel_Nodes_DistinctOn(o, collector)
          collector << "DISTINCT ON ( "
          visit(o.expr, collector) << " )"
        end
43

M
Matthew Draper 已提交
44 45 46
        def visit_Arel_Nodes_BindParam(o, collector)
          collector.add_bind(o.value) { |i| "$#{i}" }
        end
47

M
Matthew Draper 已提交
48 49 50 51
        def visit_Arel_Nodes_GroupingElement(o, collector)
          collector << "( "
          visit(o.expr, collector) << " )"
        end
52

M
Matthew Draper 已提交
53
        def visit_Arel_Nodes_Cube(o, collector)
J
Jeremy Evans 已提交
54
          collector << "CUBE"
M
Matthew Draper 已提交
55 56
          grouping_array_or_grouping_element o, collector
        end
57

M
Matthew Draper 已提交
58
        def visit_Arel_Nodes_RollUp(o, collector)
J
Jeremy Evans 已提交
59
          collector << "ROLLUP"
M
Matthew Draper 已提交
60 61
          grouping_array_or_grouping_element o, collector
        end
62

M
Matthew Draper 已提交
63
        def visit_Arel_Nodes_GroupingSet(o, collector)
J
Jeremy Evans 已提交
64
          collector << "GROUPING SETS"
M
Matthew Draper 已提交
65 66
          grouping_array_or_grouping_element o, collector
        end
67

M
Matthew Draper 已提交
68
        def visit_Arel_Nodes_Lateral(o, collector)
J
Jeremy Evans 已提交
69
          collector << "LATERAL "
M
Matthew Draper 已提交
70 71
          grouping_parentheses o, collector
        end
V
Ville Lautanala 已提交
72

73 74 75 76 77 78 79 80 81 82 83 84
        def visit_Arel_Nodes_IsNotDistinctFrom(o, collector)
          collector = visit o.left, collector
          collector << " IS NOT DISTINCT FROM "
          visit o.right, collector
        end

        def visit_Arel_Nodes_IsDistinctFrom(o, collector)
          collector = visit o.left, collector
          collector << " IS DISTINCT FROM "
          visit o.right, collector
        end

85 86 87 88 89 90 91 92 93 94
        def visit_Arel_Nodes_NullsFirst(o, collector)
          visit o.expr, collector
          collector << " NULLS FIRST"
        end

        def visit_Arel_Nodes_NullsLast(o, collector)
          visit o.expr, collector
          collector << " NULLS LAST"
        end

M
Matthew Draper 已提交
95 96 97 98 99 100 101 102 103
        # Used by Lateral visitor to enclose select queries in parentheses
        def grouping_parentheses(o, collector)
          if o.expr.is_a? Nodes::SelectStatement
            collector << "("
            visit o.expr, collector
            collector << ")"
          else
            visit o.expr, collector
          end
V
Ville Lautanala 已提交
104 105
        end

M
Matthew Draper 已提交
106 107 108 109 110 111 112 113 114 115
        # Utilized by GroupingSet, Cube & RollUp visitors to
        # handle grouping aggregation semantics
        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
116
        end
A
Aaron Patterson 已提交
117 118 119
    end
  end
end