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.
Files changed (133) 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 -5
  7. data/Appraisals +13 -0
  8. data/CHANGELOG.md +94 -5
  9. data/Gemfile +5 -0
  10. data/Gemfile.lock +62 -33
  11. data/Guardfile +4 -0
  12. data/README.md +67 -23
  13. data/Rakefile +11 -1
  14. data/arel_toolkit.gemspec +15 -6
  15. data/benchmark.rb +54 -0
  16. data/ext/pg_result_init/extconf.rb +52 -0
  17. data/ext/pg_result_init/pg_result_init.c +138 -0
  18. data/ext/pg_result_init/pg_result_init.h +6 -0
  19. data/gemfiles/active_record_6.gemfile +7 -0
  20. data/gemfiles/active_record_6.gemfile.lock +210 -0
  21. data/gemfiles/arel_gems.gemfile +10 -0
  22. data/gemfiles/arel_gems.gemfile.lock +284 -0
  23. data/gemfiles/default.gemfile +5 -0
  24. data/gemfiles/default.gemfile.lock +208 -0
  25. data/lib/arel/enhance.rb +17 -0
  26. data/lib/arel/enhance/context_enhancer/arel_table.rb +92 -0
  27. data/lib/arel/enhance/node.rb +232 -0
  28. data/lib/arel/enhance/path.rb +38 -0
  29. data/lib/arel/enhance/path_node.rb +26 -0
  30. data/lib/arel/enhance/query.rb +38 -0
  31. data/lib/arel/enhance/query_methods.rb +23 -0
  32. data/lib/arel/enhance/visitor.rb +97 -0
  33. data/lib/arel/extensions.rb +32 -6
  34. data/lib/arel/extensions/active_model_attribute_with_cast_value.rb +22 -0
  35. data/lib/arel/extensions/active_record_relation_query_attribute.rb +22 -0
  36. data/lib/arel/extensions/active_record_type_caster_connection.rb +7 -0
  37. data/lib/arel/extensions/active_record_type_caster_map.rb +7 -0
  38. data/lib/arel/extensions/array.rb +2 -9
  39. data/lib/arel/extensions/at_time_zone.rb +10 -3
  40. data/lib/arel/extensions/attributes_attribute.rb +47 -0
  41. data/lib/arel/extensions/binary.rb +7 -0
  42. data/lib/arel/extensions/bind_param.rb +15 -0
  43. data/lib/arel/extensions/bit_string.rb +2 -9
  44. data/lib/arel/extensions/case.rb +17 -0
  45. data/lib/arel/extensions/coalesce.rb +17 -3
  46. data/lib/arel/extensions/conflict.rb +9 -0
  47. data/lib/arel/extensions/contains.rb +27 -5
  48. data/lib/arel/extensions/current_catalog.rb +4 -0
  49. data/lib/arel/extensions/current_date.rb +4 -0
  50. data/lib/arel/extensions/current_of_expression.rb +2 -9
  51. data/lib/arel/extensions/current_role.rb +4 -0
  52. data/lib/arel/extensions/current_row.rb +7 -0
  53. data/lib/arel/extensions/current_schema.rb +4 -0
  54. data/lib/arel/extensions/current_user.rb +4 -0
  55. data/lib/arel/extensions/dealocate.rb +31 -0
  56. data/lib/arel/extensions/default_values.rb +4 -0
  57. data/lib/arel/extensions/delete_manager.rb +22 -6
  58. data/lib/arel/extensions/delete_statement.rb +46 -24
  59. data/lib/arel/extensions/dot.rb +11 -0
  60. data/lib/arel/extensions/exists.rb +59 -0
  61. data/lib/arel/extensions/extract_from.rb +3 -10
  62. data/lib/arel/extensions/factorial.rb +10 -2
  63. data/lib/arel/extensions/false.rb +7 -0
  64. data/lib/arel/extensions/function.rb +44 -14
  65. data/lib/arel/extensions/greatest.rb +17 -3
  66. data/lib/arel/extensions/indirection.rb +3 -12
  67. data/lib/arel/extensions/infer.rb +7 -7
  68. data/lib/arel/extensions/infix_operation.rb +17 -0
  69. data/lib/arel/extensions/insert_manager.rb +19 -3
  70. data/lib/arel/extensions/insert_statement.rb +31 -12
  71. data/lib/arel/extensions/into.rb +21 -0
  72. data/lib/arel/extensions/least.rb +17 -3
  73. data/lib/arel/extensions/named_argument.rb +3 -8
  74. data/lib/arel/extensions/named_function.rb +7 -0
  75. data/lib/arel/extensions/node.rb +10 -0
  76. data/lib/arel/extensions/ordering.rb +21 -6
  77. data/lib/arel/extensions/overlaps.rb +9 -0
  78. data/lib/arel/extensions/overlay.rb +9 -0
  79. data/lib/arel/extensions/position.rb +3 -8
  80. data/lib/arel/extensions/prepare.rb +39 -0
  81. data/lib/arel/extensions/range_function.rb +10 -2
  82. data/lib/arel/extensions/row.rb +3 -8
  83. data/lib/arel/extensions/select_core.rb +73 -0
  84. data/lib/arel/extensions/select_manager.rb +22 -6
  85. data/lib/arel/extensions/select_statement.rb +31 -9
  86. data/lib/arel/extensions/session_user.rb +4 -0
  87. data/lib/arel/extensions/set_to_default.rb +4 -0
  88. data/lib/arel/extensions/substring.rb +8 -0
  89. data/lib/arel/extensions/table.rb +43 -10
  90. data/lib/arel/extensions/time_with_precision.rb +6 -0
  91. data/lib/arel/extensions/to_sql.rb +27 -0
  92. data/lib/arel/extensions/top.rb +8 -0
  93. data/lib/arel/extensions/transaction.rb +3 -8
  94. data/lib/arel/extensions/tree_manager.rb +15 -0
  95. data/lib/arel/extensions/trim.rb +8 -0
  96. data/lib/arel/extensions/true.rb +7 -0
  97. data/lib/arel/extensions/type_cast.rb +7 -0
  98. data/lib/arel/extensions/unary.rb +7 -0
  99. data/lib/arel/extensions/unary_operation.rb +16 -0
  100. data/lib/arel/extensions/unknown.rb +4 -0
  101. data/lib/arel/extensions/update_manager.rb +22 -6
  102. data/lib/arel/extensions/update_statement.rb +36 -33
  103. data/lib/arel/extensions/user.rb +4 -0
  104. data/lib/arel/extensions/values_list.rb +15 -0
  105. data/lib/arel/extensions/variable_set.rb +9 -0
  106. data/lib/arel/extensions/variable_show.rb +3 -8
  107. data/lib/arel/middleware.rb +5 -1
  108. data/lib/arel/middleware/active_record_extension.rb +13 -0
  109. data/lib/arel/middleware/cache_accessor.rb +35 -0
  110. data/lib/arel/middleware/chain.rb +108 -33
  111. data/lib/arel/middleware/database_executor.rb +77 -0
  112. data/lib/arel/middleware/no_op_cache.rb +9 -0
  113. data/lib/arel/middleware/postgresql_adapter.rb +41 -5
  114. data/lib/arel/middleware/railtie.rb +15 -1
  115. data/lib/arel/middleware/result.rb +170 -0
  116. data/lib/arel/middleware/to_sql_executor.rb +15 -0
  117. data/lib/arel/middleware/to_sql_middleware.rb +33 -0
  118. data/lib/arel/sql_to_arel.rb +6 -3
  119. data/lib/arel/sql_to_arel/pg_query_visitor.rb +67 -38
  120. data/lib/arel/sql_to_arel/pg_query_visitor/frame_options.rb +1 -1
  121. data/lib/arel/sql_to_arel/result.rb +17 -4
  122. data/lib/arel/transformer.rb +8 -0
  123. data/lib/arel/transformer/prefix_schema_name.rb +183 -0
  124. data/lib/arel/transformer/remove_active_record_info.rb +40 -0
  125. data/lib/arel/transformer/replace_table_with_subquery.rb +31 -0
  126. data/lib/arel_toolkit.rb +15 -2
  127. data/lib/arel_toolkit/version.rb +1 -1
  128. metadata +179 -42
  129. data/.travis.yml +0 -29
  130. data/lib/arel/extensions/generate_series.rb +0 -9
  131. data/lib/arel/extensions/rank.rb +0 -9
  132. data/lib/arel/extensions/unbound_column_reference.rb +0 -5
  133. data/lib/arel/sql_formatter.rb +0 -59
