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.
Files changed (150) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +3 -0
  3. data/.github/workflows/develop.yml +90 -0
  4. data/.github/workflows/master.yml +67 -0
  5. data/.gitignore +8 -0
  6. data/.rubocop.yml +13 -2
  7. data/Appraisals +13 -0
  8. data/CHANGELOG.md +132 -6
  9. data/Gemfile +5 -0
  10. data/Gemfile.lock +92 -12
  11. data/Guardfile +23 -12
  12. data/README.md +104 -6
  13. data/Rakefile +18 -0
  14. data/arel_toolkit.gemspec +19 -4
  15. data/benchmark.rb +54 -0
  16. data/bin/console +1 -0
  17. data/ext/pg_result_init/extconf.rb +52 -0
  18. data/ext/pg_result_init/pg_result_init.c +138 -0
  19. data/ext/pg_result_init/pg_result_init.h +6 -0
  20. data/gemfiles/active_record_6.gemfile +7 -0
  21. data/gemfiles/active_record_6.gemfile.lock +210 -0
  22. data/gemfiles/arel_gems.gemfile +10 -0
  23. data/gemfiles/arel_gems.gemfile.lock +284 -0
  24. data/gemfiles/default.gemfile +5 -0
  25. data/gemfiles/default.gemfile.lock +208 -0
  26. data/lib/arel/enhance.rb +17 -0
  27. data/lib/arel/enhance/context_enhancer/arel_table.rb +92 -0
  28. data/lib/arel/enhance/node.rb +232 -0
  29. data/lib/arel/enhance/path.rb +38 -0
  30. data/lib/arel/enhance/path_node.rb +26 -0
  31. data/lib/arel/enhance/query.rb +38 -0
  32. data/lib/arel/enhance/query_methods.rb +23 -0
  33. data/lib/arel/enhance/visitor.rb +97 -0
  34. data/lib/arel/extensions.rb +55 -3
  35. data/lib/arel/extensions/active_model_attribute_with_cast_value.rb +22 -0
  36. data/lib/arel/extensions/active_record_relation_query_attribute.rb +22 -0
  37. data/lib/arel/extensions/active_record_type_caster_connection.rb +7 -0
  38. data/lib/arel/extensions/active_record_type_caster_map.rb +7 -0
  39. data/lib/arel/extensions/array.rb +2 -9
  40. data/lib/arel/extensions/assignment.rb +22 -0
  41. data/lib/arel/extensions/at_time_zone.rb +37 -0
  42. data/lib/arel/extensions/attributes_attribute.rb +47 -0
  43. data/lib/arel/extensions/binary.rb +7 -0
  44. data/lib/arel/extensions/bind_param.rb +15 -0
  45. data/lib/arel/extensions/bit_string.rb +2 -9
  46. data/lib/arel/extensions/case.rb +17 -0
  47. data/lib/arel/extensions/coalesce.rb +17 -3
  48. data/lib/arel/extensions/conflict.rb +9 -0
  49. data/lib/arel/extensions/contained_within_equals.rb +10 -0
  50. data/lib/arel/extensions/contains.rb +27 -5
  51. data/lib/arel/extensions/contains_equals.rb +10 -0
  52. data/lib/arel/extensions/current_catalog.rb +4 -0
  53. data/lib/arel/extensions/current_date.rb +4 -0
  54. data/lib/arel/extensions/current_of_expression.rb +2 -9
  55. data/lib/arel/extensions/current_role.rb +4 -0
  56. data/lib/arel/extensions/current_row.rb +7 -0
  57. data/lib/arel/extensions/current_schema.rb +4 -0
  58. data/lib/arel/extensions/current_user.rb +4 -0
  59. data/lib/arel/extensions/dealocate.rb +31 -0
  60. data/lib/arel/extensions/default_values.rb +4 -0
  61. data/lib/arel/extensions/delete_manager.rb +25 -0
  62. data/lib/arel/extensions/delete_statement.rb +32 -8
  63. data/lib/arel/extensions/distinct_from.rb +3 -16
  64. data/lib/arel/extensions/dot.rb +11 -0
  65. data/lib/arel/extensions/equality.rb +2 -4
  66. data/lib/arel/extensions/exists.rb +59 -0
  67. data/lib/arel/extensions/extract_from.rb +25 -0
  68. data/lib/arel/extensions/factorial.rb +10 -2
  69. data/lib/arel/extensions/false.rb +7 -0
  70. data/lib/arel/extensions/function.rb +44 -14
  71. data/lib/arel/extensions/greatest.rb +17 -3
  72. data/lib/arel/extensions/indirection.rb +3 -12
  73. data/lib/arel/extensions/infer.rb +7 -7
  74. data/lib/arel/extensions/infix_operation.rb +17 -0
  75. data/lib/arel/extensions/insert_manager.rb +21 -0
  76. data/lib/arel/extensions/insert_statement.rb +35 -9
  77. data/lib/arel/extensions/into.rb +21 -0
  78. data/lib/arel/extensions/json_get_field.rb +10 -0
  79. data/lib/arel/extensions/json_get_object.rb +10 -0
  80. data/lib/arel/extensions/json_path_get_field.rb +10 -0
  81. data/lib/arel/extensions/json_path_get_object.rb +10 -0
  82. data/lib/arel/extensions/jsonb_all_key_exists.rb +10 -0
  83. data/lib/arel/extensions/jsonb_any_key_exists.rb +10 -0
  84. data/lib/arel/extensions/jsonb_key_exists.rb +10 -0
  85. data/lib/arel/extensions/least.rb +17 -3
  86. data/lib/arel/extensions/named_argument.rb +24 -0
  87. data/lib/arel/extensions/named_function.rb +7 -0
  88. data/lib/arel/extensions/node.rb +10 -0
  89. data/lib/arel/extensions/not_distinct_from.rb +3 -16
  90. data/lib/arel/extensions/not_equal.rb +2 -4
  91. data/lib/arel/extensions/ordering.rb +21 -6
  92. data/lib/arel/extensions/overlap.rb +1 -1
  93. data/lib/arel/extensions/overlaps.rb +49 -0
  94. data/lib/arel/extensions/overlay.rb +53 -0
  95. data/lib/arel/extensions/position.rb +27 -0
  96. data/lib/arel/extensions/prepare.rb +39 -0
  97. data/lib/arel/extensions/range_function.rb +10 -2
  98. data/lib/arel/extensions/row.rb +3 -8
  99. data/lib/arel/extensions/select_core.rb +73 -0
  100. data/lib/arel/extensions/select_manager.rb +25 -0
  101. data/lib/arel/extensions/select_statement.rb +31 -9
  102. data/lib/arel/extensions/session_user.rb +4 -0
  103. data/lib/arel/extensions/set_to_default.rb +4 -0
  104. data/lib/arel/extensions/substring.rb +46 -0
  105. data/lib/arel/extensions/table.rb +43 -10
  106. data/lib/arel/extensions/time_with_precision.rb +6 -0
  107. data/lib/arel/extensions/to_sql.rb +27 -0
  108. data/lib/arel/extensions/top.rb +8 -0
  109. data/lib/arel/extensions/transaction.rb +45 -0
  110. data/lib/arel/extensions/tree_manager.rb +15 -0
  111. data/lib/arel/extensions/trim.rb +44 -0
  112. data/lib/arel/extensions/true.rb +7 -0
  113. data/lib/arel/extensions/type_cast.rb +11 -0
  114. data/lib/arel/extensions/unary.rb +7 -0
  115. data/lib/arel/extensions/unary_operation.rb +16 -0
  116. data/lib/arel/extensions/unknown.rb +4 -0
  117. data/lib/arel/extensions/update_manager.rb +25 -0
  118. data/lib/arel/extensions/update_statement.rb +31 -6
  119. data/lib/arel/extensions/user.rb +4 -0
  120. data/lib/arel/extensions/values_list.rb +15 -0
  121. data/lib/arel/extensions/variable_set.rb +55 -0
  122. data/lib/arel/extensions/variable_show.rb +26 -0
  123. data/lib/arel/middleware.rb +27 -0
  124. data/lib/arel/middleware/active_record_extension.rb +13 -0
  125. data/lib/arel/middleware/cache_accessor.rb +35 -0
  126. data/lib/arel/middleware/chain.rb +172 -0
  127. data/lib/arel/middleware/database_executor.rb +77 -0
  128. data/lib/arel/middleware/no_op_cache.rb +9 -0
  129. data/lib/arel/middleware/postgresql_adapter.rb +62 -0
  130. data/lib/arel/middleware/railtie.rb +25 -0
  131. data/lib/arel/middleware/result.rb +170 -0
  132. data/lib/arel/middleware/to_sql_executor.rb +15 -0
  133. data/lib/arel/middleware/to_sql_middleware.rb +33 -0
  134. data/lib/arel/sql_to_arel.rb +8 -4
  135. data/lib/arel/sql_to_arel/error.rb +6 -0
  136. data/lib/arel/sql_to_arel/pg_query_visitor.rb +324 -76
  137. data/lib/arel/sql_to_arel/pg_query_visitor/frame_options.rb +112 -0
  138. data/lib/arel/sql_to_arel/result.rb +30 -0
  139. data/lib/arel/transformer.rb +8 -0
  140. data/lib/arel/transformer/prefix_schema_name.rb +183 -0
  141. data/lib/arel/transformer/remove_active_record_info.rb +40 -0
  142. data/lib/arel/transformer/replace_table_with_subquery.rb +31 -0
  143. data/lib/arel_toolkit.rb +16 -1
  144. data/lib/arel_toolkit/version.rb +1 -1
  145. metadata +278 -25
  146. data/.travis.yml +0 -21
  147. data/lib/arel/extensions/generate_series.rb +0 -9
  148. data/lib/arel/extensions/rank.rb +0 -9
  149. data/lib/arel/sql_to_arel/frame_options.rb +0 -110
  150. 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
