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.
- checksums.yaml +4 -4
- data/.codeclimate.yml +2 -1
- data/.gitignore +6 -7
- data/.rubocop.yml +3 -67
- data/.travis/oracle/download.js +152 -0
- data/.travis/oracle/download.sh +30 -0
- data/.travis/oracle/download_ojdbc.js +116 -0
- data/.travis/oracle/install.sh +34 -0
- data/.travis/setup_accounts.sh +9 -0
- data/.travis/sqlite3/extension-functions.sh +6 -0
- data/.travis.yml +223 -0
- data/Gemfile +28 -2
- data/README.md +91 -258
- data/Rakefile +30 -48
- data/TODO +1 -0
- data/appveyor.yml +22 -60
- data/arel_extensions.gemspec +14 -13
- data/functions.html +3 -3
- data/gemfiles/rails3.gemfile +20 -0
- data/gemfiles/rails4.gemfile +29 -0
- data/gemfiles/rails5_0.gemfile +29 -0
- data/gemfiles/rails5_1_4.gemfile +14 -14
- data/gemfiles/rails5_2.gemfile +14 -16
- data/init/mssql.sql +4 -4
- data/init/mysql.sql +38 -38
- data/init/oracle.sql +0 -0
- data/init/postgresql.sql +25 -24
- data/init/sqlite.sql +0 -0
- data/lib/arel_extensions/attributes.rb +3 -7
- data/lib/arel_extensions/boolean_functions.rb +14 -53
- data/lib/arel_extensions/common_sql_functions.rb +17 -16
- data/lib/arel_extensions/comparators.rb +28 -29
- data/lib/arel_extensions/date_duration.rb +13 -17
- data/lib/arel_extensions/insert_manager.rb +15 -18
- data/lib/arel_extensions/math.rb +53 -55
- data/lib/arel_extensions/math_functions.rb +39 -46
- data/lib/arel_extensions/nodes/abs.rb +1 -0
- data/lib/arel_extensions/nodes/blank.rb +2 -1
- data/lib/arel_extensions/nodes/case.rb +19 -20
- data/lib/arel_extensions/nodes/cast.rb +8 -10
- data/lib/arel_extensions/nodes/ceil.rb +1 -1
- data/lib/arel_extensions/nodes/coalesce.rb +4 -3
- data/lib/arel_extensions/nodes/collate.rb +10 -9
- data/lib/arel_extensions/nodes/concat.rb +18 -9
- data/lib/arel_extensions/nodes/date_diff.rb +26 -42
- data/lib/arel_extensions/nodes/duration.rb +3 -0
- data/lib/arel_extensions/nodes/find_in_set.rb +1 -0
- data/lib/arel_extensions/nodes/floor.rb +1 -1
- data/lib/arel_extensions/nodes/format.rb +8 -35
- data/lib/arel_extensions/nodes/formatted_number.rb +23 -22
- data/lib/arel_extensions/nodes/function.rb +37 -46
- data/lib/arel_extensions/nodes/is_null.rb +0 -0
- data/lib/arel_extensions/nodes/json.rb +39 -52
- data/lib/arel_extensions/nodes/length.rb +0 -5
- data/lib/arel_extensions/nodes/levenshtein_distance.rb +1 -1
- data/lib/arel_extensions/nodes/locate.rb +2 -1
- data/lib/arel_extensions/nodes/log10.rb +2 -1
- data/lib/arel_extensions/nodes/matches.rb +8 -6
- data/lib/arel_extensions/nodes/md5.rb +1 -0
- data/lib/arel_extensions/nodes/power.rb +5 -5
- data/lib/arel_extensions/nodes/rand.rb +1 -0
- data/lib/arel_extensions/nodes/repeat.rb +5 -3
- data/lib/arel_extensions/nodes/replace.rb +8 -16
- data/lib/arel_extensions/nodes/round.rb +6 -5
- data/lib/arel_extensions/nodes/soundex.rb +15 -15
- data/lib/arel_extensions/nodes/std.rb +21 -18
- data/lib/arel_extensions/nodes/substring.rb +16 -8
- data/lib/arel_extensions/nodes/then.rb +1 -1
- data/lib/arel_extensions/nodes/trim.rb +6 -4
- data/lib/arel_extensions/nodes/union.rb +8 -5
- data/lib/arel_extensions/nodes/union_all.rb +7 -4
- data/lib/arel_extensions/nodes/wday.rb +4 -0
- data/lib/arel_extensions/nodes.rb +1 -1
- data/lib/arel_extensions/null_functions.rb +5 -19
- data/lib/arel_extensions/predications.rb +44 -45
- data/lib/arel_extensions/railtie.rb +5 -5
- data/lib/arel_extensions/set_functions.rb +7 -5
- data/lib/arel_extensions/string_functions.rb +35 -91
- data/lib/arel_extensions/tasks.rb +6 -6
- data/lib/arel_extensions/version.rb +1 -1
- data/lib/arel_extensions/visitors/ibm_db.rb +31 -24
- data/lib/arel_extensions/visitors/mssql.rb +194 -440
- data/lib/arel_extensions/visitors/mysql.rb +212 -368
- data/lib/arel_extensions/visitors/oracle.rb +179 -236
- data/lib/arel_extensions/visitors/oracle12.rb +31 -18
- data/lib/arel_extensions/visitors/postgresql.rb +173 -271
- data/lib/arel_extensions/visitors/sqlite.rb +127 -157
- data/lib/arel_extensions/visitors/to_sql.rb +238 -300
- data/lib/arel_extensions/visitors.rb +62 -83
- data/lib/arel_extensions.rb +31 -235
- data/test/database.yml +10 -20
- data/test/helper.rb +18 -0
- data/test/real_db_test.rb +118 -121
- data/test/support/fake_record.rb +3 -11
- data/test/test_comparators.rb +17 -14
- data/test/visitors/test_bulk_insert_oracle.rb +12 -12
- data/test/visitors/test_bulk_insert_sqlite.rb +14 -13
- data/test/visitors/test_bulk_insert_to_sql.rb +13 -11
- data/test/visitors/test_oracle.rb +55 -55
- data/test/visitors/test_to_sql.rb +226 -419
- data/test/with_ar/all_agnostic_test.rb +370 -773
- data/test/with_ar/insert_agnostic_test.rb +22 -28
- data/test/with_ar/test_bulk_sqlite.rb +17 -18
- data/test/with_ar/test_math_sqlite.rb +27 -27
- data/test/with_ar/test_string_mysql.rb +34 -32
- data/test/with_ar/test_string_sqlite.rb +35 -31
- metadata +38 -52
- data/.github/workflows/publish.yml +0 -30
- data/.github/workflows/release.yml +0 -30
- data/.github/workflows/ruby.yml +0 -452
- data/CONTRIBUTING.md +0 -102
- data/Makefile +0 -18
- data/NEWS.md +0 -116
- data/bin/build +0 -15
- data/bin/publish +0 -8
- data/dev/arelx.dockerfile +0 -41
- data/dev/compose.yaml +0 -69
- data/dev/postgres.dockerfile +0 -5
- data/dev/rbenv +0 -189
- data/gemfiles/rails5.gemfile +0 -29
- data/gemfiles/rails6.gemfile +0 -34
- data/gemfiles/rails6_1.gemfile +0 -42
- data/gemfiles/rails7.gemfile +0 -42
- data/gemfiles/rails7_1.gemfile +0 -41
- data/gemfiles/rails7_2.gemfile +0 -41
- data/gemfiles/rails8.gemfile +0 -40
- data/gemfiles/rails8_1.gemfile +0 -41
- data/gemspecs/arel_extensions-v1.gemspec +0 -27
- data/gemspecs/arel_extensions-v2.gemspec +0 -27
- data/generate_gems.sh +0 -15
- data/lib/arel_extensions/aliases.rb +0 -14
- data/lib/arel_extensions/constants.rb +0 -13
- data/lib/arel_extensions/helpers.rb +0 -61
- data/lib/arel_extensions/nodes/aggregate_function.rb +0 -13
- data/lib/arel_extensions/nodes/byte_size.rb +0 -11
- data/lib/arel_extensions/nodes/char_length.rb +0 -11
- data/lib/arel_extensions/nodes/formatted_date.rb +0 -42
- data/lib/arel_extensions/nodes/rollup.rb +0 -36
- data/lib/arel_extensions/nodes/select.rb +0 -10
- data/lib/arel_extensions/nodes/sum.rb +0 -7
- data/lib/arel_extensions/visitors/convert_format.rb +0 -37
- data/lib/arel_extensions/warning.rb +0 -42
- data/test/arelx_test_helper.rb +0 -94
- data/test/config_loader.rb +0 -9
- data/version_v1.rb +0 -3
- data/version_v2.rb +0 -3
|
@@ -1,50 +1,36 @@
|
|
|
1
|
-
#
|
|
1
|
+
#require 'oracle_visitor'
|
|
2
2
|
module ArelExtensions
|
|
3
3
|
module Visitors
|
|
4
|
-
|
|
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' => '
|
|
9
|
-
'%
|
|
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
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
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
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
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
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
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 <<
|
|
131
|
+
collector << "(LISTAGG("
|
|
150
132
|
collector = visit o.left, collector
|
|
151
|
-
collector << COMMA
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
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 <<
|
|
153
|
+
collector << "COALESCE("
|
|
174
154
|
o.expressions.each_with_index { |arg, i|
|
|
175
|
-
collector << COMMA
|
|
155
|
+
collector << Arel::Visitors::Oracle::COMMA unless i == 0
|
|
176
156
|
if i > 0 && o.left_node_type == :text
|
|
177
|
-
if arg == ''
|
|
178
|
-
collector <<
|
|
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 <<
|
|
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 <<
|
|
222
|
+
collector << "TO_CHAR("
|
|
243
223
|
collector = visit o.right, collector
|
|
244
|
-
collector << COMMA
|
|
245
|
-
collector = visit Arel.
|
|
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',
|
|
228
|
+
when 'd','m','y'
|
|
249
229
|
interval = 'DAY'
|
|
250
230
|
o.right.cast(:date)
|
|
251
|
-
when 'h',
|
|
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 <<
|
|
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 <<
|
|
261
|
+
collector << "TO_DATE("
|
|
292
262
|
collector = visit o.left, collector
|
|
293
263
|
collector << ",'HH24:MI:SS')"
|
|
294
264
|
else
|
|
295
|
-
collector <<
|
|
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 <<
|
|
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 <<
|
|
279
|
+
collector << "TO_DATE("
|
|
310
280
|
collector = visit o.left, collector
|
|
311
281
|
collector << ",'YYYY-MM-DD')"
|
|
312
282
|
else
|
|
313
|
-
collector <<
|
|
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 <<
|
|
293
|
+
collector << "CAST("
|
|
324
294
|
collector = visit o.left, collector
|
|
325
|
-
collector <<
|
|
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
|
|
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 <<
|
|
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 <<
|
|
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 <<
|
|
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 <<
|
|
350
|
+
collector << "INSTR("
|
|
381
351
|
o.expressions.each_with_index { |arg, i|
|
|
382
|
-
collector << COMMA
|
|
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 <<
|
|
360
|
+
collector << "SUBSTR("
|
|
391
361
|
o.expressions.each_with_index { |arg, i|
|
|
392
|
-
collector << COMMA
|
|
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 <<
|
|
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 << ' + '
|
|
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
|
-
|
|
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
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
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 <<
|
|
496
|
-
collector = visit o.expressions[0], collector #
|
|
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
|
-
|
|
506
|
-
if
|
|
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
|
-
|
|
511
|
-
collector <<
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
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 <<
|
|
532
|
-
collector <<
|
|
490
|
+
collector << " UNION ALL " if idx != 0
|
|
491
|
+
collector << "(SELECT "
|
|
533
492
|
len = row.length - 1
|
|
534
|
-
row.
|
|
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.
|
|
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
|
|
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,
|
|
566
|
+
old_visit_Arel_Nodes_SelectStatement(o,collector)
|
|
609
567
|
end
|
|
610
568
|
|
|
611
|
-
alias_method
|
|
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(
|
|
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,
|
|
574
|
+
old_visit_Arel_Nodes_TableAlias(o,collector)
|
|
617
575
|
end
|
|
618
576
|
|
|
619
|
-
alias_method
|
|
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
|
|
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
|
|
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
|
|
611
|
+
nines_after = (1..o.precision-1).map{'9'}.join('')+'0'
|
|
653
612
|
if comma.length == 1
|
|
654
|
-
options = Arel.
|
|
655
|
-
nines_before = (
|
|
613
|
+
options = Arel::Nodes.build_quoted("NLS_NUMERIC_CHARACTERS = '"+comma+" '")
|
|
614
|
+
nines_before = ("999"*4+"990")
|
|
656
615
|
else
|
|
657
|
-
options = Arel.
|
|
658
|
-
nines_before = (
|
|
616
|
+
options = Arel::Nodes.build_quoted("NLS_NUMERIC_CHARACTERS = '"+comma+"'")
|
|
617
|
+
nines_before = ("999G"*4+"990")
|
|
659
618
|
end
|
|
660
|
-
sign =
|
|
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.
|
|
665
|
-
|
|
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.
|
|
670
|
-
Arel.
|
|
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',
|
|
633
|
+
number = number.replace('E','e')
|
|
675
634
|
end
|
|
676
635
|
else
|
|
677
|
-
number = Arel::Nodes::NamedFunction.new('TO_CHAR',
|
|
678
|
-
Arel.
|
|
679
|
-
Arel.
|
|
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
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
Arel
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
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.
|
|
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 ?
|
|
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 ?
|
|
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 <<
|
|
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
|