arel_toolkit 0.2.0 → 0.4.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (150) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +3 -0
  3. data/.github/workflows/develop.yml +90 -0
  4. data/.github/workflows/master.yml +67 -0
  5. data/.gitignore +8 -0
  6. data/.rubocop.yml +13 -2
  7. data/Appraisals +13 -0
  8. data/CHANGELOG.md +132 -6
  9. data/Gemfile +5 -0
  10. data/Gemfile.lock +92 -12
  11. data/Guardfile +23 -12
  12. data/README.md +104 -6
  13. data/Rakefile +18 -0
  14. data/arel_toolkit.gemspec +19 -4
  15. data/benchmark.rb +54 -0
  16. data/bin/console +1 -0
  17. data/ext/pg_result_init/extconf.rb +52 -0
  18. data/ext/pg_result_init/pg_result_init.c +138 -0
  19. data/ext/pg_result_init/pg_result_init.h +6 -0
  20. data/gemfiles/active_record_6.gemfile +7 -0
  21. data/gemfiles/active_record_6.gemfile.lock +210 -0
  22. data/gemfiles/arel_gems.gemfile +10 -0
  23. data/gemfiles/arel_gems.gemfile.lock +284 -0
  24. data/gemfiles/default.gemfile +5 -0
  25. data/gemfiles/default.gemfile.lock +208 -0
  26. data/lib/arel/enhance.rb +17 -0
  27. data/lib/arel/enhance/context_enhancer/arel_table.rb +92 -0
  28. data/lib/arel/enhance/node.rb +232 -0
  29. data/lib/arel/enhance/path.rb +38 -0
  30. data/lib/arel/enhance/path_node.rb +26 -0
  31. data/lib/arel/enhance/query.rb +38 -0
  32. data/lib/arel/enhance/query_methods.rb +23 -0
  33. data/lib/arel/enhance/visitor.rb +97 -0
  34. data/lib/arel/extensions.rb +55 -3
  35. data/lib/arel/extensions/active_model_attribute_with_cast_value.rb +22 -0
  36. data/lib/arel/extensions/active_record_relation_query_attribute.rb +22 -0
  37. data/lib/arel/extensions/active_record_type_caster_connection.rb +7 -0
  38. data/lib/arel/extensions/active_record_type_caster_map.rb +7 -0
  39. data/lib/arel/extensions/array.rb +2 -9
  40. data/lib/arel/extensions/assignment.rb +22 -0
  41. data/lib/arel/extensions/at_time_zone.rb +37 -0
  42. data/lib/arel/extensions/attributes_attribute.rb +47 -0
  43. data/lib/arel/extensions/binary.rb +7 -0
  44. data/lib/arel/extensions/bind_param.rb +15 -0
  45. data/lib/arel/extensions/bit_string.rb +2 -9
  46. data/lib/arel/extensions/case.rb +17 -0
  47. data/lib/arel/extensions/coalesce.rb +17 -3
  48. data/lib/arel/extensions/conflict.rb +9 -0
  49. data/lib/arel/extensions/contained_within_equals.rb +10 -0
  50. data/lib/arel/extensions/contains.rb +27 -5
  51. data/lib/arel/extensions/contains_equals.rb +10 -0
  52. data/lib/arel/extensions/current_catalog.rb +4 -0
  53. data/lib/arel/extensions/current_date.rb +4 -0
  54. data/lib/arel/extensions/current_of_expression.rb +2 -9
  55. data/lib/arel/extensions/current_role.rb +4 -0
  56. data/lib/arel/extensions/current_row.rb +7 -0
  57. data/lib/arel/extensions/current_schema.rb +4 -0
  58. data/lib/arel/extensions/current_user.rb +4 -0
  59. data/lib/arel/extensions/dealocate.rb +31 -0
  60. data/lib/arel/extensions/default_values.rb +4 -0
  61. data/lib/arel/extensions/delete_manager.rb +25 -0
  62. data/lib/arel/extensions/delete_statement.rb +32 -8
  63. data/lib/arel/extensions/distinct_from.rb +3 -16
  64. data/lib/arel/extensions/dot.rb +11 -0
  65. data/lib/arel/extensions/equality.rb +2 -4
  66. data/lib/arel/extensions/exists.rb +59 -0
  67. data/lib/arel/extensions/extract_from.rb +25 -0
  68. data/lib/arel/extensions/factorial.rb +10 -2
  69. data/lib/arel/extensions/false.rb +7 -0
  70. data/lib/arel/extensions/function.rb +44 -14
  71. data/lib/arel/extensions/greatest.rb +17 -3
  72. data/lib/arel/extensions/indirection.rb +3 -12
  73. data/lib/arel/extensions/infer.rb +7 -7
  74. data/lib/arel/extensions/infix_operation.rb +17 -0
  75. data/lib/arel/extensions/insert_manager.rb +21 -0
  76. data/lib/arel/extensions/insert_statement.rb +35 -9
  77. data/lib/arel/extensions/into.rb +21 -0
  78. data/lib/arel/extensions/json_get_field.rb +10 -0
  79. data/lib/arel/extensions/json_get_object.rb +10 -0
  80. data/lib/arel/extensions/json_path_get_field.rb +10 -0
  81. data/lib/arel/extensions/json_path_get_object.rb +10 -0
  82. data/lib/arel/extensions/jsonb_all_key_exists.rb +10 -0
  83. data/lib/arel/extensions/jsonb_any_key_exists.rb +10 -0
  84. data/lib/arel/extensions/jsonb_key_exists.rb +10 -0
  85. data/lib/arel/extensions/least.rb +17 -3
  86. data/lib/arel/extensions/named_argument.rb +24 -0
  87. data/lib/arel/extensions/named_function.rb +7 -0
  88. data/lib/arel/extensions/node.rb +10 -0
  89. data/lib/arel/extensions/not_distinct_from.rb +3 -16
  90. data/lib/arel/extensions/not_equal.rb +2 -4
  91. data/lib/arel/extensions/ordering.rb +21 -6
  92. data/lib/arel/extensions/overlap.rb +1 -1
  93. data/lib/arel/extensions/overlaps.rb +49 -0
  94. data/lib/arel/extensions/overlay.rb +53 -0
  95. data/lib/arel/extensions/position.rb +27 -0
  96. data/lib/arel/extensions/prepare.rb +39 -0
  97. data/lib/arel/extensions/range_function.rb +10 -2
  98. data/lib/arel/extensions/row.rb +3 -8
  99. data/lib/arel/extensions/select_core.rb +73 -0
  100. data/lib/arel/extensions/select_manager.rb +25 -0
  101. data/lib/arel/extensions/select_statement.rb +31 -9
  102. data/lib/arel/extensions/session_user.rb +4 -0
  103. data/lib/arel/extensions/set_to_default.rb +4 -0
  104. data/lib/arel/extensions/substring.rb +46 -0
  105. data/lib/arel/extensions/table.rb +43 -10
  106. data/lib/arel/extensions/time_with_precision.rb +6 -0
  107. data/lib/arel/extensions/to_sql.rb +27 -0
  108. data/lib/arel/extensions/top.rb +8 -0
  109. data/lib/arel/extensions/transaction.rb +45 -0
  110. data/lib/arel/extensions/tree_manager.rb +15 -0
  111. data/lib/arel/extensions/trim.rb +44 -0
  112. data/lib/arel/extensions/true.rb +7 -0
  113. data/lib/arel/extensions/type_cast.rb +11 -0
  114. data/lib/arel/extensions/unary.rb +7 -0
  115. data/lib/arel/extensions/unary_operation.rb +16 -0
  116. data/lib/arel/extensions/unknown.rb +4 -0
  117. data/lib/arel/extensions/update_manager.rb +25 -0
  118. data/lib/arel/extensions/update_statement.rb +31 -6
  119. data/lib/arel/extensions/user.rb +4 -0
  120. data/lib/arel/extensions/values_list.rb +15 -0
  121. data/lib/arel/extensions/variable_set.rb +55 -0
  122. data/lib/arel/extensions/variable_show.rb +26 -0
  123. data/lib/arel/middleware.rb +27 -0
  124. data/lib/arel/middleware/active_record_extension.rb +13 -0
  125. data/lib/arel/middleware/cache_accessor.rb +35 -0
  126. data/lib/arel/middleware/chain.rb +172 -0
  127. data/lib/arel/middleware/database_executor.rb +77 -0
  128. data/lib/arel/middleware/no_op_cache.rb +9 -0
  129. data/lib/arel/middleware/postgresql_adapter.rb +62 -0
  130. data/lib/arel/middleware/railtie.rb +25 -0
  131. data/lib/arel/middleware/result.rb +170 -0
  132. data/lib/arel/middleware/to_sql_executor.rb +15 -0
  133. data/lib/arel/middleware/to_sql_middleware.rb +33 -0
  134. data/lib/arel/sql_to_arel.rb +8 -4
  135. data/lib/arel/sql_to_arel/error.rb +6 -0
  136. data/lib/arel/sql_to_arel/pg_query_visitor.rb +324 -76
  137. data/lib/arel/sql_to_arel/pg_query_visitor/frame_options.rb +112 -0
  138. data/lib/arel/sql_to_arel/result.rb +30 -0
  139. data/lib/arel/transformer.rb +8 -0
  140. data/lib/arel/transformer/prefix_schema_name.rb +183 -0
  141. data/lib/arel/transformer/remove_active_record_info.rb +40 -0
  142. data/lib/arel/transformer/replace_table_with_subquery.rb +31 -0
  143. data/lib/arel_toolkit.rb +16 -1
  144. data/lib/arel_toolkit/version.rb +1 -1
  145. metadata +278 -25
  146. data/.travis.yml +0 -21
  147. data/lib/arel/extensions/generate_series.rb +0 -9
  148. data/lib/arel/extensions/rank.rb +0 -9
  149. data/lib/arel/sql_to_arel/frame_options.rb +0 -110
  150. data/lib/arel/sql_to_arel/unbound_column_reference.rb +0 -5
