arel_extensions 1.1.8 → 1.1.9

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,6 +1,6 @@
1
1
  module ArelExtensions
2
2
  module Visitors
3
- Arel::Visitors::MySQL.class_eval do
3
+ Arel::Visitors::MySQL.class_eval do
4
4
  Arel::Visitors::MySQL::DATE_MAPPING = {'d' => 'DAY', 'm' => 'MONTH', 'w' => 'WEEK', 'y' => 'YEAR', 'wd' => 'WEEKDAY', 'h' => 'HOUR', 'mn' => 'MINUTE', 's' => 'SECOND'}
5
5
  Arel::Visitors::MySQL::DATE_FORMAT_DIRECTIVES = { # ISO C / POSIX
6
6
  '%Y' => '%Y', '%C' => '', '%y' => '%y', '%m' => '%m', '%B' => '%M', '%b' => '%b', '%^b' => '%b', # year, month
@@ -10,18 +10,18 @@ module ArelExtensions
10
10
  }
11
11
 
12
12
 
13
- #Math functions
14
- def visit_ArelExtensions_Nodes_Log10 o, collector
15
- collector << "LOG10("
16
- o.expressions.each_with_index { |arg, i|
17
- collector << Arel::Visitors::ToSql::COMMA unless i == 0
18
- collector = visit arg, collector
19
- }
20
- collector << ")"
21
- collector
22
- end
23
-
24
- def visit_ArelExtensions_Nodes_Power o, collector
13
+ #Math functions
14
+ def visit_ArelExtensions_Nodes_Log10 o, collector
15
+ collector << "LOG10("
16
+ o.expressions.each_with_index { |arg, i|
17
+ collector << Arel::Visitors::ToSql::COMMA unless i == 0
18
+ collector = visit arg, collector
19
+ }
20
+ collector << ")"
21
+ collector
22
+ end
23
+
24
+ def visit_ArelExtensions_Nodes_Power o, collector
25
25
  collector << "POW("
26
26
  o.expressions.each_with_index { |arg, i|
27
27
  collector << Arel::Visitors::ToSql::COMMA unless i == 0
@@ -29,11 +29,11 @@ module ArelExtensions
29
29
  }
30
30
  collector << ")"
31
31
  collector
32
- end
32
+ end
33
33
 
34
34
  #String functions
35
35
  def visit_ArelExtensions_Nodes_IMatches o, collector # insensitive on ASCII
36
- collector << 'LOWER('
36
+ collector << 'LOWER('
37
37
  collector = visit o.left, collector
38
38
  collector << ') LIKE LOWER('
39
39
  collector = visit o.right, collector
@@ -45,8 +45,8 @@ module ArelExtensions
45
45
  collector
46
46
  end
47
47
  end
48
-
49
- def visit_ArelExtensions_Nodes_AiMatches o, collector
48
+
49
+ def visit_ArelExtensions_Nodes_AiMatches o, collector
50
50
  collector = visit o.left.ai_collate, collector
51
51
  collector << ' LIKE '
52
52
  collector = visit o.right.ai_collate, collector
@@ -57,8 +57,8 @@ module ArelExtensions
57
57
  collector
58
58
  end
59
59
  end
60
-
61
- def visit_ArelExtensions_Nodes_AiIMatches o, collector
60
+
61
+ def visit_ArelExtensions_Nodes_AiIMatches o, collector
62
62
  collector = visit o.left.ai_collate, collector
63
63
  collector << ' LIKE '
64
64
  collector = visit o.right.ai_collate, collector
@@ -70,17 +70,17 @@ module ArelExtensions
70
70
  end
71
71
  end
72
72
 
