arel_extensions 2.4.0 → 2.5.0
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/.gitignore +2 -1
- data/.rubocop.yml +131 -5
- data/Makefile +31 -1
- data/NEWS.md +15 -0
- data/README.md +11 -2
- data/Rakefile +5 -3
- data/arel_extensions.gemspec +3 -5
- data/gemfiles/rails5.gemfile +15 -8
- data/gemfiles/rails5_1_4.gemfile +11 -9
- data/gemfiles/rails5_2.gemfile +16 -9
- data/gemfiles/rails6.gemfile +13 -7
- data/gemfiles/rails6_1.gemfile +13 -7
- data/gemfiles/rails7.gemfile +15 -9
- data/gemfiles/rails7_1.gemfile +15 -8
- data/gemfiles/rails7_2.gemfile +12 -6
- data/gemfiles/rails8.gemfile +7 -7
- data/gemfiles/rails8_1.gemfile +4 -4
- data/gemspecs/arel_extensions-v1.gemspec +3 -5
- data/gemspecs/arel_extensions-v2.gemspec +3 -5
- data/lib/arel_extensions/aliases.rb +3 -3
- data/lib/arel_extensions/attributes.rb +2 -0
- data/lib/arel_extensions/boolean_functions.rb +9 -7
- data/lib/arel_extensions/common_sql_functions.rb +5 -3
- data/lib/arel_extensions/comparators.rb +6 -4
- data/lib/arel_extensions/date_duration.rb +2 -0
- data/lib/arel_extensions/helpers.rb +17 -17
- data/lib/arel_extensions/insert_manager.rb +5 -1
- data/lib/arel_extensions/math.rb +40 -44
- data/lib/arel_extensions/math_functions.rb +28 -30
- data/lib/arel_extensions/nodes/aggregate_function.rb +4 -4
- data/lib/arel_extensions/nodes/blank.rb +6 -4
- data/lib/arel_extensions/nodes/case.rb +15 -12
- data/lib/arel_extensions/nodes/cast.rb +3 -5
- data/lib/arel_extensions/nodes/coalesce.rb +1 -1
- data/lib/arel_extensions/nodes/collate.rb +1 -1
- data/lib/arel_extensions/nodes/concat.rb +6 -6
- data/lib/arel_extensions/nodes/date_diff.rb +40 -49
- data/lib/arel_extensions/nodes/duration.rb +2 -2
- data/lib/arel_extensions/nodes/format.rb +2 -2
- data/lib/arel_extensions/nodes/formatted_date.rb +2 -2
- data/lib/arel_extensions/nodes/formatted_number.rb +2 -2
- data/lib/arel_extensions/nodes/function.rb +6 -4
- data/lib/arel_extensions/nodes/is_null.rb +2 -0
- data/lib/arel_extensions/nodes/json.rb +27 -15
- data/lib/arel_extensions/nodes/levenshtein_distance.rb +2 -2
- data/lib/arel_extensions/nodes/locate.rb +1 -1
- data/lib/arel_extensions/nodes/power.rb +2 -2
- data/lib/arel_extensions/nodes/rand.rb +2 -2
- data/lib/arel_extensions/nodes/repeat.rb +2 -2
- data/lib/arel_extensions/nodes/replace.rb +3 -3
- data/lib/arel_extensions/nodes/rollup.rb +4 -4
- data/lib/arel_extensions/nodes/round.rb +3 -3
- data/lib/arel_extensions/nodes/select.rb +1 -1
- data/lib/arel_extensions/nodes/std.rb +4 -4
- data/lib/arel_extensions/nodes/substring.rb +52 -2
- data/lib/arel_extensions/nodes/then.rb +1 -1
- data/lib/arel_extensions/nodes/trim.rb +2 -2
- data/lib/arel_extensions/nodes/union.rb +3 -3
- data/lib/arel_extensions/nodes/union_all.rb +3 -3
- data/lib/arel_extensions/nodes/wday.rb +2 -2
- data/lib/arel_extensions/null_functions.rb +5 -7
- data/lib/arel_extensions/predications.rb +22 -18
- data/lib/arel_extensions/string_functions.rb +26 -27
- data/lib/arel_extensions/version.rb +3 -1
- data/lib/arel_extensions/visitors/convert_format.rb +2 -2
- data/lib/arel_extensions/visitors/ibm_db.rb +5 -5
- data/lib/arel_extensions/visitors/mssql.rb +91 -92
- data/lib/arel_extensions/visitors/mysql.rb +89 -69
- data/lib/arel_extensions/visitors/oracle.rb +100 -104
- data/lib/arel_extensions/visitors/oracle12.rb +5 -6
- data/lib/arel_extensions/visitors/postgresql.rb +107 -94
- data/lib/arel_extensions/visitors/sqlite.rb +57 -65
- data/lib/arel_extensions/visitors/to_sql.rb +84 -74
- data/lib/arel_extensions/visitors.rb +6 -6
- data/lib/arel_extensions/warning.rb +5 -5
- data/lib/arel_extensions.rb +34 -27
- data/test/real_db_test.rb +31 -31
- data/test/visitors/test_to_sql.rb +2 -2
- data/test/with_ar/all_agnostic_test.rb +149 -15
- data/version_v1.rb +3 -1
- data/version_v2.rb +3 -1
- metadata +2 -30
|
@@ -13,41 +13,41 @@ module ArelExtensions
|
|
|
13
13
|
}
|
|
14
14
|
NUMBER_COMMA_MAPPING = {'en_US' => '.,', 'fr_FR' => ',', 'sv_SE' => ', '}
|
|
15
15
|
|
|
16
|
-
def visit_ArelExtensions_Nodes_ByteSize
|
|
16
|
+
def visit_ArelExtensions_Nodes_ByteSize(o, collector)
|
|
17
17
|
collector << 'LENGTHB('
|
|
18
18
|
collector = visit o.expr.coalesce(''), collector
|
|
19
19
|
collector << ')'
|
|
20
20
|
collector
|
|
21
21
|
end
|
|
22
22
|
|
|
23
|
-
def visit_ArelExtensions_Nodes_CharLength
|
|
23
|
+
def visit_ArelExtensions_Nodes_CharLength(o, collector)
|
|
24
24
|
collector << 'LENGTH('
|
|
25
25
|
collector = visit o.expr.coalesce(''), collector
|
|
26
26
|
collector << ')'
|
|
27
27
|
collector
|
|
28
28
|
end
|
|
29
29
|
|
|
30
|
-
def visit_ArelExtensions_Nodes_Log10
|
|
30
|
+
def visit_ArelExtensions_Nodes_Log10(o, collector)
|
|
31
31
|
collector << 'LOG('
|
|
32
32
|
o.expressions.each_with_index { |arg, i|
|
|
33
|
-
collector <<
|
|
33
|
+
collector << COMMA if i != 0
|
|
34
34
|
collector = visit arg, collector
|
|
35
35
|
}
|
|
36
36
|
collector << ',10)'
|
|
37
37
|
collector
|
|
38
38
|
end
|
|
39
39
|
|
|
40
|
-
def visit_ArelExtensions_Nodes_Power
|
|
40
|
+
def visit_ArelExtensions_Nodes_Power(o, collector)
|
|
41
41
|
collector << 'POWER('
|
|
42
42
|
o.expressions.each_with_index { |arg, i|
|
|
43
|
-
collector <<
|
|
43
|
+
collector << COMMA if i != 0
|
|
44
44
|
collector = visit arg, collector
|
|
45
45
|
}
|
|
46
46
|
collector << ')'
|
|
47
47
|
collector
|
|
48
48
|
end
|
|
49
49
|
|
|
50
|
-
def visit_ArelExtensions_Nodes_Concat
|
|
50
|
+
def visit_ArelExtensions_Nodes_Concat(o, collector)
|
|
51
51
|
collector << '('
|
|
52
52
|
o.expressions.each_with_index { |arg, i|
|
|
53
53
|
collector = visit o.convert_to_string_node(arg), collector
|
|
@@ -57,7 +57,7 @@ module ArelExtensions
|
|
|
57
57
|
collector
|
|
58
58
|
end
|
|
59
59
|
|
|
60
|
-
def visit_ArelExtensions_Nodes_IMatches
|
|
60
|
+
def visit_ArelExtensions_Nodes_IMatches(o, collector)
|
|
61
61
|
collector << 'LOWER('
|
|
62
62
|
collector = visit o.left, collector
|
|
63
63
|
collector << ') LIKE LOWER('
|
|
@@ -71,7 +71,7 @@ module ArelExtensions
|
|
|
71
71
|
end
|
|
72
72
|
end
|
|
73
73
|
|
|
74
|
-
def visit_ArelExtensions_Nodes_AiMatches
|
|
74
|
+
def visit_ArelExtensions_Nodes_AiMatches(o, collector)
|
|
75
75
|
collector = visit o.left.ai_collate, collector
|
|
76
76
|
collector << ' LIKE '
|
|
77
77
|
collector = visit o.right.ai_collate, collector
|
|
@@ -83,7 +83,7 @@ module ArelExtensions
|
|
|
83
83
|
end
|
|
84
84
|
end
|
|
85
85
|
|
|
86
|
-
def visit_ArelExtensions_Nodes_AiIMatches
|
|
86
|
+
def visit_ArelExtensions_Nodes_AiIMatches(o, collector)
|
|
87
87
|
collector = visit o.left.ai_collate, collector
|
|
88
88
|
collector << ' LIKE '
|
|
89
89
|
collector = visit o.right.ai_collate, collector
|
|
@@ -95,7 +95,7 @@ module ArelExtensions
|
|
|
95
95
|
end
|
|
96
96
|
end
|
|
97
97
|
|
|
98
|
-
def visit_ArelExtensions_Nodes_SMatches
|
|
98
|
+
def visit_ArelExtensions_Nodes_SMatches(o, collector)
|
|
99
99
|
collector = visit o.left, collector
|
|
100
100
|
collector << ' LIKE '
|
|
101
101
|
collector = visit o.right, collector
|
|
@@ -107,7 +107,7 @@ module ArelExtensions
|
|
|
107
107
|
end
|
|
108
108
|
end
|
|
109
109
|
|
|
110
|
-
def visit_ArelExtensions_Nodes_IDoesNotMatch
|
|
110
|
+
def visit_ArelExtensions_Nodes_IDoesNotMatch(o, collector)
|
|
111
111
|
collector << 'LOWER('
|
|
112
112
|
collector = visit o.left, collector
|
|
113
113
|
collector << ') NOT LIKE LOWER('
|
|
@@ -121,7 +121,7 @@ module ArelExtensions
|
|
|
121
121
|
end
|
|
122
122
|
end
|
|
123
123
|
|
|
124
|
-
def visit_ArelExtensions_Nodes_Collate
|
|
124
|
+
def visit_ArelExtensions_Nodes_Collate(o, collector)
|
|
125
125
|
if o.ai
|
|
126
126
|
collector << 'NLSSORT('
|
|
127
127
|
collector = visit o.expressions.first, collector
|
|
@@ -137,39 +137,39 @@ module ArelExtensions
|
|
|
137
137
|
else
|
|
138
138
|
collector = visit o.expressions.first, collector
|
|
139
139
|
end
|
|
140
|
-
|
|
140
|
+
collector
|
|
141
141
|
end
|
|
142
142
|
|
|
143
143
|
def visit_Arel_Nodes_RollUp(o, collector)
|
|
144
|
-
collector <<
|
|
144
|
+
collector << 'ROLLUP'
|
|
145
145
|
grouping_array_or_grouping_element o, collector
|
|
146
146
|
end
|
|
147
147
|
|
|
148
|
-
def visit_ArelExtensions_Nodes_GroupConcat
|
|
148
|
+
def visit_ArelExtensions_Nodes_GroupConcat(o, collector)
|
|
149
149
|
collector << '(LISTAGG('
|
|
150
150
|
collector = visit o.left, collector
|
|
151
151
|
collector << COMMA
|
|
152
152
|
sep = o.separator.is_a?(Arel::Nodes::Quoted) ? o.separator.expr : o.separator
|
|
153
153
|
collector =
|
|
154
|
-
if 'NULL'
|
|
155
|
-
visit o.separator, collector
|
|
156
|
-
else
|
|
154
|
+
if 'NULL' == sep
|
|
157
155
|
visit Arel.quoted(','), collector
|
|
156
|
+
else
|
|
157
|
+
visit o.separator, collector
|
|
158
158
|
end
|
|
159
159
|
collector << ') WITHIN GROUP (ORDER BY '
|
|
160
|
-
if
|
|
160
|
+
if o.order.blank?
|
|
161
|
+
collector = visit o.left, collector
|
|
162
|
+
else
|
|
161
163
|
o.order.each_with_index do |order, i|
|
|
162
164
|
collector << COMMA if i != 0
|
|
163
165
|
collector = visit order, collector
|
|
164
166
|
end
|
|
165
|
-
else
|
|
166
|
-
collector = visit o.left, collector
|
|
167
167
|
end
|
|
168
168
|
collector << '))'
|
|
169
169
|
collector
|
|
170
170
|
end
|
|
171
171
|
|
|
172
|
-
def visit_ArelExtensions_Nodes_Coalesce
|
|
172
|
+
def visit_ArelExtensions_Nodes_Coalesce(o, collector)
|
|
173
173
|
collector << 'COALESCE('
|
|
174
174
|
o.expressions.each_with_index { |arg, i|
|
|
175
175
|
collector << COMMA if i != 0
|
|
@@ -189,7 +189,7 @@ module ArelExtensions
|
|
|
189
189
|
collector
|
|
190
190
|
end
|
|
191
191
|
|
|
192
|
-
def visit_ArelExtensions_Nodes_MD5
|
|
192
|
+
def visit_ArelExtensions_Nodes_MD5(o, collector)
|
|
193
193
|
collector << 'LOWER (RAWTOHEX (DBMS_OBFUSCATION_TOOLKIT.md5(input => UTL_I18N.STRING_TO_RAW('
|
|
194
194
|
collector = visit o.left, collector
|
|
195
195
|
collector << ", 'AL32UTF8'))))"
|
|
@@ -197,9 +197,9 @@ module ArelExtensions
|
|
|
197
197
|
end
|
|
198
198
|
|
|
199
199
|
# :date is not possible in Oracle since this type does not really exist
|
|
200
|
-
def visit_ArelExtensions_Nodes_DateDiff
|
|
201
|
-
lc =
|
|
202
|
-
rc =
|
|
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)
|
|
203
203
|
if rc || o.right_node_type == :date || o.right_node_type == :datetime || o.right_node_type == :time
|
|
204
204
|
collector << '('
|
|
205
205
|
collector << 'TO_DATE(' if lc
|
|
@@ -210,7 +210,7 @@ module ArelExtensions
|
|
|
210
210
|
collector = visit o.right, collector
|
|
211
211
|
collector << ')' if rc
|
|
212
212
|
collector << ')'
|
|
213
|
-
if
|
|
213
|
+
if %i[ruby_time datetime time].include?(o.left_node_type)
|
|
214
214
|
collector << ' * (CASE WHEN (TRUNC('
|
|
215
215
|
collector << 'TO_DATE(' if lc
|
|
216
216
|
collector = visit o.left, collector
|
|
@@ -236,7 +236,7 @@ module ArelExtensions
|
|
|
236
236
|
collector
|
|
237
237
|
end
|
|
238
238
|
|
|
239
|
-
def visit_ArelExtensions_Nodes_Duration
|
|
239
|
+
def visit_ArelExtensions_Nodes_Duration(o, collector)
|
|
240
240
|
case o.left
|
|
241
241
|
when 'wd', 'w'
|
|
242
242
|
collector << 'TO_CHAR('
|
|
@@ -244,23 +244,24 @@ module ArelExtensions
|
|
|
244
244
|
collector << COMMA
|
|
245
245
|
collector = visit Arel.quoted(DATE_MAPPING[o.left]), collector
|
|
246
246
|
else
|
|
247
|
-
right =
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
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
|
|
264
265
|
collector << "EXTRACT(#{DATE_MAPPING[o.left]} FROM "
|
|
265
266
|
collector = visit right, collector
|
|
266
267
|
end
|
|
@@ -269,7 +270,7 @@ module ArelExtensions
|
|
|
269
270
|
collector
|
|
270
271
|
end
|
|
271
272
|
|
|
272
|
-
def visit_ArelExtensions_Nodes_Cast
|
|
273
|
+
def visit_ArelExtensions_Nodes_Cast(o, collector)
|
|
273
274
|
case o.as_attr
|
|
274
275
|
when :string
|
|
275
276
|
collector << 'TO_CHAR('
|
|
@@ -328,26 +329,26 @@ module ArelExtensions
|
|
|
328
329
|
collector
|
|
329
330
|
end
|
|
330
331
|
|
|
331
|
-
def visit_ArelExtensions_Nodes_Length
|
|
332
|
-
collector << "LENGTH#{
|
|
332
|
+
def visit_ArelExtensions_Nodes_Length(o, collector)
|
|
333
|
+
collector << "LENGTH#{'B' if o.bytewise}("
|
|
333
334
|
collector = visit o.expr, collector
|
|
334
335
|
collector << ')'
|
|
335
336
|
collector
|
|
336
337
|
end
|
|
337
338
|
|
|
338
|
-
def visit_ArelExtensions_Nodes_IsNull
|
|
339
|
+
def visit_ArelExtensions_Nodes_IsNull(o, collector)
|
|
339
340
|
collector = visit o.expr, collector
|
|
340
341
|
collector << ' IS NULL'
|
|
341
342
|
collector
|
|
342
343
|
end
|
|
343
344
|
|
|
344
|
-
def visit_ArelExtensions_Nodes_IsNotNull
|
|
345
|
+
def visit_ArelExtensions_Nodes_IsNotNull(o, collector)
|
|
345
346
|
collector = visit o.expr, collector
|
|
346
347
|
collector << ' IS NOT NULL'
|
|
347
348
|
collector
|
|
348
349
|
end
|
|
349
350
|
|
|
350
|
-
def visit_ArelExtensions_Nodes_Rand
|
|
351
|
+
def visit_ArelExtensions_Nodes_Rand(o, collector)
|
|
351
352
|
collector << 'DBMS_RANDOM.VALUE('
|
|
352
353
|
if o.left && o.right
|
|
353
354
|
collector = visit o.left, collector
|
|
@@ -358,7 +359,7 @@ module ArelExtensions
|
|
|
358
359
|
collector
|
|
359
360
|
end
|
|
360
361
|
|
|
361
|
-
def visit_Arel_Nodes_Regexp
|
|
362
|
+
def visit_Arel_Nodes_Regexp(o, collector)
|
|
362
363
|
collector << ' REGEXP_LIKE('
|
|
363
364
|
collector = visit o.left, collector
|
|
364
365
|
collector << COMMA
|
|
@@ -367,7 +368,7 @@ module ArelExtensions
|
|
|
367
368
|
collector
|
|
368
369
|
end
|
|
369
370
|
|
|
370
|
-
def visit_Arel_Nodes_NotRegexp
|
|
371
|
+
def visit_Arel_Nodes_NotRegexp(o, collector)
|
|
371
372
|
collector << ' NOT REGEXP_LIKE('
|
|
372
373
|
collector = visit o.left, collector
|
|
373
374
|
collector << COMMA
|
|
@@ -376,7 +377,7 @@ module ArelExtensions
|
|
|
376
377
|
collector
|
|
377
378
|
end
|
|
378
379
|
|
|
379
|
-
def visit_ArelExtensions_Nodes_Locate
|
|
380
|
+
def visit_ArelExtensions_Nodes_Locate(o, collector)
|
|
380
381
|
collector << 'INSTR('
|
|
381
382
|
o.expressions.each_with_index { |arg, i|
|
|
382
383
|
collector << COMMA if i != 0
|
|
@@ -386,7 +387,9 @@ module ArelExtensions
|
|
|
386
387
|
collector
|
|
387
388
|
end
|
|
388
389
|
|
|
389
|
-
def visit_ArelExtensions_Nodes_Substring
|
|
390
|
+
def visit_ArelExtensions_Nodes_Substring(o, collector)
|
|
391
|
+
return visit(o.range_substring_node, collector) if o.range?
|
|
392
|
+
|
|
390
393
|
collector << 'SUBSTR('
|
|
391
394
|
o.expressions.each_with_index { |arg, i|
|
|
392
395
|
collector << COMMA if i != 0
|
|
@@ -396,7 +399,7 @@ module ArelExtensions
|
|
|
396
399
|
collector
|
|
397
400
|
end
|
|
398
401
|
|
|
399
|
-
def visit_ArelExtensions_Nodes_Trim
|
|
402
|
+
def visit_ArelExtensions_Nodes_Trim(o, collector)
|
|
400
403
|
collector << 'TRIM(' # BOTH
|
|
401
404
|
if o.right.expr && SPECIAL_CHARS[o.right.expr]
|
|
402
405
|
collector << SPECIAL_CHARS[o.right.expr]
|
|
@@ -422,7 +425,7 @@ module ArelExtensions
|
|
|
422
425
|
collector
|
|
423
426
|
end
|
|
424
427
|
|
|
425
|
-
def visit_ArelExtensions_Nodes_Ltrim
|
|
428
|
+
def visit_ArelExtensions_Nodes_Ltrim(o, collector)
|
|
426
429
|
collector << 'TRIM(LEADING '
|
|
427
430
|
if o.right.expr && SPECIAL_CHARS[o.right.expr]
|
|
428
431
|
collector << SPECIAL_CHARS[o.right.expr]
|
|
@@ -435,7 +438,7 @@ module ArelExtensions
|
|
|
435
438
|
collector
|
|
436
439
|
end
|
|
437
440
|
|
|
438
|
-
def visit_ArelExtensions_Nodes_Rtrim
|
|
441
|
+
def visit_ArelExtensions_Nodes_Rtrim(o, collector)
|
|
439
442
|
collector << 'TRIM(TRAILING '
|
|
440
443
|
if o.right.expr && SPECIAL_CHARS[o.right.expr]
|
|
441
444
|
collector << SPECIAL_CHARS[o.right.expr]
|
|
@@ -448,15 +451,15 @@ module ArelExtensions
|
|
|
448
451
|
collector
|
|
449
452
|
end
|
|
450
453
|
|
|
451
|
-
def visit_ArelExtensions_Nodes_Blank
|
|
454
|
+
def visit_ArelExtensions_Nodes_Blank(o, collector)
|
|
452
455
|
visit o.expr.trim.length.coalesce(0).eq(0), collector
|
|
453
456
|
end
|
|
454
457
|
|
|
455
|
-
def visit_ArelExtensions_Nodes_NotBlank
|
|
458
|
+
def visit_ArelExtensions_Nodes_NotBlank(o, collector)
|
|
456
459
|
visit o.expr.trim.length.coalesce(0).gt(0), collector
|
|
457
460
|
end
|
|
458
461
|
|
|
459
|
-
def visit_ArelExtensions_Nodes_DateAdd
|
|
462
|
+
def visit_ArelExtensions_Nodes_DateAdd(o, collector)
|
|
460
463
|
collector << '('
|
|
461
464
|
collector = visit o.left, collector
|
|
462
465
|
collector << ' + ' # (o.right.value >= 0 ? ' + ' : ' - ')
|
|
@@ -465,12 +468,12 @@ module ArelExtensions
|
|
|
465
468
|
collector
|
|
466
469
|
end
|
|
467
470
|
|
|
468
|
-
def visit_ArelExtensions_Nodes_Format
|
|
471
|
+
def visit_ArelExtensions_Nodes_Format(o, collector)
|
|
469
472
|
visit_ArelExtensions_Nodes_FormattedDate o, collector
|
|
470
473
|
end
|
|
471
474
|
|
|
472
|
-
def visit_ArelExtensions_Nodes_FormattedDate
|
|
473
|
-
fmt = ArelExtensions::Visitors
|
|
475
|
+
def visit_ArelExtensions_Nodes_FormattedDate(o, collector)
|
|
476
|
+
fmt = ArelExtensions::Visitors.strftime_to_format(o.iso_format, DATE_FORMAT_DIRECTIVES)
|
|
474
477
|
collector << 'TO_CHAR('
|
|
475
478
|
collector << 'CAST(' if o.time_zone
|
|
476
479
|
collector = visit o.left, collector
|
|
@@ -479,7 +482,7 @@ module ArelExtensions
|
|
|
479
482
|
src_tz, dst_tz = o.time_zone.first
|
|
480
483
|
collector << ' as timestamp) at time zone '
|
|
481
484
|
collector = visit Arel.quoted(src_tz), collector
|
|
482
|
-
collector
|
|
485
|
+
collector << ' at time zone '
|
|
483
486
|
collector = visit Arel.quoted(dst_tz), collector
|
|
484
487
|
when String
|
|
485
488
|
collector << ' as timestamp) at time zone '
|
|
@@ -491,12 +494,12 @@ module ArelExtensions
|
|
|
491
494
|
collector
|
|
492
495
|
end
|
|
493
496
|
|
|
494
|
-
def visit_ArelExtensions_Nodes_Repeat
|
|
497
|
+
def visit_ArelExtensions_Nodes_Repeat(o, collector)
|
|
495
498
|
collector << 'LPAD('
|
|
496
499
|
collector = visit o.expressions[0], collector # can't put empty string, otherwise it wouldn't work
|
|
497
|
-
collector <<
|
|
500
|
+
collector << COMMA
|
|
498
501
|
collector = visit o.expressions[1], collector
|
|
499
|
-
collector <<
|
|
502
|
+
collector << COMMA
|
|
500
503
|
collector = visit o.expressions[0], collector
|
|
501
504
|
collector << ')'
|
|
502
505
|
collector
|
|
@@ -504,7 +507,7 @@ module ArelExtensions
|
|
|
504
507
|
|
|
505
508
|
# add primary_key if not present, avoid zip
|
|
506
509
|
if AREL_VERSION < V7
|
|
507
|
-
def visit_ArelExtensions_InsertManager_BulkValues
|
|
510
|
+
def visit_ArelExtensions_InsertManager_BulkValues(o, collector)
|
|
508
511
|
collector << '('
|
|
509
512
|
o.left.each_with_index do |row, idx| # values
|
|
510
513
|
collector << ' UNION ALL ' if idx != 0
|
|
@@ -525,7 +528,7 @@ module ArelExtensions
|
|
|
525
528
|
collector
|
|
526
529
|
end
|
|
527
530
|
else
|
|
528
|
-
def visit_ArelExtensions_InsertManager_BulkValues
|
|
531
|
+
def visit_ArelExtensions_InsertManager_BulkValues(o, collector)
|
|
529
532
|
collector << '('
|
|
530
533
|
o.left.each_with_index do |row, idx|
|
|
531
534
|
collector << ' UNION ALL ' if idx != 0
|
|
@@ -549,8 +552,7 @@ module ArelExtensions
|
|
|
549
552
|
end
|
|
550
553
|
end
|
|
551
554
|
|
|
552
|
-
|
|
553
|
-
def get_time_converted element
|
|
555
|
+
def get_time_converted(element)
|
|
554
556
|
if element.is_a?(Time)
|
|
555
557
|
ArelExtensions::Nodes::Format.new [element, '%H:%M:%S']
|
|
556
558
|
elsif element.is_a?(Arel::Attributes::Attribute)
|
|
@@ -565,42 +567,36 @@ module ArelExtensions
|
|
|
565
567
|
end
|
|
566
568
|
end
|
|
567
569
|
|
|
568
|
-
|
|
569
570
|
remove_method(:visit_Arel_Nodes_GreaterThanOrEqual) rescue nil
|
|
570
|
-
def visit_Arel_Nodes_GreaterThanOrEqual
|
|
571
|
+
def visit_Arel_Nodes_GreaterThanOrEqual(o, collector)
|
|
571
572
|
collector = visit get_time_converted(o.left), collector
|
|
572
573
|
collector << ' >= '
|
|
573
|
-
|
|
574
|
-
collector
|
|
574
|
+
visit get_time_converted(o.right), collector
|
|
575
575
|
end
|
|
576
576
|
|
|
577
577
|
remove_method(:visit_Arel_Nodes_GreaterThan) rescue nil
|
|
578
|
-
def visit_Arel_Nodes_GreaterThan
|
|
578
|
+
def visit_Arel_Nodes_GreaterThan(o, collector)
|
|
579
579
|
collector = visit get_time_converted(o.left), collector
|
|
580
580
|
collector << ' > '
|
|
581
|
-
|
|
582
|
-
collector
|
|
581
|
+
visit get_time_converted(o.right), collector
|
|
583
582
|
end
|
|
584
583
|
|
|
585
584
|
remove_method(:visit_Arel_Nodes_LessThanOrEqual) rescue nil
|
|
586
|
-
def visit_Arel_Nodes_LessThanOrEqual
|
|
585
|
+
def visit_Arel_Nodes_LessThanOrEqual(o, collector)
|
|
587
586
|
collector = visit get_time_converted(o.left), collector
|
|
588
587
|
collector << ' <= '
|
|
589
|
-
|
|
590
|
-
collector
|
|
588
|
+
visit get_time_converted(o.right), collector
|
|
591
589
|
end
|
|
592
590
|
|
|
593
591
|
remove_method(:visit_Arel_Nodes_LessThan) rescue nil
|
|
594
|
-
def visit_Arel_Nodes_LessThan
|
|
592
|
+
def visit_Arel_Nodes_LessThan(o, collector)
|
|
595
593
|
collector = visit get_time_converted(o.left), collector
|
|
596
594
|
collector << ' < '
|
|
597
|
-
|
|
598
|
-
collector
|
|
595
|
+
visit get_time_converted(o.right), collector
|
|
599
596
|
end
|
|
600
597
|
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
def visit_Arel_Nodes_SelectStatement o, collector
|
|
598
|
+
alias old_visit_Arel_Nodes_SelectStatement visit_Arel_Nodes_SelectStatement rescue nil
|
|
599
|
+
def visit_Arel_Nodes_SelectStatement(o, collector)
|
|
604
600
|
if !(collector.value.blank? || (collector.value.is_a?(Array) && collector.value[0].blank?)) && o.limit.blank? && o.offset.blank?
|
|
605
601
|
o = o.dup
|
|
606
602
|
o.orders = []
|
|
@@ -608,16 +604,16 @@ module ArelExtensions
|
|
|
608
604
|
old_visit_Arel_Nodes_SelectStatement(o, collector)
|
|
609
605
|
end
|
|
610
606
|
|
|
611
|
-
|
|
612
|
-
def visit_Arel_Nodes_TableAlias
|
|
607
|
+
alias old_visit_Arel_Nodes_TableAlias visit_Arel_Nodes_TableAlias rescue nil
|
|
608
|
+
def visit_Arel_Nodes_TableAlias(o, collector)
|
|
613
609
|
if o.name.length > 30
|
|
614
610
|
o = Arel::Table.new(o.table_name).alias(Arel.shorten(o.name))
|
|
615
611
|
end
|
|
616
612
|
old_visit_Arel_Nodes_TableAlias(o, collector)
|
|
617
613
|
end
|
|
618
614
|
|
|
619
|
-
|
|
620
|
-
def visit_Arel_Nodes_As
|
|
615
|
+
alias old_visit_Arel_Nodes_As visit_Arel_Nodes_As rescue nil
|
|
616
|
+
def visit_Arel_Nodes_As(o, collector)
|
|
621
617
|
if o.left.is_a?(Arel::Nodes::Binary)
|
|
622
618
|
collector << '('
|
|
623
619
|
collector = visit o.left, collector
|
|
@@ -632,12 +628,12 @@ module ArelExtensions
|
|
|
632
628
|
collector
|
|
633
629
|
end
|
|
634
630
|
|
|
635
|
-
def visit_ArelExtensions_Nodes_As
|
|
631
|
+
def visit_ArelExtensions_Nodes_As(o, collector)
|
|
636
632
|
visit_Arel_Nodes_As o, collector
|
|
637
633
|
end
|
|
638
634
|
|
|
639
|
-
|
|
640
|
-
def visit_Arel_Attributes_Attribute
|
|
635
|
+
alias old_visit_Arel_Attributes_Attribute visit_Arel_Attributes_Attribute rescue nil
|
|
636
|
+
def visit_Arel_Attributes_Attribute(o, collector)
|
|
641
637
|
join_name = o.relation.table_alias || o.relation.name
|
|
642
638
|
if join_name.length > 30
|
|
643
639
|
join_name = Arel.shorten(join_name)
|
|
@@ -645,11 +641,11 @@ module ArelExtensions
|
|
|
645
641
|
collector << "#{quote_table_name join_name}.#{quote_column_name o.name}"
|
|
646
642
|
end
|
|
647
643
|
|
|
648
|
-
def visit_ArelExtensions_Nodes_FormattedNumber
|
|
644
|
+
def visit_ArelExtensions_Nodes_FormattedNumber(o, collector)
|
|
649
645
|
col = o.left.coalesce(0)
|
|
650
646
|
comma = NUMBER_COMMA_MAPPING[o.locale] || '.,'
|
|
651
647
|
comma_in_format = o.precision == 0 ? '' : 'D'
|
|
652
|
-
nines_after = (1..o.precision - 1).map{'9'}.join('') + '0'
|
|
648
|
+
nines_after = (1..o.precision - 1).map { '9' }.join('') + '0'
|
|
653
649
|
if comma.length == 1
|
|
654
650
|
options = Arel.quoted("NLS_NUMERIC_CHARACTERS = '#{comma} '")
|
|
655
651
|
nines_before = ('999' * 4 + '990')
|
|
@@ -707,24 +703,24 @@ module ArelExtensions
|
|
|
707
703
|
collector
|
|
708
704
|
end
|
|
709
705
|
|
|
710
|
-
def visit_ArelExtensions_Nodes_Std
|
|
706
|
+
def visit_ArelExtensions_Nodes_Std(o, collector)
|
|
711
707
|
collector << (o.unbiased_estimator ? 'STDDEV_SAMP(' : 'STDDEV_POP(')
|
|
712
708
|
visit o.left, collector
|
|
713
709
|
collector << ')'
|
|
714
710
|
collector
|
|
715
711
|
end
|
|
716
712
|
|
|
717
|
-
def visit_ArelExtensions_Nodes_Variance
|
|
713
|
+
def visit_ArelExtensions_Nodes_Variance(o, collector)
|
|
718
714
|
collector << (o.unbiased_estimator ? 'VAR_SAMP(' : 'VAR_POP(')
|
|
719
715
|
visit o.left, collector
|
|
720
716
|
collector << ')'
|
|
721
717
|
collector
|
|
722
718
|
end
|
|
723
719
|
|
|
724
|
-
def visit_ArelExtensions_Nodes_LevenshteinDistance
|
|
720
|
+
def visit_ArelExtensions_Nodes_LevenshteinDistance(o, collector)
|
|
725
721
|
collector << 'UTL_MATCH.edit_distance('
|
|
726
722
|
collector = visit o.left, collector
|
|
727
|
-
collector <<
|
|
723
|
+
collector << COMMA
|
|
728
724
|
collector = visit o.right, collector
|
|
729
725
|
collector << ')'
|
|
730
726
|
collector
|
|
@@ -734,9 +730,9 @@ module ArelExtensions
|
|
|
734
730
|
# handle grouping aggregation semantics
|
|
735
731
|
def grouping_array_or_grouping_element(o, collector)
|
|
736
732
|
if o.expr.is_a? Array
|
|
737
|
-
collector <<
|
|
733
|
+
collector << '( '
|
|
738
734
|
visit o.expr, collector
|
|
739
|
-
collector <<
|
|
735
|
+
collector << ' )'
|
|
740
736
|
else
|
|
741
737
|
visit o.expr, collector
|
|
742
738
|
end
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
module ArelExtensions
|
|
2
2
|
module Visitors
|
|
3
3
|
Arel::Visitors.send(:remove_const, 'Oracle12') if Arel::Visitors.const_defined?('Oracle12')
|
|
4
|
-
Arel::Visitors.const_set(
|
|
5
|
-
|
|
4
|
+
Arel::Visitors.const_set(:Oracle12, Class.new(Arel::Visitors::Oracle)).class_eval do
|
|
6
5
|
def visit_Arel_Nodes_SelectOptions(o, collector)
|
|
7
6
|
collector = maybe_visit o.offset, collector
|
|
8
7
|
collector = maybe_visit o.limit, collector
|
|
@@ -48,13 +47,13 @@ module ArelExtensions
|
|
|
48
47
|
collector << ')'
|
|
49
48
|
end
|
|
50
49
|
|
|
51
|
-
def visit_ArelExtensions_Nodes_Json
|
|
50
|
+
def visit_ArelExtensions_Nodes_Json(o, collector)
|
|
52
51
|
case o.dict
|
|
53
52
|
when Array
|
|
54
53
|
collector << 'json_array('
|
|
55
54
|
o.dict.each.with_index do |v, i|
|
|
56
55
|
if i != 0
|
|
57
|
-
collector <<
|
|
56
|
+
collector << COMMA
|
|
58
57
|
end
|
|
59
58
|
collector = visit v, collector
|
|
60
59
|
end
|
|
@@ -63,7 +62,7 @@ module ArelExtensions
|
|
|
63
62
|
collector << 'json__object('
|
|
64
63
|
o.dict.each.with_index do |(k, v), i|
|
|
65
64
|
if i != 0
|
|
66
|
-
collector <<
|
|
65
|
+
collector << COMMA
|
|
67
66
|
end
|
|
68
67
|
collector << 'KEY '
|
|
69
68
|
collector = visit k, collector
|
|
@@ -76,7 +75,7 @@ module ArelExtensions
|
|
|
76
75
|
collector = visit Arel.quoted("#{o.dict}"), collector
|
|
77
76
|
collector << ' FORMAT JSON'
|
|
78
77
|
when NilClass
|
|
79
|
-
collector << %
|
|
78
|
+
collector << %('null' FORMAT JSON)
|
|
80
79
|
when Arel::Attributes::Attribute
|
|
81
80
|
collector = visit o.dict.cast('JSON'), collector
|
|
82
81
|
else
|