@@ -0,0 +1,38 @@
1
+ module Arel
2
+ module Enhance
3
+ class Path
4
+ attr_reader :nodes
5
+
6
+ def initialize(nodes = [])
7
+ @nodes = nodes
8
+ end
9
+
10
+ def append(path_node)
11
+ Path.new(nodes + [path_node])
12
+ end
13
+
14
+ def dig_send(object)
15
+ selected_object = object
16
+ nodes.each do |path_node|
17
+ selected_object = selected_object.send(*path_node.method)
18
+ end
19
+ selected_object
20
+ end
21
+
22
+ def to_a
23
+ nodes.map(&:value)
24
+ end
25
+
26
+ def current
27
+ nodes.last
28
+ end
29
+
30
+ def inspect
31
+ nodes.inspect
32
+ string = '['
33
+ string << nodes.map(&:inspect).join(', ')
34
+ string << ']'
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,26 @@
1
+ module Arel
2
+ module Enhance
3
+ class PathNode
4
+ attr_reader :method
5
+ attr_reader :value
6
+
7
+ def initialize(method, value)
8
+ @method = method
9
+ @value = value
10
+ end
11
+
12
+ def arguments?
13
+ method.is_a?(Array)
14
+ end
15
+
16
+ def inspect
17
+ case value
18
+ when String
19
+ "'#{value}'"
20
+ else
21
+ value.inspect
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,38 @@
1
+ module Arel
2
+ module Enhance
3
+ class Query
4
+ def self.call(node, kwargs)
5
+ node_attributes = %i[context parent]
6
+ node_args = kwargs.slice(*node_attributes)
7
+ object_args = kwargs.except(*node_attributes)
8
+
9
+ node.each.select do |child_node|
10
+ next unless matches?(child_node, node_args)
11
+
12
+ matches?(child_node.object, object_args)
13
+ end
14
+ end
15
+
16
+ def self.matches?(object, test)
17
+ case test
18
+ when Hash
19
+ case object
20
+ when Hash
21
+ test <= object
22
+ else
23
+ test.all? do |test_key, test_value|
24
+ next false unless object.respond_to?(test_key)
25
+
26
+ object_attribute_value = object.public_send(test_key)
27
+ matches? object_attribute_value, test_value
28
+ end
29
+ end
30
+ when Arel::Enhance::QueryMethods::QueryMethod
31
+ test.matches?(object)
32
+ else
33
+ object == test
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,23 @@
1
+ module Arel
2
+ module Enhance
3
+ module QueryMethods
4
+ class QueryMethod
5
+ attr_reader :subject
6
+
7
+ def initialize(subject)
8
+ @subject = subject
9
+ end
10
+ end
11
+
12
+ class Ancestors < QueryMethod
13
+ def matches?(other)
14
+ other <= subject
15
+ end
16
+ end
17
+
18
+ def self.in_ancestors?(object)
19
+ Ancestors.new(object)
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,97 @@
1
+ require_relative './context_enhancer/arel_table'
2
+
3
+ module Arel
4
+ module Enhance
5
+ # rubocop:disable Naming/MethodName
6
+ class Visitor < Arel::Visitors::Dot
7
+ DEFAULT_CONTEXT_ENHANCERS = {
8
+ Arel::Table => Arel::Enhance::ContextEnhancer::ArelTable,
9
+ }.freeze
10
+
11
+ attr_reader :context_enhancers
12
+
13
+ def accept(object, context_enhancers = DEFAULT_CONTEXT_ENHANCERS)
14
+ @context_enhancers = context_enhancers
15
+
16
+ root_node = Arel::Enhance::Node.new(object)
17
+ accept_with_root(object, root_node)
18
+ end
19
+
20
+ def accept_with_root(object, root_node, context_enhancers = DEFAULT_CONTEXT_ENHANCERS)
21
+ @context_enhancers = context_enhancers
22
+
23
+ with_node(root_node) do
24
+ visit object
25
+ end
26
+
27
+ root_node
28
+ end
29
+
30
+ private
31
+
32
+ def visit_edge(object, method)
33
+ arel_node = object.send(method)
34
+
35
+ process_node(arel_node, Arel::Enhance::PathNode.new(method, method))
36
+ end
37
+
38
+ def nary(object)
39
+ visit_edge(object, 'children')
40
+ end
41
+ alias visit_Arel_Nodes_And nary
42
+
43
+ def visit_Hash(object)
44
+ object.each do |key, child|
45
+ process_node(child, Arel::Enhance::PathNode.new([:[], key], key))
46
+ end
47
+ end
48
+
49
+ def visit_Array(object)
50
+ object.each_with_index do |child, index|
51
+ process_node(child, Arel::Enhance::PathNode.new([:[], index], index))
52
+ end
53
+ end
54
+
55
+ def process_node(arel_node, path_node)
56
+ node = Arel::Enhance::Node.new(arel_node)
57
+ current_node.add(path_node, node)
58
+
59
+ update_context(node)
60
+
61
+ with_node node do
62
+ visit arel_node
63
+ end
64
+ end
65
+
66
+ # rubocop:disable Metrics/AbcSize
67
+ # arel/lib/arel/visitors/visitor.rb:29
68
+ def visit(object)
69
+ dispatch_method = dispatch[object.class]
70
+ send dispatch_method, object
71
+ rescue NoMethodError => e
72
+ raise e if respond_to?(dispatch_method, true)
73
+
74
+ superklass = object.class.ancestors.find do |klass|
75
+ respond_to?(dispatch[klass], true)
76
+ end
77
+ raise(TypeError, "Cannot visit #{object.class}") unless superklass
78
+
79
+ dispatch[object.class] = dispatch[superklass]
80
+ retry
81
+ end
82
+ # rubocop:enable Metrics/AbcSize
83
+
84
+ def current_node
85
+ @node_stack.last
86
+ end
87
+
88
+ def update_context(node)
89
+ enhancer = context_enhancers[node.object.class]
90
+ return if enhancer.nil?
91
+
92
+ enhancer.call(node)
93
+ end
94
+ end
95
+ # rubocop:enable Naming/MethodName
96
+ end
97
+ end
@@ -1,3 +1,4 @@
1
+ require 'arel/extensions/dot'
1
2
  require 'arel/extensions/unknown'
