arel_extensions 2.0.13 → 2.0.14

Sign up to get free protection for your applications and to get access to all the features.
Files changed (91) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +10 -10
  3. data/Rakefile +4 -4
  4. data/gemfiles/rails3.gemfile +9 -9
  5. data/gemfiles/rails4.gemfile +13 -13
  6. data/gemfiles/rails5_0.gemfile +13 -13
  7. data/gemfiles/rails5_1_4.gemfile +13 -13
  8. data/gemfiles/rails5_2.gemfile +13 -13
  9. data/gemfiles/rails6.gemfile +13 -13
  10. data/lib/arel_extensions.rb +2 -2
  11. data/lib/arel_extensions/attributes.rb +0 -0
  12. data/lib/arel_extensions/boolean_functions.rb +3 -7
  13. data/lib/arel_extensions/common_sql_functions.rb +0 -2
  14. data/lib/arel_extensions/comparators.rb +11 -14
  15. data/lib/arel_extensions/date_duration.rb +4 -5
  16. data/lib/arel_extensions/insert_manager.rb +16 -17
  17. data/lib/arel_extensions/math.rb +8 -9
  18. data/lib/arel_extensions/math_functions.rb +15 -17
  19. data/lib/arel_extensions/nodes/abs.rb +0 -1
  20. data/lib/arel_extensions/nodes/aggregate_function.rb +0 -1
  21. data/lib/arel_extensions/nodes/blank.rb +0 -1
  22. data/lib/arel_extensions/nodes/case.rb +3 -4
  23. data/lib/arel_extensions/nodes/cast.rb +0 -1
  24. data/lib/arel_extensions/nodes/ceil.rb +1 -1
  25. data/lib/arel_extensions/nodes/change_case.rb +0 -0
  26. data/lib/arel_extensions/nodes/coalesce.rb +0 -1
  27. data/lib/arel_extensions/nodes/collate.rb +0 -1
  28. data/lib/arel_extensions/nodes/concat.rb +1 -3
  29. data/lib/arel_extensions/nodes/date_diff.rb +4 -5
  30. data/lib/arel_extensions/nodes/duration.rb +0 -1
  31. data/lib/arel_extensions/nodes/find_in_set.rb +0 -1
  32. data/lib/arel_extensions/nodes/floor.rb +1 -1
  33. data/lib/arel_extensions/nodes/format.rb +1 -0
  34. data/lib/arel_extensions/nodes/formatted_number.rb +0 -1
  35. data/lib/arel_extensions/nodes/function.rb +2 -3
  36. data/lib/arel_extensions/nodes/is_null.rb +0 -0
  37. data/lib/arel_extensions/nodes/json.rb +0 -6
  38. data/lib/arel_extensions/nodes/length.rb +0 -1
  39. data/lib/arel_extensions/nodes/levenshtein_distance.rb +0 -0
  40. data/lib/arel_extensions/nodes/locate.rb +0 -1
  41. data/lib/arel_extensions/nodes/log10.rb +1 -2
  42. data/lib/arel_extensions/nodes/matches.rb +0 -2
  43. data/lib/arel_extensions/nodes/md5.rb +0 -1
  44. data/lib/arel_extensions/nodes/power.rb +0 -1
  45. data/lib/arel_extensions/nodes/rand.rb +0 -1
  46. data/lib/arel_extensions/nodes/repeat.rb +0 -2
  47. data/lib/arel_extensions/nodes/replace.rb +0 -2
  48. data/lib/arel_extensions/nodes/round.rb +0 -1
  49. data/lib/arel_extensions/nodes/soundex.rb +0 -1
  50. data/lib/arel_extensions/nodes/std.rb +0 -1
  51. data/lib/arel_extensions/nodes/substring.rb +0 -1
  52. data/lib/arel_extensions/nodes/sum.rb +0 -0
  53. data/lib/arel_extensions/nodes/then.rb +0 -0
  54. data/lib/arel_extensions/nodes/trim.rb +0 -2
  55. data/lib/arel_extensions/nodes/union.rb +0 -2
  56. data/lib/arel_extensions/nodes/union_all.rb +0 -2
  57. data/lib/arel_extensions/nodes/wday.rb +0 -4
  58. data/lib/arel_extensions/null_functions.rb +3 -5
  59. data/lib/arel_extensions/predications.rb +2 -3
  60. data/lib/arel_extensions/railtie.rb +5 -5
  61. data/lib/arel_extensions/set_functions.rb +0 -2
  62. data/lib/arel_extensions/string_functions.rb +21 -22
  63. data/lib/arel_extensions/tasks.rb +1 -1
  64. data/lib/arel_extensions/version.rb +1 -1
  65. data/lib/arel_extensions/visitors.rb +9 -7
  66. data/lib/arel_extensions/visitors/convert_format.rb +37 -0
  67. data/lib/arel_extensions/visitors/ibm_db.rb +4 -11
  68. data/lib/arel_extensions/visitors/mssql.rb +48 -44
  69. data/lib/arel_extensions/visitors/mysql.rb +63 -65
  70. data/lib/arel_extensions/visitors/oracle.rb +48 -55
  71. data/lib/arel_extensions/visitors/oracle12.rb +2 -3
  72. data/lib/arel_extensions/visitors/postgresql.rb +39 -34
  73. data/lib/arel_extensions/visitors/sqlite.rb +23 -18
  74. data/lib/arel_extensions/visitors/to_sql.rb +42 -44
  75. data/test/arelx_test_helper.rb +0 -2
  76. data/test/real_db_test.rb +26 -41
  77. data/test/support/fake_record.rb +1 -1
  78. data/test/test_comparators.rb +0 -4
  79. data/test/visitors/test_bulk_insert_oracle.rb +0 -1
  80. data/test/visitors/test_bulk_insert_sqlite.rb +0 -2
  81. data/test/visitors/test_oracle.rb +1 -2
  82. data/test/visitors/test_to_sql.rb +16 -25
  83. data/test/with_ar/all_agnostic_test.rb +134 -139
  84. data/test/with_ar/insert_agnostic_test.rb +0 -2
  85. data/test/with_ar/test_bulk_sqlite.rb +0 -4
  86. data/test/with_ar/test_math_sqlite.rb +4 -8
  87. data/test/with_ar/test_string_mysql.rb +1 -5
  88. data/test/with_ar/test_string_sqlite.rb +1 -5
  89. data/version_v1.rb +1 -1
  90. data/version_v2.rb +1 -1
  91. metadata +3 -2