@@ -0,0 +1,10 @@
1
+ module Arel
2
+ module Nodes
3
+ # https://www.postgresql.org/docs/9.4/functions-json.html#FUNCTIONS-JSON-OP-TABLE
4
+ class JsonGetField < Arel::Nodes::InfixOperation
5
+ def initialize(left, right)
6
+ super(:'->>', left, right)
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ module Arel
2
+ module Nodes
3
+ # https://www.postgresql.org/docs/9.4/functions-json.html#FUNCTIONS-JSON-OP-TABLE
4
+ class JsonGetObject < Arel::Nodes::InfixOperation
5
+ def initialize(left, right)
6
+ super(:'->', left, right)
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ module Arel
2
+ module Nodes
3
+ # https://www.postgresql.org/docs/9.4/functions-json.html#FUNCTIONS-JSON-OP-TABLE
4
+ class JsonPathGetField < Arel::Nodes::InfixOperation
5
+ def initialize(left, right)
6
+ super(:'#>>', left, right)
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ module Arel
2
+ module Nodes
3
+ # https://www.postgresql.org/docs/9.4/functions-json.html#FUNCTIONS-JSON-OP-TABLE
4
+ class JsonPathGetObject < Arel::Nodes::InfixOperation
5
+ def initialize(left, right)
6
+ super(:'#>', left, right)
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ module Arel
2
+ module Nodes
3
+ # https://www.postgresql.org/docs/9.4/functions-json.html#FUNCTIONS-JSONB-OP-TABLE
4
+ class JsonbAllKeyExists < Arel::Nodes::InfixOperation
5
+ def initialize(left, right)
6
+ super(:'?&', left, right)
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ module Arel
2
+ module Nodes
3
+ # https://www.postgresql.org/docs/9.4/functions-json.html#FUNCTIONS-JSONB-OP-TABLE
4
+ class JsonbAnyKeyExists < Arel::Nodes::InfixOperation
5
+ def initialize(left, right)
6
+ super(:'?|', left, right)
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ module Arel
2
+ module Nodes
3
+ # https://www.postgresql.org/docs/9.4/functions-json.html#FUNCTIONS-JSONB-OP-TABLE
4
+ class JsonbKeyExists < Arel::Nodes::InfixOperation
5
+ def initialize(left, right)
6
+ super(:'?', left, right)
7
+ end
8
+ end
9
+ end
10
+ end
@@ -1,9 +1,23 @@
1
+ # rubocop:disable Naming/MethodName
2
+ # rubocop:disable Naming/UncommunicativeMethodParamName
3
+
1
4
  module Arel
