arel_extensions 1.7.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 -8
  4. data/.rubocop.yml +4 -194
  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 +89 -265
  14. data/Rakefile +30 -50
  15. data/TODO +1 -0
  16. data/appveyor.yml +22 -60
  17. data/arel_extensions.gemspec +17 -14
  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 +17 -19
  23. data/gemfiles/rails5_2.gemfile +17 -26
  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 -9
  30. data/lib/arel_extensions/boolean_functions.rb +16 -57
  31. data/lib/arel_extensions/common_sql_functions.rb +20 -21
  32. data/lib/arel_extensions/comparators.rb +28 -31
  33. data/lib/arel_extensions/date_duration.rb +13 -19
  34. data/lib/arel_extensions/insert_manager.rb +15 -22
  35. data/lib/arel_extensions/math.rb +70 -68
  36. data/lib/arel_extensions/math_functions.rb +52 -57
  37. data/lib/arel_extensions/nodes/abs.rb +1 -0
  38. data/lib/arel_extensions/nodes/blank.rb +5 -6
  39. data/lib/arel_extensions/nodes/case.rb +27 -31
  40. data/lib/arel_extensions/nodes/cast.rb +12 -12
  41. data/lib/arel_extensions/nodes/ceil.rb +1 -1
  42. data/lib/arel_extensions/nodes/coalesce.rb +5 -4
  43. data/lib/arel_extensions/nodes/collate.rb +10 -9
  44. data/lib/arel_extensions/nodes/concat.rb +22 -13
  45. data/lib/arel_extensions/nodes/date_diff.rb +70 -77
  46. data/lib/arel_extensions/nodes/duration.rb +5 -2
  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 +39 -50
  52. data/lib/arel_extensions/nodes/is_null.rb +0 -2
  53. data/lib/arel_extensions/nodes/json.rb +47 -72
  54. data/lib/arel_extensions/nodes/length.rb +0 -5
  55. data/lib/arel_extensions/nodes/levenshtein_distance.rb +2 -2
  56. data/lib/arel_extensions/nodes/locate.rb +3 -2
  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 +3 -2
  62. data/lib/arel_extensions/nodes/repeat.rb +6 -4
  63. data/lib/arel_extensions/nodes/replace.rb +8 -16
  64. data/lib/arel_extensions/nodes/round.rb +7 -6
  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 -58
  68. data/lib/arel_extensions/nodes/then.rb +2 -2
  69. data/lib/arel_extensions/nodes/trim.rb +7 -5
  70. data/lib/arel_extensions/nodes/union.rb +9 -6
  71. data/lib/arel_extensions/nodes/union_all.rb +8 -5
  72. data/lib/arel_extensions/nodes/wday.rb +6 -2
  73. data/lib/arel_extensions/nodes.rb +1 -1
  74. data/lib/arel_extensions/null_functions.rb +6 -18
  75. data/lib/arel_extensions/predications.rb +49 -54
  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 +55 -110
  79. data/lib/arel_extensions/tasks.rb +6 -6
  80. data/lib/arel_extensions/version.rb +1 -3
  81. data/lib/arel_extensions/visitors/ibm_db.rb +36 -29
  82. data/lib/arel_extensions/visitors/mssql.rb +248 -493
  83. data/lib/arel_extensions/visitors/mysql.rb +244 -420
  84. data/lib/arel_extensions/visitors/oracle.rb +258 -311
  85. data/lib/arel_extensions/visitors/oracle12.rb +34 -20
  86. data/lib/arel_extensions/visitors/postgresql.rb +239 -350
  87. data/lib/arel_extensions/visitors/sqlite.rb +169 -191
  88. data/lib/arel_extensions/visitors/to_sql.rb +299 -371
  89. data/lib/arel_extensions/visitors.rb +62 -83
  90. data/lib/arel_extensions.rb +32 -243
  91. data/test/database.yml +10 -20
  92. data/test/helper.rb +18 -0
  93. data/test/real_db_test.rb +120 -123
  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 +375 -912
  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 +64 -50
  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 -48
  113. data/NEWS.md +0 -131
  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 -36
  121. data/gemfiles/rails6.gemfile +0 -40
  122. data/gemfiles/rails6_1.gemfile +0 -48
  123. data/gemfiles/rails7.gemfile +0 -48
  124. data/gemfiles/rails7_1.gemfile +0 -48
  125. data/gemfiles/rails7_2.gemfile +0 -47
  126. data/gemfiles/rails8.gemfile +0 -40
  127. data/gemfiles/rails8_1.gemfile +0 -41
  128. data/gemspecs/arel_extensions-v1.gemspec +0 -25
  129. data/gemspecs/arel_extensions-v2.gemspec +0 -25
  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 -5
  146. data/version_v2.rb +0 -5
