arel_toolkit 0.3.0 → 0.4.0

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 (99) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +3 -0
  3. data/.gitignore +4 -1
  4. data/.rubocop.yml +13 -5
  5. data/.travis.yml +7 -2
  6. data/Appraisals +9 -0
  7. data/CHANGELOG.md +19 -0
  8. data/Gemfile +5 -0
  9. data/Gemfile.lock +22 -5
  10. data/README.md +59 -18
  11. data/arel_toolkit.gemspec +5 -1
  12. data/gemfiles/.bundle/config +2 -0
  13. data/gemfiles/arel_gems.gemfile +10 -0
  14. data/gemfiles/arel_gems.gemfile.lock +274 -0
  15. data/gemfiles/default.gemfile +5 -0
  16. data/gemfiles/default.gemfile.lock +198 -0
  17. data/lib/arel/enhance.rb +16 -0
  18. data/lib/arel/enhance/context_enhancer/arel_table.rb +75 -0
  19. data/lib/arel/enhance/node.rb +189 -0
  20. data/lib/arel/enhance/path.rb +38 -0
  21. data/lib/arel/enhance/path_node.rb +26 -0
  22. data/lib/arel/enhance/query.rb +36 -0
  23. data/lib/arel/enhance/visitor.rb +81 -0
  24. data/lib/arel/extensions.rb +24 -4
  25. data/lib/arel/extensions/active_record_type_caster_map.rb +7 -0
  26. data/lib/arel/extensions/array.rb +2 -9
  27. data/lib/arel/extensions/at_time_zone.rb +10 -3
  28. data/lib/arel/extensions/binary.rb +7 -0
  29. data/lib/arel/extensions/bit_string.rb +2 -9
  30. data/lib/arel/extensions/case.rb +17 -0
  31. data/lib/arel/extensions/conflict.rb +9 -0
  32. data/lib/arel/extensions/contains.rb +27 -5
  33. data/lib/arel/extensions/current_catalog.rb +4 -0
  34. data/lib/arel/extensions/current_date.rb +4 -0
  35. data/lib/arel/extensions/current_of_expression.rb +2 -9
  36. data/lib/arel/extensions/current_role.rb +4 -0
  37. data/lib/arel/extensions/current_row.rb +7 -0
  38. data/lib/arel/extensions/current_schema.rb +4 -0
  39. data/lib/arel/extensions/current_user.rb +4 -0
  40. data/lib/arel/extensions/dealocate.rb +31 -0
  41. data/lib/arel/extensions/default_values.rb +4 -0
  42. data/lib/arel/extensions/delete_manager.rb +22 -6
  43. data/lib/arel/extensions/delete_statement.rb +26 -9
  44. data/lib/arel/extensions/dot.rb +11 -0
  45. data/lib/arel/extensions/extract_from.rb +3 -10
  46. data/lib/arel/extensions/factorial.rb +10 -2
  47. data/lib/arel/extensions/false.rb +7 -0
  48. data/lib/arel/extensions/function.rb +42 -13
  49. data/lib/arel/extensions/indirection.rb +3 -12
  50. data/lib/arel/extensions/infer.rb +6 -6
  51. data/lib/arel/extensions/infix_operation.rb +17 -0
  52. data/lib/arel/extensions/insert_manager.rb +19 -3
  53. data/lib/arel/extensions/insert_statement.rb +30 -11
  54. data/lib/arel/extensions/into.rb +21 -0
  55. data/lib/arel/extensions/named_argument.rb +3 -8
  56. data/lib/arel/extensions/named_function.rb +7 -0
  57. data/lib/arel/extensions/ordering.rb +21 -6
  58. data/lib/arel/extensions/overlaps.rb +9 -0
  59. data/lib/arel/extensions/overlay.rb +9 -0
  60. data/lib/arel/extensions/position.rb +3 -8
  61. data/lib/arel/extensions/prepare.rb +39 -0
  62. data/lib/arel/extensions/row.rb +3 -8
  63. data/lib/arel/extensions/select_core.rb +58 -0
  64. data/lib/arel/extensions/select_manager.rb +22 -6
  65. data/lib/arel/extensions/select_statement.rb +31 -9
  66. data/lib/arel/extensions/session_user.rb +4 -0
  67. data/lib/arel/extensions/set_to_default.rb +4 -0
  68. data/lib/arel/extensions/substring.rb +8 -0
  69. data/lib/arel/extensions/table.rb +43 -10
  70. data/lib/arel/extensions/time_with_precision.rb +6 -0
  71. data/lib/arel/extensions/to_sql.rb +27 -0
  72. data/lib/arel/extensions/transaction.rb +3 -8
  73. data/lib/arel/extensions/tree_manager.rb +10 -0
  74. data/lib/arel/extensions/trim.rb +8 -0
  75. data/lib/arel/extensions/true.rb +7 -0
  76. data/lib/arel/extensions/type_cast.rb +7 -0
  77. data/lib/arel/extensions/unary.rb +7 -0
  78. data/lib/arel/extensions/unary_operation.rb +16 -0
  79. data/lib/arel/extensions/unknown.rb +4 -0
  80. data/lib/arel/extensions/update_manager.rb +22 -6
  81. data/lib/arel/extensions/update_statement.rb +27 -10
  82. data/lib/arel/extensions/user.rb +4 -0
  83. data/lib/arel/extensions/values_list.rb +15 -0
  84. data/lib/arel/extensions/variable_set.rb +9 -0
  85. data/lib/arel/extensions/variable_show.rb +3 -8
  86. data/lib/arel/middleware/chain.rb +1 -5
  87. data/lib/arel/middleware/railtie.rb +10 -0
  88. data/lib/arel/sql_to_arel.rb +6 -3
  89. data/lib/arel/sql_to_arel/pg_query_visitor.rb +43 -15
  90. data/lib/arel/sql_to_arel/pg_query_visitor/frame_options.rb +1 -1
  91. data/lib/arel/sql_to_arel/result.rb +0 -4
  92. data/lib/arel/transformer.rb +7 -0
  93. data/lib/arel/transformer/add_schema_to_table.rb +26 -0
  94. data/lib/arel/transformer/remove_active_record_info.rb +42 -0
  95. data/lib/arel_toolkit.rb +8 -1
  96. data/lib/arel_toolkit/version.rb +1 -1
  97. metadata +81 -8
  98. data/lib/arel/extensions/unbound_column_reference.rb +0 -5
  99. data/lib/arel/sql_formatter.rb +0 -59