@@ -1,7 +1,6 @@
1
1
  module ArelExtensions
2
2
  module Visitors
3
3
  class Arel::Visitors::IBM_DB
4
-
5
4
  def visit_ArelExtensions_Nodes_Ceil o, collector
6
5
  collector << "CEILING("
7
6
  collector = visit o.expr, collector
@@ -12,14 +11,13 @@ module ArelExtensions
12
11
  def visit_ArelExtensions_Nodes_Trim o, collector
13
12
  collector << "LTRIM(RTRIM("
14
13
  o.expressions.each_with_index { |arg, i|
15
- collector << Arel::Visitors::IBM_DB::COMMA unless i == 0
14
+ collector << COMMA if i != 0
16
15
  collector = visit arg, collector
17
16
  }
18
17
  collector << "))"
19
18
  collector
20
19
  end
21
20
 
22
-
23
21
  def visit_ArelExtensions_Nodes_DateDiff o, collector
24
22
  collector << "DAY("
25
23
  collector = visit o.left, collector
@@ -33,9 +31,8 @@ module ArelExtensions
33
31
  collector
34
32
  end
35
33
 
36
-
37
34
  def visit_ArelExtensions_Nodes_Duration o, collector
38
- #visit left for period
35
+ # visit left for period
39
36
  if o.left == "d"
40
37
  collector << "DAY("
41
38
  elsif o.left == "m"
@@ -45,7 +42,7 @@ module ArelExtensions
45
42
  elsif o.left == "y"
46
43
  collector << "YEAR("
47
44
  end
48
- #visit right
45
+ # visit right
49
46
  if o.right.is_a?(Arel::Attributes::Attribute)
50
47
  collector = visit o.right, collector
51
48
  else
@@ -55,12 +52,11 @@ module ArelExtensions
55
52
  collector
56
53
  end
57
54
 
58
-
59
55
  def visit_ArelExtensions_Nodes_IsNull o, collector
60
56
  collector << "COALESCE("
61
57
  collector = visit o.left, collector
62
58
  collector << ","
63
- if(o.right.is_a?(Arel::Attributes::Attribute))
59
+ if (o.right.is_a?(Arel::Attributes::Attribute))
64
60
  collector = visit o.right, collector
65
61
  else
66
62
  collector << "'#{o.right}'"
@@ -68,9 +64,6 @@ module ArelExtensions
68
64
  collector << ")"
69
65
  collector
70
66
  end
71
-
72
-
73
-
74
67
  end
75
68
  end
76
69
  end
@@ -1,13 +1,25 @@
1
1
  module ArelExtensions
2
2
  module Visitors
3
3
  module MSSQL