@@ -1,53 +1,39 @@
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
- def visit_ArelExtensions_Nodes_Log10(o, collector)
31
- collector << 'LOG('
32
- o.expressions.each_with_index { |arg, i|
33
- collector << COMMA if i != 0
34
- collector = visit arg, collector
35
- }
36
- collector << ',10)'
37
- collector
16
+ def visit_ArelExtensions_Nodes_Log10 o, 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
- def visit_ArelExtensions_Nodes_Power(o, collector)
41
- collector << 'POWER('
42
- o.expressions.each_with_index { |arg, i|
43
- collector << COMMA if i != 0
44
- collector = visit arg, collector
45
- }
46
- collector << ')'
47
- collector
26
+ def visit_ArelExtensions_Nodes_Power o, 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
- def visit_ArelExtensions_Nodes_Concat(o, collector)
36
+ def visit_ArelExtensions_Nodes_Concat o, collector
51
37
  collector << '('
52
38
  o.expressions.each_with_index { |arg, i|
53
39
  collector = visit o.convert_to_string_node(arg), collector
@@ -57,7 +43,7 @@ module ArelExtensions
57
43
  collector
58
44
  end
59
45
 
60
- def visit_ArelExtensions_Nodes_IMatches(o, collector)
46
+ def visit_ArelExtensions_Nodes_IMatches o, collector
61
47
  collector << 'LOWER('
62
48
  collector = visit o.left, collector
63
49
  collector << ') LIKE LOWER('
@@ -71,7 +57,7 @@ module ArelExtensions
71
57
  end
72
58
  end
73
59
 
74
- def visit_ArelExtensions_Nodes_AiMatches(o, collector)
60
+ def visit_ArelExtensions_Nodes_AiMatches o, collector
75
61
  collector = visit o.left.ai_collate, collector
76
62
  collector << ' LIKE '
77
63
  collector = visit o.right.ai_collate, collector
@@ -83,7 +69,7 @@ module ArelExtensions
83
69
  end
84
70
  end
85
71
 
86
- def visit_ArelExtensions_Nodes_AiIMatches(o, collector)
72
+ def visit_ArelExtensions_Nodes_AiIMatches o, collector
87
73
  collector = visit o.left.ai_collate, collector
88
74
  collector << ' LIKE '
89
75
  collector = visit o.right.ai_collate, collector
@@ -95,7 +81,7 @@ module ArelExtensions
95
81
  end
96
82
  end
97
83
 
98
- def visit_ArelExtensions_Nodes_SMatches(o, collector)
84
+ def visit_ArelExtensions_Nodes_SMatches o, collector
99
85
  collector = visit o.left, collector
100
86
  collector << ' LIKE '
101
87
  collector = visit o.right, collector
@@ -107,7 +93,8 @@ module ArelExtensions
107
93
  end
108
94
  end
109
95
 
110
- def visit_ArelExtensions_Nodes_IDoesNotMatch(o, collector)
96
+
97
+ def visit_ArelExtensions_Nodes_IDoesNotMatch o, collector
111
98
  collector << 'LOWER('
112
99
  collector = visit o.left, collector
113
100
  collector << ') NOT LIKE LOWER('
@@ -121,61 +108,54 @@ module ArelExtensions
121
108
  end
122
109
  end
123
110
 
124
- 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
111
+ def visit_ArelExtensions_Nodes_Collate o, 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
- def visit_ArelExtensions_Nodes_GroupConcat(o, collector)
149
- collector << '(LISTAGG('
130
+ def visit_ArelExtensions_Nodes_GroupConcat o, collector
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 Arel.quoted(','), collector
156
- else
157
- visit o.separator, collector
158
- end
159
- collector << ') WITHIN GROUP (ORDER BY '
160
- if o.order.blank?
161
- collector = visit o.left, collector
133
+ collector << Arel::Visitors::Oracle::COMMA
134
+ if o.right && o.right != 'NULL'
135
+ collector = visit o.right, collector
162
136
  else
163
- o.order.each_with_index do |order, i|
164
- collector << COMMA if i != 0
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
165
143
  collector = visit order, collector
166
144
  end
145
+ else
146
+ collector = visit o.left, collector
167
147
  end
168
- collector << '))'
148
+ collector << "))"
169
149
  collector
170
150
  end
171
151
 
172
- def visit_ArelExtensions_Nodes_Coalesce(o, collector)
173
- collector << 'COALESCE('
152
+ def visit_ArelExtensions_Nodes_Coalesce o, collector
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,37 +165,37 @@ 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
- def visit_ArelExtensions_Nodes_MD5(o, collector)
193
- collector << 'LOWER (RAWTOHEX (DBMS_OBFUSCATION_TOOLKIT.md5(input => UTL_I18N.STRING_TO_RAW('
172
+ def visit_ArelExtensions_Nodes_MD5 o, collector
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
197
177
  end
198
178
 
199
179
  # :date is not possible in Oracle since this type does not really exist
200
- def visit_ArelExtensions_Nodes_DateDiff(o, collector)
201
- lc = %i[ruby_date ruby_time].include?(o.left_node_type)
202
- rc = %i[ruby_date ruby_time].include?(o.right_node_type)
180
+ def visit_ArelExtensions_Nodes_DateDiff o, collector
181
+ lc = o.left_node_type == :ruby_date || o.left_node_type == :ruby_time
182
+ rc = o.right_node_type == :ruby_date || o.right_node_type == :ruby_time
203
183
  if rc || o.right_node_type == :date || o.right_node_type == :datetime || o.right_node_type == :time
204
184
  collector << '('
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
212
192
  collector << ')'
213
- if %i[ruby_time datetime time].include?(o.left_node_type)
193
+ if (o.left_node_type == :ruby_time || o.left_node_type == :datetime || o.left_node_type == :time)
214
194
  collector << ' * (CASE WHEN (TRUNC('
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
@@ -236,82 +216,71 @@ module ArelExtensions
236
216
  collector
237
217
  end
238
218
 
239
- def visit_ArelExtensions_Nodes_Duration(o, collector)
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
- right =
248
- case o.left
249
- when 'd', 'm', 'y'
250
- interval = 'DAY'
251
- o.right.cast(:date)
252
- when 'h', 'mn', 's'
253
- interval = 'SECOND'
254
- o.right.cast(:datetime)
255
- when /i\z/
256
- interval = DATE_MAPPING[o.left[0..-2]]
257
- collector << '('
258
- collector = visit o.right, collector
259
- collector << ") * (INTERVAL '1' #{interval})"
260
- return collector
261
- else
262
- interval = nil
263
- o.right
264
- end
265
- collector << "EXTRACT(#{DATE_MAPPING[o.left]} FROM "
227
+ right = case o.left
228
+ when 'd','m','y'
229
+ interval = 'DAY'
230
+ o.right.cast(:date)
231
+ when 'h','mn','s'
232
+ interval = 'SECOND'
233
+ o.right.cast(:datetime)
234
+ when /i\z/
235
+ interval = Arel::Visitors::Oracle::DATE_MAPPING[o.left[0..-2]]
236
+ collector << '('
237
+ collector = visit o.right, collector
238
+ collector << ") * (INTERVAL '1' #{interval})"
239
+ return collector
240
+ else
241
+ interval = nil
242
+ o.right
243
+ end
244
+ collector << "EXTRACT(#{Arel::Visitors::Oracle::DATE_MAPPING[o.left]} FROM "
266
245
  collector = visit right, collector
267
246
  end
268
- collector << ')'
247
+ collector << ")"
269
248
  collector << " * (INTERVAL '1' #{interval})" if interval && o.with_interval
270
249
  collector
271
250
  end
272
251
 
273
- def visit_ArelExtensions_Nodes_Cast(o, collector)
252
+ def visit_ArelExtensions_Nodes_Cast o, collector
274
253
  case o.as_attr
275
254
  when :string
276
- collector << 'TO_CHAR('
255
+ collector << "TO_CHAR("
277
256
  collector = visit o.left, collector
278
- collector << ')'
279
- return collector
280
- when :text
281
- collector << 'TO_CLOB('
282
- collector = visit o.left, collector
283
- collector << ')'
284
- return collector
285
- when :ntext
286
- collector << 'TO_NCLOB('
287
- collector = visit o.left, collector
288
- collector << ')'
257
+ collector << ")"
289
258
  return collector
290
259
  when :time
291
260
  if (o.left.respond_to?(:return_type) && o.left.return_type == :string) || o.left.is_a?(Arel::Nodes::Quoted)
292
- collector << 'TO_DATE('
261
+ collector << "TO_DATE("
293
262
  collector = visit o.left, collector
294
263
  collector << ",'HH24:MI:SS')"
295
264
  else
296
- collector << 'TO_DATE(TO_CHAR('
265
+ collector << "TO_DATE(TO_CHAR("
297
266
  collector = visit o.left, collector
298
267
  collector << ",'HH24:MI:SS'),'HH24:MI:SS')"
299
268
  end
300
269
  return collector
301
270
  when :number, :decimal
302
- collector << 'TO_NUMBER('
271
+ collector << "TO_NUMBER("
303
272
  collector = visit o.left, collector
304
- collector << ')'
273
+ collector << ")"
305
274
  return collector
306
275
  when :datetime
307
276
  as_attr = Arel::Nodes::SqlLiteral.new('timestamp')
308
277
  when :date
309
278
  if (o.left.respond_to?(:return_type) && o.left.return_type == :string) || o.left.is_a?(Arel::Nodes::Quoted)
310
- collector << 'TO_DATE('
279
+ collector << "TO_DATE("
311
280
  collector = visit o.left, collector
312
281
  collector << ",'YYYY-MM-DD')"
313
282
  else
314
- collector << 'TO_DATE(TO_CHAR('
283
+ collector << "TO_DATE(TO_CHAR("
315
284
  collector = visit o.left, collector
316
285
  collector << ",'YYYY-MM-DD'),'YYYY-MM-DD')"
317
286
  end
@@ -321,85 +290,83 @@ module ArelExtensions
321
290
  else
322
291
  as_attr = Arel::Nodes::SqlLiteral.new(o.as_attr.to_s)
323
292
  end
324
- collector << 'CAST('
293
+ collector << "CAST("
325
294
  collector = visit o.left, collector
326
- collector << ' AS '
295
+ collector << " AS "
327
296
  collector = visit as_attr, collector
328
- collector << ')'
297
+ collector << ")"
329
298
  collector
330
299
  end
331
300
 
332
- def visit_ArelExtensions_Nodes_Length(o, collector)
333
- collector << "LENGTH#{'B' if o.bytewise}("
301
+ def visit_ArelExtensions_Nodes_Length o, collector
302
+ collector << "LENGTH("
334
303
  collector = visit o.expr, collector
335
- collector << ')'
304
+ collector << ")"
336
305
  collector
337
306
  end
338
307
 
339
- def visit_ArelExtensions_Nodes_IsNull(o, collector)
308
+ def visit_ArelExtensions_Nodes_IsNull o, collector
340
309
  collector = visit o.expr, collector
341
310
  collector << ' IS NULL'
342
311
  collector
343
312
  end
344
313
 
345
- def visit_ArelExtensions_Nodes_IsNotNull(o, collector)
314
+ def visit_ArelExtensions_Nodes_IsNotNull o, collector
346
315
  collector = visit o.expr, collector
347
316
  collector << ' IS NOT NULL'
348
317
  collector
349
318
  end
350
319
 
351
- def visit_ArelExtensions_Nodes_Rand(o, collector)
352
- collector << 'DBMS_RANDOM.VALUE('
320
+ def visit_ArelExtensions_Nodes_Rand o, collector
321
+ collector << "DBMS_RANDOM.VALUE("
353
322
  if o.left && o.right
354
323
  collector = visit o.left, collector
355
- collector << COMMA
324
+ collector << Arel::Visitors::Oracle::COMMA
356
325
  collector = visit o.right, collector
357
326
  end
358
- collector << ')'
327
+ collector << ")"
359
328
  collector
360
329
  end
361
330
 
362
- def visit_Arel_Nodes_Regexp(o, collector)
363
- collector << ' REGEXP_LIKE('
331
+ def visit_Arel_Nodes_Regexp o, collector
332
+ collector << " REGEXP_LIKE("
364
333
  collector = visit o.left, collector
365
- collector << COMMA
334
+ collector << Arel::Visitors::Oracle::COMMA
366
335
  collector = visit o.right, collector
367
336
  collector << ')'
368
337
  collector
369
338
  end
370
339
 
371
- def visit_Arel_Nodes_NotRegexp(o, collector)
372
- collector << ' NOT REGEXP_LIKE('
340
+ def visit_Arel_Nodes_NotRegexp o, collector
341
+ collector << " NOT REGEXP_LIKE("
373
342
  collector = visit o.left, collector
374
- collector << COMMA
343
+ collector << Arel::Visitors::Oracle::COMMA
375
344
  collector = visit o.right, collector
376
345
  collector << ')'
377
346
  collector
378
347
  end
379
348
 
380
- def visit_ArelExtensions_Nodes_Locate(o, collector)
381
- collector << 'INSTR('
349
+ def visit_ArelExtensions_Nodes_Locate o, collector
350
+ collector << "INSTR("
382
351
  o.expressions.each_with_index { |arg, i|
383
- collector << COMMA if i != 0
352
+ collector << Arel::Visitors::Oracle::COMMA unless i == 0
384
353
  collector = visit arg, collector
385
354
  }
386
- collector << ')'
355
+ collector << ")"
387
356
  collector
388
357
  end
389
358
 
390
- def visit_ArelExtensions_Nodes_Substring(o, collector)
391
- return visit(o.range_substring_node, collector) if o.range?
392
-
393
- collector << 'SUBSTR('
359
+ def visit_ArelExtensions_Nodes_Substring o, collector
360
+ collector << "SUBSTR("
394
361
  o.expressions.each_with_index { |arg, i|
395
- collector << COMMA if i != 0
362
+ collector << Arel::Visitors::Oracle::COMMA unless i == 0
396
363
  collector = visit arg, collector
397
364
  }
398
- collector << ')'
365
+ collector << ")"
399
366
  collector
400
367
  end
401
368
 
402
- def visit_ArelExtensions_Nodes_Trim(o, collector)
369
+ def visit_ArelExtensions_Nodes_Trim o, collector
403
370
  collector << 'TRIM(' # BOTH
404
371
  if o.right.expr && SPECIAL_CHARS[o.right.expr]
405
372
  collector << SPECIAL_CHARS[o.right.expr]
@@ -411,21 +378,21 @@ module ArelExtensions
411
378
  if o.type_of_attribute(o.left) == :text
412
379
  collector << 'dbms_lob.SUBSTR('
413
380
  collector = visit o.left, collector
414
- collector << COMMA
381
+ collector << Arel::Visitors::Oracle::COMMA
415
382
  collector << 'COALESCE(dbms_lob.GETLENGTH('
416
383
  collector = visit o.left, collector
417
- collector << '), 0)'
418
- collector << COMMA
384
+ collector << "), 0)"
385
+ collector << Arel::Visitors::Oracle::COMMA
419
386
  collector << '1)'
420
387
  else
421
388
  collector = visit o.left, collector
422
389
  end
423
390
  collector << ')' if o.left.is_a? ArelExtensions::Nodes::Trim
424
- collector << ')'
391
+ collector << ")"
425
392
  collector
426
393
  end
427
394
 
428
- def visit_ArelExtensions_Nodes_Ltrim(o, collector)
395
+ def visit_ArelExtensions_Nodes_Ltrim o, collector
429
396
  collector << 'TRIM(LEADING '
430
397
  if o.right.expr && SPECIAL_CHARS[o.right.expr]
431
398
  collector << SPECIAL_CHARS[o.right.expr]
@@ -434,11 +401,11 @@ module ArelExtensions
434
401
  end
435
402
  collector << ' FROM '
436
403
  collector = visit o.left, collector
437
- collector << ')'
404
+ collector << ")"
438
405
  collector
439
406
  end
440
407
 
441
- def visit_ArelExtensions_Nodes_Rtrim(o, collector)
408
+ def visit_ArelExtensions_Nodes_Rtrim o, collector
442
409
  collector << 'TRIM(TRAILING '
443
410
  if o.right.expr && SPECIAL_CHARS[o.right.expr]
444
411
  collector << SPECIAL_CHARS[o.right.expr]
@@ -447,116 +414,105 @@ module ArelExtensions
447
414
  end
448
415
  collector << ' FROM '
449
416
  collector = visit o.left, collector
450
- collector << ')'
417
+ collector << ")"
451
418
  collector
452
419
  end
453
420
 
454
- def visit_ArelExtensions_Nodes_Blank(o, collector)
421
+ def visit_ArelExtensions_Nodes_Blank o, collector
455
422
  visit o.expr.trim.length.coalesce(0).eq(0), collector
456
423
  end
457
424
 
458
- def visit_ArelExtensions_Nodes_NotBlank(o, collector)
425
+ def visit_ArelExtensions_Nodes_NotBlank o, collector
459
426
  visit o.expr.trim.length.coalesce(0).gt(0), collector
460
427
  end
461
428
 
462
- def visit_ArelExtensions_Nodes_DateAdd(o, collector)
429
+ def visit_ArelExtensions_Nodes_DateAdd o, collector
463
430
  collector << '('
464
431
  collector = visit o.left, collector
465
- collector << ' + ' # (o.right.value >= 0 ? ' + ' : ' - ')
432
+ collector << ' + '# (o.right.value >= 0 ? ' + ' : ' - ')
466
433
  collector = visit o.oracle_value(o.right), collector
467
434
  collector << ')'
468
435
  collector
469
436
  end
470
437
 
471
- def visit_ArelExtensions_Nodes_Format(o, collector)
472
- visit_ArelExtensions_Nodes_FormattedDate o, collector
473
- end
474
-
475
- def visit_ArelExtensions_Nodes_FormattedDate(o, collector)
476
- fmt = ArelExtensions::Visitors.strftime_to_format(o.iso_format, DATE_FORMAT_DIRECTIVES)
477
- collector << 'TO_CHAR('
478
- collector << 'CAST(' if o.time_zone
438
+ def visit_ArelExtensions_Nodes_Format o, collector
439
+ collector << "TO_CHAR("
479
440
  collector = visit o.left, collector
480
- case o.time_zone
481
- when Hash
482
- src_tz, dst_tz = o.time_zone.first
483
- collector << ' as timestamp) at time zone '
484
- collector = visit Arel.quoted(src_tz), collector
485
- collector << ' at time zone '
486
- collector = visit Arel.quoted(dst_tz), collector
487
- when String
488
- collector << ' as timestamp) at time zone '
489
- collector = visit Arel.quoted(o.time_zone), collector
490
- end
491
- collector << COMMA
492
- collector = visit Arel.quoted(fmt), collector
493
- 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 << ")"
494
448
  collector
495
449
  end
496
450
 
497
- def visit_ArelExtensions_Nodes_Repeat(o, collector)
498
- collector << 'LPAD('
499
- collector = visit o.expressions[0], collector # can't put empty string, otherwise it wouldn't work
500
- collector << COMMA
451
+ def visit_ArelExtensions_Nodes_Repeat o, collector
452
+ collector << "LPAD("
453
+ collector = visit o.expressions[0], collector #can't put empty string, otherwise it wouldn't work
454
+ collector << Arel::Visitors::ToSql::COMMA
501
455
  collector = visit o.expressions[1], collector
502
- collector << COMMA
456
+ collector << Arel::Visitors::ToSql::COMMA
503
457
  collector = visit o.expressions[0], collector
504
- collector << ')'
458
+ collector << ")"
505
459
  collector
506
460
  end
507
461
 
508
- # add primary_key if not present, avoid zip
509
- if AREL_VERSION < V7
510
- def visit_ArelExtensions_InsertManager_BulkValues(o, collector)
511
- collector << '('
462
+ # add primary_key if not present, avoid zip
463
+ if Arel::VERSION.to_i < 7
464
+ def visit_ArelExtensions_InsertManager_BulkValues o, collector
465
+ collector << "("
512
466
  o.left.each_with_index do |row, idx| # values
513
- collector << ' UNION ALL ' if idx != 0
514
- collector << '(SELECT '
515
- len = row.length - 1
516
- row.zip(o.cols).each_with_index { |(value, attr), i|
517
- case value
518
- when Arel::Nodes::SqlLiteral, Arel::Nodes::BindParam
519
- collector = visit value, collector
520
- else
521
- collector << quote(value, attr && column_for(attr)).to_s
522
- end
523
- 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
524
480
  }
525
481
  collector << ' FROM DUAL)'
526
482
  end
527
- collector << ')'
483
+ collector << ")"
528
484
  collector
529
485
  end
530
486
  else
531
- def visit_ArelExtensions_InsertManager_BulkValues(o, collector)
532
- collector << '('
487
+ def visit_ArelExtensions_InsertManager_BulkValues o, collector
488
+ collector << "("
533
489
  o.left.each_with_index do |row, idx|
534
- collector << ' UNION ALL ' if idx != 0
535
- collector << '(SELECT '
490
+ collector << " UNION ALL " if idx != 0
491
+ collector << "(SELECT "
536
492
  len = row.length - 1
537
- row.zip(o.cols).each_with_index { |(value, attr), i|
493
+ row.each_with_index { |value, i|
494
+ attr = o.cols[i]
538
495
  case value
539
496
  when Arel::Nodes::SqlLiteral, Arel::Nodes::BindParam
540
497
  collector = visit value, collector
541
- when Integer
542
- collector << value.to_s
543
498
  else
544
499
  collector << (attr && attr.able_to_type_cast? ? quote(attr.type_cast_for_database(value)) : quote(value).to_s)
545
500
  end
546
- collector << COMMA unless i == len
501
+ collector << Arel::Visitors::Oracle::COMMA unless i == len
547
502
  }
548
503
  collector << ' FROM DUAL)'
549
504
  end
550
- collector << ')'
505
+ collector << ")"
551
506
  collector
552
507
  end
553
508
  end
554
509
 
555
- def get_time_converted(element)
510
+
511
+ def get_time_converted element
556
512
  if element.is_a?(Time)
557
513
  ArelExtensions::Nodes::Format.new [element, '%H:%M:%S']
558
514
  elsif element.is_a?(Arel::Attributes::Attribute)
559
- 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]
560
516
  if col && (col.type == :time)
561
517
  ArelExtensions::Nodes::Format.new [element, '%H:%M:%S']
562
518
  else
@@ -567,53 +523,59 @@ module ArelExtensions
567
523
  end
568
524
  end
569
525
 
526
+
570
527
  remove_method(:visit_Arel_Nodes_GreaterThanOrEqual) rescue nil
571
- def visit_Arel_Nodes_GreaterThanOrEqual(o, collector)
528
+ def visit_Arel_Nodes_GreaterThanOrEqual o, collector
572
529
  collector = visit get_time_converted(o.left), collector
573
- collector << ' >= '
574
- visit get_time_converted(o.right), collector
530
+ collector << " >= "
531
+ collector = visit get_time_converted(o.right), collector
532
+ collector
575
533
  end
576
534
 
577
535
  remove_method(:visit_Arel_Nodes_GreaterThan) rescue nil
578
- def visit_Arel_Nodes_GreaterThan(o, collector)
536
+ def visit_Arel_Nodes_GreaterThan o, collector
579
537
  collector = visit get_time_converted(o.left), collector
580
- collector << ' > '
581
- visit get_time_converted(o.right), collector
538
+ collector << " > "
539
+ collector = visit get_time_converted(o.right), collector
540
+ collector
582
541
  end
583
542
 
584
543
  remove_method(:visit_Arel_Nodes_LessThanOrEqual) rescue nil
585
- def visit_Arel_Nodes_LessThanOrEqual(o, collector)
544
+ def visit_Arel_Nodes_LessThanOrEqual o, collector
586
545
  collector = visit get_time_converted(o.left), collector
587
- collector << ' <= '
588
- visit get_time_converted(o.right), collector
546
+ collector << " <= "
547
+ collector = visit get_time_converted(o.right), collector
548
+ collector
589
549
  end
590
550
 
591
551
  remove_method(:visit_Arel_Nodes_LessThan) rescue nil
592
- def visit_Arel_Nodes_LessThan(o, collector)
552
+ def visit_Arel_Nodes_LessThan o, collector
593
553
  collector = visit get_time_converted(o.left), collector
594
- collector << ' < '
595
- visit get_time_converted(o.right), collector
554
+ collector << " < "
555
+ collector = visit get_time_converted(o.right), collector
556
+ collector
596
557
  end
597
558
 
598
- alias old_visit_Arel_Nodes_SelectStatement visit_Arel_Nodes_SelectStatement rescue nil
599
- def visit_Arel_Nodes_SelectStatement(o, collector)
559
+
560
+ alias_method :old_visit_Arel_Nodes_SelectStatement, :visit_Arel_Nodes_SelectStatement
561
+ def visit_Arel_Nodes_SelectStatement o, collector
600
562
  if !(collector.value.blank? || (collector.value.is_a?(Array) && collector.value[0].blank?)) && o.limit.blank? && o.offset.blank?
601
563
  o = o.dup
602
564
  o.orders = []
603
565
  end
604
- old_visit_Arel_Nodes_SelectStatement(o, collector)
566
+ old_visit_Arel_Nodes_SelectStatement(o,collector)
605
567
  end
606
568
 
607
- alias old_visit_Arel_Nodes_TableAlias visit_Arel_Nodes_TableAlias rescue nil
608
- def visit_Arel_Nodes_TableAlias(o, collector)
569
+ alias_method :old_visit_Arel_Nodes_TableAlias, :visit_Arel_Nodes_TableAlias
570
+ def visit_Arel_Nodes_TableAlias o, collector
609
571
  if o.name.length > 30
610
- 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('-', '_'))
611
573
  end