2
3
  require 'arel/extensions/time_with_precision'
3
4
  require 'arel/extensions/current_time'
@@ -20,6 +21,7 @@ require 'arel/extensions/lateral'
20
21
  require 'arel/extensions/range_function'
21
22
  require 'arel/extensions/with_ordinality'
22
23
  require 'arel/extensions/table'
24
+ require 'arel/extensions/attributes_attribute'
23
25
  require 'arel/extensions/row'
24
26
  require 'arel/extensions/ordering'
25
27
  require 'arel/extensions/all'
@@ -42,9 +44,15 @@ require 'arel/extensions/modulo'
42
44
  require 'arel/extensions/absolute'
43
45
  require 'arel/extensions/bitwise_xor'
44
46
  require 'arel/extensions/exponentiation'
47
+
45
48
  require 'arel/extensions/contains'
49
+ unless Gem.loaded_specs.key?('postgres_ext')
50
+ require 'arel/extensions/contained_within_equals'
51
+ require 'arel/extensions/contains_equals'
52
+ require 'arel/extensions/overlap'
53
+ end
54
+
46
55
  require 'arel/extensions/contained_by'
47
- require 'arel/extensions/overlap'
48
56
  require 'arel/extensions/select_statement'
49
57
  require 'arel/extensions/insert_statement'
