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,112 @@
1
+ module Arel
2
+ module SqlToArel
3
+ class PgQueryVisitor
4
+ class FrameOptions
5
+ class << self
6
+ def arel(frame_options, start_offset, end_offset)
7
+ frame_option_names = calculate_frame_option_names(frame_options)
8
+ return unless frame_option_names.include?('FRAMEOPTION_NONDEFAULT')
9
+
10
+ range_klass = if frame_option_names.include?('FRAMEOPTION_RANGE')
11
+ Arel::Nodes::Range
12
+ else
13
+ Arel::Nodes::Rows
14
+ end
15
+
16
+ start_node = calculate_frame_node(
17
+ 'FRAMEOPTION_START_',
18
+ frame_option_names,
19
+ start_offset,
20
+ )
21
+ end_node = calculate_frame_node(
22
+ 'FRAMEOPTION_END_',
23
+ frame_option_names,
24
+ end_offset,
25
+ )
26
+
27
+ if frame_option_names.include?('FRAMEOPTION_BETWEEN')
28
+ Arel::Nodes::Between.new(
29
+ range_klass.new,
30
+ Arel::Nodes::And.new([start_node, end_node]),
31
+ )
32
+ else
33
+ range_klass.new start_node
34
+ end
35
+ end
36
+
37
+ private
38
+
39
+ # always NONDEFAULT
40
+ # RANGE or ROWS
41
+ # mandatory BETWEEN
42
+ # RANGE only unbounded
43
+ # ROWS all
44
+ # https://github.com/postgres/postgres/blob/REL_10_1/src/include/nodes/parsenodes.h
45
+ FRAMEOPTIONS = {
46
+ 'FRAMEOPTION_NONDEFAULT' => 0x00001,
47
+ 'FRAMEOPTION_RANGE' => 0x00002,
48
+ 'FRAMEOPTION_ROWS' => 0x00004,
49
+ 'FRAMEOPTION_BETWEEN' => 0x00008,
50
+ 'FRAMEOPTION_START_UNBOUNDED_PRECEDING' => 0x00010,
51
+ 'FRAMEOPTION_END_UNBOUNDED_PRECEDING' => 0x00020,
52
+ 'FRAMEOPTION_START_UNBOUNDED_FOLLOWING' => 0x00040,
53
+ 'FRAMEOPTION_END_UNBOUNDED_FOLLOWING' => 0x00080,
54
+ 'FRAMEOPTION_START_CURRENT_ROW' => 0x00100,
55
+ 'FRAMEOPTION_END_CURRENT_ROW' => 0x00200,
56
+ 'FRAMEOPTION_START_VALUE_PRECEDING' => 0x00400,
57
+ 'FRAMEOPTION_END_VALUE_PRECEDING' => 0x00800,
58
+ 'FRAMEOPTION_START_VALUE_FOLLOWING' => 0x01000,
59
+ 'FRAMEOPTION_END_VALUE_FOLLOWING' => 0x02000,
60
+ }.freeze
61
+
62
+ def biggest_detractable_number(number, candidates)
63
+ high_to_low_candidates = candidates.sort { |a, b| b <=> a }
64
+ high_to_low_candidates.find do |candidate|
65
+ number - candidate >= 0
66
+ end
67
+ end
68
+
69
+ def calculate_frame_option_names(frame_options, names = [])
70
+ return names if frame_options.zero?
71
+
72
+ number = biggest_detractable_number(frame_options, FRAMEOPTIONS.values)
73
+ name = FRAMEOPTIONS.key(number)
74
+ calculate_frame_option_names(
75
+ frame_options - number, names + [name]
76
+ )
77
+ end
78
+
79
+ def calculate_frame_node(pattern, frame_option_names, offset)
80
+ node_name = frame_option_names.select { |n| n.start_with?(pattern) }
81
+ raise "Don't know how to handle multiple nodes" if node_name.length > 1
82
+
83
+ node_name = node_name.first.gsub(/FRAMEOPTION_(START|END)_/, '')
84
+ name_to_node(node_name, offset)
85
+ end
86
+
87
+ def name_to_node(node_name, offset)
88
+ case node_name
89
+ when 'UNBOUNDED_PRECEDING'
90
+ Arel::Nodes::Preceding.new
91
+
92
+ when 'UNBOUNDED_FOLLOWING'
93
+ Arel::Nodes::Following.new
94
+
95
+ when 'CURRENT_ROW'
96
+ Arel::Nodes::CurrentRow.new
97
+
98
+ when 'VALUE_PRECEDING'
99
+ Arel::Nodes::Preceding.new offset
100
+
101
+ when 'VALUE_FOLLOWING'
102
+ Arel::Nodes::Following.new offset
103
+
104
+ else
105
+ raise "Unknown start / end frame node `#{node_name}`"
106
+ end
107
+ end
108
+ end
109
+ end
110
+ end
111
+ end
112
+ end
@@ -0,0 +1,30 @@
1
+ module Arel
2
+ module SqlToArel
3
+ class Result < Array
4
+ def to_sql(engine = Arel::Table.engine)
5
+ sql, _binds = to_sql_and_binds(engine)
6
+ sql
7
+ end
8
+
9
+ def to_sql_and_binds(engine = Arel::Table.engine)
10
+ sql_collection = []
11
+ binds_collection = []
12
+
13
+ each do |item|
14
+ sql, binds = item.to_sql_and_binds(engine)
15
+ sql_collection << sql
16
+ binds_collection.concat(binds)
17
+ end
18
+
19
+ [
20
+ sql_collection.join('; '),
21
+ binds_collection,
22
+ ]
23
+ end
24
+
25
+ def map(&block)
26
+ Result.new super
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,8 @@
1
+ require_relative './transformer/prefix_schema_name'
2
+ require_relative './transformer/replace_table_with_subquery'
3
+ require_relative './transformer/remove_active_record_info'
4
+
5
+ module Arel
6
+ module Transformer
7
+ end
8
+ end
@@ -0,0 +1,183 @@
1
+ module Arel
2
+ module Transformer
3
+ class PrefixSchemaName
4
+ PG_CATALOG = 'pg_catalog'.freeze
5
+ DEFAULT_SCHEMA_PRIORITY = ['public', PG_CATALOG].freeze
6
+
7
+ attr_reader :object_mapping
8
+ attr_reader :schema_priority
9
+
10
+ def initialize(
11
+ schema_priority = DEFAULT_SCHEMA_PRIORITY,
12
+ override_object_mapping = {}
13
+ )
14
+ @schema_priority = schema_priority
15
+ @object_mapping = database_object_mapping.merge(override_object_mapping)
16
+ end
17
+
18
+ def call(arel, next_middleware)
19
+ tree = Arel.enhance(arel)
20
+ update_arel_tables(tree)
21
+ update_typecasts(tree)
22
+ update_functions(tree)
23
+
24
+ next_middleware.call tree
25
+ end
26
+
27
+ private
28
+
29
+ def update_arel_tables(tree)
30
+ tree.query(
31
+ class: Arel::Table,
32
+ schema_name: nil,
33
+ context: { range_variable: true },
34
+ ).each do |node|
35
+ schema_name = schema_name_from_object_name(node['name'].object.to_s)
36
+ node['schema_name'].replace(schema_name)
37
+ end
38
+ end
39
+
40
+ def update_typecasts(tree)
41
+ tree.query(
42
+ class: Arel::Nodes::TypeCast,
43
+ type_name: 'regclass',
44
+ ).each do |node|
45
+ update_typecast_node(node)
46
+ end
47
+ end
48
+
49
+ def update_typecast_node(node)
50
+ table_name = table_name_from_arel_node(node['arg'].object)
51
+ reference_parts = table_name.split('.')
52
+
53
+ case reference_parts.length
54
+ when 1
55
+ schema_name = schema_name_from_object_name(table_name)
56
+ reference_parts.unshift(schema_name)
57
+ node['arg']['expr'].replace(reference_parts.join('.'))
58
+ when 2
59
+ node # Do nothing
60
+ else
61
+ raise "Don't know how to handle `#{reference_parts.length}` parts in " \
62
+ "`#{reference_parts}` for sql `#{node.to_sql}`"
63
+ end
64
+ end
65
+
66
+ def update_functions(tree)
67
+ tree.query(
68
+ class: Arel::Enhance::QueryMethods.in_ancestors?(Arel::Nodes::Function),
69
+ schema_name: nil,
70
+ ).each do |node|
71
+ update_function_node(node)
72
+ end
73
+ end
74
+
75
+ def update_function_node(node)
76
+ object_name = if node.object.is_a?(Arel::Nodes::NamedFunction)
77
+ node['name'].object.downcase
78
+ else
79
+ node.object.class.to_s.demodulize.underscore
80
+ end
81
+
82
+ schema_name = schema_name_from_object_name(object_name)
83
+ node['schema_name'].replace(schema_name)
84
+ end
85
+
86
+ def table_name_from_arel_node(arel_node)
87
+ case arel_node
88
+ when Arel::Nodes::Quoted
89
+ arel_node.expr
90
+ else
91
+ raise "Unknown node `#{table_name}` for `#{node.inspect}`"
92
+ end
93
+ end
94
+
95
+ def schema_name_from_object_name(table_name)
96
+ table_name = unquote_string(table_name)
97
+ possible_schemas = object_mapping[table_name]
98
+
99
+ if possible_schemas.nil?
100
+ raise "Object `#{table_name}` does not exist in the object_mapping and cannot be prefixed"
101
+ end
102
+
103
+ schema_name = schema_priority.find do |possible_schema_name|
104
+ possible_schemas.include?(possible_schema_name)
105
+ end
106
+
107
+ if schema_name.nil?
108
+ raise "Could not find a schema name for table `#{table_name}`.\n" \
109
+ "Current schema priority is `#{schema_priority}`.\n" \
110
+ "Possible schemas are `#{possible_schemas}`."
111
+ end
112
+
113
+ # We don't need to prefix nodes with `pg_catalog`, because that's the default
114
+ # even if the search_path does not include `pg_catalog`.
115
+ return nil if schema_name == PG_CATALOG
116
+
117
+ schema_name
118
+ end
119
+
120
+ # https://www.rubydoc.info/github/rubyworks/facets/String:unquote
121
+ def unquote_string(string)
122
+ case string[0, 1]
123
+ when "'", '"', '`'
124
+ string[0] = ''
125
+ end
126
+
127
+ case string[-1, 1]
128
+ when "'", '"', '`'
129
+ string[-1] = ''
130
+ end
131
+
132
+ string
133
+ end
134
+
135
+ def database_object_mapping
136
+ mapping = {}
137
+ update_mapping mapping, database_tables
138
+ update_mapping mapping, database_views
139
+ update_mapping mapping, database_materialized_views
140
+ update_mapping mapping, database_functions
141
+
142
+ mapping
143
+ end
144
+
145
+ def update_mapping(mapping, objects)
146
+ objects.each do |object|
147
+ name = object.fetch('object_name').to_s.downcase
148
+ mapping[name] ||= []
149
+ mapping[name] << object.fetch('schema_name').to_s
150
+ end
151
+ end
152
+
153
+ def database_tables
154
+ connection.execute(
155
+ 'SELECT tablename AS object_name, schemaname AS schema_name FROM pg_tables',
156
+ )
157
+ end
158
+
159
+ def database_views
160
+ connection.execute(
161
+ 'SELECT viewname AS object_name, schemaname AS schema_name FROM pg_views',
162
+ )
163
+ end
164
+
165
+ def database_materialized_views
166
+ connection.execute(
167
+ 'SELECT matviewname AS object_name, schemaname AS schema_name FROM pg_matviews',
168
+ )
169
+ end
170
+
171
+ def database_functions
172
+ connection.execute(
173
+ 'SELECT pg_proc.proname AS object_name, pg_namespace.nspname AS schema_name ' \
174
+ 'FROM pg_proc INNER JOIN pg_namespace ON pg_proc.pronamespace = pg_namespace.oid',
175
+ )
176
+ end
177
+
178
+ def connection
179
+ Arel::Table.engine.connection
180
+ end
181
+ end
182
+ end
183
+ end
@@ -0,0 +1,40 @@
1
+ module Arel
2
+ module Transformer
3
+ class RemoveActiveRecordInfo
4
+ class << self
5
+ def call(arel, next_middleware)
6
+ tree = Arel.enhance(arel)
7
+
8
+ tree.query(class: Arel::Table).each do |node|
9
+ node['type_caster'].remove
10
+ end
11
+
12
+ tree.query(class: Arel::Nodes::BindParam).each do |node|
13
+ node.replace(
14
+ cast_for_database(node.object.value.value_for_database),
15
+ )
16
+ end
17
+
18
+ next_middleware.call tree.object
19
+ end
20
+
21
+ private
22
+
23
+ def cast_for_database(value)
24
+ case value
25
+ when String
26
+ Arel::Nodes.build_quoted(value)
27
+ when Integer
28
+ value
29
+ when TrueClass
30
+ Arel::Nodes::TypeCast.new(Arel::Nodes::Quoted.new('t'), 'bool')
31
+ when FalseClass
32
+ Arel::Nodes::TypeCast.new(Arel::Nodes::Quoted.new('f'), 'bool')
33
+ else
34
+ raise "Unknown value cast `#{value}` with class `#{value.class}`"
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,31 @@
1
+ module Arel
2
+ module Transformer
3
+ class ReplaceTableWithSubquery
4
+ attr_reader :subquery_for_table
5
+
6
+ def initialize(subquery_for_table)
7
+ @subquery_for_table = subquery_for_table
8
+ end
9
+
10
+ def call(arel, next_middleware)
11
+ tree = Arel.enhance(arel)
12
+ update_arel_tables(tree)
13
+ next_middleware.call tree
14
+ end
15
+
16
+ private
17
+
18
+ def update_arel_tables(tree)
19
+ tree.query(
20
+ class: Arel::Table,
21
+ context: { range_variable: true },
22
+ schema_name: nil,
23
+ ).each do |node|
24
+ if (subquery = subquery_for_table.call(node.name.value))
25
+ node.replace subquery.as(node.name.value)
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -1,7 +1,22 @@
1
- require 'arel_toolkit/version'
1
+ # Make sure the gems are loaded before ArelToolkit
2
+ require 'postgres_ext' if Gem.loaded_specs.key?('postgres_ext')
3
+ require 'active_record_upsert' if Gem.loaded_specs.key?('active_record_upsert')
4
+ require 'pg_search' if Gem.loaded_specs.key?('pg_search')
5
+ require 'rails/railtie' if Gem.loaded_specs.key?('railties')
2
6
  require 'arel'