612
- old_visit_Arel_Nodes_TableAlias(o, collector)
574
+ old_visit_Arel_Nodes_TableAlias(o,collector)
613
575
  end
614
576
 
615
- alias old_visit_Arel_Nodes_As visit_Arel_Nodes_As rescue nil
616
- def visit_Arel_Nodes_As(o, collector)
577
+ alias_method :old_visit_Arel_Nodes_As, :visit_Arel_Nodes_As
578
+ def visit_Arel_Nodes_As o, collector
617
579
  if o.left.is_a?(Arel::Nodes::Binary)
618
580
  collector << '('
619
581
  collector = visit o.left, collector
@@ -621,19 +583,19 @@ module ArelExtensions
621
583
  else
622
584
  collector = visit o.left, collector
623
585
  end
624
- 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/ ? '' : '"'
625
587
  collector << " AS #{quote}"
626
588
  collector = visit o.right, collector
627
589
  collector << "#{quote}"
628
590
  collector
629
591
  end
630
592
 
631
- def visit_ArelExtensions_Nodes_As(o, collector)
593
+ def visit_ArelExtensions_Nodes_As o, collector
632
594
  visit_Arel_Nodes_As o, collector
633
595
  end
634
596
 
635
- alias old_visit_Arel_Attributes_Attribute visit_Arel_Attributes_Attribute rescue nil
636
- def visit_Arel_Attributes_Attribute(o, collector)
597
+ alias_method :old_visit_Arel_Attributes_Attribute, :visit_Arel_Attributes_Attribute
598
+ def visit_Arel_Attributes_Attribute o, collector
637
599
  join_name = o.relation.table_alias || o.relation.name