73
- def visit_ArelExtensions_Nodes_SMatches o, collector
74
- collector = visit o.left.collate, collector
75
- collector << ' LIKE '
76
- collector = visit o.right.collate, collector
77
- if o.escape
78
- collector << ' ESCAPE '
79
- visit o.escape, collector
80
- else
81
- collector
82
- end
83
- end
73
+ def visit_ArelExtensions_Nodes_SMatches o, collector
74
+ collector = visit o.left.collate, collector
75
+ collector << ' LIKE '
76
+ collector = visit o.right.collate, collector
77
+ if o.escape
78
+ collector << ' ESCAPE '
79
+ visit o.escape, collector
80
+ else
81
+ collector
82
+ end
83
+ end
84
84
 
85
85
  def visit_ArelExtensions_Nodes_IDoesNotMatch o, collector
86
86
  collector << 'LOWER('
@@ -96,29 +96,29 @@ module ArelExtensions
96
96
  end
97
97
  end
98
98
 
99
- def visit_ArelExtensions_Nodes_Collate o, collector
100
- case o.expressions.first
101
- when Arel::Attributes::Attribute
102
- charset = case o.option
103
- when 'latin1','utf8'
104
- o.option
105
- else
106
- Arel::Table.engine.connection.charset || 'utf8'
107
- end
108
- else
109
- charset = (o.option == 'latin1') ? 'latin1' : 'utf8'
110
- end
111
- collector = visit o.expressions.first, collector
112
- if o.ai
113
- collector << " COLLATE #{charset == 'latin1' ? 'latin1_general_ci' : 'utf8_unicode_ci' }"
114
- #doesn't work in latin1
115
- elsif o.ci
116
- collector << " COLLATE #{charset == 'latin1' ? 'latin1_general_ci' : 'utf8_unicode_ci' }"
117
- else
118
- collector << " COLLATE #{charset}_bin"
119
- end
120
- collector
121
- end
99
+ def visit_ArelExtensions_Nodes_Collate o, collector
100
+ case o.expressions.first
101
+ when Arel::Attributes::Attribute
102
+ charset = case o.option
103
+ when 'latin1','utf8'
104
+ o.option
105
+ else
106
+ Arel::Table.engine.connection.charset || 'utf8'
107
+ end
108
+ else
109
+ charset = (o.option == 'latin1') ? 'latin1' : 'utf8'
110
+ end
111
+ collector = visit o.expressions.first, collector
112
+ if o.ai
113
+ collector << " COLLATE #{charset == 'latin1' ? 'latin1_general_ci' : 'utf8_unicode_ci' }"
114
+ #doesn't work in latin1
115
+ elsif o.ci
116
+ collector << " COLLATE #{charset == 'latin1' ? 'latin1_general_ci' : 'utf8_unicode_ci' }"
117
+ else
118
+ collector << " COLLATE #{charset}_bin"
119
+ end
120
+ collector
121
+ end
122
122
 
123
123
  def visit_ArelExtensions_Nodes_Concat o, collector
124
124
  collector << "CONCAT("
@@ -180,7 +180,7 @@ module ArelExtensions
180
180
  collector << ")"
181
181
  collector
182
182
  end
183
-
183
+
184
184
  def visit_ArelExtensions_Nodes_Repeat o, collector
185
185
  collector << "REPEAT("
