arel_toolkit 0.3.0 → 0.4.4
Sign up to get free protection for your applications and to get access to all the features.
- 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 -5
- data/Appraisals +13 -0
- data/CHANGELOG.md +94 -5
- data/Gemfile +5 -0
- data/Gemfile.lock +62 -33
- data/Guardfile +4 -0
- data/README.md +67 -23
- data/Rakefile +11 -1
- data/arel_toolkit.gemspec +15 -6
- data/benchmark.rb +54 -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 +32 -6
- 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/at_time_zone.rb +10 -3
- 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/contains.rb +27 -5
- 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 +22 -6
- data/lib/arel/extensions/delete_statement.rb +46 -24
- data/lib/arel/extensions/dot.rb +11 -0
- data/lib/arel/extensions/exists.rb +59 -0
- data/lib/arel/extensions/extract_from.rb +3 -10
- 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 +19 -3
- data/lib/arel/extensions/insert_statement.rb +31 -12
- data/lib/arel/extensions/into.rb +21 -0
- data/lib/arel/extensions/least.rb +17 -3
- data/lib/arel/extensions/named_argument.rb +3 -8
- data/lib/arel/extensions/named_function.rb +7 -0
- data/lib/arel/extensions/node.rb +10 -0
- data/lib/arel/extensions/ordering.rb +21 -6
- data/lib/arel/extensions/overlaps.rb +9 -0
- data/lib/arel/extensions/overlay.rb +9 -0
- data/lib/arel/extensions/position.rb +3 -8
- 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 +22 -6
- 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 +8 -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 +3 -8
- data/lib/arel/extensions/tree_manager.rb +15 -0
- data/lib/arel/extensions/trim.rb +8 -0
- data/lib/arel/extensions/true.rb +7 -0
- data/lib/arel/extensions/type_cast.rb +7 -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 +22 -6
- data/lib/arel/extensions/update_statement.rb +36 -33
- data/lib/arel/extensions/user.rb +4 -0
- data/lib/arel/extensions/values_list.rb +15 -0
- data/lib/arel/extensions/variable_set.rb +9 -0
- data/lib/arel/extensions/variable_show.rb +3 -8
- data/lib/arel/middleware.rb +5 -1
- 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 +108 -33
- 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 +41 -5
- data/lib/arel/middleware/railtie.rb +15 -1
- 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 +6 -3
- data/lib/arel/sql_to_arel/pg_query_visitor.rb +67 -38
- data/lib/arel/sql_to_arel/pg_query_visitor/frame_options.rb +1 -1
- data/lib/arel/sql_to_arel/result.rb +17 -4
- 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 +15 -2
- data/lib/arel_toolkit/version.rb +1 -1
- metadata +179 -42
- data/.travis.yml +0 -29
- data/lib/arel/extensions/generate_series.rb +0 -9
- data/lib/arel/extensions/rank.rb +0 -9
- data/lib/arel/extensions/unbound_column_reference.rb +0 -5
- data/lib/arel/sql_formatter.rb +0 -59
@@ -0,0 +1,15 @@
|
|
1
|
+
# rubocop:disable Naming/MethodName
|
2
|
+
# rubocop:disable Naming/UncommunicativeMethodParamName
|
3
|
+
|
4
|
+
module Arel
|
5
|
+
module Visitors
|
6
|
+
class Dot
|
7
|
+
def visit_Arel_Nodes_BindParam(o)
|
8
|
+
visit_edge o, 'value'
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
# rubocop:enable Naming/MethodName
|
15
|
+
# rubocop:enable Naming/UncommunicativeMethodParamName
|
@@ -3,21 +3,14 @@
|
|
3
3
|
|
4
4
|
module Arel
|
5
5
|
module Nodes
|
6
|
-
class BitString < Arel::Nodes::
|
7
|
-
attr_reader :str
|
8
|
-
|
9
|
-
def initialize(str)
|
10
|
-
super()
|
11
|
-
|
12
|
-
@str = str
|
13
|
-
end
|
6
|
+
class BitString < Arel::Nodes::Unary
|
14
7
|
end
|
15
8
|
end
|
16
9
|
|
17
10
|
module Visitors
|
18
11
|
class ToSql
|
19
12
|
def visit_Arel_Nodes_BitString(o, collector)
|
20
|
-
collector << "B'#{o.
|
13
|
+
collector << "B'#{o.expr[1..-1]}'"
|
21
14
|
end
|
22
15
|
end
|
23
16
|
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# rubocop:disable Naming/MethodName
|
2
|
+
# rubocop:disable Naming/UncommunicativeMethodParamName
|
3
|
+
|
4
|
+
module Arel
|
5
|
+
module Visitors
|
6
|
+
class Dot
|
7
|
+
def visit_Arel_Nodes_Case(o)
|
8
|
+
visit_edge o, 'case'
|
9
|
+
visit_edge o, 'conditions'
|
10
|
+
visit_edge o, 'default'
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
# rubocop:enable Naming/MethodName
|
17
|
+
# rubocop:enable Naming/UncommunicativeMethodParamName
|
@@ -1,9 +1,23 @@
|
|
1
|
+
# rubocop:disable Naming/MethodName
|
2
|
+
# rubocop:disable Naming/UncommunicativeMethodParamName
|
3
|
+
|
1
4
|
module Arel
|
2
5
|
module Nodes
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
+
# https://www.postgresql.org/docs/10/functions-conditional.html
|
7
|
+
class Coalesce < Arel::Nodes::Unary
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
module Visitors
|
12
|
+
class ToSql
|
13
|
+
def visit_Arel_Nodes_Coalesce(o, collector)
|
14
|
+
collector << 'COALESCE('
|
15
|
+
collector = inject_join(o.expr, collector, ', ')
|
16
|
+
collector << ')'
|
6
17
|
end
|
7
18
|
end
|
8
19
|
end
|
9
20
|
end
|
21
|
+
|
22
|
+
# rubocop:enable Naming/MethodName
|
23
|
+
# rubocop:enable Naming/UncommunicativeMethodParamName
|
@@ -40,6 +40,15 @@ module Arel
|
|
40
40
|
end
|
41
41
|
# rubocop:enable Metrics/AbcSize
|
42
42
|
end
|
43
|
+
|
44
|
+
class Dot
|
45
|
+
def visit_Arel_Nodes_Conflict(o)
|
46
|
+
visit_edge o, 'action'
|
47
|
+
visit_edge o, 'infer'
|
48
|
+
visit_edge o, 'values'
|
49
|
+
visit_edge o, 'wheres'
|
50
|
+
end
|
51
|
+
end
|
43
52
|
end
|
44
53
|
end
|
45
54
|
|
@@ -1,10 +1,32 @@
|
|
1
|
+
# rubocop:disable Naming/MethodName
|
2
|
+
# rubocop:disable Naming/UncommunicativeMethodParamName
|
3
|
+
|
1
4
|
module Arel
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
5
|
+
if Gem.loaded_specs.key?('postgres_ext')
|
6
|
+
module Visitors
|
7
|
+
module ContainsPatch
|
8
|
+
def visit_Arel_Nodes_Contains(o, collector)
|
9
|
+
if o.left.is_a?(Arel::Attribute)
|
10
|
+
super
|
11
|
+
else
|
12
|
+
infix_value o, collector, ' @> '
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
PostgreSQL.prepend(ContainsPatch)
|
18
|
+
end
|
19
|
+
else
|
20
|
+
module Nodes
|
21
|
+
# https://www.postgresql.org/docs/9.1/functions-array.html
|
22
|
+
class Contains < Arel::Nodes::InfixOperation
|
23
|
+
def initialize(left, right)
|
24
|
+
super(:'@>', left, right)
|
25
|
+
end
|
7
26
|
end
|
8
27
|
end
|
9
28
|
end
|
10
29
|
end
|
30
|
+
|
31
|
+
# rubocop:enable Naming/MethodName
|
32
|
+
# rubocop:enable Naming/UncommunicativeMethodParamName
|
@@ -4,14 +4,7 @@
|
|
4
4
|
module Arel
|
5
5
|
module Nodes
|
6
6
|
# https://www.postgresql.org/docs/10/sql-update.html
|
7
|
-
class CurrentOfExpression < Arel::Nodes::
|
8
|
-
attr_accessor :cursor_name
|
9
|
-
|
10
|
-
def initialize(cursor_name)
|
11
|
-
super()
|
12
|
-
|
13
|
-
@cursor_name = cursor_name
|
14
|
-
end
|
7
|
+
class CurrentOfExpression < Arel::Nodes::Unary
|
15
8
|
end
|
16
9
|
end
|
17
10
|
|
@@ -19,7 +12,7 @@ module Arel
|
|
19
12
|
class ToSql
|
20
13
|
def visit_Arel_Nodes_CurrentOfExpression(o, collector)
|
21
14
|
collector << 'CURRENT OF '
|
22
|
-
collector << o.
|
15
|
+
collector << o.expr
|
23
16
|
end
|
24
17
|
end
|
25
18
|
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# rubocop:disable Naming/MethodName
|
2
|
+
# rubocop:disable Naming/UncommunicativeMethodParamName
|
3
|
+
|
4
|
+
module Arel
|
5
|
+
module Visitors
|
6
|
+
class Dot
|
7
|
+
def visit_Arel_Nodes_Dealocate(o)
|
8
|
+
visit_edge o, 'name'
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
class ToSql
|
13
|
+
def visit_Arel_Nodes_Dealocate(o, collector)
|
14
|
+
collector << 'DEALLOCATE ' << (o.name || 'ALL')
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
module Nodes
|
20
|
+
class Dealocate < Node
|
21
|
+
attr_reader :name
|
22
|
+
|
23
|
+
def initialize(name)
|
24
|
+
@name = name
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
# rubocop:enable Naming/MethodName
|
31
|
+
# rubocop:enable Naming/UncommunicativeMethodParamName
|
@@ -1,9 +1,25 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
1
|
+
# rubocop:disable Naming/MethodName
|
2
|
+
# rubocop:disable Naming/UncommunicativeMethodParamName
|
3
|
+
|
4
|
+
module Arel
|
5
|
+
class DeleteManager < Arel::TreeManager
|
6
|
+
def ==(other)
|
7
|
+
other.is_a?(self.class) && @ast == other.ast && @ctx == other.ctx
|
8
|
+
end
|
9
|
+
|
10
|
+
protected
|
5
11
|
|
6
|
-
|
12
|
+
attr_reader :ctx
|
13
|
+
end
|
7
14
|
|
8
|
-
|
15
|
+
module Visitors
|
16
|
+
class Dot
|
17
|
+
def visit_Arel_DeleteManager(o)
|
18
|
+
visit_edge o, 'ast'
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
9
22
|
end
|
23
|
+
|
24
|
+
# rubocop:enable Naming/MethodName
|
25
|
+
# rubocop:enable Naming/UncommunicativeMethodParamName
|
@@ -3,18 +3,24 @@
|
|
3
3
|
|
4
4
|
module Arel
|
5
5
|
module Nodes
|
6
|
-
# https://www.postgresql.org/docs/
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
6
|
+
# https://www.postgresql.org/docs/10/sql-delete.html
|
7
|
+
class DeleteStatement
|
8
|
+
module DeleteStatementExtension
|
9
|
+
attr_accessor :using
|
10
|
+
attr_accessor :with
|
11
|
+
attr_accessor :returning
|
12
|
+
attr_accessor :orders
|
11
13
|
|
12
|
-
|
13
|
-
|
14
|
-
old_initialize(relation, wheres)
|
14
|
+
def initialize(relation = nil, wheres = [])
|
15
|
+
super
|
15
16
|
|
16
|
-
|
17
|
+
@returning = []
|
18
|
+
@orders = []
|
19
|
+
@using = []
|
20
|
+
end
|
17
21
|
end
|
22
|
+
|
23
|
+
prepend DeleteStatementExtension
|
18
24
|
end
|
19
25
|
end
|
20
26
|
|
@@ -24,31 +30,47 @@ module Arel
|
|
24
30
|
def visit_Arel_Nodes_DeleteStatement(o, collector)
|
25
31
|
if o.with
|
26
32
|
collector = visit o.with, collector
|
27
|
-
collector <<
|
33
|
+
collector << ' '
|
28
34
|
end
|
29
35
|
|
30
|
-
|
31
|
-
|
36
|
+
if Gem.loaded_specs['activerecord'].version >= Gem::Version.new('6.0.0')
|
37
|
+
o = prepare_delete_statement(o)
|
32
38
|
|
33
|
-
|
34
|
-
|
35
|
-
|
39
|
+
if has_join_sources?(o)
|
40
|
+
collector << 'DELETE '
|
41
|
+
visit o.relation.left, collector
|
42
|
+
collector << ' FROM '
|
43
|
+
else
|
44
|
+
collector << 'DELETE FROM '
|
45
|
+
end
|
46
|
+
else
|
47
|
+
collector << 'DELETE FROM '
|
36
48
|
end
|
37
49
|
|
38
|
-
|
39
|
-
collector << WHERE
|
40
|
-
collector = inject_join o.wheres, collector, AND
|
41
|
-
end
|
42
|
-
|
43
|
-
unless o.returning.empty?
|
44
|
-
collector << ' RETURNING '
|
45
|
-
collector = inject_join o.returning, collector, ', '
|
46
|
-
end
|
50
|
+
collector = visit o.relation, collector
|
47
51
|
|
52
|
+
collect_nodes_for o.using, collector, ' USING ', ', '
|
53
|
+
collect_nodes_for o.wheres, collector, ' WHERE ', ' AND '
|
54
|
+
collect_nodes_for o.returning, collector, ' RETURNING ', ', '
|
55
|
+
collect_nodes_for o.orders, collector, ' ORDER BY '
|
48
56
|
maybe_visit o.limit, collector
|
49
57
|
end
|
50
58
|
# rubocop:enable Metrics/AbcSize
|
51
59
|
end
|
60
|
+
|
61
|
+
class Dot
|
62
|
+
module DeleteStatementExtension
|
63
|
+
def visit_Arel_Nodes_DeleteStatement(o)
|
64
|
+
super
|
65
|
+
|
66
|
+
visit_edge o, 'using'
|
67
|
+
visit_edge o, 'with'
|
68
|
+
visit_edge o, 'returning'
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
prepend(DeleteStatementExtension)
|
73
|
+
end
|
52
74
|
end
|
53
75
|
end
|
54
76
|
|
@@ -0,0 +1,59 @@
|
|
1
|
+
# rubocop:disable Naming/MethodName
|
2
|
+
# rubocop:disable Naming/UncommunicativeMethodParamName
|
3
|
+
|
4
|
+
module Arel
|
5
|
+
module Nodes
|
6
|
+
# This is a copy of https://github.com/rails/arel/blob/v9.0.0/lib/arel/nodes/function.rb
|
7
|
+
# Only difference is the superclass, because EXISTS is not a function but a subquery expression.
|
8
|
+
# Semantic meaning is important when transforming the Arel using the enhanced AST,
|
9
|
+
# because EXISTS cannot be processed as a function. For example it does not have a schema
|
10
|
+
# like a normal function.
|
11
|
+
#
|
12
|
+
# To change the superclass we're removing the existing Exists class `Arel::Nodes::Exists`
|
13
|
+
# and recreating it extending from `Arel::Nodes::Unary`.
|
14
|
+
remove_const(:Exists)
|
15
|
+
|
16
|
+
# https://www.postgresql.org/docs/10/functions-subquery.html
|
17
|
+
class Exists < Arel::Nodes::Unary
|
18
|
+
include Arel::Predications
|
19
|
+
include Arel::WindowPredications
|
20
|
+
include Arel::OrderPredications
|
21
|
+
attr_accessor :expressions, :alias, :distinct
|
22
|
+
|
23
|
+
def initialize(expr, aliaz = nil)
|
24
|
+
@expressions = expr
|
25
|
+
@alias = aliaz && SqlLiteral.new(aliaz)
|
26
|
+
@distinct = false
|
27
|
+
end
|
28
|
+
|
29
|
+
def as(aliaz)
|
30
|
+
self.alias = SqlLiteral.new(aliaz)
|
31
|
+
self
|
32
|
+
end
|
33
|
+
|
34
|
+
def hash
|
35
|
+
[@expressions, @alias, @distinct].hash
|
36
|
+
end
|
37
|
+
|
38
|
+
def eql?(other)
|
39
|
+
self.class == other.class &&
|
40
|
+
expressions == other.expressions &&
|
41
|
+
self.alias == other.alias &&
|
42
|
+
distinct == other.distinct
|
43
|
+
end
|
44
|
+
alias == eql?
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
module Visitors
|
49
|
+
class Dot
|
50
|
+
def visit_Arel_Nodes_Exists(o)
|
51
|
+
visit_edge o, 'expressions'
|
52
|
+
visit_edge o, 'alias'
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
# rubocop:enable Naming/MethodName
|
59
|
+
# rubocop:enable Naming/UncommunicativeMethodParamName
|