638
600
  if join_name.length > 30
639
601
  join_name = Arel.shorten(join_name)
@@ -641,56 +603,52 @@ module ArelExtensions
641
603
  collector << "#{quote_table_name join_name}.#{quote_column_name o.name}"
642
604
  end
643
605
 
644
- def visit_ArelExtensions_Nodes_FormattedNumber(o, collector)
606
+
607
+ def visit_ArelExtensions_Nodes_FormattedNumber o, collector
645
608
  col = o.left.coalesce(0)
646
- comma = NUMBER_COMMA_MAPPING[o.locale] || '.,'
609
+ comma = Arel::Visitors::Oracle::NUMBER_COMMA_MAPPING[o.locale] || '.,'
647
610
  comma_in_format = o.precision == 0 ? '' : 'D'
648
- nines_after = (1..o.precision - 1).map { '9' }.join('') + '0'
611
+ nines_after = (1..o.precision-1).map{'9'}.join('')+'0'
649
612
  if comma.length == 1
650
- options = Arel.quoted("NLS_NUMERIC_CHARACTERS = '#{comma} '")
651
- nines_before = ('999' * 4 + '990')
613
+ options = Arel::Nodes.build_quoted("NLS_NUMERIC_CHARACTERS = '"+comma+" '")
614
+ nines_before = ("999"*4+"990")
652
615
  else