50
58
  require 'arel/extensions/default_values'
@@ -56,14 +64,58 @@ require 'arel/extensions/current_of_expression'
56
64
  require 'arel/extensions/delete_statement'
57
65
  require 'arel/extensions/least'
58
66
  require 'arel/extensions/greatest'
59
- require 'arel/extensions/generate_series'
60
- require 'arel/extensions/rank'
61
67
  require 'arel/extensions/coalesce'
62
68
  require 'arel/extensions/not_equal'
63
69
  require 'arel/extensions/equality'
64
70
  require 'arel/extensions/named_function'
65
71
  require 'arel/extensions/intersect_all'
66
72
  require 'arel/extensions/except_all'
73
+ require 'arel/extensions/select_manager'
74
+ require 'arel/extensions/insert_manager'
75
+ require 'arel/extensions/update_manager'
76
+ require 'arel/extensions/delete_manager'
77
+ require 'arel/extensions/at_time_zone'
78
+ require 'arel/extensions/extract_from'
79
+ require 'arel/extensions/json_get_object'
80
+ require 'arel/extensions/json_get_field'
81
+ require 'arel/extensions/json_path_get_object'
82
+ require 'arel/extensions/json_path_get_field'
83
+ require 'arel/extensions/jsonb_key_exists'
84
+ require 'arel/extensions/jsonb_any_key_exists'
85
+ require 'arel/extensions/jsonb_all_key_exists'
86
+ require 'arel/extensions/transaction'
87
+ require 'arel/extensions/assignment'
88
+ require 'arel/extensions/variable_set'
89
+ require 'arel/extensions/variable_show'
90
+ require 'arel/extensions/position'
91
+ require 'arel/extensions/overlay'
92
+ require 'arel/extensions/substring'
93
+ require 'arel/extensions/overlaps'
94
+ require 'arel/extensions/trim'
95
+ require 'arel/extensions/named_argument'
96
+ require 'arel/extensions/tree_manager'
97
+ require 'arel/extensions/into'
98
+ require 'arel/extensions/select_core'
99
+ require 'arel/extensions/unary'
100
+ require 'arel/extensions/binary'
101
+ require 'arel/extensions/unary_operation'
102
+ require 'arel/extensions/infix_operation'
103
+ require 'arel/extensions/values_list'
104
+ require 'arel/extensions/case'
105
+ require 'arel/extensions/current_row'
106
+ require 'arel/extensions/false'
107
+ require 'arel/extensions/true'
108
+ require 'arel/extensions/to_sql'
109
+ require 'arel/extensions/prepare'
110
+ require 'arel/extensions/dealocate'
111
+ require 'arel/extensions/active_record_type_caster_map'
112
+ require 'arel/extensions/active_record_type_caster_connection'
113
+ require 'arel/extensions/active_record_relation_query_attribute'
114
+ require 'arel/extensions/active_model_attribute_with_cast_value'
115
+ require 'arel/extensions/exists'
116
+ require 'arel/extensions/bind_param'
117
+ require 'arel/extensions/node'
118
+ require 'arel/extensions/top'
67
119
 
