arel_extensions 1.6.0 → 2.0.0.rc3

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 (146) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +2 -1
  3. data/.gitignore +6 -7
  4. data/.rubocop.yml +3 -67
  5. data/.travis/oracle/download.js +152 -0
  6. data/.travis/oracle/download.sh +30 -0
  7. data/.travis/oracle/download_ojdbc.js +116 -0
  8. data/.travis/oracle/install.sh +34 -0
  9. data/.travis/setup_accounts.sh +9 -0
  10. data/.travis/sqlite3/extension-functions.sh +6 -0
  11. data/.travis.yml +223 -0
  12. data/Gemfile +28 -2
  13. data/README.md +91 -258
  14. data/Rakefile +30 -48
  15. data/TODO +1 -0
  16. data/appveyor.yml +22 -60
  17. data/arel_extensions.gemspec +14 -13
  18. data/functions.html +3 -3
  19. data/gemfiles/rails3.gemfile +20 -0
  20. data/gemfiles/rails4.gemfile +29 -0
  21. data/gemfiles/rails5_0.gemfile +29 -0
  22. data/gemfiles/rails5_1_4.gemfile +14 -14
  23. data/gemfiles/rails5_2.gemfile +14 -16
  24. data/init/mssql.sql +4 -4
  25. data/init/mysql.sql +38 -38
  26. data/init/oracle.sql +0 -0
  27. data/init/postgresql.sql +25 -24
  28. data/init/sqlite.sql +0 -0
  29. data/lib/arel_extensions/attributes.rb +3 -7
  30. data/lib/arel_extensions/boolean_functions.rb +14 -53
  31. data/lib/arel_extensions/common_sql_functions.rb +17 -16
  32. data/lib/arel_extensions/comparators.rb +28 -29
  33. data/lib/arel_extensions/date_duration.rb +13 -17
  34. data/lib/arel_extensions/insert_manager.rb +15 -18
  35. data/lib/arel_extensions/math.rb +53 -55
  36. data/lib/arel_extensions/math_functions.rb +39 -46
  37. data/lib/arel_extensions/nodes/abs.rb +1 -0
  38. data/lib/arel_extensions/nodes/blank.rb +2 -1
  39. data/lib/arel_extensions/nodes/case.rb +19 -20
  40. data/lib/arel_extensions/nodes/cast.rb +8 -10
  41. data/lib/arel_extensions/nodes/ceil.rb +1 -1
  42. data/lib/arel_extensions/nodes/coalesce.rb +4 -3
  43. data/lib/arel_extensions/nodes/collate.rb +10 -9
  44. data/lib/arel_extensions/nodes/concat.rb +18 -9
  45. data/lib/arel_extensions/nodes/date_diff.rb +26 -42
  46. data/lib/arel_extensions/nodes/duration.rb +3 -0
  47. data/lib/arel_extensions/nodes/find_in_set.rb +1 -0
  48. data/lib/arel_extensions/nodes/floor.rb +1 -1
  49. data/lib/arel_extensions/nodes/format.rb +8 -35
  50. data/lib/arel_extensions/nodes/formatted_number.rb +23 -22
  51. data/lib/arel_extensions/nodes/function.rb +37 -46
  52. data/lib/arel_extensions/nodes/is_null.rb +0 -0
  53. data/lib/arel_extensions/nodes/json.rb +39 -52
  54. data/lib/arel_extensions/nodes/length.rb +0 -5
  55. data/lib/arel_extensions/nodes/levenshtein_distance.rb +1 -1
  56. data/lib/arel_extensions/nodes/locate.rb +2 -1
  57. data/lib/arel_extensions/nodes/log10.rb +2 -1
  58. data/lib/arel_extensions/nodes/matches.rb +8 -6
  59. data/lib/arel_extensions/nodes/md5.rb +1 -0
  60. data/lib/arel_extensions/nodes/power.rb +5 -5
  61. data/lib/arel_extensions/nodes/rand.rb +1 -0
  62. data/lib/arel_extensions/nodes/repeat.rb +5 -3
  63. data/lib/arel_extensions/nodes/replace.rb +8 -16
  64. data/lib/arel_extensions/nodes/round.rb +6 -5
  65. data/lib/arel_extensions/nodes/soundex.rb +15 -15
  66. data/lib/arel_extensions/nodes/std.rb +21 -18
  67. data/lib/arel_extensions/nodes/substring.rb +16 -8
  68. data/lib/arel_extensions/nodes/then.rb +1 -1
  69. data/lib/arel_extensions/nodes/trim.rb +6 -4
  70. data/lib/arel_extensions/nodes/union.rb +8 -5
  71. data/lib/arel_extensions/nodes/union_all.rb +7 -4
  72. data/lib/arel_extensions/nodes/wday.rb +4 -0
  73. data/lib/arel_extensions/nodes.rb +1 -1
  74. data/lib/arel_extensions/null_functions.rb +5 -19
  75. data/lib/arel_extensions/predications.rb +44 -45
  76. data/lib/arel_extensions/railtie.rb +5 -5
  77. data/lib/arel_extensions/set_functions.rb +7 -5
  78. data/lib/arel_extensions/string_functions.rb +35 -91
  79. data/lib/arel_extensions/tasks.rb +6 -6
  80. data/lib/arel_extensions/version.rb +1 -1
  81. data/lib/arel_extensions/visitors/ibm_db.rb +31 -24
  82. data/lib/arel_extensions/visitors/mssql.rb +194 -440
  83. data/lib/arel_extensions/visitors/mysql.rb +212 -368
  84. data/lib/arel_extensions/visitors/oracle.rb +179 -236
  85. data/lib/arel_extensions/visitors/oracle12.rb +31 -18
  86. data/lib/arel_extensions/visitors/postgresql.rb +173 -271
  87. data/lib/arel_extensions/visitors/sqlite.rb +127 -157
  88. data/lib/arel_extensions/visitors/to_sql.rb +238 -300
  89. data/lib/arel_extensions/visitors.rb +62 -83
  90. data/lib/arel_extensions.rb +31 -235
  91. data/test/database.yml +10 -20
  92. data/test/helper.rb +18 -0
  93. data/test/real_db_test.rb +118 -121
  94. data/test/support/fake_record.rb +3 -11
  95. data/test/test_comparators.rb +17 -14
  96. data/test/visitors/test_bulk_insert_oracle.rb +12 -12
  97. data/test/visitors/test_bulk_insert_sqlite.rb +14 -13
  98. data/test/visitors/test_bulk_insert_to_sql.rb +13 -11
  99. data/test/visitors/test_oracle.rb +55 -55
  100. data/test/visitors/test_to_sql.rb +226 -419
  101. data/test/with_ar/all_agnostic_test.rb +370 -773
  102. data/test/with_ar/insert_agnostic_test.rb +22 -28
  103. data/test/with_ar/test_bulk_sqlite.rb +17 -18
  104. data/test/with_ar/test_math_sqlite.rb +27 -27
  105. data/test/with_ar/test_string_mysql.rb +34 -32
  106. data/test/with_ar/test_string_sqlite.rb +35 -31
  107. metadata +38 -52
  108. data/.github/workflows/publish.yml +0 -30
  109. data/.github/workflows/release.yml +0 -30
  110. data/.github/workflows/ruby.yml +0 -452
  111. data/CONTRIBUTING.md +0 -102
  112. data/Makefile +0 -18
  113. data/NEWS.md +0 -116
  114. data/bin/build +0 -15
  115. data/bin/publish +0 -8
  116. data/dev/arelx.dockerfile +0 -41
  117. data/dev/compose.yaml +0 -69
  118. data/dev/postgres.dockerfile +0 -5
  119. data/dev/rbenv +0 -189
  120. data/gemfiles/rails5.gemfile +0 -29
  121. data/gemfiles/rails6.gemfile +0 -34
  122. data/gemfiles/rails6_1.gemfile +0 -42
  123. data/gemfiles/rails7.gemfile +0 -42
  124. data/gemfiles/rails7_1.gemfile +0 -41
  125. data/gemfiles/rails7_2.gemfile +0 -41
  126. data/gemfiles/rails8.gemfile +0 -40
  127. data/gemfiles/rails8_1.gemfile +0 -41
  128. data/gemspecs/arel_extensions-v1.gemspec +0 -27
  129. data/gemspecs/arel_extensions-v2.gemspec +0 -27
  130. data/generate_gems.sh +0 -15
  131. data/lib/arel_extensions/aliases.rb +0 -14
  132. data/lib/arel_extensions/constants.rb +0 -13
  133. data/lib/arel_extensions/helpers.rb +0 -61
  134. data/lib/arel_extensions/nodes/aggregate_function.rb +0 -13
  135. data/lib/arel_extensions/nodes/byte_size.rb +0 -11
  136. data/lib/arel_extensions/nodes/char_length.rb +0 -11
  137. data/lib/arel_extensions/nodes/formatted_date.rb +0 -42
  138. data/lib/arel_extensions/nodes/rollup.rb +0 -36
  139. data/lib/arel_extensions/nodes/select.rb +0 -10
  140. data/lib/arel_extensions/nodes/sum.rb +0 -7
  141. data/lib/arel_extensions/visitors/convert_format.rb +0 -37
  142. data/lib/arel_extensions/warning.rb +0 -42
  143. data/test/arelx_test_helper.rb +0 -94
  144. data/test/config_loader.rb +0 -9
  145. data/version_v1.rb +0 -3
  146. data/version_v2.rb +0 -3