653
- options = Arel.quoted("NLS_NUMERIC_CHARACTERS = '#{comma}'")
654
- nines_before = ('999G' * 4 + '990')
616
+ options = Arel::Nodes.build_quoted("NLS_NUMERIC_CHARACTERS = '"+comma+"'")
617
+ nines_before = ("999G"*4+"990")
655
618
  end
656
- sign = Arel.when(col < 0).
619
+ sign = ArelExtensions::Nodes::Case.new.when(col<0).
657
620
  then('-').
658
621
  else(o.flags.include?('+') ? '+' : (o.flags.include?(' ') ? ' ' : ''))
659
622
  sign_length = o.flags.include?('+') || o.flags.include?(' ') ?
660
- Arel.quoted(1) :
661
- 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)
662
625
 
663
626
  if o.scientific_notation
664
- number = Arel::Nodes::NamedFunction.new('TO_CHAR', [
665
- Arel.quoted(col.abs),
666
- 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'),
667
630
  options
668
631
  ])
669
632
  if o.type == 'e'
670
- number = number.replace('E', 'e')
633
+ number = number.replace('E','e')
671
634
  end
672
635
  else
673
- number = Arel::Nodes::NamedFunction.new('TO_CHAR', [
674
- Arel.quoted(col.abs),
675
- 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),
676
639
  options
677
640
  ])