7
+ require 'active_record'
8
+ require 'active_record/connection_adapters/postgresql_adapter'
9
+
10
+ require 'arel_toolkit/version'
11
+
12
+ require 'pg'
13
+ require 'arel_toolkit/pg_result_init'
14
+
3
15
  require 'arel/extensions'
4
16
  require 'arel/sql_to_arel'
17
+ require 'arel/middleware'
18
+ require 'arel/enhance'
19
+ require 'arel/transformer'
5
20
 
6
21
  module ArelToolkit
7
22
  end
@@ -1,3 +1,3 @@
1
1
  module ArelToolkit
2
- VERSION = '0.2.0'.freeze
2
+ VERSION = '0.4.3'.freeze
3
3
  end
metadata CHANGED
@@ -1,43 +1,57 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: arel_toolkit
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.4.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - maarten
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-05-30 00:00:00.000000000 Z
11
+ date: 2020-11-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: arel
14
+ name: activerecord
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: pg
15
29
  requirement: !ruby/object:Gem::Requirement
16
30
  requirements:
17
31
  - - "~>"
18
32
  - !ruby/object:Gem::Version
19
- version: 9.0.0
33
+ version: 1.1.4
20
34
  type: :runtime
21
35
  prerelease: false
22
36
  version_requirements: !ruby/object:Gem::Requirement