@@ -4,14 +4,7 @@
4
4
  module Arel
5
5
  module Nodes
6
6
  # https://www.postgresql.org/docs/9.1/functions-datetime.html#FUNCTIONS-DATETIME-EXTRACT
7
- class ExtractFrom < Arel::Nodes::Unary
8
- attr_reader :field
9
-
10
- def initialize(expr, field)
11
- super(expr)
12
-
13
- @field = field
14
- end
7
+ class ExtractFrom < Arel::Nodes::Binary
15
8
  end
16
9
  end
17
10
 
@@ -19,9 +12,9 @@ module Arel
19
12
  class ToSql
20
13
  def visit_Arel_Nodes_ExtractFrom(o, collector)
21
14
  collector << 'extract('
22
- visit o.field, collector
15
+ visit o.right, collector
23
16
  collector << ' from '
24
- visit o.expr, collector
17
+ visit o.left, collector
25
18
  collector << ')'
26
19
  end
27
20
  end
@@ -4,11 +4,12 @@
4
4
  module Arel
5
5
  module Nodes
6
6
  # https://www.postgresql.org/docs/9.4/functions-math.html
7
- class Factorial < Arel::Nodes::Unary
7
+ class Factorial < Arel::Nodes::Node
8
8
  attr_accessor :prefix
