arel_toolkit 0.3.0 → 0.4.4
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 -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
|
@@ -3,15 +3,19 @@
|
|
|
3
3
|
|
|
4
4
|
module Arel
|
|
5
5
|
module Nodes
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
class Ordering
|
|
7
|
+
module OrderingExtension
|
|
8
|
+
# Postgres: https://www.postgresql.org/docs/9.4/queries-order.html
|
|
9
|
+
attr_accessor :nulls
|
|
9
10
|
|
|
10
|
-
|
|
11
|
-
|
|
11
|
+
def initialize(expr, nulls = 0)
|
|
12
|
+
super(expr)
|
|
12
13
|
|
|
13
|
-
|
|
14
|
+
@nulls = nulls
|
|
15
|
+
end
|
|
14
16
|
end
|
|
17
|
+
|
|
18
|
+
prepend OrderingExtension
|
|
15
19
|
end
|
|
16
20
|
end
|
|
17
21
|
|
|
@@ -40,6 +44,17 @@ module Arel
|
|
|
40
44
|
end
|
|
41
45
|
end
|
|
42
46
|
end
|
|
47
|
+
|
|
48
|
+
class Dot
|
|
49
|
+
module OrderingExtension
|
|
50
|
+
def visit_Arel_Nodes_Ordering(o)
|
|
51
|
+
super
|
|
52
|
+
visit_edge o, 'nulls'
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
prepend OrderingExtension
|
|
57
|
+
end
|
|
43
58
|
end
|
|
44
59
|
end
|
|
45
60
|
|
|
@@ -4,14 +4,9 @@
|
|
|
4
4
|
module Arel
|
|
5
5
|
module Nodes
|
|
6
6
|
# https://www.postgresql.org/docs/9.1/functions-string.html#FUNCTIONS-STRING-SQL
|
|
7
|
-
class Position < Arel::Nodes::
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
def initialize(substring, string)
|
|
12
|
-
@substring = substring
|
|
13
|
-
@string = string
|
|
14
|
-
end
|
|
7
|
+
class Position < Arel::Nodes::Binary
|
|
8
|
+
alias substring left
|
|
9
|
+
alias string right
|
|
15
10
|
end
|
|
16
11
|
end
|
|
17
12
|
|
|
@@ -0,0 +1,39 @@
|
|
|
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_Prepare(o)
|
|
8
|
+
visit_edge o, 'name'
|
|
9
|
+
visit_edge o, 'argtypes'
|
|
10
|
+
visit_edge o, 'query'
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
class ToSql
|
|
15
|
+
def visit_Arel_Nodes_Prepare(o, collector)
|
|
16
|
+
collector << "PREPARE #{o.name}"
|
|
17
|
+
collector << " (#{o.argtypes.join(', ')})" if o.argtypes
|
|
18
|
+
collector << ' AS ('
|
|
19
|
+
visit(o.query, collector)
|
|
20
|
+
collector << ')'
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
module Nodes
|
|
26
|
+
class Prepare < Node
|
|
27
|
+
attr_reader :name, :query, :argtypes
|
|
28
|
+
|
|
29
|
+
def initialize(name, argtypes, query)
|
|
30
|
+
@name = name
|
|
31
|
+
@query = query
|
|
32
|
+
@argtypes = argtypes
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# rubocop:enable Naming/MethodName
|
|
39
|
+
# rubocop:enable Naming/UncommunicativeMethodParamName
|
|
@@ -5,15 +5,23 @@ module Arel
|
|
|
5
5
|
module Nodes
|
|
6
6
|
# Postgres: https://www.postgresql.org/docs/9.4/sql-select.html
|
|
7
7
|
class RangeFunction < Arel::Nodes::Unary
|
|
8
|
+
attr_reader :is_rowsfrom
|
|
9
|
+
|
|
10
|
+
def initialize(*args, is_rowsfrom:, **kwargs)
|
|
11
|
+
@is_rowsfrom = is_rowsfrom
|
|
12
|
+
super(*args, **kwargs)
|
|
13
|
+
end
|
|
8
14
|
end
|
|
9
15
|
end
|
|
10
16
|
|
|
11
17
|
module Visitors
|
|
12
18
|
class ToSql
|
|
13
19
|
def visit_Arel_Nodes_RangeFunction(o, collector)
|
|
14
|
-
collector << 'ROWS FROM ('
|
|
20
|
+
collector << 'ROWS FROM (' if o.is_rowsfrom
|
|
15
21
|
visit o.expr, collector
|
|
16
|
-
collector << ')'
|
|
22
|
+
collector << ')' if o.is_rowsfrom
|
|
23
|
+
|
|
24
|
+
collector
|
|
17
25
|
end
|
|
18
26
|
end
|
|
19
27
|
end
|
data/lib/arel/extensions/row.rb
CHANGED
|
@@ -4,14 +4,9 @@
|
|
|
4
4
|
module Arel
|
|
5
5
|
module Nodes
|
|
6
6
|
# Postgres: https://www.postgresql.org/docs/9.2/sql-expressions.html
|
|
7
|
-
class Row < Arel::Nodes::
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
def initialize(args, row_format)
|
|
11
|
-
super(args)
|
|
12
|
-
|
|
13
|
-
@row_format = row_format
|
|
14
|
-
end
|
|
7
|
+
class Row < Arel::Nodes::Binary
|
|
8
|
+
alias expr left
|
|
9
|
+
alias row_format right
|
|
15
10
|
end
|
|
16
11
|
end
|
|
17
12
|
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# rubocop:disable Naming/MethodName
|
|
2
|
+
# rubocop:disable Naming/UncommunicativeMethodParamName
|
|
3
|
+
# rubocop:disable Metrics/AbcSize
|
|
4
|
+
|
|
5
|
+
module Arel
|
|
6
|
+
module Nodes
|
|
7
|
+
class SelectCore < Arel::Nodes::Node
|
|
8
|
+
attr_accessor :into
|
|
9
|
+
attr_accessor :top
|
|
10
|
+
|
|
11
|
+
private
|
|
12
|
+
|
|
13
|
+
def hash
|
|
14
|
+
[
|
|
15
|
+
@source, @set_quantifier, @projections, @optimizer_hints,
|
|
16
|
+
@wheres, @groups, @havings, @windows, @comment, @top, @into
|
|
17
|
+
].hash
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def eql?(other)
|
|
21
|
+
super &&
|
|
22
|
+
top == other.top &&
|
|
23
|
+
into == other.into
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
module Visitors
|
|
29
|
+
class ToSql
|
|
30
|
+
def visit_Arel_Nodes_SelectCore(o, collector)
|
|
31
|
+
collector << 'SELECT'
|
|
32
|
+
|
|
33
|
+
collector = maybe_visit o.set_quantifier, collector
|
|
34
|
+
|
|
35
|
+
collect_nodes_for o.projections, collector, ' '
|
|
36
|
+
|
|
37
|
+
maybe_visit o.into, collector
|
|
38
|
+
|
|
39
|
+
if o.source && !o.source.empty?
|
|
40
|
+
collector << ' FROM '
|
|
41
|
+
collector = visit o.source, collector
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
collect_nodes_for o.wheres, collector, ' WHERE ', ' AND '
|
|
45
|
+
collect_nodes_for o.groups, collector, ' GROUP BY '
|
|
46
|
+
unless o.havings.empty?
|
|
47
|
+
collector << ' HAVING '
|
|
48
|
+
inject_join o.havings, collector, ' AND '
|
|
49
|
+
end
|
|
50
|
+
collect_nodes_for o.windows, collector, ' WINDOW '
|
|
51
|
+
|
|
52
|
+
collector
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
class Dot
|
|
57
|
+
module SelectCoreExtension
|
|
58
|
+
def visit_Arel_Nodes_SelectCore(o)
|
|
59
|
+
super
|
|
60
|
+
|
|
61
|
+
visit_edge o, 'into'
|
|
62
|
+
visit_edge o, 'top'
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
prepend SelectCoreExtension
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
# rubocop:enable Metrics/AbcSize
|
|
72
|
+
# rubocop:enable Naming/MethodName
|
|
73
|
+
# 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 SelectManager
|
|
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_SelectManager(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,21 +3,43 @@
|
|
|
3
3
|
|
|
4
4
|
module Arel
|
|
5
5
|
module Nodes
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
6
|
+
class SelectStatement
|
|
7
|
+
module SelectStatementExtension
|
|
8
|
+
# For INSERT statements
|
|
9
|
+
attr_accessor :values_lists
|
|
10
|
+
attr_accessor :union
|
|
11
|
+
attr_writer :cores
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
prepend SelectStatementExtension
|
|
11
15
|
end
|
|
12
16
|
end
|
|
13
17
|
|
|
14
18
|
module Visitors
|
|
15
19
|
class ToSql
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
+
module SelectStatementExtension
|
|
21
|
+
def visit_Arel_Nodes_SelectStatement(o, collector)
|
|
22
|
+
visit(o.union, collector) if o.union
|
|
23
|
+
super
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
prepend SelectStatementExtension
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
class Dot
|
|
31
|
+
module SelectStatementExtension
|
|
32
|
+
def visit_Arel_Nodes_SelectStatement(o)
|
|
33
|
+
super
|
|
34
|
+
|
|
35
|
+
visit_edge o, 'lock'
|
|
36
|
+
visit_edge o, 'with'
|
|
37
|
+
visit_edge o, 'union'
|
|
38
|
+
visit_edge o, 'values_lists'
|
|
39
|
+
end
|
|
20
40
|
end
|
|
41
|
+
|
|
42
|
+
prepend SelectStatementExtension
|
|
21
43
|
end
|
|
22
44
|
end
|
|
23
45
|
end
|
|
@@ -3,16 +3,15 @@
|
|
|
3
3
|
# rubocop:disable Metrics/ParameterLists
|
|
4
4
|
|
|
5
5
|
module Arel
|
|
6
|
-
|
|
7
|
-
|
|
6
|
+
class Table
|
|
7
|
+
module TableExtension
|
|
8
8
|
# postgres only: https://www.postgresql.org/docs/9.5/sql-select.html
|
|
9
9
|
attr_accessor :only
|
|
10
|
-
# postgres only: https://www.postgresql.org/docs/
|
|
10
|
+
# postgres only: https://www.postgresql.org/docs/10/ddl-schemas.html
|
|
11
11
|
attr_accessor :schema_name
|
|
12
12
|
# postgres only: https://www.postgresql.org/docs/9.1/catalog-pg-class.html
|
|
13
13
|
attr_accessor :relpersistence
|
|
14
14
|
|
|
15
|
-
alias_method :old_initialize, :initialize
|
|
16
15
|
def initialize(
|
|
17
16
|
name,
|
|
18
17
|
as: nil,
|
|
@@ -25,21 +24,55 @@ module Arel
|
|
|
25
24
|
@schema_name = schema_name
|
|
26
25
|
@relpersistence = relpersistence
|
|
27
26
|
|
|
28
|
-
|
|
27
|
+
super(name, as: as, type_caster: type_caster)
|
|
29
28
|
end
|
|
30
29
|
end
|
|
30
|
+
|
|
31
|
+
prepend TableExtension
|
|
31
32
|
end
|
|
32
33
|
|
|
33
34
|
module Visitors
|
|
34
35
|
class ToSql
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
36
|
+
module TableExtension
|
|
37
|
+
def visit_Arel_Table(o, collector)
|
|
38
|
+
collector << 'ONLY ' if o.only
|
|
39
|
+
|
|
40
|
+
case o.relpersistence
|
|
41
|
+
when 'p'
|
|
42
|
+
collector << ''
|
|
43
|
+
|
|
44
|
+
when 'u'
|
|
45
|
+
collector << 'UNLOGGED '
|
|
38
46
|
|
|
39
|
-
|
|
47
|
+
when 't'
|
|
48
|
+
collector << 'TEMPORARY '
|
|
40
49
|
|
|
41
|
-
|
|
50
|
+
else
|
|
51
|
+
raise "Unknown relpersistence `#{o.relpersistence}`"
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
collector << "\"#{o.schema_name}\"." if o.schema_name
|
|
55
|
+
|
|
56
|
+
super
|
|
57
|
+
end
|
|
42
58
|
end
|
|
59
|
+
|
|
60
|
+
prepend TableExtension
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
class Dot
|
|
64
|
+
module TableExtension
|
|
65
|
+
def visit_Arel_Table(o)
|
|
66
|
+
super
|
|
67
|
+
|
|
68
|
+
visit_edge o, 'only'
|
|
69
|
+
visit_edge o, 'schema_name'
|
|
70
|
+
visit_edge o, 'relpersistence'
|
|
71
|
+
visit_edge o, 'type_caster'
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
prepend TableExtension
|
|
43
76
|
end
|
|
44
77
|
end
|
|
45
78
|
end
|