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
@@ -1,21 +0,0 @@
1
- ---
2
- env:
3
- global:
4
- - CC_TEST_REPORTER_ID=64634aec08aacb7cba69b6eb1f4c814228cffe9d167dcb208dcc6d49a4c5c493
5
- sudo: false
6
- language: ruby
7
- cache: bundler
8
- notifications:
9
- email: false
10
- rvm:
11
- - 2.5.3
12
- before_script:
13
- - curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
14
- - chmod +x ./cc-test-reporter
15
- - ./cc-test-reporter before-build
16
- before_install:
17
- - gem install bundler -v 2.0.1
18
- script:
19
- - bundle exec rspec spec
20
- after_script:
21
- - ./cc-test-reporter after-build --exit-code $TRAVIS_TEST_RESULT
@@ -1,9 +0,0 @@
1
- module Arel
2
- module Nodes
3
- class GenerateSeries < Arel::Nodes::NamedFunction
4
- def initialize(args)
5
- super 'GENERATE_SERIES', args
6
- end
7
- end
8
- end
9
- end
@@ -1,9 +0,0 @@
1
- module Arel
2
- module Nodes
3
- class Rank < Arel::Nodes::NamedFunction
4
- def initialize(args)
5
- super 'RANK', args
6
- end
7
- end
8
- end
9
- end
@@ -1,110 +0,0 @@
1
- module Arel
2
- module SqlToArel
3
- class FrameOptions
4
- class << self
5
- def arel(frame_options, start_offset, end_offset)
6
- frame_option_names = calculate_frame_option_names(frame_options)
7
- return unless frame_option_names.include?('FRAMEOPTION_NONDEFAULT')
8
-
9
- range_klass = if frame_option_names.include?('FRAMEOPTION_RANGE')
10
- Arel::Nodes::Range
11
- else
12
- Arel::Nodes::Rows
13
- end
14
-
15
- start_node = calculate_frame_node(
16
- 'FRAMEOPTION_START_',
17
- frame_option_names,
18
- start_offset,
19
- )
20
- end_node = calculate_frame_node(
21
- 'FRAMEOPTION_END_',
22
- frame_option_names,
23
- end_offset,
24
- )
25
-
26
- if frame_option_names.include?('FRAMEOPTION_BETWEEN')
27
- Arel::Nodes::Between.new(
28
- range_klass.new,
29
- Arel::Nodes::And.new([start_node, end_node]),
30
- )
31
- else
32
- range_klass.new start_node
33
- end
34
- end
35
-
36
- private
37
-
38
- # always NONDEFAULT
39
- # RANGE or ROWS
40
- # mandatory BETWEEN
41
- # RANGE only unbounded
42
- # ROWS all
43
- # https://github.com/postgres/postgres/blob/REL_10_1/src/include/nodes/parsenodes.h
44
- FRAMEOPTIONS = {
45
- 'FRAMEOPTION_NONDEFAULT' => 0x00001,
46
- 'FRAMEOPTION_RANGE' => 0x00002,
47
- 'FRAMEOPTION_ROWS' => 0x00004,
48
- 'FRAMEOPTION_BETWEEN' => 0x00008,
49
- 'FRAMEOPTION_START_UNBOUNDED_PRECEDING' => 0x00010,
50
- 'FRAMEOPTION_END_UNBOUNDED_PRECEDING' => 0x00020,
51
- 'FRAMEOPTION_START_UNBOUNDED_FOLLOWING' => 0x00040,
52
- 'FRAMEOPTION_END_UNBOUNDED_FOLLOWING' => 0x00080,
53
- 'FRAMEOPTION_START_CURRENT_ROW' => 0x00100,
54
- 'FRAMEOPTION_END_CURRENT_ROW' => 0x00200,
55
- 'FRAMEOPTION_START_VALUE_PRECEDING' => 0x00400,
56
- 'FRAMEOPTION_END_VALUE_PRECEDING' => 0x00800,
57
- 'FRAMEOPTION_START_VALUE_FOLLOWING' => 0x01000,
58
- 'FRAMEOPTION_END_VALUE_FOLLOWING' => 0x02000
59
- }.freeze
60
-
61
- def biggest_detractable_number(number, candidates)
62
- high_to_low_candidates = candidates.sort { |a, b| b <=> a }
63
- high_to_low_candidates.find do |candidate|
64
- number - candidate >= 0
65
- end
66
- end
67
-
68
- def calculate_frame_option_names(frame_options, names = [])
69
- return names if frame_options.zero?
70
-
71
- number = biggest_detractable_number(frame_options, FRAMEOPTIONS.values)
72
- name = FRAMEOPTIONS.key(number)
73
- calculate_frame_option_names(
74
- frame_options - number, names + [name]
75
- )
76
- end
77
-
78
- def calculate_frame_node(pattern, frame_option_names, offset)
79
- node_name = frame_option_names.select { |n| n.start_with?(pattern) }
80
- raise "Don't know how to handle multiple nodes" if node_name.length > 1
81
-
82
- node_name = node_name.first.gsub(/FRAMEOPTION_(START|END)_/, '')
83
- name_to_node(node_name, offset)
84
- end
85
-
86
- def name_to_node(node_name, offset)
87
- case node_name
88
- when 'UNBOUNDED_PRECEDING'
89
- Arel::Nodes::Preceding.new
90
-
91
- when 'UNBOUNDED_FOLLOWING'
92
- Arel::Nodes::Following.new
93
-
94
- when 'CURRENT_ROW'
95
- Arel::Nodes::CurrentRow.new
96
-
97
- when 'VALUE_PRECEDING'
98
- Arel::Nodes::Preceding.new offset
99
-
100
- when 'VALUE_FOLLOWING'
101
- Arel::Nodes::Following.new offset
102
-
103
- else
104
- raise "Unknown start / end frame node `#{node_name}`"
105
- end
106
- end
107
- end
108
- end
109
- end
110
- end
@@ -1,5 +0,0 @@
1
- module Arel
2
- module SqlToArel
3
- class UnboundColumnReference < ::Arel::Nodes::SqlLiteral; end
4
- end
5
- end