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,47 @@
|
|
|
1
|
+
# rubocop:disable Naming/MethodName
|
|
2
|
+
# rubocop:disable Naming/UncommunicativeMethodParamName
|
|
3
|
+
|
|
4
|
+
module Arel
|
|
5
|
+
module Attributes
|
|
6
|
+
class Attribute
|
|
7
|
+
module AttributeExtension
|
|
8
|
+
# postgres only: https://www.postgresql.org/docs/10/ddl-schemas.html
|
|
9
|
+
attr_accessor :schema_name
|
|
10
|
+
attr_accessor :database
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
prepend AttributeExtension
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
module Visitors
|
|
18
|
+
class ToSql
|
|
19
|
+
module AttributesAttributeExtension
|
|
20
|
+
def visit_Arel_Attributes_Attribute(o, collector)
|
|
21
|
+
collector << "#{quote_table_name(o.database)}." if o.database
|
|
22
|
+
collector << "#{quote_table_name(o.schema_name)}." if o.schema_name
|
|
23
|
+
|
|
24
|
+
super
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
prepend AttributesAttributeExtension
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
class Dot
|
|
32
|
+
module AttributesAttributeExtension
|
|
33
|
+
def visit_Arel_Attributes_Attribute(o)
|
|
34
|
+
super
|
|
35
|
+
|
|
36
|
+
visit_edge o, 'schema_name'
|
|
37
|
+
visit_edge o, 'database'
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
prepend AttributesAttributeExtension
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# rubocop:enable Naming/MethodName
|
|
47
|
+
# rubocop:enable Naming/UncommunicativeMethodParamName
|
|
@@ -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
|
|
@@ -0,0 +1,25 @@
|
|
|
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
|
|
11
|
+
|
|
12
|
+
attr_reader :ctx
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
module Visitors
|
|
16
|
+
class Dot
|
|
17
|
+
def visit_Arel_DeleteManager(o)
|
|
18
|
+
visit_edge o, 'ast'
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# rubocop:enable Naming/MethodName
|
|
25
|
+
# rubocop:enable Naming/UncommunicativeMethodParamName
|
|
@@ -3,11 +3,21 @@
|
|
|
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
|
+
|
|
13
|
+
def initialize(relation = nil, wheres = [])
|
|
14
|
+
super
|
|
15
|
+
|
|
16
|
+
@returning = []
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
prepend DeleteStatementExtension
|
|
11
21
|
end
|
|
12
22
|
end
|
|
13
23
|
|
|
@@ -17,7 +27,7 @@ module Arel
|
|
|
17
27
|
def visit_Arel_Nodes_DeleteStatement(o, collector)
|
|
18
28
|
if o.with
|
|
19
29
|
collector = visit o.with, collector
|
|
20
|
-
collector <<
|
|
30
|
+
collector << ' '
|
|
21
31
|
end
|
|
22
32
|
|
|
23
33
|
collector << 'DELETE FROM '
|
|
@@ -29,8 +39,8 @@ module Arel
|
|
|
29
39
|
end
|
|
30
40
|
|
|
31
41
|
if o.wheres.any?
|
|
32
|
-
collector << WHERE
|
|
33
|
-
collector = inject_join o.wheres, collector, AND
|
|
42
|
+
collector << ' WHERE '
|
|
43
|
+
collector = inject_join o.wheres, collector, ' AND '
|
|
34
44
|
end
|
|
35
45
|
|
|
36
46
|
unless o.returning.empty?
|
|
@@ -42,6 +52,20 @@ module Arel
|
|
|
42
52
|
end
|
|
43
53
|
# rubocop:enable Metrics/AbcSize
|
|
44
54
|
end
|
|
55
|
+
|
|
56
|
+
class Dot
|
|
57
|
+
module DeleteStatementExtension
|
|
58
|
+
def visit_Arel_Nodes_DeleteStatement(o)
|
|
59
|
+
super
|
|
60
|
+
|
|
61
|
+
visit_edge o, 'using'
|
|
62
|
+
visit_edge o, 'with'
|
|
63
|
+
visit_edge o, 'returning'
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
prepend(DeleteStatementExtension)
|
|
68
|
+
end
|
|
45
69
|
end
|
|
46
70
|
end
|
|
47
71
|
|