4
- Arel::Visitors::MSSQL::DATE_MAPPING = {'d' => 'day', 'm' => 'month', 'y' => 'year', 'wd' => 'weekday', 'w' => 'week', 'h' => 'hour', 'mn' => 'minute', 's' => 'second'}
4
+ Arel::Visitors::MSSQL::DATE_MAPPING = {
5
+ 'd' => 'day', 'm' => 'month', 'y' => 'year', 'wd' => 'weekday', 'w' => 'week', 'h' => 'hour', 'mn' => 'minute', 's' => 'second'
6
+ }.freeze
7
+
5
8
  Arel::Visitors::MSSQL::DATE_FORMAT_DIRECTIVES = {
6
9
  '%Y' => 'YYYY', '%C' => '', '%y' => 'YY', '%m' => 'MM', '%B' => '', '%b' => '', '%^b' => '', # year, month
7
10
  '%d' => 'DD', '%e' => '', '%j' => '', '%w' => 'dw', '%A' => '', # day, weekday
8
11
  '%H' => 'hh', '%k' => '', '%I' => '', '%l' => '', '%P' => '', '%p' => '', # hours
9
12
  '%M' => 'mi', '%S' => 'ss', '%L' => 'ms', '%N' => 'ns', '%z' => 'tz'
10
- }
13
+ }.freeze
14
+
15
+ Arel::Visitors::MSSQL::DATE_FORMAT_REGEX =
16
+ Regexp.new(
17
+ Arel::Visitors::MSSQL::DATE_FORMAT_DIRECTIVES
18
+ .keys
19
+ .map{|k| Regexp.escape(k)}
20
+ .join('|')
21
+ ).freeze
22
+
11
23
  # TODO; all others... http://www.sql-server-helper.com/tips/date-formats.aspx
12
24
  Arel::Visitors::MSSQL::DATE_CONVERT_FORMATS = {
13
25
  'YYYY-MM-DD' => 120,
@@ -19,7 +31,7 @@ module ArelExtensions
19
31
  'DD-MM-YY' => 5,
20
32
  'DD.MM.YYYY' => 104,
21
33
  'YYYY-MM-DDTHH:MM:SS:MMM' => 126
22
- }
34
+ }.freeze
23
35
 
24
36
  # Math Functions
25
37
  def visit_ArelExtensions_Nodes_Ceil o, collector
@@ -32,7 +44,7 @@ module ArelExtensions
32
44
  def visit_ArelExtensions_Nodes_Log10 o, collector
33
45
  collector << "LOG10("
34
46
  o.expressions.each_with_index { |arg, i|
35
- collector << Arel::Visitors::ToSql::COMMA unless i == 0
47
+ collector << Arel::Visitors::ToSql::COMMA if i != 0
36
48
  collector = visit arg, collector
37
49
  }
38
50
  collector << ")"
@@ -42,7 +54,7 @@ module ArelExtensions
42
54
  def visit_ArelExtensions_Nodes_Power o, collector
43
55
  collector << "POWER("
44
56
  o.expressions.each_with_index { |arg, i|
45
- collector << Arel::Visitors::ToSql::COMMA unless i == 0
57
+ collector << Arel::Visitors::ToSql::COMMA if i != 0
46
58
  collector = visit arg, collector
47
59
  }
48
60
  collector << ")"
@@ -66,7 +78,7 @@ module ArelExtensions
66
78
  def visit_ArelExtensions_Nodes_Concat o, collector
67
79
  collector << "CONCAT("
68
80
  o.expressions.each_with_index { |arg, i|
69
- collector << Arel::Visitors::MSSQL::COMMA unless i == 0
81
+ collector << Arel::Visitors::MSSQL::COMMA if i != 0
70
82
  collector = visit arg, collector
71
83
  }
72
84
  collector << ")"
@@ -76,7 +88,7 @@ module ArelExtensions
76
88
  def visit_ArelExtensions_Nodes_Repeat o, collector
77
89
  collector << "REPLICATE("
78
90
  o.expressions.each_with_index { |arg, i|
79
- collector << Arel::Visitors::ToSql::COMMA unless i == 0
91
+ collector << Arel::Visitors::ToSql::COMMA if i != 0
80
92
  collector = visit arg, collector
81
93
  }
82
94
  collector << ")"
@@ -86,12 +98,12 @@ module ArelExtensions
86
98
 
87
99
 
88
100
  def visit_ArelExtensions_Nodes_DateDiff o, collector