23
37
  requirements:
24
38
  - - "~>"
25
39
  - !ruby/object:Gem::Version
26
- version: 9.0.0
40
+ version: 1.1.4
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: pg_query
29
43
  requirement: !ruby/object:Gem::Requirement
30
44
  requirements:
31
45
  - - "~>"
32
46
  - !ruby/object:Gem::Version
33
- version: 1.1.0
47
+ version: 1.2.0
34
48
  type: :runtime
35
49
  prerelease: false
36
50
  version_requirements: !ruby/object:Gem::Requirement
37
51
  requirements:
38
52
  - - "~>"
39
53
  - !ruby/object:Gem::Version
40
- version: 1.1.0
54
+ version: 1.2.0
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: bundler
43
57
  requirement: !ruby/object:Gem::Requirement
@@ -52,20 +66,62 @@ dependencies:
52
66
  - - "~>"
53
67
  - !ruby/object:Gem::Version
54
68
  version: '2.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: dpl
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 1.10.11
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 1.10.11
83
+ - !ruby/object:Gem::Dependency
84
+ name: github_changelog_generator
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '1.15'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '1.15'
55
97
  - !ruby/object:Gem::Dependency
56
98
  name: rake
57
99
  requirement: !ruby/object:Gem::Requirement
58
100
  requirements:
