arel_extensions 2.3.3 → 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/.github/workflows/ruby.yml +92 -43
- data/.gitignore +2 -1
- data/.rubocop.yml +131 -5
- data/Makefile +48 -0
- data/NEWS.md +22 -0
- data/README.md +32 -5
- data/Rakefile +5 -3
- data/arel_extensions.gemspec +3 -5
- data/dev/arelx.dockerfile +13 -16
- data/dev/compose.yaml +26 -28
- 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 +40 -0
- data/gemfiles/rails8_1.gemfile +41 -0
- 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/constants.rb +13 -0
- data/lib/arel_extensions/date_duration.rb +2 -0
- data/lib/arel_extensions/helpers.rb +18 -19
- data/lib/arel_extensions/insert_manager.rb +5 -1
- data/lib/arel_extensions/math.rb +40 -44
- data/lib/arel_extensions/math_functions.rb +29 -31
- data/lib/arel_extensions/nodes/aggregate_function.rb +4 -4
- data/lib/arel_extensions/nodes/blank.rb +6 -4
- data/lib/arel_extensions/nodes/byte_size.rb +11 -0
- data/lib/arel_extensions/nodes/case.rb +16 -13
- data/lib/arel_extensions/nodes/cast.rb +3 -5
- data/lib/arel_extensions/nodes/char_length.rb +11 -0
- 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 +7 -7
- 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/matches.rb +2 -2
- 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 +23 -19
- data/lib/arel_extensions/string_functions.rb +37 -28
- 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 +111 -97
- data/lib/arel_extensions/visitors/mysql.rb +101 -67
- data/lib/arel_extensions/visitors/oracle.rb +113 -103
- data/lib/arel_extensions/visitors/oracle12.rb +5 -6
- data/lib/arel_extensions/visitors/postgresql.rb +119 -92
- data/lib/arel_extensions/visitors/sqlite.rb +72 -64
- data/lib/arel_extensions/visitors/to_sql.rb +85 -75
- data/lib/arel_extensions/visitors.rb +7 -7
- data/lib/arel_extensions/warning.rb +5 -5
- data/lib/arel_extensions.rb +47 -31
- data/test/arelx_test_helper.rb +8 -6
- data/test/config_loader.rb +9 -0
- data/test/database.yml +8 -6
- data/test/real_db_test.rb +33 -33
- data/test/support/fake_record.rb +3 -1
- data/test/visitors/test_bulk_insert_oracle.rb +2 -2
- data/test/visitors/test_bulk_insert_sqlite.rb +2 -2
- data/test/visitors/test_to_sql.rb +2 -2
- data/test/with_ar/all_agnostic_test.rb +214 -32
- data/test/with_ar/insert_agnostic_test.rb +2 -2
- data/test/with_ar/test_bulk_sqlite.rb +2 -2
- data/test/with_ar/test_math_sqlite.rb +2 -2
- data/test/with_ar/test_string_mysql.rb +2 -2
- data/test/with_ar/test_string_sqlite.rb +2 -2
- data/version_v1.rb +3 -1
- data/version_v2.rb +3 -1
- metadata +9 -33
- data/bin/compose +0 -6
- data/gemfiles/rails3.gemfile +0 -20
- data/gemfiles/rails4_2.gemfile +0 -38
|
@@ -13,27 +13,41 @@ module ArelExtensions
|
|
|
13
13
|
}
|
|
14
14
|
NUMBER_COMMA_MAPPING = {'en_US' => '.,', 'fr_FR' => ',', 'sv_SE' => ', '}
|
|
15
15
|
|
|
16
|
-
def
|
|
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
|
|
29
|
+
|
|
30
|
+
def visit_ArelExtensions_Nodes_Log10(o, collector)
|
|
17
31
|
collector << 'LOG('
|
|
18
32
|
o.expressions.each_with_index { |arg, i|
|
|
19
|
-
collector <<
|
|
33
|
+
collector << COMMA if i != 0
|
|
20
34
|
collector = visit arg, collector
|
|
21
35
|
}
|
|
22
36
|
collector << ',10)'
|
|
23
37
|
collector
|
|
24
38
|
end
|
|
25
39
|
|
|
26
|
-
def visit_ArelExtensions_Nodes_Power
|
|
40
|
+
def visit_ArelExtensions_Nodes_Power(o, collector)
|
|
27
41
|
collector << 'POWER('
|
|
28
42
|
o.expressions.each_with_index { |arg, i|
|
|
29
|
-
collector <<
|
|
43
|
+
collector << COMMA if i != 0
|
|
30
44
|
collector = visit arg, collector
|
|
31
45
|
}
|
|
32
46
|
collector << ')'
|
|
33
47
|
collector
|
|
34
48
|
end
|
|
35
49
|
|
|
36
|
-
def visit_ArelExtensions_Nodes_Concat
|
|
50
|
+
def visit_ArelExtensions_Nodes_Concat(o, collector)
|
|
37
51
|
collector << '('
|
|
38
52
|
o.expressions.each_with_index { |arg, i|
|
|
39
53
|
collector = visit o.convert_to_string_node(arg), collector
|
|
@@ -43,7 +57,7 @@ module ArelExtensions
|
|
|
43
57
|
collector
|
|
44
58
|
end
|
|
45
59
|
|
|
46
|
-
def visit_ArelExtensions_Nodes_IMatches
|
|
60
|
+
def visit_ArelExtensions_Nodes_IMatches(o, collector)
|
|
47
61
|
collector << 'LOWER('
|
|
48
62
|
collector = visit o.left, collector
|
|
49
63
|
collector << ') LIKE LOWER('
|
|
@@ -57,7 +71,7 @@ module ArelExtensions
|
|
|
57
71
|
end
|
|
58
72
|
end
|
|
59
73
|
|
|
60
|
-
def visit_ArelExtensions_Nodes_AiMatches
|
|
74
|
+
def visit_ArelExtensions_Nodes_AiMatches(o, collector)
|
|
61
75
|
collector = visit o.left.ai_collate, collector
|
|
62
76
|
collector << ' LIKE '
|
|
63
77
|
collector = visit o.right.ai_collate, collector
|
|
@@ -69,7 +83,7 @@ module ArelExtensions
|
|
|
69
83
|
end
|
|
70
84
|
end
|
|
71
85
|
|
|
72
|
-
def visit_ArelExtensions_Nodes_AiIMatches
|
|
86
|
+
def visit_ArelExtensions_Nodes_AiIMatches(o, collector)
|
|
73
87
|
collector = visit o.left.ai_collate, collector
|
|
74
88
|
collector << ' LIKE '
|
|
75
89
|
collector = visit o.right.ai_collate, collector
|
|
@@ -81,7 +95,7 @@ module ArelExtensions
|
|
|
81
95
|
end
|
|
82
96
|
end
|
|
83
97
|
|
|
84
|
-
def visit_ArelExtensions_Nodes_SMatches
|
|
98
|
+
def visit_ArelExtensions_Nodes_SMatches(o, collector)
|
|
85
99
|
collector = visit o.left, collector
|
|
86
100
|
collector << ' LIKE '
|
|
87
101
|
collector = visit o.right, collector
|
|
@@ -93,7 +107,7 @@ module ArelExtensions
|
|
|
93
107
|
end
|
|
94
108
|
end
|
|
95
109
|
|
|
96
|
-
def visit_ArelExtensions_Nodes_IDoesNotMatch
|
|
110
|
+
def visit_ArelExtensions_Nodes_IDoesNotMatch(o, collector)
|
|
97
111
|
collector << 'LOWER('
|
|
98
112
|
collector = visit o.left, collector
|
|
99
113
|
collector << ') NOT LIKE LOWER('
|
|
@@ -107,7 +121,7 @@ module ArelExtensions
|
|
|
107
121
|
end
|
|
108
122
|
end
|
|
109
123
|
|
|
110
|
-
def visit_ArelExtensions_Nodes_Collate
|
|
124
|
+
def visit_ArelExtensions_Nodes_Collate(o, collector)
|
|
111
125
|
if o.ai
|
|
112
126
|
collector << 'NLSSORT('
|
|
113
127
|
collector = visit o.expressions.first, collector
|
|
@@ -123,39 +137,39 @@ module ArelExtensions
|
|
|
123
137
|
else
|
|
124
138
|
collector = visit o.expressions.first, collector
|
|
125
139
|
end
|
|
126
|
-
|
|
140
|
+
collector
|
|
127
141
|
end
|
|
128
142
|
|
|
129
143
|
def visit_Arel_Nodes_RollUp(o, collector)
|
|
130
|
-
collector <<
|
|
144
|
+
collector << 'ROLLUP'
|
|
131
145
|
grouping_array_or_grouping_element o, collector
|
|
132
146
|
end
|
|
133
147
|
|
|
134
|
-
def visit_ArelExtensions_Nodes_GroupConcat
|
|
148
|
+
def visit_ArelExtensions_Nodes_GroupConcat(o, collector)
|
|
135
149
|
collector << '(LISTAGG('
|
|
136
150
|
collector = visit o.left, collector
|
|
137
151
|
collector << COMMA
|
|
138
152
|
sep = o.separator.is_a?(Arel::Nodes::Quoted) ? o.separator.expr : o.separator
|
|
139
153
|
collector =
|
|
140
|
-
if 'NULL'
|
|
141
|
-
visit o.separator, collector
|
|
142
|
-
else
|
|
154
|
+
if 'NULL' == sep
|
|
143
155
|
visit Arel.quoted(','), collector
|
|
156
|
+
else
|
|
157
|
+
visit o.separator, collector
|
|
144
158
|
end
|
|
145
159
|
collector << ') WITHIN GROUP (ORDER BY '
|
|
146
|
-
if
|
|
160
|
+
if o.order.blank?
|
|
161
|
+
collector = visit o.left, collector
|
|
162
|
+
else
|
|
147
163
|
o.order.each_with_index do |order, i|
|
|
148
164
|
collector << COMMA if i != 0
|
|
149
165
|
collector = visit order, collector
|
|
150
166
|
end
|
|
151
|
-
else
|
|
152
|
-
collector = visit o.left, collector
|
|
153
167
|
end
|
|
154
168
|
collector << '))'
|
|
155
169
|
collector
|
|
156
170
|
end
|
|
157
171
|
|
|
158
|
-
def visit_ArelExtensions_Nodes_Coalesce
|
|
172
|
+
def visit_ArelExtensions_Nodes_Coalesce(o, collector)
|
|
159
173
|
collector << 'COALESCE('
|
|
160
174
|
o.expressions.each_with_index { |arg, i|
|
|
161
175
|
collector << COMMA if i != 0
|
|
@@ -175,7 +189,7 @@ module ArelExtensions
|
|
|
175
189
|
collector
|
|
176
190
|
end
|
|
177
191
|
|
|
178
|
-
def visit_ArelExtensions_Nodes_MD5
|
|
192
|
+
def visit_ArelExtensions_Nodes_MD5(o, collector)
|
|
179
193
|
collector << 'LOWER (RAWTOHEX (DBMS_OBFUSCATION_TOOLKIT.md5(input => UTL_I18N.STRING_TO_RAW('
|
|
180
194
|
collector = visit o.left, collector
|
|
181
195
|
collector << ", 'AL32UTF8'))))"
|
|
@@ -183,9 +197,9 @@ module ArelExtensions
|
|
|
183
197
|
end
|
|
184
198
|
|
|
185
199
|
# :date is not possible in Oracle since this type does not really exist
|
|
186
|
-
def visit_ArelExtensions_Nodes_DateDiff
|
|
187
|
-
lc =
|
|
188
|
-
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)
|
|
189
203
|
if rc || o.right_node_type == :date || o.right_node_type == :datetime || o.right_node_type == :time
|
|
190
204
|
collector << '('
|
|
191
205
|
collector << 'TO_DATE(' if lc
|
|
@@ -196,7 +210,7 @@ module ArelExtensions
|
|
|
196
210
|
collector = visit o.right, collector
|
|
197
211
|
collector << ')' if rc
|
|
198
212
|
collector << ')'
|
|
199
|
-
if
|
|
213
|
+
if %i[ruby_time datetime time].include?(o.left_node_type)
|
|
200
214
|
collector << ' * (CASE WHEN (TRUNC('
|
|
201
215
|
collector << 'TO_DATE(' if lc
|
|
202
216
|
collector = visit o.left, collector
|
|
@@ -222,7 +236,7 @@ module ArelExtensions
|
|
|
222
236
|
collector
|
|
223
237
|
end
|
|
224
238
|
|
|
225
|
-
def visit_ArelExtensions_Nodes_Duration
|
|
239
|
+
def visit_ArelExtensions_Nodes_Duration(o, collector)
|
|
226
240
|
case o.left
|
|
227
241
|
when 'wd', 'w'
|
|
228
242
|
collector << 'TO_CHAR('
|
|
@@ -230,23 +244,24 @@ module ArelExtensions
|
|
|
230
244
|
collector << COMMA
|
|
231
245
|
collector = visit Arel.quoted(DATE_MAPPING[o.left]), collector
|
|
232
246
|
else
|
|
233
|
-
right =
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
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
|
|
250
265
|
collector << "EXTRACT(#{DATE_MAPPING[o.left]} FROM "
|
|
251
266
|
collector = visit right, collector
|
|
252
267
|
end
|
|
@@ -255,7 +270,7 @@ module ArelExtensions
|
|
|
255
270
|
collector
|
|
256
271
|
end
|
|
257
272
|
|
|
258
|
-
def visit_ArelExtensions_Nodes_Cast
|
|
273
|
+
def visit_ArelExtensions_Nodes_Cast(o, collector)
|
|
259
274
|
case o.as_attr
|
|
260
275
|
when :string
|
|
261
276
|
collector << 'TO_CHAR('
|
|
@@ -314,26 +329,26 @@ module ArelExtensions
|
|
|
314
329
|
collector
|
|
315
330
|
end
|
|
316
331
|
|
|
317
|
-
def visit_ArelExtensions_Nodes_Length
|
|
318
|
-
collector << "LENGTH#{
|
|
332
|
+
def visit_ArelExtensions_Nodes_Length(o, collector)
|
|
333
|
+
collector << "LENGTH#{'B' if o.bytewise}("
|
|
319
334
|
collector = visit o.expr, collector
|
|
320
335
|
collector << ')'
|
|
321
336
|
collector
|
|
322
337
|
end
|
|
323
338
|
|
|
324
|
-
def visit_ArelExtensions_Nodes_IsNull
|
|
339
|
+
def visit_ArelExtensions_Nodes_IsNull(o, collector)
|
|
325
340
|
collector = visit o.expr, collector
|
|
326
341
|
collector << ' IS NULL'
|
|
327
342
|
collector
|
|
328
343
|
end
|
|
329
344
|
|
|
330
|
-
def visit_ArelExtensions_Nodes_IsNotNull
|
|
345
|
+
def visit_ArelExtensions_Nodes_IsNotNull(o, collector)
|
|
331
346
|
collector = visit o.expr, collector
|
|
332
347
|
collector << ' IS NOT NULL'
|
|
333
348
|
collector
|
|
334
349
|
end
|
|
335
350
|
|
|
336
|
-
def visit_ArelExtensions_Nodes_Rand
|
|
351
|
+
def visit_ArelExtensions_Nodes_Rand(o, collector)
|
|
337
352
|
collector << 'DBMS_RANDOM.VALUE('
|
|
338
353
|
if o.left && o.right
|
|
339
354
|
collector = visit o.left, collector
|
|
@@ -344,7 +359,7 @@ module ArelExtensions
|
|
|
344
359
|
collector
|
|
345
360
|
end
|
|
346
361
|
|
|
347
|
-
def visit_Arel_Nodes_Regexp
|
|
362
|
+
def visit_Arel_Nodes_Regexp(o, collector)
|
|
348
363
|
collector << ' REGEXP_LIKE('
|
|
349
364
|
collector = visit o.left, collector
|
|
350
365
|
collector << COMMA
|
|
@@ -353,7 +368,7 @@ module ArelExtensions
|
|
|
353
368
|
collector
|
|
354
369
|
end
|
|
355
370
|
|
|
356
|
-
def visit_Arel_Nodes_NotRegexp
|
|
371
|
+
def visit_Arel_Nodes_NotRegexp(o, collector)
|
|
357
372
|
collector << ' NOT REGEXP_LIKE('
|
|
358
373
|
collector = visit o.left, collector
|
|
359
374
|
collector << COMMA
|
|
@@ -362,7 +377,7 @@ module ArelExtensions
|
|
|
362
377
|
collector
|
|
363
378
|
end
|
|
364
379
|
|
|
365
|
-
def visit_ArelExtensions_Nodes_Locate
|
|
380
|
+
def visit_ArelExtensions_Nodes_Locate(o, collector)
|
|
366
381
|
collector << 'INSTR('
|
|
367
382
|
o.expressions.each_with_index { |arg, i|
|
|
368
383
|
collector << COMMA if i != 0
|
|
@@ -372,7 +387,9 @@ module ArelExtensions
|
|
|
372
387
|
collector
|
|
373
388
|
end
|
|
374
389
|
|
|
375
|
-
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
|
+
|
|
376
393
|
collector << 'SUBSTR('
|
|
377
394
|
o.expressions.each_with_index { |arg, i|
|
|
378
395
|
collector << COMMA if i != 0
|
|
@@ -382,7 +399,7 @@ module ArelExtensions
|
|
|
382
399
|
collector
|
|
383
400
|
end
|
|
384
401
|
|
|
385
|
-
def visit_ArelExtensions_Nodes_Trim
|
|
402
|
+
def visit_ArelExtensions_Nodes_Trim(o, collector)
|
|
386
403
|
collector << 'TRIM(' # BOTH
|
|
387
404
|
if o.right.expr && SPECIAL_CHARS[o.right.expr]
|
|
388
405
|
collector << SPECIAL_CHARS[o.right.expr]
|
|
@@ -408,7 +425,7 @@ module ArelExtensions
|
|
|
408
425
|
collector
|
|
409
426
|
end
|
|
410
427
|
|
|
411
|
-
def visit_ArelExtensions_Nodes_Ltrim
|
|
428
|
+
def visit_ArelExtensions_Nodes_Ltrim(o, collector)
|
|
412
429
|
collector << 'TRIM(LEADING '
|
|
413
430
|
if o.right.expr && SPECIAL_CHARS[o.right.expr]
|
|
414
431
|
collector << SPECIAL_CHARS[o.right.expr]
|
|
@@ -421,7 +438,7 @@ module ArelExtensions
|
|
|
421
438
|
collector
|
|
422
439
|
end
|
|
423
440
|
|
|
424
|
-
def visit_ArelExtensions_Nodes_Rtrim
|
|
441
|
+
def visit_ArelExtensions_Nodes_Rtrim(o, collector)
|
|
425
442
|
collector << 'TRIM(TRAILING '
|
|
426
443
|
if o.right.expr && SPECIAL_CHARS[o.right.expr]
|
|
427
444
|
collector << SPECIAL_CHARS[o.right.expr]
|
|
@@ -434,15 +451,15 @@ module ArelExtensions
|
|
|
434
451
|
collector
|
|
435
452
|
end
|
|
436
453
|
|
|
437
|
-
def visit_ArelExtensions_Nodes_Blank
|
|
454
|
+
def visit_ArelExtensions_Nodes_Blank(o, collector)
|
|
438
455
|
visit o.expr.trim.length.coalesce(0).eq(0), collector
|
|
439
456
|
end
|
|
440
457
|
|
|
441
|
-
def visit_ArelExtensions_Nodes_NotBlank
|
|
458
|
+
def visit_ArelExtensions_Nodes_NotBlank(o, collector)
|
|
442
459
|
visit o.expr.trim.length.coalesce(0).gt(0), collector
|
|
443
460
|
end
|
|
444
461
|
|
|
445
|
-
def visit_ArelExtensions_Nodes_DateAdd
|
|
462
|
+
def visit_ArelExtensions_Nodes_DateAdd(o, collector)
|
|
446
463
|
collector << '('
|
|
447
464
|
collector = visit o.left, collector
|
|
448
465
|
collector << ' + ' # (o.right.value >= 0 ? ' + ' : ' - ')
|
|
@@ -451,12 +468,12 @@ module ArelExtensions
|
|
|
451
468
|
collector
|
|
452
469
|
end
|
|
453
470
|
|
|
454
|
-
def visit_ArelExtensions_Nodes_Format
|
|
471
|
+
def visit_ArelExtensions_Nodes_Format(o, collector)
|
|
455
472
|
visit_ArelExtensions_Nodes_FormattedDate o, collector
|
|
456
473
|
end
|
|
457
474
|
|
|
458
|
-
def visit_ArelExtensions_Nodes_FormattedDate
|
|
459
|
-
fmt = ArelExtensions::Visitors
|
|
475
|
+
def visit_ArelExtensions_Nodes_FormattedDate(o, collector)
|
|
476
|
+
fmt = ArelExtensions::Visitors.strftime_to_format(o.iso_format, DATE_FORMAT_DIRECTIVES)
|
|
460
477
|
collector << 'TO_CHAR('
|
|
461
478
|
collector << 'CAST(' if o.time_zone
|
|
462
479
|
collector = visit o.left, collector
|
|
@@ -465,7 +482,7 @@ module ArelExtensions
|
|
|
465
482
|
src_tz, dst_tz = o.time_zone.first
|
|
466
483
|
collector << ' as timestamp) at time zone '
|
|
467
484
|
collector = visit Arel.quoted(src_tz), collector
|
|
468
|
-
collector
|
|
485
|
+
collector << ' at time zone '
|
|
469
486
|
collector = visit Arel.quoted(dst_tz), collector
|
|
470
487
|
when String
|
|
471
488
|
collector << ' as timestamp) at time zone '
|
|
@@ -477,20 +494,20 @@ module ArelExtensions
|
|
|
477
494
|
collector
|
|
478
495
|
end
|
|
479
496
|
|
|
480
|
-
def visit_ArelExtensions_Nodes_Repeat
|
|
497
|
+
def visit_ArelExtensions_Nodes_Repeat(o, collector)
|
|
481
498
|
collector << 'LPAD('
|
|
482
499
|
collector = visit o.expressions[0], collector # can't put empty string, otherwise it wouldn't work
|
|
483
|
-
collector <<
|
|
500
|
+
collector << COMMA
|
|
484
501
|
collector = visit o.expressions[1], collector
|
|
485
|
-
collector <<
|
|
502
|
+
collector << COMMA
|
|
486
503
|
collector = visit o.expressions[0], collector
|
|
487
504
|
collector << ')'
|
|
488
505
|
collector
|
|
489
506
|
end
|
|
490
507
|
|
|
491
508
|
# add primary_key if not present, avoid zip
|
|
492
|
-
if
|
|
493
|
-
def visit_ArelExtensions_InsertManager_BulkValues
|
|
509
|
+
if AREL_VERSION < V7
|
|
510
|
+
def visit_ArelExtensions_InsertManager_BulkValues(o, collector)
|
|
494
511
|
collector << '('
|
|
495
512
|
o.left.each_with_index do |row, idx| # values
|
|
496
513
|
collector << ' UNION ALL ' if idx != 0
|
|
@@ -511,7 +528,7 @@ module ArelExtensions
|
|
|
511
528
|
collector
|
|
512
529
|
end
|
|
513
530
|
else
|
|
514
|
-
def visit_ArelExtensions_InsertManager_BulkValues
|
|
531
|
+
def visit_ArelExtensions_InsertManager_BulkValues(o, collector)
|
|
515
532
|
collector << '('
|
|
516
533
|
o.left.each_with_index do |row, idx|
|
|
517
534
|
collector << ' UNION ALL ' if idx != 0
|
|
@@ -535,8 +552,7 @@ module ArelExtensions
|
|
|
535
552
|
end
|
|
536
553
|
end
|
|
537
554
|
|
|
538
|
-
|
|
539
|
-
def get_time_converted element
|
|
555
|
+
def get_time_converted(element)
|
|
540
556
|
if element.is_a?(Time)
|
|
541
557
|
ArelExtensions::Nodes::Format.new [element, '%H:%M:%S']
|
|
542
558
|
elsif element.is_a?(Arel::Attributes::Attribute)
|
|
@@ -551,42 +567,36 @@ module ArelExtensions
|
|
|
551
567
|
end
|
|
552
568
|
end
|
|
553
569
|
|
|
554
|
-
|
|
555
570
|
remove_method(:visit_Arel_Nodes_GreaterThanOrEqual) rescue nil
|
|
556
|
-
def visit_Arel_Nodes_GreaterThanOrEqual
|
|
571
|
+
def visit_Arel_Nodes_GreaterThanOrEqual(o, collector)
|
|
557
572
|
collector = visit get_time_converted(o.left), collector
|
|
558
573
|
collector << ' >= '
|
|
559
|
-
|
|
560
|
-
collector
|
|
574
|
+
visit get_time_converted(o.right), collector
|
|
561
575
|
end
|
|
562
576
|
|
|
563
577
|
remove_method(:visit_Arel_Nodes_GreaterThan) rescue nil
|
|
564
|
-
def visit_Arel_Nodes_GreaterThan
|
|
578
|
+
def visit_Arel_Nodes_GreaterThan(o, collector)
|
|
565
579
|
collector = visit get_time_converted(o.left), collector
|
|
566
580
|
collector << ' > '
|
|
567
|
-
|
|
568
|
-
collector
|
|
581
|
+
visit get_time_converted(o.right), collector
|
|
569
582
|
end
|
|
570
583
|
|
|
571
584
|
remove_method(:visit_Arel_Nodes_LessThanOrEqual) rescue nil
|
|
572
|
-
def visit_Arel_Nodes_LessThanOrEqual
|
|
585
|
+
def visit_Arel_Nodes_LessThanOrEqual(o, collector)
|
|
573
586
|
collector = visit get_time_converted(o.left), collector
|
|
574
587
|
collector << ' <= '
|
|
575
|
-
|
|
576
|
-
collector
|
|
588
|
+
visit get_time_converted(o.right), collector
|
|
577
589
|
end
|
|
578
590
|
|
|
579
591
|
remove_method(:visit_Arel_Nodes_LessThan) rescue nil
|
|
580
|
-
def visit_Arel_Nodes_LessThan
|
|
592
|
+
def visit_Arel_Nodes_LessThan(o, collector)
|
|
581
593
|
collector = visit get_time_converted(o.left), collector
|
|
582
594
|
collector << ' < '
|
|
583
|
-
|
|
584
|
-
collector
|
|
595
|
+
visit get_time_converted(o.right), collector
|
|
585
596
|
end
|
|
586
597
|
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
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)
|
|
590
600
|
if !(collector.value.blank? || (collector.value.is_a?(Array) && collector.value[0].blank?)) && o.limit.blank? && o.offset.blank?
|
|
591
601
|
o = o.dup
|
|
592
602
|
o.orders = []
|
|
@@ -594,16 +604,16 @@ module ArelExtensions
|
|
|
594
604
|
old_visit_Arel_Nodes_SelectStatement(o, collector)
|
|
595
605
|
end
|
|
596
606
|
|
|
597
|
-
|
|
598
|
-
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)
|
|
599
609
|
if o.name.length > 30
|
|
600
610
|
o = Arel::Table.new(o.table_name).alias(Arel.shorten(o.name))
|
|
601
611
|
end
|
|
602
612
|
old_visit_Arel_Nodes_TableAlias(o, collector)
|
|
603
613
|
end
|
|
604
614
|
|
|
605
|
-
|
|
606
|
-
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)
|
|
607
617
|
if o.left.is_a?(Arel::Nodes::Binary)
|
|
608
618
|
collector << '('
|
|
609
619
|
collector = visit o.left, collector
|
|
@@ -618,12 +628,12 @@ module ArelExtensions
|
|
|
618
628
|
collector
|
|
619
629
|
end
|
|
620
630
|
|
|
621
|
-
def visit_ArelExtensions_Nodes_As
|
|
631
|
+
def visit_ArelExtensions_Nodes_As(o, collector)
|
|
622
632
|
visit_Arel_Nodes_As o, collector
|
|
623
633
|
end
|
|
624
634
|
|
|
625
|
-
|
|
626
|
-
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)
|
|
627
637
|
join_name = o.relation.table_alias || o.relation.name
|
|
628
638
|
if join_name.length > 30
|
|
629
639
|
join_name = Arel.shorten(join_name)
|
|
@@ -631,11 +641,11 @@ module ArelExtensions
|
|
|
631
641
|
collector << "#{quote_table_name join_name}.#{quote_column_name o.name}"
|
|
632
642
|
end
|
|
633
643
|
|
|
634
|
-
def visit_ArelExtensions_Nodes_FormattedNumber
|
|
644
|
+
def visit_ArelExtensions_Nodes_FormattedNumber(o, collector)
|
|
635
645
|
col = o.left.coalesce(0)
|
|
636
646
|
comma = NUMBER_COMMA_MAPPING[o.locale] || '.,'
|
|
637
647
|
comma_in_format = o.precision == 0 ? '' : 'D'
|
|
638
|
-
nines_after = (1..o.precision - 1).map{'9'}.join('') + '0'
|
|
648
|
+
nines_after = (1..o.precision - 1).map { '9' }.join('') + '0'
|
|
639
649
|
if comma.length == 1
|
|
640
650
|
options = Arel.quoted("NLS_NUMERIC_CHARACTERS = '#{comma} '")
|
|
641
651
|
nines_before = ('999' * 4 + '990')
|
|
@@ -693,24 +703,24 @@ module ArelExtensions
|
|
|
693
703
|
collector
|
|
694
704
|
end
|
|
695
705
|
|
|
696
|
-
def visit_ArelExtensions_Nodes_Std
|
|
706
|
+
def visit_ArelExtensions_Nodes_Std(o, collector)
|
|
697
707
|
collector << (o.unbiased_estimator ? 'STDDEV_SAMP(' : 'STDDEV_POP(')
|
|
698
708
|
visit o.left, collector
|
|
699
709
|
collector << ')'
|
|
700
710
|
collector
|
|
701
711
|
end
|
|
702
712
|
|
|
703
|
-
def visit_ArelExtensions_Nodes_Variance
|
|
713
|
+
def visit_ArelExtensions_Nodes_Variance(o, collector)
|
|
704
714
|
collector << (o.unbiased_estimator ? 'VAR_SAMP(' : 'VAR_POP(')
|
|
705
715
|
visit o.left, collector
|
|
706
716
|
collector << ')'
|
|
707
717
|
collector
|
|
708
718
|
end
|
|
709
719
|
|
|
710
|
-
def visit_ArelExtensions_Nodes_LevenshteinDistance
|
|
720
|
+
def visit_ArelExtensions_Nodes_LevenshteinDistance(o, collector)
|
|
711
721
|
collector << 'UTL_MATCH.edit_distance('
|
|
712
722
|
collector = visit o.left, collector
|
|
713
|
-
collector <<
|
|
723
|
+
collector << COMMA
|
|
714
724
|
collector = visit o.right, collector
|
|
715
725
|
collector << ')'
|
|
716
726
|
collector
|
|
@@ -720,9 +730,9 @@ module ArelExtensions
|
|
|
720
730
|
# handle grouping aggregation semantics
|
|
721
731
|
def grouping_array_or_grouping_element(o, collector)
|
|
722
732
|
if o.expr.is_a? Array
|
|
723
|
-
collector <<
|
|
733
|
+
collector << '( '
|
|
724
734
|
visit o.expr, collector
|
|
725
|
-
collector <<
|
|
735
|
+
collector << ' )'
|
|
726
736
|
else
|
|
727
737
|
visit o.expr, collector
|
|
728
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
|