9
+ attr_accessor :expr
9
10
 
10
11
  def initialize(expr, prefix)
11
- super(expr)
12
+ @expr = expr
12
13
  @prefix = prefix
13
14
  end
14
15
  end
@@ -26,6 +27,13 @@ module Arel
26
27
  end
27
28
  end
28
29
  end
30
+
31
+ class Dot
32
+ def visit_Arel_Nodes_Factorial(o)
33
+ visit_edge o, 'expr'
34
+ visit_edge o, 'prefix'
35
+ end
36
+ end
29
37
  end
30
38
  end
31
39
 
@@ -0,0 +1,7 @@
1
+ module Arel
2
+ module Visitors
3
+ class Dot
4
+ alias visit_Arel_Nodes_False terminal
5
+ end
6
+ end
7
+ end
@@ -3,20 +3,27 @@
3
3
  module Arel
4
4
  module Nodes
5
5
  # Postgres: https://www.postgresql.org/docs/9.1/functions-comparison.html
6
- Arel::Nodes::Function.class_eval do
7
- # postgres only: https://www.postgresql.org/docs/9.5/functions-aggregate.html
8
- attr_accessor :orders
9
- attr_accessor :filter
10
- attr_accessor :within_group
11
- attr_accessor :variardic
12
-
13
- def initialize(expr, aliaz = nil)
14
- super()
15
- @expressions = expr
16
- @alias = aliaz && SqlLiteral.new(aliaz)
17
- @distinct = false
18
- @orders = []
6
+ class Function
7
+ module FunctionExtension
8
+ # postgres only: https://www.postgresql.org/docs/9.5/functions-aggregate.html
9
+ attr_accessor :orders
10
+ attr_accessor :filter
11
+ attr_accessor :within_group
12
+ attr_accessor :variardic
13
+ # postgres only: https://www.postgresql.org/docs/10/ddl-schemas.html
14
+ attr_accessor :schema_name
15
+
16
+ def initialize(expr, aliaz = nil)
17
+ super
18
+
19
+ @expressions = expr
20
+ @alias = aliaz && SqlLiteral.new(aliaz)
21
+ @distinct = false
22
+ @orders = []
23
+ end
19
24
  end
25
+
26
+ prepend FunctionExtension
20
27
  end
21
28
  end
22
29
 
@@ -26,6 +33,7 @@ module Arel
26
33
  # rubocop:disable Metrics/CyclomaticComplexity