59
101
  - - "~>"
60
102
  - !ruby/object:Gem::Version
61
- version: '10.0'
103
+ version: '13.0'
62
104
  type: :development
63
105
  prerelease: false
64
106
  version_requirements: !ruby/object:Gem::Requirement
65
107
  requirements:
66
108
  - - "~>"
67
109
  - !ruby/object:Gem::Version
68
- version: '10.0'
110
+ version: '13.0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rake-compiler
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '1.0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '1.0'
69
125
  - !ruby/object:Gem::Dependency
70
126
  name: rspec
71
127
  requirement: !ruby/object:Gem::Requirement
@@ -80,6 +136,48 @@ dependencies:
80
136
  - - "~>"
81
137
  - !ruby/object:Gem::Version
82
138
  version: '3.8'
139
+ - !ruby/object:Gem::Dependency
140
+ name: approvals
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: 0.0.24
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: 0.0.24
153
+ - !ruby/object:Gem::Dependency
154
+ name: appraisal
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - "~>"
158
+ - !ruby/object:Gem::Version
159
+ version: 2.2.0
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - "~>"
165
+ - !ruby/object:Gem::Version
166
+ version: 2.2.0
167
+ - !ruby/object:Gem::Dependency
168
+ name: database_cleaner
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - "~>"
172
+ - !ruby/object:Gem::Version
173
+ version: 1.7.0
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - "~>"
179
+ - !ruby/object:Gem::Version
180
+ version: 1.7.0
83
181
  - !ruby/object:Gem::Dependency