@@ -1,50 +1,36 @@
1
- # require 'oracle_visitor'
1
+ #require 'oracle_visitor'
2
2
  module ArelExtensions
3
3
  module Visitors
4
- class Arel::Visitors::Oracle
4
+ Arel::Visitors::Oracle.class_eval do
5
+
5
6
  SPECIAL_CHARS = {"\t" => 'CHR(9)', "\n" => 'CHR(10)', "\r" => 'CHR(13)'}
6
- DATE_MAPPING = {'d' => 'DAY', 'm' => 'MONTH', 'w' => 'IW', 'y' => 'YEAR', 'wd' => 'D', 'h' => 'HOUR', 'mn' => 'MINUTE', 's' => 'SECOND'}
7
- DATE_FORMAT_DIRECTIVES = {
8
- '%Y' => 'YYYY', '%C' => 'CC', '%y' => 'YY', '%m' => 'MM', '%B' => 'Month', '%^B' => 'MONTH', '%b' => 'Mon', '%^b' => 'MON',
9
- '%V' => 'IW', '%G' => 'IYYY', # ISO week number and year of week
10
- '%d' => 'DD', '%e' => 'FMDD', '%j' => 'DDD', '%w' => '', '%a' => 'Dy', '%A' => 'Day', # day, weekday
7
+ Arel::Visitors::Oracle::DATE_MAPPING = {'d' => 'DAY', 'm' => 'MONTH', 'w' => 'IW', 'y' => 'YEAR', 'wd' => 'D', 'h' => 'HOUR', 'mn' => 'MINUTE', 's' => 'SECOND'}
8
+ Arel::Visitors::Oracle::DATE_FORMAT_DIRECTIVES = {
9
+ '%Y' => 'IYYY', '%C' => 'CC', '%y' => 'YY', '%m' => 'MM', '%B' => 'Month', '%^B' => 'MONTH', '%b' => 'Mon', '%^b' => 'MON',
10
+ '%d' => 'DD', '%e' => 'FMDD', '%j' => 'DDD', '%w' => '', '%A' => 'Day', # day, weekday
11
11
  '%H' => 'HH24', '%k' => '', '%I' => 'HH', '%l' => '', '%P' => 'am', '%p' => 'AM', # hours
12
12
  '%M' => 'MI', '%S' => 'SS', '%L' => 'MS', '%N' => 'US', '%z' => 'tz' # seconds, subseconds
13
13
  }
14
- NUMBER_COMMA_MAPPING = {'en_US' => '.,', 'fr_FR' => ',', 'sv_SE' => ', '}
15
-
16
- def visit_ArelExtensions_Nodes_ByteSize o, collector
17
- collector << 'LENGTHB('
18
- collector = visit o.expr.coalesce(''), collector
19
- collector << ')'
20
- collector
21
- end
22
-
23
- def visit_ArelExtensions_Nodes_CharLength o, collector
24
- collector << 'LENGTH('
25
- collector = visit o.expr.coalesce(''), collector
26
- collector << ')'
27
- collector
28
- end
14
+ Arel::Visitors::Oracle::NUMBER_COMMA_MAPPING = { 'en_US' => '.,', 'fr_FR' => ',', 'sv_SE' => ', ' }
29
15
 
30
16
  def visit_ArelExtensions_Nodes_Log10 o, collector
31
- collector << 'LOG('
32
- o.expressions.each_with_index { |arg, i|
33
- collector << Arel::Visitors::ToSql::COMMA if i != 0
34
- collector = visit arg, collector
35
- }
36
- collector << ',10)'
37
- collector
17
+ collector << "LOG("
18
+ o.expressions.each_with_index { |arg, i|
19
+ collector << Arel::Visitors::ToSql::COMMA unless i == 0
20
+ collector = visit arg, collector
21
+ }
22
+ collector << ",10)"
23
+ collector
38
24
  end
39
25
 
40
26
  def visit_ArelExtensions_Nodes_Power o, collector
41
- collector << 'POWER('
42
- o.expressions.each_with_index { |arg, i|
43
- collector << Arel::Visitors::ToSql::COMMA if i != 0
44
- collector = visit arg, collector
45
- }
46
- collector << ')'
47
- collector
27
+ collector << "POWER("
28
+ o.expressions.each_with_index { |arg, i|
29
+ collector << Arel::Visitors::ToSql::COMMA unless i == 0
30
+ collector = visit arg, collector
31
+ }
32
+ collector << ")"
33
+ collector
48
34
  end
49
35
 
50
36
  def visit_ArelExtensions_Nodes_Concat o, collector
@@ -107,6 +93,7 @@ module ArelExtensions
107
93
  end
108
94
  end
109
95
 
96
+
110
97
  def visit_ArelExtensions_Nodes_IDoesNotMatch o, collector
111
98
  collector << 'LOWER('
112
99
  collector = visit o.left, collector
@@ -122,60 +109,53 @@ module ArelExtensions
122
109
  end
123
110
 
124
111
  def visit_ArelExtensions_Nodes_Collate o, collector
125
- if o.ai
126
- collector << 'NLSSORT('
127
- collector = visit o.expressions.first, collector
128
- collector << COMMA
129
- collector << "'NLS_SORT = BINARY_AI NLS_COMP = LINGUISTIC'"
130
- collector << ')'
131
- elsif o.ci
132
- collector << 'NLSSORT('
133
- collector = visit o.expressions.first, collector
134
- collector << COMMA
135
- collector << "'NLS_SORT = BINARY_CI NLS_COMP = LINGUISTIC'"
136
- collector << ')'
137
- else
138
- collector = visit o.expressions.first, collector
139
- end
140
- collector
112
+ if o.ai
113
+ collector << "NLSSORT("
114
+ collector = visit o.expressions.first, collector
115
+ collector << Arel::Visitors::Oracle::COMMA
116
+ collector << "'NLS_SORT = BINARY_AI NLS_COMP = LINGUISTIC'"
117
+ collector << ")"
118
+ elsif o.ci
119
+ collector << "NLSSORT("
120
+ collector = visit o.expressions.first, collector
121
+ collector << Arel::Visitors::Oracle::COMMA
122
+ collector << "'NLS_SORT = BINARY_CI NLS_COMP = LINGUISTIC'"
123
+ collector << ")"
124
+ else
125
+ collector = visit o.expressions.first, collector
141
126
  end
142
-
143
- def visit_Arel_Nodes_RollUp(o, collector)
144
- collector << "ROLLUP"
145
- grouping_array_or_grouping_element o, collector
127
+ collector
146
128
  end
147
129
 
148
130
  def visit_ArelExtensions_Nodes_GroupConcat o, collector
149
- collector << '(LISTAGG('
131
+ collector << "(LISTAGG("
150
132
  collector = visit o.left, collector
151
- collector << COMMA
152
- sep = o.separator.is_a?(Arel::Nodes::Quoted) ? o.separator.expr : o.separator
153
- collector =
154
- if 'NULL' != sep
155
- visit o.separator, collector
156
- else
157
- visit Arel.quoted(','), collector
158
- end
159
- collector << ') WITHIN GROUP (ORDER BY '
160
- if !o.order.blank?
161
- o.order.each_with_index do |order, i|
162
- collector << COMMA if i != 0
133
+ collector << Arel::Visitors::Oracle::COMMA
134
+ if o.right && o.right != 'NULL'
135
+ collector = visit o.right, collector
136
+ else
137
+ collector = visit Arel::Nodes.build_quoted(','), collector
138
+ end
139
+ collector << ") WITHIN GROUP (ORDER BY "
140
+ if !o.orders.blank?
141
+ o.orders.each_with_index do |order,i|
142
+ collector << Arel::Visitors::Oracle::COMMA unless i == 0
163
143
  collector = visit order, collector
164
144
  end
165
145
  else
166
146
  collector = visit o.left, collector
167
147
  end
168
- collector << '))'
148
+ collector << "))"
169
149
  collector
170
150
  end
171
151
 
172
152
  def visit_ArelExtensions_Nodes_Coalesce o, collector
173
- collector << 'COALESCE('
153
+ collector << "COALESCE("
174
154
  o.expressions.each_with_index { |arg, i|
175
- collector << COMMA if i != 0
155
+ collector << Arel::Visitors::Oracle::COMMA unless i == 0
176
156
  if i > 0 && o.left_node_type == :text
177
- if arg == '' || (arg.is_a?(Arel::Nodes::Quoted) && (arg.expr == ''))
178
- collector << 'NULL'
157
+ if arg == '' || (arg.is_a?(Arel::Nodes::Quoted) && (arg.expr == ''))
158
+ collector << "NULL"
179
159
  else
180
160
  collector << 'TO_CLOB('
181
161
  collector = visit arg, collector
@@ -185,12 +165,12 @@ module ArelExtensions
185
165
  collector = visit arg, collector
186
166
  end
187
167
  }
188
- collector << ')'
168
+ collector << ")"
189
169
  collector
190
170
  end
191
171
 
192
172
  def visit_ArelExtensions_Nodes_MD5 o, collector
193
- collector << 'LOWER (RAWTOHEX (DBMS_OBFUSCATION_TOOLKIT.md5(input => UTL_I18N.STRING_TO_RAW('
173
+ collector << "LOWER (RAWTOHEX (DBMS_OBFUSCATION_TOOLKIT.md5(input => UTL_I18N.STRING_TO_RAW("
194
174
  collector = visit o.left, collector
195
175
  collector << ", 'AL32UTF8'))))"
196
176
  collector
@@ -205,7 +185,7 @@ module ArelExtensions
205
185
  collector << 'TO_DATE(' if lc
206
186
  collector = visit o.left, collector
207
187
  collector << ')' if lc
208
- collector << ' - '
188
+ collector << " - "
209
189
  collector << 'TO_DATE(' if rc
210
190
  collector = visit o.right, collector
211
191
  collector << ')' if rc
@@ -215,7 +195,7 @@ module ArelExtensions
215
195
  collector << 'TO_DATE(' if lc
216
196
  collector = visit o.left, collector
217
197
  collector << ')' if lc
218
- collector << COMMA
198
+ collector << Arel::Visitors::Oracle::COMMA
219
199
  collector << "'DDD') = "
220
200
  collector << 'TO_DATE(' if lc
221
201
  collector = visit o.left, collector
@@ -239,20 +219,20 @@ module ArelExtensions
239
219
  def visit_ArelExtensions_Nodes_Duration o, collector
240
220
  case o.left
241
221
  when 'wd', 'w'
242
- collector << 'TO_CHAR('
222
+ collector << "TO_CHAR("
243
223
  collector = visit o.right, collector
244
- collector << COMMA
245
- collector = visit Arel.quoted(DATE_MAPPING[o.left]), collector
224
+ collector << Arel::Visitors::Oracle::COMMA
225
+ collector = visit Arel::Nodes.build_quoted(Arel::Visitors::Oracle::DATE_MAPPING[o.left]), collector
246
226
  else
247
227
  right = case o.left
248
- when 'd', 'm', 'y'
228
+ when 'd','m','y'
249
229
  interval = 'DAY'
250
230
  o.right.cast(:date)
251
- when 'h', 'mn', 's'
231
+ when 'h','mn','s'
252
232
  interval = 'SECOND'
253
233
  o.right.cast(:datetime)
254
234
  when /i\z/
255
- interval = DATE_MAPPING[o.left[0..-2]]
235
+ interval = Arel::Visitors::Oracle::DATE_MAPPING[o.left[0..-2]]
256
236
  collector << '('
257
237
  collector = visit o.right, collector
258
238
  collector << ") * (INTERVAL '1' #{interval})"
@@ -261,10 +241,10 @@ module ArelExtensions
261
241
  interval = nil
262
242
  o.right
263
243
  end
264
- collector << "EXTRACT(#{DATE_MAPPING[o.left]} FROM "
244
+ collector << "EXTRACT(#{Arel::Visitors::Oracle::DATE_MAPPING[o.left]} FROM "
265
245
  collector = visit right, collector
266
246
  end
267
- collector << ')'
247
+ collector << ")"
268
248
  collector << " * (INTERVAL '1' #{interval})" if interval && o.with_interval
269
249
  collector
270
250
  end
@@ -272,45 +252,35 @@ module ArelExtensions
272
252
  def visit_ArelExtensions_Nodes_Cast o, collector
273
253
  case o.as_attr
274
254
  when :string
275
- collector << 'TO_CHAR('
276
- collector = visit o.left, collector
277
- collector << ')'
278
- return collector
279
- when :text
280
- collector << 'TO_CLOB('
255
+ collector << "TO_CHAR("
281
256
  collector = visit o.left, collector
282
- collector << ')'
283
- return collector
284
- when :ntext
285
- collector << 'TO_NCLOB('
286
- collector = visit o.left, collector
287
- collector << ')'
257
+ collector << ")"
288
258
  return collector
289
259
  when :time
290
260
  if (o.left.respond_to?(:return_type) && o.left.return_type == :string) || o.left.is_a?(Arel::Nodes::Quoted)
291
- collector << 'TO_DATE('
261
+ collector << "TO_DATE("
292
262
  collector = visit o.left, collector
293
263
  collector << ",'HH24:MI:SS')"
294
264
  else
295
- collector << 'TO_DATE(TO_CHAR('
265
+ collector << "TO_DATE(TO_CHAR("
296
266
  collector = visit o.left, collector
297
267
  collector << ",'HH24:MI:SS'),'HH24:MI:SS')"
298
268
  end
299
269
  return collector
300
270
  when :number, :decimal
301
- collector << 'TO_NUMBER('
271
+ collector << "TO_NUMBER("
302
272
  collector = visit o.left, collector
303
- collector << ')'
273
+ collector << ")"
304
274
  return collector
305
275
  when :datetime
306
276
  as_attr = Arel::Nodes::SqlLiteral.new('timestamp')
307
277
  when :date
308
278
  if (o.left.respond_to?(:return_type) && o.left.return_type == :string) || o.left.is_a?(Arel::Nodes::Quoted)
309
- collector << 'TO_DATE('
279
+ collector << "TO_DATE("
310
280
  collector = visit o.left, collector
311
281
  collector << ",'YYYY-MM-DD')"
312
282
  else
313
- collector << 'TO_DATE(TO_CHAR('
283
+ collector << "TO_DATE(TO_CHAR("
314
284
  collector = visit o.left, collector
315
285
  collector << ",'YYYY-MM-DD'),'YYYY-MM-DD')"
316
286
  end
@@ -320,18 +290,18 @@ module ArelExtensions
320
290
  else
321
291
  as_attr = Arel::Nodes::SqlLiteral.new(o.as_attr.to_s)
322
292
  end
323
- collector << 'CAST('
293
+ collector << "CAST("
324
294
  collector = visit o.left, collector
325
- collector << ' AS '
295
+ collector << " AS "
326
296
  collector = visit as_attr, collector
327
- collector << ')'
297
+ collector << ")"
328
298
  collector
329
299
  end
330
300
 
331
301
  def visit_ArelExtensions_Nodes_Length o, collector
332
- collector << "LENGTH#{o.bytewise ? 'B' : ''}("
302
+ collector << "LENGTH("
333
303
  collector = visit o.expr, collector
334
- collector << ')'
304
+ collector << ")"
335
305
  collector
336
306
  end
337
307
 
@@ -348,51 +318,51 @@ module ArelExtensions
348
318
  end
349
319
 
350
320
  def visit_ArelExtensions_Nodes_Rand o, collector
351
- collector << 'DBMS_RANDOM.VALUE('
321
+ collector << "DBMS_RANDOM.VALUE("
352
322
  if o.left && o.right
353
323
  collector = visit o.left, collector
354
- collector << COMMA
324
+ collector << Arel::Visitors::Oracle::COMMA
355
325
  collector = visit o.right, collector
356
326
  end
357
- collector << ')'
327
+ collector << ")"
358
328
  collector
359
329
  end
360
330
 
361
331
  def visit_Arel_Nodes_Regexp o, collector
362
- collector << ' REGEXP_LIKE('
332
+ collector << " REGEXP_LIKE("
363
333
  collector = visit o.left, collector
364
- collector << COMMA
334
+ collector << Arel::Visitors::Oracle::COMMA
365
335
  collector = visit o.right, collector
366
336
  collector << ')'
367
337
  collector
368
338
  end
369
339
 
370
340
  def visit_Arel_Nodes_NotRegexp o, collector
371
- collector << ' NOT REGEXP_LIKE('
341
+ collector << " NOT REGEXP_LIKE("
372
342
  collector = visit o.left, collector
373
- collector << COMMA
343
+ collector << Arel::Visitors::Oracle::COMMA
374
344
  collector = visit o.right, collector
375
345
  collector << ')'
376
346
  collector
377
347
  end
378
348
 
379
349
  def visit_ArelExtensions_Nodes_Locate o, collector
380
- collector << 'INSTR('
350
+ collector << "INSTR("
381
351
  o.expressions.each_with_index { |arg, i|
382
- collector << COMMA if i != 0
352
+ collector << Arel::Visitors::Oracle::COMMA unless i == 0
383
353
  collector = visit arg, collector
384
354
  }
385
- collector << ')'
355
+ collector << ")"
386
356
  collector
387
357
  end
388
358
 
389
359
  def visit_ArelExtensions_Nodes_Substring o, collector
390
- collector << 'SUBSTR('
360
+ collector << "SUBSTR("
391
361
  o.expressions.each_with_index { |arg, i|
392
- collector << COMMA if i != 0
362
+ collector << Arel::Visitors::Oracle::COMMA unless i == 0
393
363
  collector = visit arg, collector
394
364
  }
395
- collector << ')'
365
+ collector << ")"
396
366
  collector
397
367
  end
398
368
 
@@ -408,17 +378,17 @@ module ArelExtensions
408
378
  if o.type_of_attribute(o.left) == :text
409
379
  collector << 'dbms_lob.SUBSTR('
410
380
  collector = visit o.left, collector
411
- collector << COMMA
381
+ collector << Arel::Visitors::Oracle::COMMA
412
382
  collector << 'COALESCE(dbms_lob.GETLENGTH('
413
383
  collector = visit o.left, collector
414
- collector << '), 0)'
415
- collector << COMMA
384
+ collector << "), 0)"
385
+ collector << Arel::Visitors::Oracle::COMMA
416
386
  collector << '1)'
417
387
  else
418
388
  collector = visit o.left, collector
419
389
  end
420
390
  collector << ')' if o.left.is_a? ArelExtensions::Nodes::Trim
421
- collector << ')'
391
+ collector << ")"
422
392
  collector
423
393
  end
424
394
 
@@ -431,7 +401,7 @@ module ArelExtensions
431
401
  end
432
402
  collector << ' FROM '
433
403
  collector = visit o.left, collector
434
- collector << ')'
404
+ collector << ")"
435
405
  collector
436
406
  end
437
407
 
@@ -444,7 +414,7 @@ module ArelExtensions
444
414
  end
445
415
  collector << ' FROM '
446
416
  collector = visit o.left, collector
447
- collector << ')'
417
+ collector << ")"
448
418
  collector
449
419
  end
450
420
 
@@ -459,92 +429,80 @@ module ArelExtensions
459
429
  def visit_ArelExtensions_Nodes_DateAdd o, collector
460
430
  collector << '('
461
431
  collector = visit o.left, collector
462
- collector << ' + ' # (o.right.value >= 0 ? ' + ' : ' - ')
432
+ collector << ' + '# (o.right.value >= 0 ? ' + ' : ' - ')
463
433
  collector = visit o.oracle_value(o.right), collector
464
434
  collector << ')'
465
435
  collector
466
436
  end
467
437
 
468
438
  def visit_ArelExtensions_Nodes_Format o, collector
469
- visit_ArelExtensions_Nodes_FormattedDate o, collector
470
- end
471
-
472
- def visit_ArelExtensions_Nodes_FormattedDate o, collector
473
- fmt = ArelExtensions::Visitors::strftime_to_format(o.iso_format, DATE_FORMAT_DIRECTIVES)
474
- collector << 'TO_CHAR('
475
- collector << 'CAST(' if o.time_zone
439
+ collector << "TO_CHAR("
476
440
  collector = visit o.left, collector
477
- case o.time_zone
478
- when Hash
479
- src_tz, dst_tz = o.time_zone.first
480
- collector << ' as timestamp) at time zone '
481
- collector = visit Arel.quoted(src_tz), collector
482
- collector < ' at time zone '
483
- collector = visit Arel.quoted(dst_tz), collector
484
- when String
485
- collector << ' as timestamp) at time zone '
486
- collector = visit Arel.quoted(o.time_zone), collector
487
- end
488
- collector << COMMA
489
- collector = visit Arel.quoted(fmt), collector
490
- collector << ')'
441
+ collector << Arel::Visitors::Oracle::COMMA
442
+
443
+ f = o.iso_format.gsub(/\ (\w+)/, ' "\1"')
444
+ Arel::Visitors::Oracle::DATE_FORMAT_DIRECTIVES.each { |d, r| f.gsub!(d, r) }
445
+ collector = visit Arel::Nodes.build_quoted(f), collector
446
+
447
+ collector << ")"
491
448
  collector
492
449
  end
493
450
 
494
451
  def visit_ArelExtensions_Nodes_Repeat o, collector
495
- collector << 'LPAD('
496
- collector = visit o.expressions[0], collector # can't put empty string, otherwise it wouldn't work
452
+ collector << "LPAD("
453
+ collector = visit o.expressions[0], collector #can't put empty string, otherwise it wouldn't work
497
454
  collector << Arel::Visitors::ToSql::COMMA
498
455
  collector = visit o.expressions[1], collector
499
456
  collector << Arel::Visitors::ToSql::COMMA
500
457
  collector = visit o.expressions[0], collector
501
- collector << ')'
458
+ collector << ")"
502
459
  collector
503
460
  end
504
461
 
505
- # add primary_key if not present, avoid zip
506
- if AREL_VERSION < V7
462
+ # add primary_key if not present, avoid zip
463
+ if Arel::VERSION.to_i < 7
507
464
  def visit_ArelExtensions_InsertManager_BulkValues o, collector
508
- collector << '('
465
+ collector << "("
509
466
  o.left.each_with_index do |row, idx| # values
510
- collector << ' UNION ALL ' if idx != 0
511
- collector << '(SELECT '
512
- len = row.length - 1
513
- row.zip(o.cols).each_with_index { |(value, attr), i|
514
- case value
515
- when Arel::Nodes::SqlLiteral, Arel::Nodes::BindParam
516
- collector = visit value, collector
517
- else
518
- collector << quote(value, attr && column_for(attr)).to_s
519
- end
520
- collector << COMMA unless i == len
467
+ collector << " UNION ALL " if idx != 0
468
+ collector << "(SELECT "
469
+ v = Arel::Nodes::Values.new(row, o.cols)
470
+ len = v.expressions.length - 1
471
+ v.expressions.each_with_index { |value, i|
472
+ case value
473
+ when Arel::Nodes::SqlLiteral, Arel::Nodes::BindParam
474
+ collector = visit value, collector
475
+ else
476
+ attr = v.columns[i]
477
+ collector << quote(value, attr && column_for(attr)).to_s
478
+ end
479
+ collector << Arel::Visitors::Oracle::COMMA unless i == len
521
480
  }
522
481
  collector << ' FROM DUAL)'
523
482
  end
524
- collector << ')'
483
+ collector << ")"
525
484
  collector
526
485
  end
527
486
  else
528
487
  def visit_ArelExtensions_InsertManager_BulkValues o, collector
529
- collector << '('
488
+ collector << "("
530
489
  o.left.each_with_index do |row, idx|
531
- collector << ' UNION ALL ' if idx != 0
532
- collector << '(SELECT '
490
+ collector << " UNION ALL " if idx != 0
491
+ collector << "(SELECT "
533
492
  len = row.length - 1
534
- row.zip(o.cols).each_with_index { |(value, attr), i|
493
+ row.each_with_index { |value, i|
494
+ attr = o.cols[i]
535
495
  case value
536
496
  when Arel::Nodes::SqlLiteral, Arel::Nodes::BindParam
537
497
  collector = visit value, collector
538
- when Integer
539
- collector << value.to_s
540
498
  else
541
499
  collector << (attr && attr.able_to_type_cast? ? quote(attr.type_cast_for_database(value)) : quote(value).to_s)
542
500
  end
543
- collector << COMMA unless i == len
501
+ collector << Arel::Visitors::Oracle::COMMA unless i == len
544
502
  }
545
503
  collector << ' FROM DUAL)'
546
504
  end
547
- collector << ')'
505
+ collector << ")"
548
506
  collector
549
507
  end
550
508
  end
@@ -554,7 +512,7 @@ module ArelExtensions
554
512
  if element.is_a?(Time)
555
513
  ArelExtensions::Nodes::Format.new [element, '%H:%M:%S']
556
514
  elsif element.is_a?(Arel::Attributes::Attribute)
557
- col = Arel.column_of(element.relation.table_name, element.name.to_s)
515
+ col = Arel::Table.engine.connection.schema_cache.columns_hash(element.relation.table_name)[element.name.to_s]
558
516
  if col && (col.type == :time)
559
517
  ArelExtensions::Nodes::Format.new [element, '%H:%M:%S']
560
518
  else
@@ -569,7 +527,7 @@ module ArelExtensions
569
527
  remove_method(:visit_Arel_Nodes_GreaterThanOrEqual) rescue nil
570
528
  def visit_Arel_Nodes_GreaterThanOrEqual o, collector
571
529
  collector = visit get_time_converted(o.left), collector
572
- collector << ' >= '
530
+ collector << " >= "
573
531
  collector = visit get_time_converted(o.right), collector
574
532
  collector
575
533
  end
@@ -577,7 +535,7 @@ module ArelExtensions
577
535
  remove_method(:visit_Arel_Nodes_GreaterThan) rescue nil
578
536
  def visit_Arel_Nodes_GreaterThan o, collector
579
537
  collector = visit get_time_converted(o.left), collector
580
- collector << ' > '
538
+ collector << " > "
581
539
  collector = visit get_time_converted(o.right), collector
582
540
  collector
583
541
  end
@@ -585,7 +543,7 @@ module ArelExtensions
585
543
  remove_method(:visit_Arel_Nodes_LessThanOrEqual) rescue nil
586
544
  def visit_Arel_Nodes_LessThanOrEqual o, collector
587
545
  collector = visit get_time_converted(o.left), collector
588
- collector << ' <= '
546
+ collector << " <= "
589
547
  collector = visit get_time_converted(o.right), collector
590
548
  collector
591
549
  end
@@ -593,30 +551,30 @@ module ArelExtensions
593
551
  remove_method(:visit_Arel_Nodes_LessThan) rescue nil
594
552
  def visit_Arel_Nodes_LessThan o, collector
595
553
  collector = visit get_time_converted(o.left), collector
596
- collector << ' < '
554
+ collector << " < "
597
555
  collector = visit get_time_converted(o.right), collector
598
556
  collector
599
557
  end
600
558
 
601
559
 
602
- alias_method(:old_visit_Arel_Nodes_SelectStatement, :visit_Arel_Nodes_SelectStatement) rescue nil
560
+ alias_method :old_visit_Arel_Nodes_SelectStatement, :visit_Arel_Nodes_SelectStatement
603
561
  def visit_Arel_Nodes_SelectStatement o, collector
604
562
  if !(collector.value.blank? || (collector.value.is_a?(Array) && collector.value[0].blank?)) && o.limit.blank? && o.offset.blank?
605
563
  o = o.dup
606
564
  o.orders = []
607
565
  end
608
- old_visit_Arel_Nodes_SelectStatement(o, collector)
566
+ old_visit_Arel_Nodes_SelectStatement(o,collector)
609
567
  end
610
568
 
611
- alias_method(:old_visit_Arel_Nodes_TableAlias, :visit_Arel_Nodes_TableAlias) rescue nil
569
+ alias_method :old_visit_Arel_Nodes_TableAlias, :visit_Arel_Nodes_TableAlias
612
570
  def visit_Arel_Nodes_TableAlias o, collector
613
571
  if o.name.length > 30
614
- o = Arel::Table.new(o.table_name).alias(Arel.shorten(o.name))
572
+ o = Arel::Table.new(o.table_name).alias(Base64.urlsafe_encode64(Digest::MD5.new.digest(o.name)).tr('=', '').tr('-', '_'))
615
573
  end
616
- old_visit_Arel_Nodes_TableAlias(o, collector)
574
+ old_visit_Arel_Nodes_TableAlias(o,collector)
617
575
  end
618
576
 
619
- alias_method(:old_visit_Arel_Nodes_As, :visit_Arel_Nodes_As) rescue nil
577
+ alias_method :old_visit_Arel_Nodes_As, :visit_Arel_Nodes_As
620
578
  def visit_Arel_Nodes_As o, collector
621
579
  if o.left.is_a?(Arel::Nodes::Binary)
622
580
  collector << '('
@@ -625,7 +583,7 @@ module ArelExtensions
625
583
  else
626
584
  collector = visit o.left, collector
627
585
  end
628
- quote = /(\A".*"\z)|\A[a-zA-Z_]*\z/.match?(o.right.to_s) ? '' : '"'
586
+ quote = o.right.to_s =~ /(\A["].*["]\z)|\A[a-zA-Z_]*\z/ ? '' : '"'
629
587
  collector << " AS #{quote}"
630
588
  collector = visit o.right, collector
631
589
  collector << "#{quote}"
@@ -636,7 +594,7 @@ module ArelExtensions
636
594
  visit_Arel_Nodes_As o, collector
637
595
  end
638
596
 
639
- alias_method(:old_visit_Arel_Attributes_Attribute, :visit_Arel_Attributes_Attribute) rescue nil
597
+ alias_method :old_visit_Arel_Attributes_Attribute, :visit_Arel_Attributes_Attribute
640
598
  def visit_Arel_Attributes_Attribute o, collector
641
599
  join_name = o.relation.table_alias || o.relation.name
642
600
  if join_name.length > 30
@@ -645,56 +603,52 @@ module ArelExtensions
645
603
  collector << "#{quote_table_name join_name}.#{quote_column_name o.name}"
646
604
  end
647
605
 
606
+
648
607
  def visit_ArelExtensions_Nodes_FormattedNumber o, collector
649
608
  col = o.left.coalesce(0)
650
- comma = NUMBER_COMMA_MAPPING[o.locale] || '.,'
609
+ comma = Arel::Visitors::Oracle::NUMBER_COMMA_MAPPING[o.locale] || '.,'
651
610
  comma_in_format = o.precision == 0 ? '' : 'D'
652
- nines_after = (1..o.precision - 1).map{'9'}.join('') + '0'
611
+ nines_after = (1..o.precision-1).map{'9'}.join('')+'0'
653
612
  if comma.length == 1
654
- options = Arel.quoted("NLS_NUMERIC_CHARACTERS = '#{comma} '")
655
- nines_before = ('999' * 4 + '990')
613
+ options = Arel::Nodes.build_quoted("NLS_NUMERIC_CHARACTERS = '"+comma+" '")
614
+ nines_before = ("999"*4+"990")
656
615
  else
657
- options = Arel.quoted("NLS_NUMERIC_CHARACTERS = '#{comma}'")
658
- nines_before = ('999G' * 4 + '990')
616
+ options = Arel::Nodes.build_quoted("NLS_NUMERIC_CHARACTERS = '"+comma+"'")
617
+ nines_before = ("999G"*4+"990")
659
618
  end
660
- sign = Arel.when(col < 0).
619
+ sign = ArelExtensions::Nodes::Case.new.when(col<0).
661
620
  then('-').
662
621
  else(o.flags.include?('+') ? '+' : (o.flags.include?(' ') ? ' ' : ''))
663
622
  sign_length = o.flags.include?('+') || o.flags.include?(' ') ?
664
- Arel.quoted(1) :
665
- Arel.when(col < 0).then(1).else(0)
623
+ Arel::Nodes.build_quoted(1) :
624
+ ArelExtensions::Nodes::Case.new.when(col<0).then(1).else(0)
666
625
 
667
626
  if o.scientific_notation
668
- number = Arel::Nodes::NamedFunction.new('TO_CHAR', [
669
- Arel.quoted(col.abs),
670
- Arel.quoted("FM#{nines_before}#{comma_in_format}#{nines_after}EEEE"),
627
+ number = Arel::Nodes::NamedFunction.new('TO_CHAR',[
628
+ Arel::Nodes.build_quoted(col.abs),
629
+ Arel::Nodes.build_quoted('FM'+nines_before+comma_in_format+nines_after+'EEEE'),
671
630
  options
672
631
  ])
673
632
  if o.type == 'e'
674
- number = number.replace('E', 'e')
633
+ number = number.replace('E','e')
675
634
  end
676
635
  else
677
- number = Arel::Nodes::NamedFunction.new('TO_CHAR', [
678
- Arel.quoted(col.abs),
679
- Arel.quoted("FM#{nines_before}#{comma_in_format}#{nines_after}"),
636
+ number = Arel::Nodes::NamedFunction.new('TO_CHAR',[
637
+ Arel::Nodes.build_quoted(col.abs),
638
+ Arel::Nodes.build_quoted('FM'+nines_before+comma_in_format+nines_after),
680
639
  options
681
640
  ])
682
641
  end
683
642
 
684
- repeated_char =
685
- if o.width == 0
686
- Arel.quoted('')
687
- else
688
- Arel
689
- .when(Arel.quoted(o.width).abs - (number.length + sign_length) > 0)
690
- .then(Arel.quoted(
691
- o.flags.include?('-') ? ' ' : (o.flags.include?('0') ? '0' : ' ')
692
- ).repeat(Arel.quoted(o.width).abs - (number.length + sign_length))
693
- )
694
- .else('')
695
- end
696
- before = !o.flags.include?('0') && !o.flags.include?('-') ? repeated_char : ''
697
- middle = o.flags.include?('0') && !o.flags.include?('-') ? repeated_char : ''
643
+ repeated_char = (o.width == 0) ? Arel::Nodes.build_quoted('') : ArelExtensions::Nodes::Case.new().
644
+ when(Arel::Nodes.build_quoted(o.width).abs-(number.length+sign_length)>0).
645
+ then(Arel::Nodes.build_quoted(
646
+ o.flags.include?('-') ? ' ' : (o.flags.include?('0') ? '0' : ' ')
647
+ ).repeat(Arel::Nodes.build_quoted(o.width).abs-(number.length+sign_length))
648
+ ).
649
+ else('')
650
+ before = (!o.flags.include?('0'))&&(!o.flags.include?('-')) ? repeated_char : ''
651
+ middle = (o.flags.include?('0'))&&(!o.flags.include?('-')) ? repeated_char : ''
698
652
  after = o.flags.include?('-') ? repeated_char : ''
699
653
  full_number = ArelExtensions::Nodes::Concat.new([
700
654
  before,
@@ -703,26 +657,26 @@ module ArelExtensions
703
657
  number,
704
658
  after
705
659
  ])
706
- collector = visit ArelExtensions::Nodes::Concat.new([Arel.quoted(o.prefix), full_number, Arel.quoted(o.suffix)]), collector
660
+ collector = visit ArelExtensions::Nodes::Concat.new([Arel::Nodes.build_quoted(o.prefix),full_number,Arel::Nodes.build_quoted(o.suffix)]), collector
707
661
  collector
708
662
  end
709
663
 
710
664
  def visit_ArelExtensions_Nodes_Std o, collector
711
- collector << (o.unbiased_estimator ? 'STDDEV_SAMP(' : 'STDDEV_POP(')
665
+ collector << (o.unbiased_estimator ? "STDDEV_SAMP(" : "STDDEV_POP(")
712
666
  visit o.left, collector
713
- collector << ')'
667
+ collector << ")"
714
668
  collector
715
669
  end
716
670
 
717
671
  def visit_ArelExtensions_Nodes_Variance o, collector
718
- collector << (o.unbiased_estimator ? 'VAR_SAMP(' : 'VAR_POP(')
672
+ collector << (o.unbiased_estimator ? "VAR_SAMP(" : "VAR_POP(")
719
673
  visit o.left, collector
720
- collector << ')'
674
+ collector << ")"
721
675
  collector
722
676
  end
723
677
 
724
678
  def visit_ArelExtensions_Nodes_LevenshteinDistance o, collector
725
- collector << 'UTL_MATCH.edit_distance('
679
+ collector << "UTL_MATCH.edit_distance("
726
680
  collector = visit o.left, collector
727
681
  collector << Arel::Visitors::ToSql::COMMA
728
682
  collector = visit o.right, collector
@@ -730,17 +684,6 @@ module ArelExtensions
730
684
  collector
731
685
  end
732
686
 
733
- # Utilized by GroupingSet, Cube & RollUp visitors to
734
- # handle grouping aggregation semantics
735
- def grouping_array_or_grouping_element(o, collector)
736
- if o.expr.is_a? Array
737
- collector << "( "
738
- visit o.expr, collector
739
- collector << " )"
740
- else
741
- visit o.expr, collector
742
- end
743
- end
744
687
  end
745
688
  end
746
689
  end