27
34
  # rubocop:disable Metrics/AbcSize
28
35
  def aggregate(name, o, collector)
36
+ collector << "#{o.schema_name}." if o.schema_name
29
37
  collector << "#{name}("
30
38
  collector << 'DISTINCT ' if o.distinct
31
39
  collector << 'VARIADIC ' if o.variardic
@@ -38,7 +46,7 @@ module Arel
38
46
  end
39
47
 
40
48
  if o.orders.any?
41
- collector << SPACE unless o.within_group
49
+ collector << ' ' unless o.within_group
42
50
  collector << 'ORDER BY '
43
51
  collector = inject_join o.orders, collector, ', '
44
52
  end
@@ -62,6 +70,28 @@ module Arel
62
70
  # rubocop:enable Metrics/CyclomaticComplexity
63
71
  # rubocop:enable Metrics/AbcSize
64
72
  end
73
+
74
+ class Dot
75
+ module FunctionExtension
76
+ def function(o)
77
+ super
78
+
79
+ visit_edge o, 'orders'
80
+ visit_edge o, 'filter'
81
+ visit_edge o, 'within_group'
82
+ visit_edge o, 'variardic'
83
+ visit_edge o, 'schema_name'
84
+ end
85
+
86
+ alias visit_Arel_Nodes_Min function
87
+ alias visit_Arel_Nodes_Max function
88
+ alias visit_Arel_Nodes_Avg function
89
+ alias visit_Arel_Nodes_Sum function
90
+ alias visit_Arel_Nodes_Count function
91
+ end
92
+
93
+ prepend FunctionExtension
94
+ end
65
95
  end
66
96
  end
67
97
 
@@ -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 Greatest < Arel::Nodes::NamedFunction
4
- def initialize(args)
5
- super 'GREATEST', args
6
+ # https://www.postgresql.org/docs/10/functions-conditional.html
7
+ class Greatest < Arel::Nodes::Unary
8
+ end
9
+ end
10
+
11
+ module Visitors
12
+ class ToSql
13
+ def visit_Arel_Nodes_Greatest(o, collector)
14
+ collector << 'GREATEST('
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
@@ -3,25 +3,16 @@
3
3
 
4
4
  module Arel
5
5
  module Nodes
6
- class Indirection < Arel::Nodes::Node
7
- attr_reader :arg
8
- attr_reader :indirection
9
-
10
- def initialize(arg, indirection)
11
- super()
12
-
13
- @arg = arg
14
- @indirection = indirection
15
- end
6
+ class Indirection < Arel::Nodes::Binary
16
7
  end
17
8
  end
18
9
 
19
10
  module Visitors
20
11
  class ToSql
21
12
  def visit_Arel_Nodes_Indirection(o, collector)
22
- visit(o.arg, collector)
13
+ visit(o.left, collector)
23
14
  collector << '['
24
- visit(o.indirection, collector)
15
+ visit(o.right, collector)
25
16
  collector << ']'
26
17
  end
27
18
  end
@@ -4,9 +4,9 @@
4
4
  module Arel
5
5
  module Nodes
6
6
  # https://www.postgresql.org/docs/9.5/sql-insert.html
7
- class Infer < Arel::Nodes::Node
8
- attr_accessor :name
9
- attr_accessor :indexes
7
+ class Infer < Arel::Nodes::Binary
8
+ alias name left
9
+ alias indexes right
10
10
  end
11
11
  end
12
12
 
@@ -15,13 +15,13 @@ module Arel
15
15
  def visit_Arel_Nodes_Infer(o, collector)
16
16
  if o.name
17
17
  collector << 'ON CONSTRAINT '
18
- collector << o.name
19
- collector << SPACE
18
+ collector << o.left
19
+ collector << ' '
20
20
  end
21
21
 
22
- if o.indexes
22
+ if o.right
23
23
  collector << '('
24
- inject_join o.indexes, collector, ', '
24
+ inject_join o.right, collector, ', '
25
25
  collector << ') '
26
26
  end
27
27
 