678
641
  end
679
642
 
680
- repeated_char =
681
- if o.width == 0
682
- Arel.quoted('')
683
- else
684
- Arel
685
- .when(Arel.quoted(o.width).abs - (number.length + sign_length) > 0)
686
- .then(Arel.quoted(
687
- o.flags.include?('-') ? ' ' : (o.flags.include?('0') ? '0' : ' ')
688
- ).repeat(Arel.quoted(o.width).abs - (number.length + sign_length))
689
- )
690
- .else('')
691
- end
692
- before = !o.flags.include?('0') && !o.flags.include?('-') ? repeated_char : ''
693
- 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 : ''
694
652
  after = o.flags.include?('-') ? repeated_char : ''
695
653
  full_number = ArelExtensions::Nodes::Concat.new([
696
654
  before,
@@ -699,44 +657,33 @@ module ArelExtensions
699
657
  number,
700
658
  after
701
659
  ])
702
- 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
703
661
  collector
704
662
  end
705
663
 
706
- def visit_ArelExtensions_Nodes_Std(o, collector)
707
- collector << (o.unbiased_estimator ? 'STDDEV_SAMP(' : 'STDDEV_POP(')
664
+ def visit_ArelExtensions_Nodes_Std o, collector
665
+ collector << (o.unbiased_estimator ? "STDDEV_SAMP(" : "STDDEV_POP(")
708
666
  visit o.left, collector