84
182
  name: simplecov
85
183
  requirement: !ruby/object:Gem::Requirement
@@ -112,16 +210,16 @@ dependencies:
112
210
  name: rubocop
113
211
  requirement: !ruby/object:Gem::Requirement
114
212
  requirements:
115
- - - "~>"
213
+ - - '='
116
214
  - !ruby/object:Gem::Version
117
- version: '0.69'
215
+ version: 0.71.0
118
216
  type: :development
119
217
  prerelease: false
120
218
  version_requirements: !ruby/object:Gem::Requirement
121
219
  requirements:
122
- - - "~>"
220
+ - - '='
123
221
  - !ruby/object:Gem::Version
124
- version: '0.69'
222
+ version: 0.71.0
125
223
  - !ruby/object:Gem::Dependency
126
224
  name: guard
127
225
  requirement: !ruby/object:Gem::Requirement
@@ -150,6 +248,62 @@ dependencies:
150
248
  - - "~>"
151
249
  - !ruby/object:Gem::Version
152
250
  version: '4.7'
251
+ - !ruby/object:Gem::Dependency
252
+ name: guard-rubocop
253
+ requirement: !ruby/object:Gem::Requirement
254
+ requirements:
255
+ - - "~>"
256
+ - !ruby/object:Gem::Version
257
+ version: 1.3.0
258
+ type: :development
259
+ prerelease: false
260
+ version_requirements: !ruby/object:Gem::Requirement
261
+ requirements:
262
+ - - "~>"
263
+ - !ruby/object:Gem::Version
264
+ version: 1.3.0
265
+ - !ruby/object:Gem::Dependency
266
+ name: guard-rake
267
+ requirement: !ruby/object:Gem::Requirement
268
+ requirements:
269
+ - - "~>"
270
+ - !ruby/object:Gem::Version
271
+ version: 1.0.0
272
+ type: :development
273
+ prerelease: false
274
+ version_requirements: !ruby/object:Gem::Requirement
275
+ requirements:
276
+ - - "~>"
277
+ - !ruby/object:Gem::Version
278
+ version: 1.0.0
279
+ - !ruby/object:Gem::Dependency
280
+ name: stackprof
281
+ requirement: !ruby/object:Gem::Requirement
282
+ requirements:
283
+ - - "~>"
284
+ - !ruby/object:Gem::Version
285
+ version: '0.2'
286
+ type: :development
287
+ prerelease: false
288
+ version_requirements: !ruby/object:Gem::Requirement
289
+ requirements:
290
+ - - "~>"
291
+ - !ruby/object:Gem::Version
292
+ version: '0.2'
293
+ - !ruby/object:Gem::Dependency
294
+ name: memory_profiler
295
+ requirement: !ruby/object:Gem::Requirement
296
+ requirements:
297
+ - - "~>"
298
+ - !ruby/object:Gem::Version
299
+ version: '0.9'
300
+ type: :development
301
+ prerelease: false
302
+ version_requirements: !ruby/object:Gem::Requirement
303
+ requirements:
304
+ - - "~>"
305
+ - !ruby/object:Gem::Version
306
+ version: '0.9'
153
307
  - !ruby/object:Gem::Dependency