@@ -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_InfixOperation(o)
8
+ visit_edge o, 'operator'
9
+ visit_edge o, 'left'
10
+ visit_edge o, 'right'
11
+ end
12
+ end
13
+ end
14
+ end
15
+
16
+ # rubocop:enable Naming/MethodName
17
+ # rubocop:enable Naming/UncommunicativeMethodParamName
@@ -1,5 +1,21 @@
1
- Arel::InsertManager.class_eval do
2
- def ==(other)
3
- @ast == other.ast
1
+ # rubocop:disable Naming/MethodName
2
+ # rubocop:disable Naming/UncommunicativeMethodParamName
3
+
4
+ module Arel
5
+ class InsertManager < Arel::TreeManager
6
+ def ==(other)
7
+ other.is_a?(self.class) && @ast == other.ast
8
+ end
9
+ end
10
+
11
+ module Visitors
12
+ class Dot
13
+ def visit_Arel_InsertManager(o)
14
+ visit_edge o, 'ast'
15
+ end
16
+ end
4
17
  end
5
18
  end
19
+
20
+ # rubocop:enable Naming/MethodName
21
+ # rubocop:enable Naming/UncommunicativeMethodParamName
@@ -3,19 +3,22 @@
3
3
 
4
4
  module Arel
5
5
  module Nodes
6
- # https://www.postgresql.org/docs/9.5/sql-insert.html
7
- Arel::Nodes::InsertStatement.class_eval do
8
- attr_accessor :with
9
- attr_accessor :conflict
10
- attr_accessor :override
11
- attr_accessor :returning
6
+ class InsertStatement
7
+ # https://www.postgresql.org/docs/9.5/sql-insert.html
8
+ module InsertStatementExtension
9
+ attr_accessor :with
10
+ attr_accessor :conflict
11
+ attr_accessor :override
12
+ attr_accessor :returning
12
13
 
13
- alias_method :old_initialize, :initialize
14
- def initialize
15
- old_initialize
14
+ def initialize
15
+ super
16
16
 
17
- @returning = []
17
+ @returning = []
18
+ end
18
19
  end
20
+
21
+ prepend(InsertStatementExtension)
19
22
  end
20
23
  end
21
24
 
@@ -27,7 +30,7 @@ module Arel
27
30
  def visit_Arel_Nodes_InsertStatement(o, collector)
28
31
  if o.with
29
32
  collector = visit o.with, collector
30
- collector << SPACE
33
+ collector << ' '
31
34
  end
32
35
 
33
36
  collector << 'INSERT INTO '
@@ -57,18 +60,34 @@ module Arel
57
60
  collector
58
61
  end
59
62
 
63
+ visit(o.conflict, collector) if o.conflict
64
+
60
65
  unless o.returning.empty?
61
66
  collector << ' RETURNING '
62
67
  collector = inject_join o.returning, collector, ', '
63
68
  end
64
69
 
65
- visit(o.conflict, collector) if o.conflict
66
70
  collector
67
71
  end
68
72
  # rubocop:enable Metrics/CyclomaticComplexity
69
73
  # rubocop:enable Metrics/AbcSize
70
74
  # rubocop:enable Metrics/PerceivedComplexity
71
75
  end
76
+
77
+ class Dot
78
+ module InsertStatementExtension
79
+ def visit_Arel_Nodes_InsertStatement(o)
80
+ super
81
+
82
+ visit_edge o, 'with'
83
+ visit_edge o, 'conflict'
84
+ visit_edge o, 'override'
85
+ visit_edge o, 'returning'
86
+ end
87
+ end
88
+
89
+ prepend(InsertStatementExtension)
90
+ end
72
91
  end
73
92
  end
74
93
 
@@ -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
- 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
@@ -3,14 +3,9 @@
3
3
 
4
4
  module Arel
5
5
  module Nodes
6
- class NamedArgument < Arel::Nodes::Node
7
- attr_reader :name
8
- attr_reader :value
9
-
10
- def initialize(name, value)
11
- @name = name
12
- @value = value
13
- end
6
+ class NamedArgument < Arel::Nodes::Binary
7
+ alias name left
8
+ alias value right
14
9
  end
15
10
  end
16
11
 
@@ -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