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,21 @@
|
|
|
1
|
+
# rubocop:disable Naming/MethodName
|
|
2
|
+
# rubocop:disable Naming/UncommunicativeMethodParamName
|
|
3
|
+
|
|
4
|
+
module Arel
|
|
5
|
+
module Nodes
|
|
6
|
+
class Into < Arel::Nodes::Unary
|
|
7
|
+
end
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
module Visitors
|
|
11
|
+
class ToSql
|
|
12
|
+
def visit_Arel_Nodes_Into(o, collector)
|
|
13
|
+
collector << 'INTO '
|
|
14
|
+
visit o.expr, collector
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# rubocop:enable Naming/MethodName
|
|
21
|
+
# 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 Least < Arel::Nodes::Unary
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
module Visitors
|
|
12
|
+
class ToSql
|
|
13
|
+
def visit_Arel_Nodes_Least(o, collector)
|
|
14
|
+
collector << 'LEAST('
|
|
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
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# rubocop:disable Naming/MethodName
|
|
2
|
+
# rubocop:disable Naming/UncommunicativeMethodParamName
|
|
3
|
+
|
|
4
|
+
module Arel
|
|
5
|
+
module Nodes
|
|
6
|
+
class NamedArgument < Arel::Nodes::Binary
|
|
7
|
+
alias name left
|
|
8
|
+
alias value right
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
module Visitors
|
|
13
|
+
class ToSql
|
|
14
|
+
def visit_Arel_Nodes_NamedArgument(o, collector)
|
|
15
|
+
collector << o.name
|
|
16
|
+
collector << ' => '
|
|
17
|
+
visit(o.value, collector)
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# rubocop:enable Naming/MethodName
|
|
24
|
+
# rubocop:enable Naming/UncommunicativeMethodParamName
|
|
@@ -1,22 +1,9 @@
|
|
|
1
|
-
# rubocop:disable Naming/MethodName
|
|
2
|
-
# rubocop:disable Naming/UncommunicativeMethodParamName
|
|
3
|
-
|
|
4
1
|
module Arel
|
|
5
2
|
module Nodes
|
|
6
|
-
class NotDistinctFrom < Arel::Nodes::
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
module Visitors
|
|
11
|
-
class ToSql
|
|
12
|
-
def visit_Arel_Nodes_NotDistinctFrom(o, collector)
|
|
13
|
-
visit o.left, collector
|
|
14
|
-
collector << ' IS NOT DISTINCT FROM '
|
|
15
|
-
visit o.right, collector
|
|
3
|
+
class NotDistinctFrom < Arel::Nodes::InfixOperation
|
|
4
|
+
def initialize(left, right)
|
|
5
|
+
super(:'IS NOT DISTINCT FROM', left, right)
|
|
16
6
|
end
|
|
17
7
|
end
|
|
18
8
|
end
|
|
19
9
|
end
|
|
20
|
-
|
|
21
|
-
# rubocop:enable Naming/MethodName
|
|
22
|
-
# rubocop:enable Naming/UncommunicativeMethodParamName
|
|
@@ -6,15 +6,13 @@ module Arel
|
|
|
6
6
|
class ToSql
|
|
7
7
|
def visit_Arel_Nodes_NotEqual(o, collector)
|
|
8
8
|
right = o.right
|
|
9
|
-
|
|
10
9
|
collector = visit o.left, collector
|
|
11
10
|
|
|
12
|
-
|
|
13
|
-
when Arel::Nodes::Unknown, Arel::Nodes::False, Arel::Nodes::True
|
|
11
|
+
if [Arel::Nodes::Unknown, Arel::Nodes::False, Arel::Nodes::True].include?(right.class)
|
|
14
12
|
collector << ' IS NOT '
|
|
15
13
|
visit right, collector
|
|
16
14
|
|
|
17
|
-
|
|
15
|
+
elsif right.nil?
|
|
18
16
|
collector << ' IS NOT NULL'
|
|
19
17
|
|
|
20
18
|
else
|
|
@@ -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
|
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# rubocop:disable Naming/MethodName
|
|
2
|
+
# rubocop:disable Naming/UncommunicativeMethodParamName
|
|
3
|
+
|
|
4
|
+
module Arel
|
|
5
|
+
module Nodes
|
|
6
|
+
# https://www.postgresql.org/docs/10/functions-string.html
|
|
7
|
+
class Overlaps < Arel::Nodes::Node
|
|
8
|
+
attr_reader :start1
|
|
9
|
+
attr_reader :end1
|
|
10
|
+
attr_reader :start2
|
|
11
|
+
attr_reader :end2
|
|
12
|
+
|
|
13
|
+
def initialize(start1, end1, start2, end2)
|
|
14
|
+
@start1 = start1
|
|
15
|
+
@end1 = end1
|
|
16
|
+
@start2 = start2
|
|
17
|
+
@end2 = end2
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
module Visitors
|
|
23
|
+
class ToSql
|
|
24
|
+
def visit_Arel_Nodes_Overlaps(o, collector)
|
|
25
|
+
collector << '('
|
|
26
|
+
visit o.start1, collector
|
|
27
|
+
collector << ', '
|
|
28
|
+
visit o.end1, collector
|
|
29
|
+
collector << ') OVERLAPS ('
|
|
30
|
+
visit o.start2, collector
|
|
31
|
+
collector << ', '
|
|
32
|
+
visit o.end2, collector
|
|
33
|
+
collector << ')'
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
class Dot
|
|
38
|
+
def visit_Arel_Nodes_Overlaps(o)
|
|
39
|
+
visit_edge o, 'start1'
|
|
40
|
+
visit_edge o, 'end1'
|
|
41
|
+
visit_edge o, 'start2'
|
|
42
|
+
visit_edge o, 'end2'
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# rubocop:enable Naming/MethodName
|
|
49
|
+
# rubocop:enable Naming/UncommunicativeMethodParamName
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# rubocop:disable Naming/MethodName
|
|
2
|
+
# rubocop:disable Naming/UncommunicativeMethodParamName
|
|
3
|
+
# rubocop:disable Metrics/AbcSize
|
|
4
|
+
|
|
5
|
+
module Arel
|
|
6
|
+
module Nodes
|
|
7
|
+
# https://www.postgresql.org/docs/10/functions-string.html
|
|
8
|
+
class Overlay < Arel::Nodes::Node
|
|
9
|
+
attr_reader :string
|
|
10
|
+
attr_reader :substring
|
|
11
|
+
attr_reader :start
|
|
12
|
+
attr_reader :length
|
|
13
|
+
|
|
14
|
+
def initialize(string, substring, start, length = nil)
|
|
15
|
+
@string = string
|
|
16
|
+
@substring = substring
|
|
17
|
+
@start = start
|
|
18
|
+
@length = length
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
module Visitors
|
|
24
|
+
class ToSql
|
|
25
|
+
def visit_Arel_Nodes_Overlay(o, collector)
|
|
26
|
+
collector << 'overlay('
|
|
27
|
+
visit o.string, collector
|
|
28
|
+
collector << ' placing '
|
|
29
|
+
visit o.substring, collector
|
|
30
|
+
collector << ' from '
|
|
31
|
+
visit o.start, collector
|
|
32
|
+
unless o.length.nil?
|
|
33
|
+
collector << ' for '
|
|
34
|
+
visit o.length, collector
|
|
35
|
+
end
|
|
36
|
+
collector << ')'
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
class Dot
|
|
41
|
+
def visit_Arel_Nodes_Overlay(o)
|
|
42
|
+
visit_edge o, 'string'
|
|
43
|
+
visit_edge o, 'substring'
|
|
44
|
+
visit_edge o, 'start'
|
|
45
|
+
visit_edge o, 'length'
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# rubocop:enable Naming/MethodName
|
|
52
|
+
# rubocop:enable Naming/UncommunicativeMethodParamName
|
|
53
|
+
# rubocop:enable Metrics/AbcSize
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# rubocop:disable Naming/MethodName
|
|
2
|
+
# rubocop:disable Naming/UncommunicativeMethodParamName
|
|
3
|
+
|
|
4
|
+
module Arel
|
|
5
|
+
module Nodes
|
|
6
|
+
# https://www.postgresql.org/docs/9.1/functions-string.html#FUNCTIONS-STRING-SQL
|
|
7
|
+
class Position < Arel::Nodes::Binary
|
|
8
|
+
alias substring left
|
|
9
|
+
alias string right
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
module Visitors
|
|
14
|
+
class ToSql
|
|
15
|
+
def visit_Arel_Nodes_Position(o, collector)
|
|
16
|
+
collector << 'position('
|
|
17
|
+
visit o.substring, collector
|
|
18
|
+
collector << ' in '
|
|
19
|
+
visit o.string, collector
|
|
20
|
+
collector << ')'
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# rubocop:enable Naming/MethodName
|
|
27
|
+
# rubocop:enable Naming/UncommunicativeMethodParamName
|
|
@@ -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
|