68
120
  module Arel
69
121
  module Extensions
@@ -0,0 +1,22 @@
1
+ # rubocop:disable Naming/MethodName
2
+ # rubocop:disable Naming/UncommunicativeMethodParamName
3
+
4
+ module Arel
5
+ module Visitors
6
+ class Dot
7
+ def visit_ActiveModel_Attribute_WithCastValue(o)
8
+ visit_edge o, 'name'
9
+ visit_edge o, 'value_before_type_cast'
10
+ end
11
+ end
12
+
13
+ class ToSql
14
+ def visit_ActiveModel_Attribute_WithCastValue(_o, collector)
15
+ collector
16
+ end
17
+ end
18
+ end
19
+ end
20
+
21
+ # rubocop:enable Naming/MethodName
22
+ # rubocop:enable Naming/UncommunicativeMethodParamName
@@ -0,0 +1,22 @@
1
+ # rubocop:disable Naming/MethodName
2
+ # rubocop:disable Naming/UncommunicativeMethodParamName
3
+
4
+ module Arel
5
+ module Visitors
6
+ class Dot
7
+ def visit_ActiveRecord_Relation_QueryAttribute(o)
8
+ visit_edge o, 'name'
9
+ visit_edge o, 'value_before_type_cast'
10
+ end
11
+ end
12
+
13
+ class ToSql
14
+ def visit_ActiveRecord_Relation_QueryAttribute(_o, collector)
15
+ collector
16
+ end
17
+ end
18
+ end
19
+ end
20
+
21
+ # rubocop:enable Naming/MethodName
22
+ # rubocop:enable Naming/UncommunicativeMethodParamName
@@ -0,0 +1,7 @@
1
+ module Arel
2
+ module Visitors
3
+ class Dot
4
+ alias visit_ActiveRecord_TypeCaster_Connection terminal
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module Arel
2
+ module Visitors
3
+ class Dot
4
+ alias visit_ActiveRecord_TypeCaster_Map terminal
5
+ end
6
+ end
7
+ end
@@ -3,14 +3,7 @@
3
3
 