154
308
  name: pry
155
309
  requirement: !ruby/object:Gem::Requirement
@@ -178,6 +332,20 @@ dependencies:
178
332
  - - ">="
179
333
  - !ruby/object:Gem::Version
180
334
  version: '0'
335
+ - !ruby/object:Gem::Dependency
336
+ name: pry-doc
337
+ requirement: !ruby/object:Gem::Requirement
338
+ requirements:
339
+ - - ">="
340
+ - !ruby/object:Gem::Version
341
+ version: '0'
342
+ type: :development
343
+ prerelease: false
344
+ version_requirements: !ruby/object:Gem::Requirement
345
+ requirements:
346
+ - - ">="
347
+ - !ruby/object:Gem::Version
348
+ version: '0'
181
349
  - !ruby/object:Gem::Dependency
182
350
  name: pry-rescue
183
351
  requirement: !ruby/object:Gem::Requirement
@@ -223,19 +391,22 @@ dependencies:
223
391
  description: 'ArelToolkit contains parsing, querying, modifying, optimisations, extensions
224
392
  and more for Arel.
225
393
 
226
- '
394
+ '
227
395
  email:
228
396
  - maarten@vgijssel.nl
229
397
  executables: []
230
- extensions: []
398
+ extensions:
399
+ - ext/pg_result_init/extconf.rb
231
400
  extra_rdoc_files: []
232
401
  files:
233
402
  - ".codeclimate.yml"
403
+ - ".github/workflows/develop.yml"
404
+ - ".github/workflows/master.yml"
234
405
  - ".gitignore"
235
406
  - ".rspec"
236
407
  - ".rubocop.yml"
237
408
  - ".ruby-version"
238
- - ".travis.yml"
409
+ - Appraisals
239
410
  - CHANGELOG.md
240
411
  - CODE_OF_CONDUCT.md
241
412
  - Gemfile
@@ -245,52 +416,101 @@ files:
245
416
  - README.md
246
417
  - Rakefile
247
418
  - arel_toolkit.gemspec
419
+ - benchmark.rb
248
420
  - bin/console
249
421
  - bin/setup
422
+ - ext/pg_result_init/extconf.rb
423
+ - ext/pg_result_init/pg_result_init.c
424
+ - ext/pg_result_init/pg_result_init.h
425
+ - gemfiles/.bundle/config
426
+ - gemfiles/active_record_6.gemfile
427
+ - gemfiles/active_record_6.gemfile.lock
428
+ - gemfiles/arel_gems.gemfile
429
+ - gemfiles/arel_gems.gemfile.lock
430
+ - gemfiles/default.gemfile
431
+ - gemfiles/default.gemfile.lock
432
+ - lib/arel/enhance.rb
433
+ - lib/arel/enhance/context_enhancer/arel_table.rb
434
+ - lib/arel/enhance/node.rb
435
+ - lib/arel/enhance/path.rb
436
+ - lib/arel/enhance/path_node.rb
437
+ - lib/arel/enhance/query.rb
438
+ - lib/arel/enhance/query_methods.rb
439
+ - lib/arel/enhance/visitor.rb
250
440
  - lib/arel/extensions.rb
251
441
  - lib/arel/extensions/absolute.rb
442
+ - lib/arel/extensions/active_model_attribute_with_cast_value.rb
443
+ - lib/arel/extensions/active_record_relation_query_attribute.rb
444
+ - lib/arel/extensions/active_record_type_caster_connection.rb
445
+ - lib/arel/extensions/active_record_type_caster_map.rb
252
446
  - lib/arel/extensions/all.rb
