arel_extensions 1.1.8 → 1.1.9
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/.travis.yml +2 -0
- data/Gemfile +1 -1
- data/gemfiles/rails3.gemfile +12 -12
- data/gemfiles/rails4.gemfile +17 -17
- data/gemfiles/rails5_0.gemfile +17 -17
- data/gemfiles/rails5_1_4.gemfile +17 -17
- data/gemfiles/rails5_2.gemfile +17 -17
- data/lib/arel_extensions/boolean_functions.rb +30 -11
- data/lib/arel_extensions/math.rb +111 -112
- data/lib/arel_extensions/math_functions.rb +50 -31
- data/lib/arel_extensions/nodes/function.rb +25 -26
- data/lib/arel_extensions/nodes/json.rb +81 -0
- data/lib/arel_extensions/predications.rb +95 -97
- data/lib/arel_extensions/version.rb +1 -1
- data/lib/arel_extensions/visitors/mssql.rb +121 -108
- data/lib/arel_extensions/visitors/mysql.rb +230 -148
- data/lib/arel_extensions/visitors/oracle.rb +242 -232
- data/lib/arel_extensions/visitors/oracle12.rb +39 -1
- data/lib/arel_extensions/visitors/postgresql.rb +216 -134
- data/lib/arel_extensions/visitors/sqlite.rb +200 -189
- data/lib/arel_extensions/visitors/to_sql.rb +239 -171
- data/lib/arel_extensions/visitors.rb +63 -33
- data/lib/arel_extensions.rb +1 -0
- data/test/visitors/test_oracle.rb +1 -1
- data/test/visitors/test_to_sql.rb +206 -195
- data/test/with_ar/all_agnostic_test.rb +278 -235
- metadata +3 -2
@@ -20,7 +20,7 @@ module ArelExtensions
|
|
20
20
|
collector << ")"
|
21
21
|
collector
|
22
22
|
end
|
23
|
-
|
23
|
+
|
24
24
|
def visit_ArelExtensions_Nodes_Power o, collector
|
25
25
|
collector << "POWER("
|
26
26
|
o.expressions.each_with_index { |arg, i|
|
@@ -30,7 +30,7 @@ module ArelExtensions
|
|
30
30
|
collector << ")"
|
31
31
|
collector
|
32
32
|
end
|
33
|
-
|
33
|
+
|
34
34
|
def visit_ArelExtensions_Nodes_Log10 o, collector
|
35
35
|
collector << "LOG("
|
36
36
|
o.expressions.each_with_index { |arg, i|
|
@@ -40,7 +40,7 @@ module ArelExtensions
|
|
40
40
|
collector << ")"
|
41
41
|
collector
|
42
42
|
end
|
43
|
-
|
43
|
+
|
44
44
|
|
45
45
|
remove_method(:visit_Arel_Nodes_Regexp) rescue nil
|
46
46
|
def visit_Arel_Nodes_Regexp o, collector
|
@@ -57,7 +57,7 @@ module ArelExtensions
|
|
57
57
|
collector = visit o.right, collector
|
58
58
|
collector
|
59
59
|
end
|
60
|
-
|
60
|
+
|
61
61
|
def visit_ArelExtensions_Nodes_Concat o, collector
|
62
62
|
collector << '('
|
63
63
|
o.expressions.each_with_index { |arg, i|
|
@@ -68,6 +68,21 @@ module ArelExtensions
|
|
68
68
|
collector
|
69
69
|
end
|
70
70
|
|
71
|
+
alias_method :old_visit_Arel_Nodes_As, :visit_Arel_Nodes_As
|
72
|
+
def visit_Arel_Nodes_As o, collector
|
73
|
+
if o.left.is_a?(Arel::Nodes::Binary)
|
74
|
+
collector << '('
|
75
|
+
collector = visit o.left, collector
|
76
|
+
collector << ')'
|
77
|
+
else
|
78
|
+
collector = visit o.left, collector
|
79
|
+
end
|
80
|
+
collector << " AS \""
|
81
|
+
collector = visit o.right, collector
|
82
|
+
collector << "\""
|
83
|
+
collector
|
84
|
+
end
|
85
|
+
|
71
86
|
def visit_ArelExtensions_Nodes_GroupConcat o, collector
|
72
87
|
collector << "array_to_string(array_agg("
|
73
88
|
collector = visit o.left, collector
|
@@ -128,7 +143,7 @@ module ArelExtensions
|
|
128
143
|
collector << ")"
|
129
144
|
collector
|
130
145
|
end
|
131
|
-
|
146
|
+
|
132
147
|
def visit_ArelExtensions_Nodes_Repeat o, collector
|
133
148
|
collector << "REPEAT("
|
134
149
|
o.expressions.each_with_index { |arg, i|
|
@@ -137,9 +152,9 @@ module ArelExtensions
|
|
137
152
|
}
|
138
153
|
collector << ")"
|
139
154
|
collector
|
140
|
-
end
|
141
|
-
|
142
|
-
def visit_ArelExtensions_Nodes_AiMatches o, collector
|
155
|
+
end
|
156
|
+
|
157
|
+
def visit_ArelExtensions_Nodes_AiMatches o, collector
|
143
158
|
collector = visit o.left.ai_collate, collector
|
144
159
|
collector << ' LIKE '
|
145
160
|
collector = visit o.right.ai_collate, collector
|
@@ -150,8 +165,8 @@ module ArelExtensions
|
|
150
165
|
collector
|
151
166
|
end
|
152
167
|
end
|
153
|
-
|
154
|
-
def visit_ArelExtensions_Nodes_AiIMatches o, collector
|
168
|
+
|
169
|
+
def visit_ArelExtensions_Nodes_AiIMatches o, collector
|
155
170
|
collector = visit o.left.ai_collate, collector
|
156
171
|
collector << ' ILIKE '
|
157
172
|
collector = visit o.right.ai_collate, collector
|
@@ -162,8 +177,8 @@ module ArelExtensions
|
|
162
177
|
collector
|
163
178
|
end
|
164
179
|
end
|
165
|
-
|
166
|
-
def visit_ArelExtensions_Nodes_SMatches o, collector
|
180
|
+
|
181
|
+
def visit_ArelExtensions_Nodes_SMatches o, collector
|
167
182
|
collector = visit o.left, collector
|
168
183
|
collector << ' LIKE '
|
169
184
|
collector = visit o.right, collector
|
@@ -175,7 +190,7 @@ module ArelExtensions
|
|
175
190
|
end
|
176
191
|
end
|
177
192
|
|
178
|
-
def visit_ArelExtensions_Nodes_Collate o, collector
|
193
|
+
def visit_ArelExtensions_Nodes_Collate o, collector
|
179
194
|
if o.ai
|
180
195
|
collector << "unaccent("
|
181
196
|
collector = visit o.expressions.first, collector
|
@@ -184,7 +199,7 @@ module ArelExtensions
|
|
184
199
|
collector = visit o.expressions.first, collector
|
185
200
|
else
|
186
201
|
collector = visit o.expressions.first, collector
|
187
|
-
end
|
202
|
+
end
|
188
203
|
collector
|
189
204
|
end
|
190
205
|
|
@@ -241,12 +256,12 @@ module ArelExtensions
|
|
241
256
|
collector << ' IS NULL'
|
242
257
|
collector
|
243
258
|
end
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
259
|
+
|
260
|
+
def visit_ArelExtensions_Nodes_IsNotNull o, collector
|
261
|
+
collector = visit o.left, collector
|
262
|
+
collector << ' IS NOT NULL'
|
263
|
+
collector
|
264
|
+
end
|
250
265
|
|
251
266
|
def visit_ArelExtensions_Nodes_Sum o, collector
|
252
267
|
collector << "sum("
|
@@ -261,126 +276,193 @@ module ArelExtensions
|
|
261
276
|
collector << ')'
|
262
277
|
collector
|
263
278
|
end
|
264
|
-
|
265
|
-
|
279
|
+
|
280
|
+
def visit_ArelExtensions_Nodes_Cast o, collector
|
266
281
|
collector << "CAST("
|
267
282
|
collector = visit o.left, collector
|
268
283
|
collector << " AS "
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
284
|
+
case o.as_attr
|
285
|
+
when :string
|
286
|
+
as_attr = Arel::Nodes::SqlLiteral.new('varchar')
|
287
|
+
when :time
|
288
|
+
as_attr = Arel::Nodes::SqlLiteral.new('time')
|
289
|
+
when :number
|
290
|
+
as_attr = Arel::Nodes::SqlLiteral.new('int')
|
291
|
+
when :datetime
|
292
|
+
as_attr = Arel::Nodes::SqlLiteral.new('datetime')
|
293
|
+
when :binary
|
294
|
+
as_attr = Arel::Nodes::SqlLiteral.new('binary')
|
295
|
+
else
|
296
|
+
as_attr = Arel::Nodes::SqlLiteral.new(o.as_attr.to_s)
|
297
|
+
end
|
283
298
|
collector = visit as_attr, collector
|
284
299
|
collector << ")"
|
285
300
|
collector
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
|
301
|
+
end
|
302
|
+
|
303
|
+
def visit_ArelExtensions_Nodes_FormattedNumber o, collector
|
304
|
+
col = o.left.coalesce(0)
|
305
|
+
comma = o.precision == 0 ? '' : (Arel::Visitors::PostgreSQL::NUMBER_COMMA_MAPPING[o.locale][0] || '.')
|
306
|
+
thousand_separator = Arel::Visitors::PostgreSQL::NUMBER_COMMA_MAPPING[o.locale][1] || (Arel::Visitors::PostgreSQL::NUMBER_COMMA_MAPPING[o.locale] ? '' : 'G')
|
307
|
+
nines_after = (1..o.precision).map{'9'}.join('')
|
308
|
+
nines_before = ("999#{thousand_separator}"*4+"990")
|
309
|
+
|
310
|
+
sign = ArelExtensions::Nodes::Case.new.when(col<0).
|
311
|
+
then('-').
|
312
|
+
else(o.flags.include?('+') ? '+' : (o.flags.include?(' ') ? ' ' : ''))
|
313
|
+
sign_length = ArelExtensions::Nodes::Length.new([sign])
|
314
|
+
|
315
|
+
if o.scientific_notation
|
316
|
+
number = ArelExtensions::Nodes::Concat.new([
|
317
|
+
Arel::Nodes::NamedFunction.new('TRIM',[
|
318
|
+
Arel::Nodes::NamedFunction.new('TO_CHAR',[
|
319
|
+
col.abs/Arel::Nodes.build_quoted(10).pow(col.abs.log10.floor),
|
320
|
+
Arel::Nodes.build_quoted('FM'+nines_before+'"'+comma+'"V'+nines_after)
|
321
|
+
])]),
|
322
|
+
o.type,
|
323
|
+
Arel::Nodes::NamedFunction.new('TRIM',[
|
324
|
+
Arel::Nodes::NamedFunction.new('TO_CHAR',[
|
325
|
+
col.abs.log10.floor,
|
326
|
+
Arel::Nodes.build_quoted('FM'+nines_before)
|
327
|
+
])])
|
328
|
+
])
|
329
|
+
else
|
330
|
+
number = Arel::Nodes::NamedFunction.new('TRIM',[
|
331
|
+
Arel::Nodes::NamedFunction.new('TO_CHAR',[
|
332
|
+
Arel::Nodes.build_quoted(col.abs),
|
333
|
+
Arel::Nodes.build_quoted('FM'+nines_before+'"'+comma+'"V'+nines_after)
|
334
|
+
])])
|
335
|
+
end
|
336
|
+
|
337
|
+
repeated_char = (o.width == 0) ? Arel::Nodes.build_quoted('') : ArelExtensions::Nodes::Case.new().
|
338
|
+
when(Arel::Nodes.build_quoted(o.width).abs-(number.length+sign_length)>0).
|
339
|
+
then(Arel::Nodes.build_quoted(
|
340
|
+
o.flags.include?('-') ? ' ' : (o.flags.include?('0') ? '0' : ' ')
|
341
|
+
).repeat(Arel::Nodes.build_quoted(o.width).abs-(number.length+sign_length))
|
342
|
+
).
|
343
|
+
else('')
|
344
|
+
before = (!o.flags.include?('0'))&&(!o.flags.include?('-')) ? repeated_char : ''
|
345
|
+
middle = (o.flags.include?('0'))&&(!o.flags.include?('-')) ? repeated_char : ''
|
346
|
+
after = o.flags.include?('-') ? repeated_char : ''
|
347
|
+
full_number = ArelExtensions::Nodes::Concat.new([
|
348
|
+
before,
|
349
|
+
sign,
|
350
|
+
middle,
|
351
|
+
number,
|
352
|
+
after
|
353
|
+
])
|
354
|
+
collector = visit ArelExtensions::Nodes::Concat.new([Arel::Nodes.build_quoted(o.prefix),full_number,Arel::Nodes.build_quoted(o.suffix)]), collector
|
355
|
+
collector
|
356
|
+
end
|
357
|
+
|
358
|
+
|
359
|
+
alias_method :old_visit_Arel_Nodes_SelectStatement, :visit_Arel_Nodes_SelectStatement
|
360
|
+
def visit_Arel_Nodes_SelectStatement o, collector
|
361
|
+
|
362
|
+
if !(collector.value.blank? || (collector.value.is_a?(Array) && collector.value[0].blank?)) && o.limit.blank? && o.offset.blank?
|
363
|
+
o = o.dup
|
364
|
+
o.orders = []
|
365
|
+
end
|
366
|
+
old_visit_Arel_Nodes_SelectStatement(o,collector)
|
367
|
+
end
|
368
|
+
|
369
|
+
alias_method :old_visit_Arel_Nodes_TableAlias, :visit_Arel_Nodes_TableAlias
|
370
|
+
def visit_Arel_Nodes_TableAlias o, collector
|
371
|
+
if o.name.length > 63
|
372
|
+
o = Arel::Table.new(o.table_name).alias(Arel.shorten(o.name))
|
373
|
+
end
|
374
|
+
old_visit_Arel_Nodes_TableAlias(o,collector)
|
375
|
+
end
|
376
|
+
|
377
|
+
alias_method :old_visit_Arel_Attributes_Attribute, :visit_Arel_Attributes_Attribute
|
378
|
+
def visit_Arel_Attributes_Attribute o, collector
|
379
|
+
join_name = o.relation.table_alias || o.relation.name
|
380
|
+
if join_name.length > 63
|
381
|
+
join_name = Arel.shorten(join_name)
|
382
|
+
end
|
383
|
+
collector << "#{quote_table_name join_name}.#{quote_column_name o.name}"
|
384
|
+
end
|
385
|
+
|
386
|
+
def visit_ArelExtensions_Nodes_Std o, collector
|
387
|
+
collector << (o.unbiased_estimator ? "STDDEV_SAMP(" : "STDDEV_POP(")
|
388
|
+
visit o.left, collector
|
389
|
+
collector << ")"
|
390
|
+
collector
|
391
|
+
end
|
392
|
+
|
393
|
+
def visit_ArelExtensions_Nodes_Variance o, collector
|
394
|
+
collector << (o.unbiased_estimator ? "VAR_SAMP(" : "VAR_POP(")
|
395
|
+
visit o.left, collector
|
396
|
+
collector << ")"
|
397
|
+
collector
|
398
|
+
end
|
399
|
+
|
400
|
+
def visit_ArelExtensions_Nodes_Json o,collector
|
401
|
+
case o.hash
|
402
|
+
when Array
|
403
|
+
collector << 'to_jsonb(array['
|
404
|
+
o.hash.each.with_index do |v,i|
|
405
|
+
if i != 0
|
406
|
+
collector << Arel::Visitors::MySQL::COMMA
|
407
|
+
end
|
408
|
+
collector = visit v, collector
|
409
|
+
end
|
410
|
+
collector << '])'
|
411
|
+
when Hash
|
412
|
+
collector << 'jsonb_build_object('
|
413
|
+
o.hash.each.with_index do |(k,v),i|
|
414
|
+
if i != 0
|
415
|
+
collector << Arel::Visitors::MySQL::COMMA
|
416
|
+
end
|
417
|
+
collector = visit k, collector
|
418
|
+
collector << Arel::Visitors::MySQL::COMMA
|
419
|
+
collector = visit v, collector
|
420
|
+
end
|
421
|
+
collector << ')'
|
422
|
+
when String,Numeric,TrueClass,FalseClass
|
423
|
+
collector = visit Arel::Nodes.build_quoted("#{o.hash}"), collector
|
424
|
+
collector << '::jsonb'
|
425
|
+
when NilClass
|
426
|
+
collector << %Q['null'::jsonb]
|
427
|
+
when Arel::Attributes::Attribute
|
428
|
+
collector = visit o.hash.cast(:jsonb), collector
|
429
|
+
else
|
430
|
+
collector = visit o.hash, collector
|
431
|
+
collector << '::jsonb'
|
432
|
+
end
|
433
|
+
collector
|
434
|
+
end
|
435
|
+
|
436
|
+
def visit_ArelExtensions_Nodes_JsonMerge o,collector
|
437
|
+
o.expressions.each.with_index do |v,i|
|
438
|
+
if i != 0
|
439
|
+
collector << ' || '
|
440
|
+
end
|
441
|
+
collector = visit v, collector
|
442
|
+
end
|
443
|
+
collector
|
444
|
+
end
|
445
|
+
|
446
|
+
def visit_ArelExtensions_Nodes_JsonGet o,collector
|
447
|
+
collector = visit o.hash, collector
|
448
|
+
collector << ' -> '
|
449
|
+
collector = visit o.key, collector
|
450
|
+
collector
|
451
|
+
end
|
452
|
+
|
453
|
+
def visit_ArelExtensions_Nodes_JsonSet o,collector
|
454
|
+
collector << 'jsonb_set('
|
455
|
+
collector = visit o.hash, collector
|
456
|
+
collector << Arel::Visitors::MySQL::COMMA
|
457
|
+
collector << 'array['
|
458
|
+
collector = visit o.key, collector
|
459
|
+
collector << ']'
|
460
|
+
collector << Arel::Visitors::MySQL::COMMA
|
461
|
+
collector = visit o.value, collector
|
462
|
+
collector << Arel::Visitors::MySQL::COMMA
|
463
|
+
collector << 'true)'
|
464
|
+
collector
|
465
|
+
end
|
384
466
|
|
385
467
|
end
|
386
468
|
end
|