89
- if o.right_node_type == :ruby_date || o.right_node_type == :ruby_time || o.right_node_type == :date || o.right_node_type == :datetime || o.right_node_type == :time
90
- collector << if o.left_node_type == :ruby_time || o.left_node_type == :datetime || o.left_node_type == :time
91
- 'DATEDIFF(second'
92
- else
93
- 'DATEDIFF(day'
94
- end
101
+ case o.right_node_type
102
+ when :ruby_date, :ruby_time, :date, :datetime, :time
103
+ collector << case o.left_node_type
104
+ when :ruby_time, :datetime, :time then 'DATEDIFF(second'
105
+ else 'DATEDIFF(day'
106
+ end
95
107
  collector << Arel::Visitors::MSSQL::COMMA
96
108
  collector = visit o.right, collector
97
109
  collector << Arel::Visitors::MSSQL::COMMA
@@ -151,7 +163,7 @@ module ArelExtensions
151
163
  def visit_ArelExtensions_Nodes_Round o, collector
152
164
  collector << "ROUND("
153
165
  o.expressions.each_with_index { |arg, i|
154
- collector << Arel::Visitors::MSSQL::COMMA unless i == 0
166
+ collector << Arel::Visitors::MSSQL::COMMA if i != 0
155
167
  collector = visit arg, collector
156
168
  }
157
169
  if o.expressions.length == 1
@@ -242,42 +254,34 @@ module ArelExtensions
242
254
  end
243
255
 
244
256
  def visit_ArelExtensions_Nodes_Format o, collector
245
- f = o.iso_format.dup
246
- Arel::Visitors::MSSQL::DATE_FORMAT_DIRECTIVES.each { |d, r| f.gsub!(d, r) }
247
- if Arel::Visitors::MSSQL::DATE_CONVERT_FORMATS[f]
257
+ f = ArelExtensions::Visitors::strftime_to_format(o.iso_format, Arel::Visitors::MSSQL::DATE_FORMAT_DIRECTIVES)
258
+ if fmt = Arel::Visitors::MSSQL::DATE_CONVERT_FORMATS[f]
248
259
  collector << "CONVERT(VARCHAR(#{f.length})"
249
260
  collector << Arel::Visitors::MSSQL::COMMA
250
261
  collector = visit o.left, collector
251
262
  collector << Arel::Visitors::MSSQL::COMMA
252
- collector << Arel::Visitors::MSSQL::DATE_CONVERT_FORMATS[f].to_s
263
+ collector << fmt.to_s
253
264
  collector << ')'
254
265
  collector
255
266
  else
267
+ s = StringScanner.new o.iso_format
256
268
  collector << "("
257
- t = o.iso_format.split('%')
258
- t.each_with_index {|str, i|
259
- if i == 0 && t[0] != '%'
260
- collector = visit Arel::Nodes.build_quoted(str), collector
261
- if str.length > 1
262
- collector << Arel::Visitors::MSSQL::COMMA
263
- collector = visit Arel::Nodes.build_quoted(str.sub(/\A./, '')), collector
264
- end
265
- elsif str.length > 0
266
- if !Arel::Visitors::MSSQL::DATE_FORMAT_DIRECTIVES['%' + str[0]].blank?
267
- collector << 'LTRIM(STR(DATEPART('
268
- collector << Arel::Visitors::MSSQL::DATE_FORMAT_DIRECTIVES['%' + str[0]]
269
- collector << Arel::Visitors::MSSQL::COMMA
270
- collector = visit o.left, collector
271
- collector << ')))'
272
- if str.length > 1
273
- collector << ' + '
274
- collector = visit Arel::Nodes.build_quoted(str.sub(/\A./, '')), collector
275
- end
276
- end
269
+ sep = ''
270
+ while !s.eos?
271
+ collector << sep
272
+ sep = ' + '
273
+ case
274
+ when s.scan(Arel::Visitors::MSSQL::DATE_FORMAT_REGEX)
275
+ dir = Arel::Visitors::MSSQL::DATE_FORMAT_DIRECTIVES[s.matched]
276
+ collector << 'LTRIM(STR(DATEPART('
277
+ collector << dir
278
+ collector << Arel::Visitors::MSSQL::COMMA
279
+ collector = visit o.left, collector
280
+ collector << ')))'
281
+ when s.scan(/[^%]+|./)
282
+ collector = visit Arel::Nodes.build_quoted(s.matched), collector
277
283
  end
278
- collector << ' + ' if t[i + 1]
279
- }
280
-
284
+ end
281
285
  collector << ')'
282
286
  collector
283
287
  end
@@ -286,7 +290,7 @@ module ArelExtensions
286
290
  def visit_ArelExtensions_Nodes_Replace o, collector
287
291
  collector << "REPLACE("
288
292
  o.expressions.each_with_index { |arg, i|
289
- collector << Arel::Visitors::MSSQL::COMMA unless i == 0
293
+ collector << Arel::Visitors::MSSQL::COMMA if i != 0
290
294
  collector = visit arg, collector
291
295
  }