4
4
  module Arel
5
5
  module Nodes
6
- class Array < Arel::Nodes::Node
7
- attr_reader :items
8
-
9
- def initialize(items)
10
- super()
11
-
12
- @items = items
13
- end
6
+ class Array < Arel::Nodes::Unary
14
7
  end
15
8
  end
16
9
 
@@ -18,7 +11,7 @@ module Arel
18
11
  class ToSql
19
12
  def visit_Arel_Nodes_Array(o, collector)
20
13
  collector << 'ARRAY['
21
- inject_join(o.items, collector, ', ')
14
+ inject_join(o.expr, collector, ', ')
22
15
  collector << ']'
23
16
  end
24
17
  end
@@ -0,0 +1,22 @@
1
+ # rubocop:disable Naming/MethodName
2
+ # rubocop:disable Naming/UncommunicativeMethodParamName
3
+ module Arel
4
+ module Visitors
5
+ class ToSql
6
+ def visit_Arel_Nodes_Assignment(o, collector)
7
+ collector = visit o.left, collector
8
+ collector << ' = '
9
+
10
+ case o.right
11
+ when Arel::Nodes::Node, Arel::Attributes::Attribute
12
+ visit o.right, collector
13
+ else
14
+ collector << quote(o.right).to_s
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
20
+
21
+ # rubocop:enable Naming/MethodName
22
+ # rubocop:enable Naming/UncommunicativeMethodParamName
@@ -0,0 +1,37 @@
1
+ # rubocop:disable Naming/MethodName
2
+ # rubocop:disable Naming/UncommunicativeMethodParamName
3
+
4
+ module Arel
5
+ module Nodes
6
+ # https://www.postgresql.org/docs/9.2/functions-datetime.html#FUNCTIONS-DATETIME-ZONECONVERT
7
+ class AtTimeZone < Arel::Nodes::Node
8
+ attr_reader :timezone
9
+ attr_reader :expr
10
+
11
+ def initialize(expr, timezone)
12
+ @expr = expr
13
+ @timezone = timezone
14
+ end
15
+ end
16
+ end
17
+
18
+ module Visitors
19
+ class ToSql
20
+ def visit_Arel_Nodes_AtTimeZone(o, collector)
21
+ visit o.expr, collector
22
+ collector << ' AT TIME ZONE '
23
+ visit o.timezone, collector
24
+ end
25
+ end
26
+
27
+ class Dot
28
+ def visit_Arel_Nodes_AtTimeZone(o)
29
+ visit_edge o, 'expr'
30
+ visit_edge o, 'timezone'
31
+ end
32
+ end
33
+ end
34
+ end
35
+
36
+ # rubocop:enable Naming/MethodName
37
+ # rubocop:enable Naming/UncommunicativeMethodParamName