186
186
  o.expressions.each_with_index { |arg, i|
@@ -262,17 +262,17 @@ module ArelExtensions
262
262
  collector << ")"
263
263
  collector
264
264
  end
265
-
266
- def visit_ArelExtensions_Nodes_IsNotNull o, collector
267
- collector << "NOT ISNULL("
268
- collector = visit o.left, collector
269
- if o.right
270
- collector << Arel::Visitors::MySQL::COMMA
271
- collector = visit o.right, collector
272
- end
273
- collector << ")"
274
- collector
275
- end
265
+
266
+ def visit_ArelExtensions_Nodes_IsNotNull o, collector
267
+ collector << "NOT ISNULL("
268
+ collector = visit o.left, collector
269
+ if o.right
270
+ collector << Arel::Visitors::MySQL::COMMA
271
+ collector = visit o.right, collector
272
+ end
273
+ collector << ")"
274
+ collector
275
+ end
276
276
 
277
277
  def visit_ArelExtensions_Nodes_Wday o, collector
278
278
  collector << "(WEEKDAY("
@@ -281,96 +281,178 @@ module ArelExtensions
281
281
  collector
282
282
  end
283
283
 
284
- def visit_ArelExtensions_Nodes_Cast o, collector
284
+ def visit_ArelExtensions_Nodes_Cast o, collector
285
285
  collector << "CAST("
286
286
  collector = visit o.left, collector
287
287
  collector << " AS "
288
- case o.as_attr
289
- when :string
290
- as_attr = Arel::Nodes::SqlLiteral.new('char')
291
- when :time
292
- as_attr = Arel::Nodes::SqlLiteral.new('time')
293
- when :number
294
- as_attr = Arel::Nodes::SqlLiteral.new('int')
295
- when :datetime
296
- as_attr = Arel::Nodes::SqlLiteral.new('datetime')
297
- when :binary
298
- as_attr = Arel::Nodes::SqlLiteral.new('binary')
299
- else
300
- as_attr = Arel::Nodes::SqlLiteral.new(o.as_attr.to_s)
301
- end
288
+ case o.as_attr
289
+ when :string
290
+ as_attr = Arel::Nodes::SqlLiteral.new('char')
291
+ when :time
292
+ as_attr = Arel::Nodes::SqlLiteral.new('time')
293
+ when :number
294
+ as_attr = Arel::Nodes::SqlLiteral.new('int')
295
+ when :datetime
296
+ as_attr = Arel::Nodes::SqlLiteral.new('datetime')
297
+ when :binary
298
+ as_attr = Arel::Nodes::SqlLiteral.new('binary')
299
+ else
300
+ as_attr = Arel::Nodes::SqlLiteral.new(o.as_attr.to_s)
301
+ end
302
302
  collector = visit as_attr, collector
303
303
  collector << ")"
304
304
  collector
305
- end
306
-
307
- alias_method :old_visit_Arel_Nodes_SelectStatement, :visit_Arel_Nodes_SelectStatement
308
- def visit_Arel_Nodes_SelectStatement o, collector
309
- if !(collector.value.blank? || (collector.value.is_a?(Array) && collector.value[0].blank?)) && o.limit.blank? && o.offset.blank?
310
- o = o.dup
311
- o.orders = []
312
- end
313
- old_visit_Arel_Nodes_SelectStatement(o,collector)
314
- end
315
-
316
- def visit_ArelExtensions_Nodes_FormattedNumber o, collector
317
- col = o.left.coalesce(0)
318
- params = o.locale ? [o.precision,Arel::Nodes.build_quoted(o.locale)] : [o.precision]
319
- sign = ArelExtensions::Nodes::Case.new.when(col<0).
320
- then('-').
321
- else(o.flags.include?('+') ? '+' : (o.flags.include?(' ') ? ' ' : ''))
322
- sign_length = ArelExtensions::Nodes::Length.new([sign])
323
-
324
- if o.scientific_notation
325
- number = ArelExtensions::Nodes::Concat.new([
326
- Arel::Nodes::NamedFunction.new('FORMAT',[
327
- col.abs/Arel::Nodes.build_quoted(10).pow(col.abs.log10.floor)
328
- ]+params),
329
- o.type,
330
- Arel::Nodes::NamedFunction.new('FORMAT',[
331
- col.abs.log10.floor,
332
- 0
333
- ])
334
- ])
335
- else
336
- number = Arel::Nodes::NamedFunction.new('FORMAT',[col.abs]+params)
337
- end
338
-
339
- repeated_char = (o.width == 0) ? Arel::Nodes.build_quoted('') : ArelExtensions::Nodes::Case.new().
340
- when(Arel::Nodes.build_quoted(o.width).abs-(number.length+sign_length)>0).
341
- then(Arel::Nodes.build_quoted(
342
- o.flags.include?('-') ? ' ' : (o.flags.include?('0') ? '0' : ' ')
343
- ).repeat(Arel::Nodes.build_quoted(o.width).abs-(number.length+sign_length))
344
- ).
345
- else('')
346
- before = (!o.flags.include?('0'))&&(!o.flags.include?('-')) ? repeated_char : ''
347
- middle = (o.flags.include?('0'))&&(!o.flags.include?('-')) ? repeated_char : ''
348
- after = o.flags.include?('-') ? repeated_char : ''
349
- full_number = ArelExtensions::Nodes::Concat.new([
350
- before,
351
- sign,
352
- middle,
353
- number,
354
- after
355
- ])
356
- collector = visit ArelExtensions::Nodes::Concat.new([Arel::Nodes.build_quoted(o.prefix),full_number,Arel::Nodes.build_quoted(o.suffix)]), collector
357
- collector
358
- end
359
-
360
- def visit_ArelExtensions_Nodes_Std o, collector
361
- collector << (o.unbiased_estimator ? "STDDEV_SAMP(" : "STDDEV_POP(")
362
- visit o.left, collector
363
- collector << ")"
364
- collector
365
- end
366
-
367
- def visit_ArelExtensions_Nodes_Variance o, collector
368
- collector << (o.unbiased_estimator ? "VAR_SAMP(" : "VAR_POP(")
369
- visit o.left, collector
370
- collector << ")"
371
- collector
372
- end
305
+ end
306
+
307
+ alias_method :old_visit_Arel_Nodes_SelectStatement, :visit_Arel_Nodes_SelectStatement
308
+ def visit_Arel_Nodes_SelectStatement o, collector
309
+ if !(collector.value.blank? || (collector.value.is_a?(Array) && collector.value[0].blank?)) && o.limit.blank? && o.offset.blank?
310
+ o = o.dup
311
+ o.orders = []
312
+ end
313
+ old_visit_Arel_Nodes_SelectStatement(o,collector)
314
+ end
315
+
316
+ alias_method :old_visit_Arel_Nodes_As, :visit_Arel_Nodes_As
317
+ def visit_Arel_Nodes_As o, collector
318
+ if o.left.is_a?(Arel::Nodes::Binary)
319
+ collector << '('
320
+ collector = visit o.left, collector
321
+ collector << ')'
322
+ else
323
+ collector = visit o.left, collector
324
+ end
325
+ collector << " AS `"
326
+ collector = visit o.right, collector
327
+ collector << "`"
328
+ collector
329
+ end
330
+
331
+ def visit_ArelExtensions_Nodes_FormattedNumber o, collector
332
+ col = o.left.coalesce(0)
333
+ params = o.locale ? [o.precision,Arel::Nodes.build_quoted(o.locale)] : [o.precision]
334
+ sign = ArelExtensions::Nodes::Case.new.when(col<0).
335
+ then('-').
336
+ else(o.flags.include?('+') ? '+' : (o.flags.include?(' ') ? ' ' : ''))
337
+ sign_length = ArelExtensions::Nodes::Length.new([sign])
338
+
339
+ if o.scientific_notation
340
+ number = ArelExtensions::Nodes::Concat.new([
341
+ Arel::Nodes::NamedFunction.new('FORMAT',[
342
+ col.abs/Arel::Nodes.build_quoted(10).pow(col.abs.log10.floor)
343
+ ]+params),
344
+ o.type,
345
+ Arel::Nodes::NamedFunction.new('FORMAT',[
346
+ col.abs.log10.floor,
347
+ 0
348
+ ])
349
+ ])
350
+ else
351
+ number = Arel::Nodes::NamedFunction.new('FORMAT',[col.abs]+params)
352
+ end
353
+
354
+ repeated_char = (o.width == 0) ? Arel::Nodes.build_quoted('') : ArelExtensions::Nodes::Case.new().
355
+ when(Arel::Nodes.build_quoted(o.width).abs-(number.length+sign_length)>0).
356
+ then(Arel::Nodes.build_quoted(
357
+ o.flags.include?('-') ? ' ' : (o.flags.include?('0') ? '0' : ' ')
358
+ ).repeat(Arel::Nodes.build_quoted(o.width).abs-(number.length+sign_length))
359
+ ).
360
+ else('')
361
+ before = (!o.flags.include?('0'))&&(!o.flags.include?('-')) ? repeated_char : ''
362
+ middle = (o.flags.include?('0'))&&(!o.flags.include?('-')) ? repeated_char : ''
363
+ after = o.flags.include?('-') ? repeated_char : ''
364
+ full_number = ArelExtensions::Nodes::Concat.new([
365
+ before,
366
+ sign,
367
+ middle,
368
+ number,
369
+ after
370
+ ])
371
+ collector = visit ArelExtensions::Nodes::Concat.new([Arel::Nodes.build_quoted(o.prefix),full_number,Arel::Nodes.build_quoted(o.suffix)]), collector
372
+ collector
373
+ end
374
+
375
+ def visit_ArelExtensions_Nodes_Std o, collector
376
+ collector << (o.unbiased_estimator ? "STDDEV_SAMP(" : "STDDEV_POP(")
377
+ visit o.left, collector
378
+ collector << ")"
379
+ collector
380
+ end
373
381
 
382
+ def visit_ArelExtensions_Nodes_Variance o, collector
383
+ collector << (o.unbiased_estimator ? "VAR_SAMP(" : "VAR_POP(")
384
+ visit o.left, collector
385
+ collector << ")"
386
+ collector
387
+ end
388
+
389
+ def visit_ArelExtensions_Nodes_Json o,collector
390
+ case o.hash
391
+ when Array
392
+ collector << 'JSON_ARRAY('
393
+ o.hash.each.with_index do |v,i|
394
+ if i != 0
395
+ collector << Arel::Visitors::MySQL::COMMA
396
+ end
397
+ collector = visit v, collector
398
+ end
399
+ collector << ')'
400
+ when Hash
401
+ collector << 'JSON_OBJECT('
402
+ o.hash.each.with_index do |(k,v),i|
403
+ if i != 0
404
+ collector << Arel::Visitors::MySQL::COMMA
405
+ end
406
+ collector = visit k, collector
407
+ collector << Arel::Visitors::MySQL::COMMA
408
+ collector = visit v, collector
409
+ end
410
+ collector << ')'
411
+ else
412
+ collector = visit o.hash, collector
413
+ end
414
+ collector
415
+ end
416
+
417
+ def visit_ArelExtensions_Nodes_JsonMerge o,collector
418
+ collector << 'JSON_MERGE_PATCH('
419
+ o.expressions.each.with_index do |v,i|
420
+ if i != 0
421
+ collector << Arel::Visitors::MySQL::COMMA
422
+ end
423
+ collector = visit v, collector
424
+ end
425
+ collector << ')'
426
+ collector
427
+ end
428
+
429
+ def visit_ArelExtensions_Nodes_JsonGet o,collector
430
+ collector << 'JSON_EXTRACT('
431
+ collector = visit o.hash, collector
432
+ collector << Arel::Visitors::MySQL::COMMA
433
+ if o.key.is_a?(Integer)
434
+ collector << "\"$[#{o.key}]\""
435
+ else
436
+ collector = visit Arel::Nodes.build_quoted('$.')+o.key, collector
437
+ end
438
+ collector << ')'
439
+ collector
440
+ end
441
+
442
+ def visit_ArelExtensions_Nodes_JsonSet o,collector
443
+ collector << 'JSON_SET('
444
+ collector = visit o.hash, collector
445
+ collector << Arel::Visitors::MySQL::COMMA
446
+ if o.key.is_a?(Integer)
447
+ collector << "\"$[#{o.key}]\""
448
+ else
449
+ collector = visit Arel::Nodes.build_quoted('$.')+o.key, collector
450
+ end
451
+ collector << Arel::Visitors::MySQL::COMMA
452
+ collector = visit o.value, collector
453
+ collector << ')'
454
+ collector
455
+ end
374
456
 
375
457
  end
376
458
  end