292
296
  collector << ")"
@@ -296,7 +300,7 @@ module ArelExtensions
296
300
  def visit_ArelExtensions_Nodes_FindInSet o, collector
297
301
  collector << "dbo.FIND_IN_SET("
298
302
  o.expressions.each_with_index { |arg, i|
299
- collector << Arel::Visitors::MSSQL::COMMA unless i == 0
303
+ collector << Arel::Visitors::MSSQL::COMMA if i != 0
300
304
  collector = visit arg, collector
301
305
  }
302
306
  collector << ")"
@@ -409,7 +413,7 @@ module ArelExtensions
409
413
  collector << ") WITHIN GROUP (ORDER BY "
410
414
  if o.order.present?
411
415
  o.order.each_with_index do |order,i|
412
- collector << Arel::Visitors::Oracle::COMMA unless i == 0
416
+ collector << Arel::Visitors::Oracle::COMMA if i != 0
413
417
  collector = visit order, collector
414
418
  end
415
419
  else
@@ -1,20 +1,24 @@
1
1
  module ArelExtensions
2
2
  module Visitors
3
3
  class Arel::Visitors::MySQL
4
- Arel::Visitors::MySQL::DATE_MAPPING = {'d' => 'DAY', 'm' => 'MONTH', 'w' => 'WEEK', 'y' => 'YEAR', 'wd' => 'WEEKDAY', 'h' => 'HOUR', 'mn' => 'MINUTE', 's' => 'SECOND'}
5
- Arel::Visitors::MySQL::DATE_FORMAT_DIRECTIVES = { # ISO C / POSIX
4
+ DATE_MAPPING = {
5
+ 'd' => 'DAY', 'm' => 'MONTH', 'w' => 'WEEK', 'y' => 'YEAR', 'wd' => 'WEEKDAY',
6
+ 'h' => 'HOUR', 'mn' => 'MINUTE', 's' => 'SECOND'
7
+ }.freeze
8
+
9
+ DATE_FORMAT_DIRECTIVES = { # ISO C / POSIX
6
10
  '%Y' => '%Y', '%C' => '', '%y' => '%y', '%m' => '%m', '%B' => '%M', '%b' => '%b', '%^b' => '%b', # year, month
7
11
  '%d' => '%d', '%e' => '%e', '%j' => '%j', '%w' => '%w', '%A' => '%W', # day, weekday
8
12
  '%H' => '%H', '%k' => '%k', '%I' => '%I', '%l' => '%l', '%P' => '%p', '%p' => '%p', # hours
9
13
  '%M' => '%i', '%S' => '%S', '%L' => '', '%N' => '%f', '%z' => ''
10
- }
14
+ }.freeze
11
15
 
12
16
 
13
- #Math functions
17
+ # Math functions
14
18
  def visit_ArelExtensions_Nodes_Log10 o, collector
15
19
  collector << "LOG10("
16
20
  o.expressions.each_with_index { |arg, i|
17
- collector << Arel::Visitors::ToSql::COMMA unless i == 0
21
+ collector << Arel::Visitors::ToSql::COMMA if i != 0
18
22
  collector = visit arg, collector
19
23
  }
20
24
  collector << ")"
@@ -24,14 +28,14 @@ module ArelExtensions
24
28
  def visit_ArelExtensions_Nodes_Power o, collector
25
29
  collector << "POW("
26
30
  o.expressions.each_with_index { |arg, i|
27
- collector << Arel::Visitors::ToSql::COMMA unless i == 0
31
+ collector << Arel::Visitors::ToSql::COMMA if i != 0
28
32
  collector = visit arg, collector
29
33
  }
30
34
  collector << ")"
31
35
  collector
32
36
  end
33
37
 
34
- #String functions
38
+ # String functions
35
39
  def visit_ArelExtensions_Nodes_IMatches o, collector # insensitive on ASCII
36
40
  collector << 'LOWER('
37
41
  collector = visit o.left, collector
@@ -112,10 +116,10 @@ module ArelExtensions
112
116
  collector = visit o.expressions.first, collector
113
117
  collector <<
114
118
  if o.ai
115
- " COLLATE #{charset == 'latin1' ? 'latin1_general_ci' : 'utf8_unicode_ci' }"
116
- #doesn't work in latin1
119
+ " COLLATE #{charset == 'latin1' ? 'latin1_general_ci' : 'utf8_unicode_ci'}"
120
+ # doesn't work in latin1
117
121
  elsif o.ci
118
- " COLLATE #{charset == 'latin1' ? 'latin1_general_ci' : 'utf8_unicode_ci' }"
122
+ " COLLATE #{charset == 'latin1' ? 'latin1_general_ci' : 'utf8_unicode_ci'}"
119
123
  else