253
447
  - lib/arel/extensions/any.rb
254
448
  - lib/arel/extensions/array.rb
255
449
  - lib/arel/extensions/array_subselect.rb
450
+ - lib/arel/extensions/assignment.rb
451
+ - lib/arel/extensions/at_time_zone.rb
452
+ - lib/arel/extensions/attributes_attribute.rb
256
453
  - lib/arel/extensions/between_symmetric.rb
454
+ - lib/arel/extensions/binary.rb
455
+ - lib/arel/extensions/bind_param.rb
257
456
  - lib/arel/extensions/bit_string.rb
258
457
  - lib/arel/extensions/bitwise_xor.rb
458
+ - lib/arel/extensions/case.rb
259
459
  - lib/arel/extensions/coalesce.rb
260
460
  - lib/arel/extensions/conflict.rb
261
461
  - lib/arel/extensions/contained_by.rb
462
+ - lib/arel/extensions/contained_within_equals.rb
262
463
  - lib/arel/extensions/contains.rb
464
+ - lib/arel/extensions/contains_equals.rb
263
465
  - lib/arel/extensions/cross_join.rb
264
466
  - lib/arel/extensions/cube_root.rb
265
467
  - lib/arel/extensions/current_catalog.rb
266
468
  - lib/arel/extensions/current_date.rb
267
469
  - lib/arel/extensions/current_of_expression.rb
268
470
  - lib/arel/extensions/current_role.rb
471
+ - lib/arel/extensions/current_row.rb
269
472
  - lib/arel/extensions/current_schema.rb
270
473
  - lib/arel/extensions/current_time.rb
271
474
  - lib/arel/extensions/current_timestamp.rb
272
475
  - lib/arel/extensions/current_user.rb
476
+ - lib/arel/extensions/dealocate.rb
273
477
  - lib/arel/extensions/default_values.rb
478
+ - lib/arel/extensions/delete_manager.rb
274
479
  - lib/arel/extensions/delete_statement.rb
275
480
  - lib/arel/extensions/distinct_from.rb
481
+ - lib/arel/extensions/dot.rb
276
482
  - lib/arel/extensions/equality.rb
277
483
  - lib/arel/extensions/except_all.rb
484
+ - lib/arel/extensions/exists.rb
278
485
  - lib/arel/extensions/exponentiation.rb
486
+ - lib/arel/extensions/extract_from.rb
279
487
  - lib/arel/extensions/factorial.rb
488
+ - lib/arel/extensions/false.rb
280
489
  - lib/arel/extensions/function.rb
281
- - lib/arel/extensions/generate_series.rb
282
490
  - lib/arel/extensions/greatest.rb
283
491
  - lib/arel/extensions/indirection.rb
284
492
  - lib/arel/extensions/infer.rb
493
+ - lib/arel/extensions/infix_operation.rb
494
+ - lib/arel/extensions/insert_manager.rb
285
495
  - lib/arel/extensions/insert_statement.rb
286
496
  - lib/arel/extensions/intersect_all.rb
497
+ - lib/arel/extensions/into.rb
498
+ - lib/arel/extensions/json_get_field.rb
499
+ - lib/arel/extensions/json_get_object.rb
500
+ - lib/arel/extensions/json_path_get_field.rb
501
+ - lib/arel/extensions/json_path_get_object.rb
502
+ - lib/arel/extensions/jsonb_all_key_exists.rb
503
+ - lib/arel/extensions/jsonb_any_key_exists.rb
504
+ - lib/arel/extensions/jsonb_key_exists.rb
287
505
  - lib/arel/extensions/lateral.rb
288
506
  - lib/arel/extensions/least.rb
289
507
  - lib/arel/extensions/local_time.rb
290
508
  - lib/arel/extensions/local_timestamp.rb
291
509
  - lib/arel/extensions/modulo.rb
510
+ - lib/arel/extensions/named_argument.rb
292
511
  - lib/arel/extensions/named_function.rb
293
512
  - lib/arel/extensions/natural_join.rb
513
+ - lib/arel/extensions/node.rb
294
514
  - lib/arel/extensions/not_between.rb
295
515
  - lib/arel/extensions/not_between_symmetric.rb
296
516
  - lib/arel/extensions/not_distinct_from.rb