2
5
  module Nodes
3
- class Least < Arel::Nodes::NamedFunction
4
- def initialize(args)
5
- super 'LEAST', args
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
@@ -8,6 +8,13 @@ module Arel
8
8
  aggregate(o.name, o, collector)
9
9
  end
10
10
  end
11
+
12
+ class Dot
13
+ def visit_Arel_Nodes_NamedFunction(o)
14
+ visit_edge o, 'name'
15
+ function(o)
16
+ end
17
+ end
11
18
  end
12
19
  end
13
20
 
@@ -0,0 +1,10 @@
1
+ module Arel
2
+ module Nodes
3
+ class Node
4
+ def to_sql_and_binds(engine = Arel::Table.engine)
5
+ collector = engine.connection.send(:collector)
6
+ engine.connection.visitor.accept(self, collector).value
7
+ end
8
+ end
9
+ end
10
+ end
@@ -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::Binary
7
- end
8
- end
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
- case right
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
- when NilClass
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
- Arel::Nodes::Ordering.class_eval do
7
- # Postgres: https://www.postgresql.org/docs/9.4/queries-order.html
8
- attr_accessor :nulls
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
- def initialize(expr, nulls = 0)
11
- super(expr)
11
+ def initialize(expr, nulls = 0)
12
+ super(expr)
12
13
 
13
- @nulls = nulls
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
 
@@ -1,7 +1,7 @@
1
1
  module Arel
2
2
  module Nodes
3
3
  # https://www.postgresql.org/docs/9.1/functions-array.html
4
- class Overlap < InfixOperation
4
+ class Overlap < Arel::Nodes::InfixOperation
5
5
  def initialize(left, right)
6
6
  super(:'&&', left, right)
7
7
  end
@@ -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