120
124
  " COLLATE #{charset}_bin"
121
125
  end
@@ -125,7 +129,7 @@ module ArelExtensions
125
129
  def visit_ArelExtensions_Nodes_Concat o, collector
126
130
  collector << "CONCAT("
127
131
  o.expressions.each_with_index { |arg, i|
128
- collector << Arel::Visitors::MySQL::COMMA unless i == 0
132
+ collector << COMMA if i != 0
129
133
  if (arg.is_a?(Numeric)) || (arg.is_a?(Arel::Attributes::Attribute))
130
134
  collector << "CAST("
131
135
  collector = visit arg, collector
@@ -144,7 +148,7 @@ module ArelExtensions
144
148
  if !o.order.blank?
145
149
  collector << ' ORDER BY '
146
150
  o.order.each_with_index do |order,i|
147
- collector << Arel::Visitors::ToSql::COMMA unless i == 0
151
+ collector << Arel::Visitors::ToSql::COMMA if i != 0
148
152
  collector = visit order, collector
149
153
  end
150
154
  end
@@ -165,7 +169,7 @@ module ArelExtensions
165
169
  collector
166
170
  end
167
171
 
168
- def visit_ArelExtensions_Nodes_Ltrim o , collector
172
+ def visit_ArelExtensions_Nodes_Ltrim o, collector
169
173
  collector << 'TRIM(LEADING '
170
174
  collector = visit o.right, collector
171
175
  collector << " FROM "
@@ -174,7 +178,7 @@ module ArelExtensions
174
178
  collector
175
179
  end
176
180
 
177
- def visit_ArelExtensions_Nodes_Rtrim o , collector
181
+ def visit_ArelExtensions_Nodes_Rtrim o, collector
178
182
  collector << 'TRIM(TRAILING '
179
183
  collector = visit o.right, collector
180
184
  collector << " FROM "
@@ -186,7 +190,7 @@ module ArelExtensions
186
190
  def visit_ArelExtensions_Nodes_Repeat o, collector
187
191
  collector << "REPEAT("
188
192
  o.expressions.each_with_index { |arg, i|
189
- collector << Arel::Visitors::ToSql::COMMA unless i == 0
193
+ collector << Arel::Visitors::ToSql::COMMA if i != 0
190
194
  collector = visit arg, collector
191
195
  }
192
196
  collector << ")"
@@ -202,13 +206,12 @@ module ArelExtensions
202
206
 
203
207
  def visit_ArelExtensions_Nodes_Format o, collector
204
208
  case o.col_type
205
- when :date, :datetime
209
+ when :date, :datetime, :time
210
+ fmt = ArelExtensions::Visitors::strftime_to_format(o.iso_format, DATE_FORMAT_DIRECTIVES)
206
211
  collector << "DATE_FORMAT("
207
212
  collector = visit o.left, collector
208
- collector << Arel::Visitors::MySQL::COMMA
209
- f = o.iso_format.dup
210
- Arel::Visitors::MySQL::DATE_FORMAT_DIRECTIVES.each { |d, r| f.gsub!(d, r) }
211
- collector = visit Arel::Nodes.build_quoted(f), collector
213
+ collector << COMMA
214
+ collector = visit Arel::Nodes.build_quoted(fmt), collector
212
215
  collector << ")"
213
216
  when :integer, :float, :decimal
214
217
  collector << "FORMAT("
@@ -225,14 +228,15 @@ module ArelExtensions
225
228
  end
226
229
 
227
230
  def visit_ArelExtensions_Nodes_DateDiff o, collector
228
- if o.right_node_type == :ruby_date || o.right_node_type == :ruby_time || o.right_node_type == :date || o.right_node_type == :datetime || o.right_node_type == :time
229
- collector << if o.left_node_type == :ruby_time || o.left_node_type == :datetime || o.left_node_type == :time
230
- 'TIMESTAMPDIFF(SECOND, '
231
- else
232
- 'DATEDIFF('
233
- end
231
+ case o.right_node_type
232
+ when :ruby_date, :ruby_time, :date, :datetime, :time
233
+ collector <<
234
+ case o.left_node_type
235
+ when :ruby_time, :datetime, :time then 'TIMESTAMPDIFF(SECOND, '
236
+ else 'DATEDIFF('
237
+ end
234
238
  collector = visit o.right, collector
235
- collector << Arel::Visitors::MySQL::COMMA
239
+ collector << COMMA
236
240
  collector = visit o.left, collector
237
241
  collector << ")"
238
242
  else
@@ -256,13 +260,12 @@ module ArelExtensions
256
260
  def visit_ArelExtensions_Nodes_DateAdd o, collector
257
261
  collector << "DATE_ADD("
258
262
  collector = visit o.left, collector
259
- collector << Arel::Visitors::MySQL::COMMA
263
+ collector << COMMA
260
264
  collector = visit o.mysql_value(o.right), collector
261
265
  collector << ")"
262
266
  collector
263
267
  end
264
268
 
265
-
266
269
  def visit_ArelExtensions_Nodes_Duration o, collector
267
270
  if o.left == 'wd'
268
271
  collector << "(WEEKDAY("
@@ -276,13 +279,13 @@ module ArelExtensions
276
279
  when 'h','mn','s'
277
280
  interval = 'SECOND'
278
281
  when /i\z/
279
- interval = Arel::Visitors::MySQL::DATE_MAPPING[o.left[0..-2]]
282
+ interval = DATE_MAPPING[o.left[0..-2]]
280
283
  else
281
284
  interval = nil
282
285
  end
283
286
  end
284
287
  collector << " INTERVAL " if o.with_interval && interval
285
- collector << "#{Arel::Visitors::MySQL::DATE_MAPPING[o.left]}("
288
+ collector << "#{DATE_MAPPING[o.left]}("
286
289
  collector = visit o.right, collector
287
290
  collector << ")"
288
291
  collector << " #{interval} " if o.with_interval && interval
@@ -290,7 +293,6 @@ module ArelExtensions
290
293
  collector
291
294
  end
292
295
 
293
-
294
296
  def visit_ArelExtensions_Nodes_IsNull o, collector
295
297
  collector << "ISNULL("
296
298
  collector = visit o.expr, collector
@@ -316,30 +318,25 @@ module ArelExtensions
316
318
  collector << "CAST("
317
319
  collector = visit o.left, collector
318
320
  collector << " AS "
319
- case o.as_attr
320
- when :string
321
- as_attr = Arel::Nodes::SqlLiteral.new('char')
322
- when :time
323
- as_attr = Arel::Nodes::SqlLiteral.new('time')
324
- when :int
325
- as_attr = Arel::Nodes::SqlLiteral.new('signed')
326
- when :number, :decimal
327
- as_attr = Arel::Nodes::SqlLiteral.new('decimal(20,6)')
328
- when :datetime
329
- as_attr = Arel::Nodes::SqlLiteral.new('datetime')
330
- when :date
331
- as_attr = Arel::Nodes::SqlLiteral.new('date')
332
- when :binary
333
- as_attr = Arel::Nodes::SqlLiteral.new('binary')
334
- else
335
- as_attr = Arel::Nodes::SqlLiteral.new(o.as_attr.to_s)
336
- end
321
+ as_attr =
322
+ Arel::Nodes::SqlLiteral.new(
323
+ case o.as_attr
324
+ when :string then 'char'
325
+ when :time then 'time'
326
+ when :int then 'signed'
327
+ when :number, :decimal then 'decimal(20,6)'
328
+ when :datetime then 'datetime'
329
+ when :date then 'date'
330
+ when :binary then 'binary'
331
+ else o.as_attr.to_s
332
+ end
333
+ )
337
334
  collector = visit as_attr, collector
338
335
  collector << ")"
339
336
  collector
340
337
  end
341
338
 
342
- alias_method :old_visit_Arel_Nodes_SelectStatement, :visit_Arel_Nodes_SelectStatement
339
+ alias_method(:old_visit_Arel_Nodes_SelectStatement, :visit_Arel_Nodes_SelectStatement) rescue nil
343
340
  def visit_Arel_Nodes_SelectStatement o, collector
344
341
  if !(collector.value.blank? || (collector.value.is_a?(Array) && collector.value[0].blank?)) && o.limit.blank? && o.offset.blank?
345
342
  o = o.dup
@@ -348,7 +345,7 @@ module ArelExtensions
348
345
  old_visit_Arel_Nodes_SelectStatement(o,collector)
349
346
  end
350
347
 
351
- alias_method :old_visit_Arel_Nodes_As, :visit_Arel_Nodes_As
348
+ alias_method(:old_visit_Arel_Nodes_As, :visit_Arel_Nodes_As) rescue nil
352
349
  def visit_Arel_Nodes_As o, collector
353
350
  if o.left.is_a?(Arel::Nodes::Binary)
354
351
  collector << '('
@@ -467,21 +464,22 @@ module ArelExtensions
467
464
  conn.respond_to?(:version) && conn.send(:version) >= mariadb_v || \
468
465
  conn.instance_variable_get(:"@version") && conn.instance_variable_get(:"@version") >= mariadb_v) || \