@@ -299,32 +519,66 @@ files:
299
519
  - lib/arel/extensions/null_if.rb
300
520
  - lib/arel/extensions/ordering.rb
301
521
  - lib/arel/extensions/overlap.rb
522
+ - lib/arel/extensions/overlaps.rb
523
+ - lib/arel/extensions/overlay.rb
524
+ - lib/arel/extensions/position.rb
525
+ - lib/arel/extensions/prepare.rb
302
526
  - lib/arel/extensions/range_function.rb
303
- - lib/arel/extensions/rank.rb
304
527
  - lib/arel/extensions/row.rb
528
+ - lib/arel/extensions/select_core.rb
529
+ - lib/arel/extensions/select_manager.rb
305
530
  - lib/arel/extensions/select_statement.rb
306
531
  - lib/arel/extensions/session_user.rb
307
532
  - lib/arel/extensions/set_to_default.rb
308
533
  - lib/arel/extensions/similar.rb
309
534
  - lib/arel/extensions/square_root.rb
535
+ - lib/arel/extensions/substring.rb
310
536
  - lib/arel/extensions/table.rb
311
537
  - lib/arel/extensions/time_with_precision.rb
538
+ - lib/arel/extensions/to_sql.rb
539
+ - lib/arel/extensions/top.rb
540
+ - lib/arel/extensions/transaction.rb
541
+ - lib/arel/extensions/tree_manager.rb
542
+ - lib/arel/extensions/trim.rb
543
+ - lib/arel/extensions/true.rb
312
544
  - lib/arel/extensions/type_cast.rb
545
+ - lib/arel/extensions/unary.rb
546
+ - lib/arel/extensions/unary_operation.rb
313
547
  - lib/arel/extensions/unknown.rb
548
+ - lib/arel/extensions/update_manager.rb
314
549
  - lib/arel/extensions/update_statement.rb
315
550
  - lib/arel/extensions/user.rb
551
+ - lib/arel/extensions/values_list.rb
552
+ - lib/arel/extensions/variable_set.rb
553
+ - lib/arel/extensions/variable_show.rb
316
554
  - lib/arel/extensions/with_ordinality.rb
555
+ - lib/arel/middleware.rb
556
+ - lib/arel/middleware/active_record_extension.rb
557
+ - lib/arel/middleware/cache_accessor.rb
558
+ - lib/arel/middleware/chain.rb
559
+ - lib/arel/middleware/database_executor.rb
560
+ - lib/arel/middleware/no_op_cache.rb
561
+ - lib/arel/middleware/postgresql_adapter.rb
562
+ - lib/arel/middleware/railtie.rb
563
+ - lib/arel/middleware/result.rb
564
+ - lib/arel/middleware/to_sql_executor.rb
565
+ - lib/arel/middleware/to_sql_middleware.rb
317
566
  - lib/arel/sql_to_arel.rb
318
- - lib/arel/sql_to_arel/frame_options.rb
567
+ - lib/arel/sql_to_arel/error.rb
319
568
  - lib/arel/sql_to_arel/pg_query_visitor.rb
320
- - lib/arel/sql_to_arel/unbound_column_reference.rb
569
+ - lib/arel/sql_to_arel/pg_query_visitor/frame_options.rb
570
+ - lib/arel/sql_to_arel/result.rb
571
+ - lib/arel/transformer.rb
572
+ - lib/arel/transformer/prefix_schema_name.rb
573
+ - lib/arel/transformer/remove_active_record_info.rb
574
+ - lib/arel/transformer/replace_table_with_subquery.rb
321
575
  - lib/arel_toolkit.rb
322
576
  - lib/arel_toolkit/version.rb
323
577
  homepage: https://github.com/mvgijssel/arel_toolkit
324
578
  licenses:
325
579
  - MIT
326
580
  metadata: {}
327
- post_install_message:
581
+ post_install_message:
328
582
  rdoc_options: []
329
583
  require_paths:
330
584
  - lib
@@ -339,9 +593,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
339
593
  - !ruby/object:Gem::Version
340
594
  version: '0'
341
595
  requirements: []
342
- rubyforge_project:
343
- rubygems_version: 2.7.6
344
- signing_key:
596
+ rubygems_version: 3.0.3
597
+ signing_key:
345
598
  specification_version: 4
346
599
  summary: Collection of tools for Arel
347
600
  test_files: []