@@ -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
@@ -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
 
@@ -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
 
@@ -33,6 +33,15 @@ module Arel
33
33
  collector << ')'
34
34
  end
35
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
36
45
  end
37
46
  end
38
47
 
@@ -36,6 +36,15 @@ module Arel
36
36
  collector << ')'
37
37
  end
38
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
39
48
  end
40
49
  end
41
50
 
@@ -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::Node
8
- attr_reader :substring
9
- attr_reader :string
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
@@ -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::Unary
8
- attr_reader :row_format
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,58 @@
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
+ end
10
+ end
11
+
12
+ module Visitors
13
+ class ToSql
14
+ def visit_Arel_Nodes_SelectCore(o, collector)
15
+ collector << 'SELECT'
16
+
17
+ collector = maybe_visit o.top, collector
18
+
19
+ collector = maybe_visit o.set_quantifier, collector
20
+
21
+ collect_nodes_for o.projections, collector, SPACE
22
+
23
+ maybe_visit o.into, collector
24
+
25
+ if o.source && !o.source.empty?
26
+ collector << ' FROM '
27
+ collector = visit o.source, collector
28
+ end
29
+
30
+ collect_nodes_for o.wheres, collector, WHERE, AND
31
+ collect_nodes_for o.groups, collector, GROUP_BY
32
+ unless o.havings.empty?
33
+ collector << ' HAVING '
34
+ inject_join o.havings, collector, AND
35
+ end
36
+ collect_nodes_for o.windows, collector, WINDOW
37
+
38
+ collector
39
+ end
40
+ end
41
+
42
+ class Dot
43
+ module SelectCoreExtension
44
+ def visit_Arel_Nodes_SelectCore(o)
45
+ super
46
+
47
+ visit_edge o, 'into'
48
+ end
49
+ end
50
+
51
+ prepend SelectCoreExtension
52
+ end
53
+ end
54
+ end
55
+
56
+ # rubocop:enable Metrics/AbcSize
57
+ # rubocop:enable Naming/MethodName
58
+ # rubocop:enable Naming/UncommunicativeMethodParamName
@@ -1,9 +1,25 @@
1
- Arel::SelectManager.class_eval do
2
- def ==(other)
3
- @ast == other.ast && @ctx == other.ctx
4
- end
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
- protected
12
+ attr_reader :ctx
13
+ end
7
14
 
8
- attr_reader :ctx
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
- Arel::Nodes::SelectStatement.class_eval do
7
- # For INSERT statements
8
- attr_accessor :values_lists
9
- attr_accessor :union
10
- attr_writer :cores
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
- alias old_visit_Nodes_SelectStatement visit_Arel_Nodes_SelectStatement
17
- def visit_Arel_Nodes_SelectStatement(o, collector)
18
- visit(o.union, collector) if o.union
19
- old_visit_Nodes_SelectStatement(o, collector)
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
@@ -13,6 +13,10 @@ module Arel
13
13
  collector << 'session_user'
14
14
  end
15
15
  end
16
+
17
+ class Dot
18
+ alias visit_Arel_Nodes_SessionUser terminal
19
+ end
16
20
  end
17
21
  end
18
22
 
@@ -14,6 +14,10 @@ module Arel
14
14
  collector << 'DEFAULT'
15
15
  end
16
16
  end
17
+
18
+ class Dot
19
+ alias visit_Arel_Nodes_SetToDefault terminal
20
+ end
17
21
  end
18
22
  end
19
23
 
@@ -31,6 +31,14 @@ module Arel
31
31
  collector << ')'
32
32
  end
33
33
  end
34
+
35
+ class Dot
36
+ def visit_Arel_Nodes_Substring(o)
37
+ visit_edge o, 'string'
38
+ visit_edge o, 'pattern'
39
+ visit_edge o, 'escape'
40
+ end
41
+ end
34
42
  end
35
43
  end
36
44
 
@@ -3,16 +3,15 @@
3
3
  # rubocop:disable Metrics/ParameterLists
4
4
 
5
5
  module Arel
6
- module Nodes
7
- Arel::Table.class_eval do
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/9.5/ddl-schemas.html
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
- old_initialize(name, as: as, type_caster: type_caster)
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
- alias old_visit_Arel_Table visit_Arel_Table
36
- def visit_Arel_Table(o, collector)
37
- collector << 'ONLY ' if o.only
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
- collector << "\"#{o.schema_name}\"." if o.schema_name
47
+ when 't'
48
+ collector << 'TEMPORARY '
40
49
 
41
- old_visit_Arel_Table(o, collector)
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