469
466
  !conn.send(:mariadb?) && \
470
- (conn.respond_to?(:get_database_version) && conn.send(:get_database_version) >= mysql_v || \
471
- conn.respond_to?(:version) && conn.send(:version) >= mysql_v || \
472
- conn.instance_variable_get(:"@version") && conn.instance_variable_get(:"@version") >= mysql_v)
467
+ (conn.respond_to?(:get_database_version) && conn.send(:get_database_version) >= mysql_v || \
468
+ conn.respond_to?(:version) && conn.send(:version) >= mysql_v || \
469
+ conn.instance_variable_get(:"@version") && conn.instance_variable_get(:"@version") >= mysql_v)
473
470
  # ideally we should parse the instance_variable @full_version because @version contains only the supposedly
474
471
  # corresponding mysql version of the current mariadb version (which is not very helpful most of the time)
475
472
  end
476
473
 
477
474
  def visit_ArelExtensions_Nodes_Json o,collector
478
475
  return super if !json_supported?
476
+
479
477
  case o.dict
480
478
  when Array
481
479
  collector << 'JSON_ARRAY('
482
480
  o.dict.each.with_index do |v,i|
483
481
  if i != 0
484
- collector << Arel::Visitors::MySQL::COMMA
482
+ collector << COMMA
485
483
  end
