arel_extensions 2.1.3 → 2.1.4
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 +1 -2
- data/.github/workflows/ruby.yml +4 -4
- data/.rubocop.yml +25 -1
- data/Gemfile +10 -10
- data/README.md +1 -2
- data/Rakefile +4 -4
- data/TODO +0 -1
- data/arel_extensions.gemspec +11 -11
- data/gemfiles/rails3.gemfile +10 -10
- data/gemfiles/rails4.gemfile +13 -13
- data/gemfiles/rails5_0.gemfile +12 -12
- data/gemfiles/rails5_1_4.gemfile +12 -12
- data/gemfiles/rails5_2.gemfile +13 -13
- data/gemfiles/rails6.gemfile +11 -11
- data/gemfiles/rails6_1.gemfile +11 -11
- data/gemfiles/rails7.gemfile +7 -7
- data/gemspecs/arel_extensions-v1.gemspec +12 -12
- data/gemspecs/arel_extensions-v2.gemspec +11 -11
- data/init/mssql.sql +0 -0
- data/init/mysql.sql +0 -0
- data/init/oracle.sql +0 -0
- data/init/postgresql.sql +0 -0
- data/init/sqlite.sql +0 -0
- data/lib/arel_extensions/attributes.rb +2 -2
- data/lib/arel_extensions/boolean_functions.rb +2 -4
- data/lib/arel_extensions/common_sql_functions.rb +10 -10
- data/lib/arel_extensions/comparators.rb +14 -14
- data/lib/arel_extensions/date_duration.rb +7 -7
- data/lib/arel_extensions/helpers.rb +16 -13
- data/lib/arel_extensions/insert_manager.rb +1 -1
- data/lib/arel_extensions/math.rb +16 -18
- data/lib/arel_extensions/math_functions.rb +18 -18
- data/lib/arel_extensions/nodes/abs.rb +0 -0
- data/lib/arel_extensions/nodes/aggregate_function.rb +0 -0
- data/lib/arel_extensions/nodes/blank.rb +1 -1
- data/lib/arel_extensions/nodes/case.rb +4 -6
- data/lib/arel_extensions/nodes/cast.rb +3 -3
- data/lib/arel_extensions/nodes/ceil.rb +0 -0
- data/lib/arel_extensions/nodes/change_case.rb +0 -0
- data/lib/arel_extensions/nodes/coalesce.rb +0 -0
- data/lib/arel_extensions/nodes/collate.rb +9 -9
- data/lib/arel_extensions/nodes/concat.rb +2 -2
- data/lib/arel_extensions/nodes/date_diff.rb +6 -6
- data/lib/arel_extensions/nodes/duration.rb +0 -0
- data/lib/arel_extensions/nodes/find_in_set.rb +0 -0
- data/lib/arel_extensions/nodes/floor.rb +0 -0
- data/lib/arel_extensions/nodes/format.rb +0 -0
- data/lib/arel_extensions/nodes/formatted_number.rb +2 -2
- data/lib/arel_extensions/nodes/function.rb +21 -21
- data/lib/arel_extensions/nodes/is_null.rb +0 -0
- data/lib/arel_extensions/nodes/json.rb +7 -7
- data/lib/arel_extensions/nodes/length.rb +0 -0
- data/lib/arel_extensions/nodes/levenshtein_distance.rb +1 -1
- data/lib/arel_extensions/nodes/locate.rb +0 -0
- data/lib/arel_extensions/nodes/log10.rb +0 -0
- data/lib/arel_extensions/nodes/matches.rb +1 -1
- data/lib/arel_extensions/nodes/md5.rb +0 -0
- data/lib/arel_extensions/nodes/power.rb +0 -0
- data/lib/arel_extensions/nodes/rand.rb +0 -0
- data/lib/arel_extensions/nodes/repeat.rb +0 -0
- data/lib/arel_extensions/nodes/replace.rb +2 -2
- data/lib/arel_extensions/nodes/round.rb +0 -0
- data/lib/arel_extensions/nodes/soundex.rb +2 -2
- data/lib/arel_extensions/nodes/std.rb +0 -0
- data/lib/arel_extensions/nodes/substring.rb +0 -0
- data/lib/arel_extensions/nodes/sum.rb +0 -0
- data/lib/arel_extensions/nodes/then.rb +0 -0
- data/lib/arel_extensions/nodes/trim.rb +0 -0
- data/lib/arel_extensions/nodes/union.rb +4 -4
- data/lib/arel_extensions/nodes/union_all.rb +3 -3
- data/lib/arel_extensions/nodes/wday.rb +0 -0
- data/lib/arel_extensions/nodes.rb +0 -0
- data/lib/arel_extensions/null_functions.rb +0 -0
- data/lib/arel_extensions/predications.rb +10 -10
- data/lib/arel_extensions/railtie.rb +1 -1
- data/lib/arel_extensions/set_functions.rb +3 -3
- data/lib/arel_extensions/string_functions.rb +8 -8
- data/lib/arel_extensions/tasks.rb +2 -2
- data/lib/arel_extensions/version.rb +1 -1
- data/lib/arel_extensions/visitors/convert_format.rb +0 -0
- data/lib/arel_extensions/visitors/ibm_db.rb +19 -19
- data/lib/arel_extensions/visitors/mssql.rb +127 -121
- data/lib/arel_extensions/visitors/mysql.rb +137 -145
- data/lib/arel_extensions/visitors/oracle.rb +128 -128
- data/lib/arel_extensions/visitors/oracle12.rb +16 -16
- data/lib/arel_extensions/visitors/postgresql.rb +139 -137
- data/lib/arel_extensions/visitors/sqlite.rb +83 -85
- data/lib/arel_extensions/visitors/to_sql.rb +143 -148
- data/lib/arel_extensions/visitors.rb +7 -7
- data/lib/arel_extensions.rb +46 -32
- data/test/arelx_test_helper.rb +14 -13
- data/test/database.yml +5 -5
- data/test/real_db_test.rb +78 -78
- data/test/support/fake_record.rb +1 -1
- data/test/test_comparators.rb +5 -5
- data/test/visitors/test_bulk_insert_oracle.rb +4 -4
- data/test/visitors/test_bulk_insert_sqlite.rb +4 -4
- data/test/visitors/test_bulk_insert_to_sql.rb +4 -4
- data/test/visitors/test_oracle.rb +14 -14
- data/test/visitors/test_to_sql.rb +82 -82
- data/test/with_ar/all_agnostic_test.rb +364 -299
- data/test/with_ar/insert_agnostic_test.rb +17 -14
- data/test/with_ar/test_bulk_sqlite.rb +4 -4
- data/test/with_ar/test_math_sqlite.rb +12 -12
- data/test/with_ar/test_string_mysql.rb +20 -20
- data/test/with_ar/test_string_sqlite.rb +20 -20
- data/version_v1.rb +1 -1
- data/version_v2.rb +1 -1
- metadata +2 -9
- data/.travis/oracle/download.js +0 -152
- data/.travis/oracle/download.sh +0 -30
- data/.travis/oracle/download_ojdbc.js +0 -116
- data/.travis/oracle/install.sh +0 -34
- data/.travis/setup_accounts.sh +0 -9
- data/.travis/sqlite3/extension-functions.sh +0 -6
- data/.travis.yml +0 -193
|
@@ -7,30 +7,30 @@ module ArelExtensions
|
|
|
7
7
|
DATE_FORMAT_DIRECTIVES = {
|
|
8
8
|
'%Y' => 'YYYY', '%C' => 'CC', '%y' => 'YY', '%m' => 'MM', '%B' => 'Month', '%^B' => 'MONTH', '%b' => 'Mon', '%^b' => 'MON',
|
|
9
9
|
'%V' => 'IW', '%G' => 'IYYY', # ISO week number and year of week
|
|
10
|
-
'%d' => 'DD', '%e' => 'FMDD', '%j' => 'DDD', '%w' => '', '%A' => 'Day',
|
|
10
|
+
'%d' => 'DD', '%e' => 'FMDD', '%j' => 'DDD', '%w' => '', '%a' => 'Dy', '%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
14
|
NUMBER_COMMA_MAPPING = { 'en_US' => '.,', 'fr_FR' => ',', 'sv_SE' => ', ' }
|
|
15
15
|
|
|
16
16
|
def visit_ArelExtensions_Nodes_Log10 o, collector
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
17
|
+
collector << 'LOG('
|
|
18
|
+
o.expressions.each_with_index { |arg, i|
|
|
19
|
+
collector << Arel::Visitors::ToSql::COMMA if i != 0
|
|
20
|
+
collector = visit arg, collector
|
|
21
|
+
}
|
|
22
|
+
collector << ',10)'
|
|
23
|
+
collector
|
|
24
24
|
end
|
|
25
25
|
|
|
26
26
|
def visit_ArelExtensions_Nodes_Power o, collector
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
27
|
+
collector << 'POWER('
|
|
28
|
+
o.expressions.each_with_index { |arg, i|
|
|
29
|
+
collector << Arel::Visitors::ToSql::COMMA if i != 0
|
|
30
|
+
collector = visit arg, collector
|
|
31
|
+
}
|
|
32
|
+
collector << ')'
|
|
33
|
+
collector
|
|
34
34
|
end
|
|
35
35
|
|
|
36
36
|
def visit_ArelExtensions_Nodes_Concat o, collector
|
|
@@ -108,54 +108,54 @@ module ArelExtensions
|
|
|
108
108
|
end
|
|
109
109
|
|
|
110
110
|
def visit_ArelExtensions_Nodes_Collate o, collector
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
111
|
+
if o.ai
|
|
112
|
+
collector << 'NLSSORT('
|
|
113
|
+
collector = visit o.expressions.first, collector
|
|
114
|
+
collector << COMMA
|
|
115
|
+
collector << "'NLS_SORT = BINARY_AI NLS_COMP = LINGUISTIC'"
|
|
116
|
+
collector << ')'
|
|
117
|
+
elsif o.ci
|
|
118
|
+
collector << 'NLSSORT('
|
|
119
|
+
collector = visit o.expressions.first, collector
|
|
120
|
+
collector << COMMA
|
|
121
|
+
collector << "'NLS_SORT = BINARY_CI NLS_COMP = LINGUISTIC'"
|
|
122
|
+
collector << ')'
|
|
123
|
+
else
|
|
124
|
+
collector = visit o.expressions.first, collector
|
|
125
|
+
end
|
|
126
126
|
collector
|
|
127
127
|
end
|
|
128
128
|
|
|
129
129
|
def visit_ArelExtensions_Nodes_GroupConcat o, collector
|
|
130
|
-
collector <<
|
|
130
|
+
collector << '(LISTAGG('
|
|
131
131
|
collector = visit o.left, collector
|
|
132
132
|
collector << COMMA
|
|
133
133
|
collector =
|
|
134
134
|
if o.separator && o.separator != 'NULL'
|
|
135
135
|
visit o.separator, collector
|
|
136
136
|
else
|
|
137
|
-
visit Arel
|
|
137
|
+
visit Arel.quoted(','), collector
|
|
138
138
|
end
|
|
139
|
-
collector <<
|
|
139
|
+
collector << ') WITHIN GROUP (ORDER BY '
|
|
140
140
|
if !o.order.blank?
|
|
141
|
-
o.order.each_with_index do |order,i|
|
|
141
|
+
o.order.each_with_index do |order, i|
|
|
142
142
|
collector << COMMA if i != 0
|
|
143
143
|
collector = visit order, collector
|
|
144
144
|
end
|
|
145
145
|
else
|
|
146
146
|
collector = visit o.left, collector
|
|
147
147
|
end
|
|
148
|
-
collector <<
|
|
148
|
+
collector << '))'
|
|
149
149
|
collector
|
|
150
150
|
end
|
|
151
151
|
|
|
152
152
|
def visit_ArelExtensions_Nodes_Coalesce o, collector
|
|
153
|
-
collector <<
|
|
153
|
+
collector << 'COALESCE('
|
|
154
154
|
o.expressions.each_with_index { |arg, i|
|
|
155
155
|
collector << COMMA if i != 0
|
|
156
156
|
if i > 0 && o.left_node_type == :text
|
|
157
157
|
if arg == '' || (arg.is_a?(Arel::Nodes::Quoted) && (arg.expr == ''))
|
|
158
|
-
collector <<
|
|
158
|
+
collector << 'NULL'
|
|
159
159
|
else
|
|
160
160
|
collector << 'TO_CLOB('
|
|
161
161
|
collector = visit arg, collector
|
|
@@ -165,12 +165,12 @@ module ArelExtensions
|
|
|
165
165
|
collector = visit arg, collector
|
|
166
166
|
end
|
|
167
167
|
}
|
|
168
|
-
collector <<
|
|
168
|
+
collector << ')'
|
|
169
169
|
collector
|
|
170
170
|
end
|
|
171
171
|
|
|
172
172
|
def visit_ArelExtensions_Nodes_MD5 o, collector
|
|
173
|
-
collector <<
|
|
173
|
+
collector << 'LOWER (RAWTOHEX (DBMS_OBFUSCATION_TOOLKIT.md5(input => UTL_I18N.STRING_TO_RAW('
|
|
174
174
|
collector = visit o.left, collector
|
|
175
175
|
collector << ", 'AL32UTF8'))))"
|
|
176
176
|
collector
|
|
@@ -185,7 +185,7 @@ module ArelExtensions
|
|
|
185
185
|
collector << 'TO_DATE(' if lc
|
|
186
186
|
collector = visit o.left, collector
|
|
187
187
|
collector << ')' if lc
|
|
188
|
-
collector <<
|
|
188
|
+
collector << ' - '
|
|
189
189
|
collector << 'TO_DATE(' if rc
|
|
190
190
|
collector = visit o.right, collector
|
|
191
191
|
collector << ')' if rc
|
|
@@ -219,16 +219,16 @@ module ArelExtensions
|
|
|
219
219
|
def visit_ArelExtensions_Nodes_Duration o, collector
|
|
220
220
|
case o.left
|
|
221
221
|
when 'wd', 'w'
|
|
222
|
-
collector <<
|
|
222
|
+
collector << 'TO_CHAR('
|
|
223
223
|
collector = visit o.right, collector
|
|
224
224
|
collector << COMMA
|
|
225
|
-
collector = visit Arel
|
|
225
|
+
collector = visit Arel.quoted(DATE_MAPPING[o.left]), collector
|
|
226
226
|
else
|
|
227
227
|
right = case o.left
|
|
228
|
-
when 'd','m','y'
|
|
228
|
+
when 'd', 'm', 'y'
|
|
229
229
|
interval = 'DAY'
|
|
230
230
|
o.right.cast(:date)
|
|
231
|
-
when 'h','mn','s'
|
|
231
|
+
when 'h', 'mn', 's'
|
|
232
232
|
interval = 'SECOND'
|
|
233
233
|
o.right.cast(:datetime)
|
|
234
234
|
when /i\z/
|
|
@@ -244,7 +244,7 @@ module ArelExtensions
|
|
|
244
244
|
collector << "EXTRACT(#{DATE_MAPPING[o.left]} FROM "
|
|
245
245
|
collector = visit right, collector
|
|
246
246
|
end
|
|
247
|
-
collector <<
|
|
247
|
+
collector << ')'
|
|
248
248
|
collector << " * (INTERVAL '1' #{interval})" if interval && o.with_interval
|
|
249
249
|
collector
|
|
250
250
|
end
|
|
@@ -252,45 +252,45 @@ module ArelExtensions
|
|
|
252
252
|
def visit_ArelExtensions_Nodes_Cast o, collector
|
|
253
253
|
case o.as_attr
|
|
254
254
|
when :string
|
|
255
|
-
collector <<
|
|
255
|
+
collector << 'TO_CHAR('
|
|
256
256
|
collector = visit o.left, collector
|
|
257
|
-
collector <<
|
|
257
|
+
collector << ')'
|
|
258
258
|
return collector
|
|
259
259
|
when :text
|
|
260
|
-
collector <<
|
|
260
|
+
collector << 'TO_CLOB('
|
|
261
261
|
collector = visit o.left, collector
|
|
262
|
-
collector <<
|
|
262
|
+
collector << ')'
|
|
263
263
|
return collector
|
|
264
264
|
when :ntext
|
|
265
|
-
collector <<
|
|
265
|
+
collector << 'TO_NCLOB('
|
|
266
266
|
collector = visit o.left, collector
|
|
267
|
-
collector <<
|
|
267
|
+
collector << ')'
|
|
268
268
|
return collector
|
|
269
269
|
when :time
|
|
270
270
|
if (o.left.respond_to?(:return_type) && o.left.return_type == :string) || o.left.is_a?(Arel::Nodes::Quoted)
|
|
271
|
-
collector <<
|
|
271
|
+
collector << 'TO_DATE('
|
|
272
272
|
collector = visit o.left, collector
|
|
273
273
|
collector << ",'HH24:MI:SS')"
|
|
274
274
|
else
|
|
275
|
-
collector <<
|
|
275
|
+
collector << 'TO_DATE(TO_CHAR('
|
|
276
276
|
collector = visit o.left, collector
|
|
277
277
|
collector << ",'HH24:MI:SS'),'HH24:MI:SS')"
|
|
278
278
|
end
|
|
279
279
|
return collector
|
|
280
280
|
when :number, :decimal
|
|
281
|
-
collector <<
|
|
281
|
+
collector << 'TO_NUMBER('
|
|
282
282
|
collector = visit o.left, collector
|
|
283
|
-
collector <<
|
|
283
|
+
collector << ')'
|
|
284
284
|
return collector
|
|
285
285
|
when :datetime
|
|
286
286
|
as_attr = Arel::Nodes::SqlLiteral.new('timestamp')
|
|
287
287
|
when :date
|
|
288
288
|
if (o.left.respond_to?(:return_type) && o.left.return_type == :string) || o.left.is_a?(Arel::Nodes::Quoted)
|
|
289
|
-
collector <<
|
|
289
|
+
collector << 'TO_DATE('
|
|
290
290
|
collector = visit o.left, collector
|
|
291
291
|
collector << ",'YYYY-MM-DD')"
|
|
292
292
|
else
|
|
293
|
-
collector <<
|
|
293
|
+
collector << 'TO_DATE(TO_CHAR('
|
|
294
294
|
collector = visit o.left, collector
|
|
295
295
|
collector << ",'YYYY-MM-DD'),'YYYY-MM-DD')"
|
|
296
296
|
end
|
|
@@ -300,18 +300,18 @@ module ArelExtensions
|
|
|
300
300
|
else
|
|
301
301
|
as_attr = Arel::Nodes::SqlLiteral.new(o.as_attr.to_s)
|
|
302
302
|
end
|
|
303
|
-
collector <<
|
|
303
|
+
collector << 'CAST('
|
|
304
304
|
collector = visit o.left, collector
|
|
305
|
-
collector <<
|
|
305
|
+
collector << ' AS '
|
|
306
306
|
collector = visit as_attr, collector
|
|
307
|
-
collector <<
|
|
307
|
+
collector << ')'
|
|
308
308
|
collector
|
|
309
309
|
end
|
|
310
310
|
|
|
311
311
|
def visit_ArelExtensions_Nodes_Length o, collector
|
|
312
312
|
collector << "LENGTH#{o.bytewise ? 'B' : ''}("
|
|
313
313
|
collector = visit o.expr, collector
|
|
314
|
-
collector <<
|
|
314
|
+
collector << ')'
|
|
315
315
|
collector
|
|
316
316
|
end
|
|
317
317
|
|
|
@@ -328,18 +328,18 @@ module ArelExtensions
|
|
|
328
328
|
end
|
|
329
329
|
|
|
330
330
|
def visit_ArelExtensions_Nodes_Rand o, collector
|
|
331
|
-
collector <<
|
|
331
|
+
collector << 'DBMS_RANDOM.VALUE('
|
|
332
332
|
if o.left && o.right
|
|
333
333
|
collector = visit o.left, collector
|
|
334
334
|
collector << COMMA
|
|
335
335
|
collector = visit o.right, collector
|
|
336
336
|
end
|
|
337
|
-
collector <<
|
|
337
|
+
collector << ')'
|
|
338
338
|
collector
|
|
339
339
|
end
|
|
340
340
|
|
|
341
341
|
def visit_Arel_Nodes_Regexp o, collector
|
|
342
|
-
collector <<
|
|
342
|
+
collector << ' REGEXP_LIKE('
|
|
343
343
|
collector = visit o.left, collector
|
|
344
344
|
collector << COMMA
|
|
345
345
|
collector = visit o.right, collector
|
|
@@ -348,7 +348,7 @@ module ArelExtensions
|
|
|
348
348
|
end
|
|
349
349
|
|
|
350
350
|
def visit_Arel_Nodes_NotRegexp o, collector
|
|
351
|
-
collector <<
|
|
351
|
+
collector << ' NOT REGEXP_LIKE('
|
|
352
352
|
collector = visit o.left, collector
|
|
353
353
|
collector << COMMA
|
|
354
354
|
collector = visit o.right, collector
|
|
@@ -357,22 +357,22 @@ module ArelExtensions
|
|
|
357
357
|
end
|
|
358
358
|
|
|
359
359
|
def visit_ArelExtensions_Nodes_Locate o, collector
|
|
360
|
-
collector <<
|
|
360
|
+
collector << 'INSTR('
|
|
361
361
|
o.expressions.each_with_index { |arg, i|
|
|
362
362
|
collector << COMMA if i != 0
|
|
363
363
|
collector = visit arg, collector
|
|
364
364
|
}
|
|
365
|
-
collector <<
|
|
365
|
+
collector << ')'
|
|
366
366
|
collector
|
|
367
367
|
end
|
|
368
368
|
|
|
369
369
|
def visit_ArelExtensions_Nodes_Substring o, collector
|
|
370
|
-
collector <<
|
|
370
|
+
collector << 'SUBSTR('
|
|
371
371
|
o.expressions.each_with_index { |arg, i|
|
|
372
372
|
collector << COMMA if i != 0
|
|
373
373
|
collector = visit arg, collector
|
|
374
374
|
}
|
|
375
|
-
collector <<
|
|
375
|
+
collector << ')'
|
|
376
376
|
collector
|
|
377
377
|
end
|
|
378
378
|
|
|
@@ -391,14 +391,14 @@ module ArelExtensions
|
|
|
391
391
|
collector << COMMA
|
|
392
392
|
collector << 'COALESCE(dbms_lob.GETLENGTH('
|
|
393
393
|
collector = visit o.left, collector
|
|
394
|
-
collector <<
|
|
394
|
+
collector << '), 0)'
|
|
395
395
|
collector << COMMA
|
|
396
396
|
collector << '1)'
|
|
397
397
|
else
|
|
398
398
|
collector = visit o.left, collector
|
|
399
399
|
end
|
|
400
400
|
collector << ')' if o.left.is_a? ArelExtensions::Nodes::Trim
|
|
401
|
-
collector <<
|
|
401
|
+
collector << ')'
|
|
402
402
|
collector
|
|
403
403
|
end
|
|
404
404
|
|
|
@@ -411,7 +411,7 @@ module ArelExtensions
|
|
|
411
411
|
end
|
|
412
412
|
collector << ' FROM '
|
|
413
413
|
collector = visit o.left, collector
|
|
414
|
-
collector <<
|
|
414
|
+
collector << ')'
|
|
415
415
|
collector
|
|
416
416
|
end
|
|
417
417
|
|
|
@@ -424,7 +424,7 @@ module ArelExtensions
|
|
|
424
424
|
end
|
|
425
425
|
collector << ' FROM '
|
|
426
426
|
collector = visit o.left, collector
|
|
427
|
-
collector <<
|
|
427
|
+
collector << ')'
|
|
428
428
|
collector
|
|
429
429
|
end
|
|
430
430
|
|
|
@@ -447,46 +447,46 @@ module ArelExtensions
|
|
|
447
447
|
|
|
448
448
|
def visit_ArelExtensions_Nodes_Format o, collector
|
|
449
449
|
fmt = ArelExtensions::Visitors::strftime_to_format(o.iso_format, DATE_FORMAT_DIRECTIVES)
|
|
450
|
-
collector <<
|
|
451
|
-
collector <<
|
|
450
|
+
collector << 'TO_CHAR('
|
|
451
|
+
collector << 'CAST(' if o.time_zone
|
|
452
452
|
collector = visit o.left, collector
|
|
453
453
|
case o.time_zone
|
|
454
454
|
when Hash
|
|
455
455
|
src_tz, dst_tz = o.time_zone.first
|
|
456
456
|
collector << ' as timestamp) at time zone '
|
|
457
|
-
collector = visit Arel
|
|
457
|
+
collector = visit Arel.quoted(src_tz), collector
|
|
458
458
|
collecto < ' at time zone '
|
|
459
|
-
collector = visit Arel
|
|
459
|
+
collector = visit Arel.quoted(dst_tz), collector
|
|
460
460
|
when String
|
|
461
461
|
collector << ' as timestamp) at time zone '
|
|
462
|
-
collector = visit Arel
|
|
462
|
+
collector = visit Arel.quoted(o.time_zone), collector
|
|
463
463
|
end
|
|
464
464
|
collector << COMMA
|
|
465
|
-
collector = visit Arel
|
|
466
|
-
collector <<
|
|
465
|
+
collector = visit Arel.quoted(fmt), collector
|
|
466
|
+
collector << ')'
|
|
467
467
|
collector
|
|
468
468
|
end
|
|
469
469
|
|
|
470
470
|
def visit_ArelExtensions_Nodes_Repeat o, collector
|
|
471
|
-
collector <<
|
|
471
|
+
collector << 'LPAD('
|
|
472
472
|
collector = visit o.expressions[0], collector # can't put empty string, otherwise it wouldn't work
|
|
473
473
|
collector << Arel::Visitors::ToSql::COMMA
|
|
474
474
|
collector = visit o.expressions[1], collector
|
|
475
475
|
collector << Arel::Visitors::ToSql::COMMA
|
|
476
476
|
collector = visit o.expressions[0], collector
|
|
477
|
-
collector <<
|
|
477
|
+
collector << ')'
|
|
478
478
|
collector
|
|
479
479
|
end
|
|
480
480
|
|
|
481
481
|
# add primary_key if not present, avoid zip
|
|
482
482
|
if Arel::VERSION.to_i < 7
|
|
483
483
|
def visit_ArelExtensions_InsertManager_BulkValues o, collector
|
|
484
|
-
collector <<
|
|
484
|
+
collector << '('
|
|
485
485
|
o.left.each_with_index do |row, idx| # values
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
486
|
+
collector << ' UNION ALL ' if idx != 0
|
|
487
|
+
collector << '(SELECT '
|
|
488
|
+
len = row.length - 1
|
|
489
|
+
row.zip(o.cols).each_with_index { |(value, attr), i|
|
|
490
490
|
case value
|
|
491
491
|
when Arel::Nodes::SqlLiteral, Arel::Nodes::BindParam
|
|
492
492
|
collector = visit value, collector
|
|
@@ -494,18 +494,18 @@ module ArelExtensions
|
|
|
494
494
|
collector << quote(value, attr && column_for(attr)).to_s
|
|
495
495
|
end
|
|
496
496
|
collector << COMMA unless i == len
|
|
497
|
-
|
|
498
|
-
|
|
497
|
+
}
|
|
498
|
+
collector << ' FROM DUAL)'
|
|
499
499
|
end
|
|
500
|
-
collector <<
|
|
500
|
+
collector << ')'
|
|
501
501
|
collector
|
|
502
502
|
end
|
|
503
503
|
else
|
|
504
504
|
def visit_ArelExtensions_InsertManager_BulkValues o, collector
|
|
505
|
-
collector <<
|
|
505
|
+
collector << '('
|
|
506
506
|
o.left.each_with_index do |row, idx|
|
|
507
|
-
collector <<
|
|
508
|
-
collector <<
|
|
507
|
+
collector << ' UNION ALL ' if idx != 0
|
|
508
|
+
collector << '(SELECT '
|
|
509
509
|
len = row.length - 1
|
|
510
510
|
row.zip(o.cols).each_with_index { |(value, attr), i|
|
|
511
511
|
case value
|
|
@@ -520,7 +520,7 @@ module ArelExtensions
|
|
|
520
520
|
}
|
|
521
521
|
collector << ' FROM DUAL)'
|
|
522
522
|
end
|
|
523
|
-
collector <<
|
|
523
|
+
collector << ')'
|
|
524
524
|
collector
|
|
525
525
|
end
|
|
526
526
|
end
|
|
@@ -530,7 +530,7 @@ module ArelExtensions
|
|
|
530
530
|
if element.is_a?(Time)
|
|
531
531
|
ArelExtensions::Nodes::Format.new [element, '%H:%M:%S']
|
|
532
532
|
elsif element.is_a?(Arel::Attributes::Attribute)
|
|
533
|
-
col =
|
|
533
|
+
col = Arel.column_of(element.relation.table_name, element.name.to_s)
|
|
534
534
|
if col && (col.type == :time)
|
|
535
535
|
ArelExtensions::Nodes::Format.new [element, '%H:%M:%S']
|
|
536
536
|
else
|
|
@@ -545,7 +545,7 @@ module ArelExtensions
|
|
|
545
545
|
remove_method(:visit_Arel_Nodes_GreaterThanOrEqual) rescue nil
|
|
546
546
|
def visit_Arel_Nodes_GreaterThanOrEqual o, collector
|
|
547
547
|
collector = visit get_time_converted(o.left), collector
|
|
548
|
-
collector <<
|
|
548
|
+
collector << ' >= '
|
|
549
549
|
collector = visit get_time_converted(o.right), collector
|
|
550
550
|
collector
|
|
551
551
|
end
|
|
@@ -553,7 +553,7 @@ module ArelExtensions
|
|
|
553
553
|
remove_method(:visit_Arel_Nodes_GreaterThan) rescue nil
|
|
554
554
|
def visit_Arel_Nodes_GreaterThan o, collector
|
|
555
555
|
collector = visit get_time_converted(o.left), collector
|
|
556
|
-
collector <<
|
|
556
|
+
collector << ' > '
|
|
557
557
|
collector = visit get_time_converted(o.right), collector
|
|
558
558
|
collector
|
|
559
559
|
end
|
|
@@ -561,7 +561,7 @@ module ArelExtensions
|
|
|
561
561
|
remove_method(:visit_Arel_Nodes_LessThanOrEqual) rescue nil
|
|
562
562
|
def visit_Arel_Nodes_LessThanOrEqual o, collector
|
|
563
563
|
collector = visit get_time_converted(o.left), collector
|
|
564
|
-
collector <<
|
|
564
|
+
collector << ' <= '
|
|
565
565
|
collector = visit get_time_converted(o.right), collector
|
|
566
566
|
collector
|
|
567
567
|
end
|
|
@@ -569,7 +569,7 @@ module ArelExtensions
|
|
|
569
569
|
remove_method(:visit_Arel_Nodes_LessThan) rescue nil
|
|
570
570
|
def visit_Arel_Nodes_LessThan o, collector
|
|
571
571
|
collector = visit get_time_converted(o.left), collector
|
|
572
|
-
collector <<
|
|
572
|
+
collector << ' < '
|
|
573
573
|
collector = visit get_time_converted(o.right), collector
|
|
574
574
|
collector
|
|
575
575
|
end
|
|
@@ -581,7 +581,7 @@ module ArelExtensions
|
|
|
581
581
|
o = o.dup
|
|
582
582
|
o.orders = []
|
|
583
583
|
end
|
|
584
|
-
old_visit_Arel_Nodes_SelectStatement(o,collector)
|
|
584
|
+
old_visit_Arel_Nodes_SelectStatement(o, collector)
|
|
585
585
|
end
|
|
586
586
|
|
|
587
587
|
alias_method(:old_visit_Arel_Nodes_TableAlias, :visit_Arel_Nodes_TableAlias) rescue nil
|
|
@@ -589,7 +589,7 @@ module ArelExtensions
|
|
|
589
589
|
if o.name.length > 30
|
|
590
590
|
o = Arel::Table.new(o.table_name).alias(Base64.urlsafe_encode64(Digest::MD5.new.digest(o.name)).tr('=', '').tr('-', '_'))
|
|
591
591
|
end
|
|
592
|
-
old_visit_Arel_Nodes_TableAlias(o,collector)
|
|
592
|
+
old_visit_Arel_Nodes_TableAlias(o, collector)
|
|
593
593
|
end
|
|
594
594
|
|
|
595
595
|
alias_method(:old_visit_Arel_Nodes_As, :visit_Arel_Nodes_As) rescue nil
|
|
@@ -625,47 +625,47 @@ module ArelExtensions
|
|
|
625
625
|
col = o.left.coalesce(0)
|
|
626
626
|
comma = NUMBER_COMMA_MAPPING[o.locale] || '.,'
|
|
627
627
|
comma_in_format = o.precision == 0 ? '' : 'D'
|
|
628
|
-
nines_after = (1..o.precision-1).map{'9'}.join('')+'0'
|
|
628
|
+
nines_after = (1..o.precision - 1).map{'9'}.join('') + '0'
|
|
629
629
|
if comma.length == 1
|
|
630
|
-
options = Arel
|
|
631
|
-
nines_before = (
|
|
630
|
+
options = Arel.quoted("NLS_NUMERIC_CHARACTERS = '" + comma + " '")
|
|
631
|
+
nines_before = ('999' * 4 + '990')
|
|
632
632
|
else
|
|
633
|
-
options = Arel
|
|
634
|
-
nines_before = (
|
|
633
|
+
options = Arel.quoted("NLS_NUMERIC_CHARACTERS = '" + comma + "'")
|
|
634
|
+
nines_before = ('999G' * 4 + '990')
|
|
635
635
|
end
|
|
636
|
-
sign =
|
|
636
|
+
sign = Arel.when(col < 0).
|
|
637
637
|
then('-').
|
|
638
638
|
else(o.flags.include?('+') ? '+' : (o.flags.include?(' ') ? ' ' : ''))
|
|
639
639
|
sign_length = o.flags.include?('+') || o.flags.include?(' ') ?
|
|
640
|
-
Arel
|
|
641
|
-
|
|
640
|
+
Arel.quoted(1) :
|
|
641
|
+
Arel.when(col < 0).then(1).else(0)
|
|
642
642
|
|
|
643
643
|
if o.scientific_notation
|
|
644
|
-
number = Arel::Nodes::NamedFunction.new('TO_CHAR',[
|
|
645
|
-
Arel
|
|
646
|
-
Arel
|
|
644
|
+
number = Arel::Nodes::NamedFunction.new('TO_CHAR', [
|
|
645
|
+
Arel.quoted(col.abs),
|
|
646
|
+
Arel.quoted('FM' + nines_before + comma_in_format + nines_after + 'EEEE'),
|
|
647
647
|
options
|
|
648
648
|
])
|
|
649
649
|
if o.type == 'e'
|
|
650
|
-
number = number.replace('E','e')
|
|
650
|
+
number = number.replace('E', 'e')
|
|
651
651
|
end
|
|
652
652
|
else
|
|
653
|
-
number = Arel::Nodes::NamedFunction.new('TO_CHAR',[
|
|
654
|
-
Arel
|
|
655
|
-
Arel
|
|
653
|
+
number = Arel::Nodes::NamedFunction.new('TO_CHAR', [
|
|
654
|
+
Arel.quoted(col.abs),
|
|
655
|
+
Arel.quoted('FM' + nines_before + comma_in_format + nines_after),
|
|
656
656
|
options
|
|
657
657
|
])
|
|
658
658
|
end
|
|
659
659
|
|
|
660
|
-
repeated_char = (o.width == 0) ? Arel
|
|
661
|
-
when(Arel
|
|
662
|
-
then(Arel
|
|
660
|
+
repeated_char = (o.width == 0) ? Arel.quoted('') : ArelExtensions::Nodes::Case.new.
|
|
661
|
+
when(Arel.quoted(o.width).abs - (number.length + sign_length) > 0).
|
|
662
|
+
then(Arel.quoted(
|
|
663
663
|
o.flags.include?('-') ? ' ' : (o.flags.include?('0') ? '0' : ' ')
|
|
664
|
-
).repeat(Arel
|
|
664
|
+
).repeat(Arel.quoted(o.width).abs - (number.length + sign_length))
|
|
665
665
|
).
|
|
666
666
|
else('')
|
|
667
|
-
before = (!o.flags.include?('0'))&&(!o.flags.include?('-')) ? repeated_char : ''
|
|
668
|
-
middle = (o.flags.include?('0'))&&(!o.flags.include?('-')) ? repeated_char : ''
|
|
667
|
+
before = (!o.flags.include?('0')) && (!o.flags.include?('-')) ? repeated_char : ''
|
|
668
|
+
middle = (o.flags.include?('0')) && (!o.flags.include?('-')) ? repeated_char : ''
|
|
669
669
|
after = o.flags.include?('-') ? repeated_char : ''
|
|
670
670
|
full_number = ArelExtensions::Nodes::Concat.new([
|
|
671
671
|
before,
|
|
@@ -674,26 +674,26 @@ module ArelExtensions
|
|
|
674
674
|
number,
|
|
675
675
|
after
|
|
676
676
|
])
|
|
677
|
-
collector = visit ArelExtensions::Nodes::Concat.new([Arel
|
|
677
|
+
collector = visit ArelExtensions::Nodes::Concat.new([Arel.quoted(o.prefix), full_number, Arel.quoted(o.suffix)]), collector
|
|
678
678
|
collector
|
|
679
679
|
end
|
|
680
680
|
|
|
681
681
|
def visit_ArelExtensions_Nodes_Std o, collector
|
|
682
|
-
collector << (o.unbiased_estimator ?
|
|
682
|
+
collector << (o.unbiased_estimator ? 'STDDEV_SAMP(' : 'STDDEV_POP(')
|
|
683
683
|
visit o.left, collector
|
|
684
|
-
collector <<
|
|
684
|
+
collector << ')'
|
|
685
685
|
collector
|
|
686
686
|
end
|
|
687
687
|
|
|
688
688
|
def visit_ArelExtensions_Nodes_Variance o, collector
|
|
689
|
-
collector << (o.unbiased_estimator ?
|
|
689
|
+
collector << (o.unbiased_estimator ? 'VAR_SAMP(' : 'VAR_POP(')
|
|
690
690
|
visit o.left, collector
|
|
691
|
-
collector <<
|
|
691
|
+
collector << ')'
|
|
692
692
|
collector
|
|
693
693
|
end
|
|
694
694
|
|
|
695
695
|
def visit_ArelExtensions_Nodes_LevenshteinDistance o, collector
|
|
696
|
-
collector <<
|
|
696
|
+
collector << 'UTL_MATCH.edit_distance('
|
|
697
697
|
collector = visit o.left, collector
|
|
698
698
|
collector << Arel::Visitors::ToSql::COMMA
|
|
699
699
|
collector = visit o.right, collector
|