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.
- checksums.yaml +4 -4
- data/.codeclimate.yml +3 -0
- data/.github/workflows/develop.yml +90 -0
- data/.github/workflows/master.yml +67 -0
- data/.gitignore +8 -0
- data/.rubocop.yml +13 -2
- data/Appraisals +13 -0
- data/CHANGELOG.md +132 -6
- data/Gemfile +5 -0
- data/Gemfile.lock +92 -12
- data/Guardfile +23 -12
- data/README.md +104 -6
- data/Rakefile +18 -0
- data/arel_toolkit.gemspec +19 -4
- data/benchmark.rb +54 -0
- data/bin/console +1 -0
- data/ext/pg_result_init/extconf.rb +52 -0
- data/ext/pg_result_init/pg_result_init.c +138 -0
- data/ext/pg_result_init/pg_result_init.h +6 -0
- data/gemfiles/active_record_6.gemfile +7 -0
- data/gemfiles/active_record_6.gemfile.lock +210 -0
- data/gemfiles/arel_gems.gemfile +10 -0
- data/gemfiles/arel_gems.gemfile.lock +284 -0
- data/gemfiles/default.gemfile +5 -0
- data/gemfiles/default.gemfile.lock +208 -0
- data/lib/arel/enhance.rb +17 -0
- data/lib/arel/enhance/context_enhancer/arel_table.rb +92 -0
- data/lib/arel/enhance/node.rb +232 -0
- data/lib/arel/enhance/path.rb +38 -0
- data/lib/arel/enhance/path_node.rb +26 -0
- data/lib/arel/enhance/query.rb +38 -0
- data/lib/arel/enhance/query_methods.rb +23 -0
- data/lib/arel/enhance/visitor.rb +97 -0
- data/lib/arel/extensions.rb +55 -3
- data/lib/arel/extensions/active_model_attribute_with_cast_value.rb +22 -0
- data/lib/arel/extensions/active_record_relation_query_attribute.rb +22 -0
- data/lib/arel/extensions/active_record_type_caster_connection.rb +7 -0
- data/lib/arel/extensions/active_record_type_caster_map.rb +7 -0
- data/lib/arel/extensions/array.rb +2 -9
- data/lib/arel/extensions/assignment.rb +22 -0
- data/lib/arel/extensions/at_time_zone.rb +37 -0
- data/lib/arel/extensions/attributes_attribute.rb +47 -0
- data/lib/arel/extensions/binary.rb +7 -0
- data/lib/arel/extensions/bind_param.rb +15 -0
- data/lib/arel/extensions/bit_string.rb +2 -9
- data/lib/arel/extensions/case.rb +17 -0
- data/lib/arel/extensions/coalesce.rb +17 -3
- data/lib/arel/extensions/conflict.rb +9 -0
- data/lib/arel/extensions/contained_within_equals.rb +10 -0
- data/lib/arel/extensions/contains.rb +27 -5
- data/lib/arel/extensions/contains_equals.rb +10 -0
- data/lib/arel/extensions/current_catalog.rb +4 -0
- data/lib/arel/extensions/current_date.rb +4 -0
- data/lib/arel/extensions/current_of_expression.rb +2 -9
- data/lib/arel/extensions/current_role.rb +4 -0
- data/lib/arel/extensions/current_row.rb +7 -0
- data/lib/arel/extensions/current_schema.rb +4 -0
- data/lib/arel/extensions/current_user.rb +4 -0
- data/lib/arel/extensions/dealocate.rb +31 -0
- data/lib/arel/extensions/default_values.rb +4 -0
- data/lib/arel/extensions/delete_manager.rb +25 -0
- data/lib/arel/extensions/delete_statement.rb +32 -8
- data/lib/arel/extensions/distinct_from.rb +3 -16
- data/lib/arel/extensions/dot.rb +11 -0
- data/lib/arel/extensions/equality.rb +2 -4
- data/lib/arel/extensions/exists.rb +59 -0
- data/lib/arel/extensions/extract_from.rb +25 -0
- data/lib/arel/extensions/factorial.rb +10 -2
- data/lib/arel/extensions/false.rb +7 -0
- data/lib/arel/extensions/function.rb +44 -14
- data/lib/arel/extensions/greatest.rb +17 -3
- data/lib/arel/extensions/indirection.rb +3 -12
- data/lib/arel/extensions/infer.rb +7 -7
- data/lib/arel/extensions/infix_operation.rb +17 -0
- data/lib/arel/extensions/insert_manager.rb +21 -0
- data/lib/arel/extensions/insert_statement.rb +35 -9
- data/lib/arel/extensions/into.rb +21 -0
- data/lib/arel/extensions/json_get_field.rb +10 -0
- data/lib/arel/extensions/json_get_object.rb +10 -0
- data/lib/arel/extensions/json_path_get_field.rb +10 -0
- data/lib/arel/extensions/json_path_get_object.rb +10 -0
- data/lib/arel/extensions/jsonb_all_key_exists.rb +10 -0
- data/lib/arel/extensions/jsonb_any_key_exists.rb +10 -0
- data/lib/arel/extensions/jsonb_key_exists.rb +10 -0
- data/lib/arel/extensions/least.rb +17 -3
- data/lib/arel/extensions/named_argument.rb +24 -0
- data/lib/arel/extensions/named_function.rb +7 -0
- data/lib/arel/extensions/node.rb +10 -0
- data/lib/arel/extensions/not_distinct_from.rb +3 -16
- data/lib/arel/extensions/not_equal.rb +2 -4
- data/lib/arel/extensions/ordering.rb +21 -6
- data/lib/arel/extensions/overlap.rb +1 -1
- data/lib/arel/extensions/overlaps.rb +49 -0
- data/lib/arel/extensions/overlay.rb +53 -0
- data/lib/arel/extensions/position.rb +27 -0
- data/lib/arel/extensions/prepare.rb +39 -0
- data/lib/arel/extensions/range_function.rb +10 -2
- data/lib/arel/extensions/row.rb +3 -8
- data/lib/arel/extensions/select_core.rb +73 -0
- data/lib/arel/extensions/select_manager.rb +25 -0
- data/lib/arel/extensions/select_statement.rb +31 -9
- data/lib/arel/extensions/session_user.rb +4 -0
- data/lib/arel/extensions/set_to_default.rb +4 -0
- data/lib/arel/extensions/substring.rb +46 -0
- data/lib/arel/extensions/table.rb +43 -10
- data/lib/arel/extensions/time_with_precision.rb +6 -0
- data/lib/arel/extensions/to_sql.rb +27 -0
- data/lib/arel/extensions/top.rb +8 -0
- data/lib/arel/extensions/transaction.rb +45 -0
- data/lib/arel/extensions/tree_manager.rb +15 -0
- data/lib/arel/extensions/trim.rb +44 -0
- data/lib/arel/extensions/true.rb +7 -0
- data/lib/arel/extensions/type_cast.rb +11 -0
- data/lib/arel/extensions/unary.rb +7 -0
- data/lib/arel/extensions/unary_operation.rb +16 -0
- data/lib/arel/extensions/unknown.rb +4 -0
- data/lib/arel/extensions/update_manager.rb +25 -0
- data/lib/arel/extensions/update_statement.rb +31 -6
- data/lib/arel/extensions/user.rb +4 -0
- data/lib/arel/extensions/values_list.rb +15 -0
- data/lib/arel/extensions/variable_set.rb +55 -0
- data/lib/arel/extensions/variable_show.rb +26 -0
- data/lib/arel/middleware.rb +27 -0
- data/lib/arel/middleware/active_record_extension.rb +13 -0
- data/lib/arel/middleware/cache_accessor.rb +35 -0
- data/lib/arel/middleware/chain.rb +172 -0
- data/lib/arel/middleware/database_executor.rb +77 -0
- data/lib/arel/middleware/no_op_cache.rb +9 -0
- data/lib/arel/middleware/postgresql_adapter.rb +62 -0
- data/lib/arel/middleware/railtie.rb +25 -0
- data/lib/arel/middleware/result.rb +170 -0
- data/lib/arel/middleware/to_sql_executor.rb +15 -0
- data/lib/arel/middleware/to_sql_middleware.rb +33 -0
- data/lib/arel/sql_to_arel.rb +8 -4
- data/lib/arel/sql_to_arel/error.rb +6 -0
- data/lib/arel/sql_to_arel/pg_query_visitor.rb +324 -76
- data/lib/arel/sql_to_arel/pg_query_visitor/frame_options.rb +112 -0
- data/lib/arel/sql_to_arel/result.rb +30 -0
- data/lib/arel/transformer.rb +8 -0
- data/lib/arel/transformer/prefix_schema_name.rb +183 -0
- data/lib/arel/transformer/remove_active_record_info.rb +40 -0
- data/lib/arel/transformer/replace_table_with_subquery.rb +31 -0
- data/lib/arel_toolkit.rb +16 -1
- data/lib/arel_toolkit/version.rb +1 -1
- metadata +278 -25
- data/.travis.yml +0 -21
- data/lib/arel/extensions/generate_series.rb +0 -9
- data/lib/arel/extensions/rank.rb +0 -9
- data/lib/arel/sql_to_arel/frame_options.rb +0 -110
- 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
|
data/lib/arel/extensions.rb
CHANGED
|
@@ -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
|
|
@@ -3,14 +3,7 @@
|
|
|
3
3
|
|
|
4
4
|
module Arel
|
|
5
5
|
module Nodes
|
|
6
|
-
class Array < Arel::Nodes::
|
|
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.
|
|
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
|