486
484
  collector = visit v, collector
487
485
  end
@@ -490,10 +488,10 @@ module ArelExtensions
490
488
  collector << 'JSON_OBJECT('
491
489
  o.dict.each.with_index do |(k,v),i|
492
490
  if i != 0
493
- collector << Arel::Visitors::MySQL::COMMA
491
+ collector << COMMA
494
492
  end
495
493
  collector = visit k, collector
496
- collector << Arel::Visitors::MySQL::COMMA
494
+ collector << COMMA
497
495
  collector = visit v, collector
498
496
  end
499
497
  collector << ')'
@@ -507,7 +505,7 @@ module ArelExtensions
507
505
  collector << 'JSON_MERGE_PATCH('
508
506
  o.expressions.each.with_index do |v,i|
509
507
  if i != 0
510
- collector << Arel::Visitors::MySQL::COMMA
508
+ collector << COMMA
511
509
  end
512
510
  collector = visit v, collector
513
511
  end
@@ -518,7 +516,7 @@ module ArelExtensions
518
516
  def visit_ArelExtensions_Nodes_JsonGet o,collector
519
517
  collector << 'JSON_EXTRACT('
520
518
  collector = visit o.dict, collector
521
- collector << Arel::Visitors::MySQL::COMMA
519
+ collector << COMMA
522
520
  if o.key.is_a?(Integer)
523
521
  collector << "\"$[#{o.key}]\""
524
522
  else
@@ -531,13 +529,13 @@ module ArelExtensions
531
529
  def visit_ArelExtensions_Nodes_JsonSet o,collector
532
530
  collector << 'JSON_SET('
533
531
  collector = visit o.dict, collector
534
- collector << Arel::Visitors::MySQL::COMMA
532
+ collector << COMMA
535
533
  if o.key.is_a?(Integer)
536
534
  collector << "\"$[#{o.key}]\""
537
535
  else
538
536
  collector = visit Arel::Nodes.build_quoted('$.')+o.key, collector
539
537
  end
540
- collector << Arel::Visitors::MySQL::COMMA
538
+ collector << COMMA
541
539
  collector = visit o.value, collector
542
540
  collector << ')'
543
541
  collector
@@ -545,6 +543,7 @@ module ArelExtensions
545
543
 
546
544
  def visit_ArelExtensions_Nodes_JsonGroup o, collector
547
545
  return super if !json_supported?
546
+
548
547
  if o.as_array
549
548
  collector << 'JSON_ARRAYAGG('
550
549
  collector = visit o.dict, collector
@@ -555,11 +554,11 @@ module ArelExtensions
555
554
  collector << 'JSON_MERGE_PATCH(' if o.dict.length > 1
556
555
  o.dict.each.with_index do |(k,v),i|
557
556
  if i != 0
558
- collector << Arel::Visitors::MySQL::COMMA
557
+ collector << COMMA
559
558
  end
560
559
  collector << 'JSON_OBJECTAGG('
561
560
  collector = visit k, collector
562
- collector << Arel::Visitors::MySQL::COMMA
561
+ collector << COMMA
563
562
  collector = visit v, collector
564
563
  collector << ')'
565
564
  end
@@ -572,7 +571,6 @@ module ArelExtensions
572
571
  end
573
572
  collector
574
573
  end
575
-
576
574
  end
577
575
  end
578
576
  end