709
- collector << ')'
667
+ collector << ")"
710
668
  collector
711
669
  end
712
670
 
713
- def visit_ArelExtensions_Nodes_Variance(o, collector)
714
- collector << (o.unbiased_estimator ? 'VAR_SAMP(' : 'VAR_POP(')
671
+ def visit_ArelExtensions_Nodes_Variance o, collector
672
+ collector << (o.unbiased_estimator ? "VAR_SAMP(" : "VAR_POP(")
715
673
  visit o.left, collector
716
- collector << ')'
674
+ collector << ")"
717
675
  collector
718
676
  end
719
677
 
720
- def visit_ArelExtensions_Nodes_LevenshteinDistance(o, collector)
721
- collector << 'UTL_MATCH.edit_distance('
678
+ def visit_ArelExtensions_Nodes_LevenshteinDistance o, collector
679
+ collector << "UTL_MATCH.edit_distance("
722
680
  collector = visit o.left, collector
723
- collector << COMMA
681
+ collector << Arel::Visitors::ToSql::COMMA
724
682
  collector = visit o.right, collector
725
683
  collector << ')'
726
684
  collector
727
685
  end
728
686
 
729
- # Utilized by GroupingSet, Cube & RollUp visitors to
730
- # handle grouping aggregation semantics
731
- def grouping_array_or_grouping_element(o, collector)
732
- if o.expr.is_a? Array
733
- collector << '( '
734
- visit o.expr, collector
735
- collector << ' )'
736
- else
737
- visit o.expr, collector
738
- end
739
- end
740
687
  end
741
688
  end
742
689
  end