arel_extensions 2.0.21 → 2.2.2

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.
Files changed (138) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +1 -2
  3. data/.github/workflows/publish.yml +29 -0
  4. data/.github/workflows/release.yml +30 -0
  5. data/.github/workflows/ruby.yml +377 -80
  6. data/.gitignore +7 -6
  7. data/.rubocop.yml +62 -1
  8. data/CONTRIBUTING.md +102 -0
  9. data/Gemfile +2 -23
  10. data/NEWS.md +89 -0
  11. data/README.md +228 -84
  12. data/Rakefile +11 -4
  13. data/TODO +0 -1
  14. data/appveyor.yml +60 -22
  15. data/arel_extensions.gemspec +11 -12
  16. data/bin/build +15 -0
  17. data/bin/compose +6 -0
  18. data/bin/publish +8 -0
  19. data/dev/arelx.dockerfile +44 -0
  20. data/dev/compose.yaml +71 -0
  21. data/dev/postgres.dockerfile +5 -0
  22. data/dev/rbenv +189 -0
  23. data/gemfiles/rails3.gemfile +10 -10
  24. data/gemfiles/rails4_2.gemfile +38 -0
  25. data/gemfiles/rails5.gemfile +29 -0
  26. data/gemfiles/rails5_1_4.gemfile +13 -13
  27. data/gemfiles/rails5_2.gemfile +16 -14
  28. data/gemfiles/rails6.gemfile +18 -15
  29. data/gemfiles/rails6_1.gemfile +18 -15
  30. data/gemfiles/rails7.gemfile +33 -0
  31. data/gemfiles/rails7_1.gemfile +33 -0
  32. data/gemfiles/rails7_2.gemfile +33 -0
  33. data/gemspecs/arel_extensions-v1.gemspec +12 -13
  34. data/gemspecs/arel_extensions-v2.gemspec +11 -12
  35. data/init/mssql.sql +0 -0
  36. data/init/mysql.sql +0 -0
  37. data/init/oracle.sql +0 -0
  38. data/init/postgresql.sql +0 -0
  39. data/init/sqlite.sql +0 -0
  40. data/lib/arel_extensions/aliases.rb +14 -0
  41. data/lib/arel_extensions/attributes.rb +10 -2
  42. data/lib/arel_extensions/boolean_functions.rb +2 -4
  43. data/lib/arel_extensions/common_sql_functions.rb +12 -12
  44. data/lib/arel_extensions/comparators.rb +14 -14
  45. data/lib/arel_extensions/date_duration.rb +14 -9
  46. data/lib/arel_extensions/helpers.rb +62 -0
  47. data/lib/arel_extensions/insert_manager.rb +19 -17
  48. data/lib/arel_extensions/math.rb +48 -45
  49. data/lib/arel_extensions/math_functions.rb +18 -18
  50. data/lib/arel_extensions/nodes/abs.rb +0 -0
  51. data/lib/arel_extensions/nodes/aggregate_function.rb +0 -0
  52. data/lib/arel_extensions/nodes/blank.rb +1 -1
  53. data/lib/arel_extensions/nodes/case.rb +10 -12
  54. data/lib/arel_extensions/nodes/cast.rb +6 -6
  55. data/lib/arel_extensions/nodes/ceil.rb +0 -0
  56. data/lib/arel_extensions/nodes/change_case.rb +0 -0
  57. data/lib/arel_extensions/nodes/coalesce.rb +1 -1
  58. data/lib/arel_extensions/nodes/collate.rb +9 -9
  59. data/lib/arel_extensions/nodes/concat.rb +2 -2
  60. data/lib/arel_extensions/nodes/date_diff.rb +33 -14
  61. data/lib/arel_extensions/nodes/duration.rb +0 -0
  62. data/lib/arel_extensions/nodes/find_in_set.rb +0 -0
  63. data/lib/arel_extensions/nodes/floor.rb +0 -0
  64. data/lib/arel_extensions/nodes/format.rb +3 -2
  65. data/lib/arel_extensions/nodes/formatted_date.rb +42 -0
  66. data/lib/arel_extensions/nodes/formatted_number.rb +2 -2
  67. data/lib/arel_extensions/nodes/function.rb +22 -26
  68. data/lib/arel_extensions/nodes/is_null.rb +0 -0
  69. data/lib/arel_extensions/nodes/json.rb +15 -9
  70. data/lib/arel_extensions/nodes/length.rb +6 -0
  71. data/lib/arel_extensions/nodes/levenshtein_distance.rb +1 -1
  72. data/lib/arel_extensions/nodes/locate.rb +1 -1
  73. data/lib/arel_extensions/nodes/log10.rb +0 -0
  74. data/lib/arel_extensions/nodes/matches.rb +1 -1
  75. data/lib/arel_extensions/nodes/md5.rb +0 -0
  76. data/lib/arel_extensions/nodes/power.rb +0 -0
  77. data/lib/arel_extensions/nodes/rand.rb +0 -0
  78. data/lib/arel_extensions/nodes/repeat.rb +2 -2
  79. data/lib/arel_extensions/nodes/replace.rb +2 -10
  80. data/lib/arel_extensions/nodes/rollup.rb +36 -0
  81. data/lib/arel_extensions/nodes/round.rb +0 -0
  82. data/lib/arel_extensions/nodes/select.rb +10 -0
  83. data/lib/arel_extensions/nodes/soundex.rb +2 -2
  84. data/lib/arel_extensions/nodes/std.rb +0 -0
  85. data/lib/arel_extensions/nodes/substring.rb +1 -1
  86. data/lib/arel_extensions/nodes/sum.rb +0 -0
  87. data/lib/arel_extensions/nodes/then.rb +1 -1
  88. data/lib/arel_extensions/nodes/trim.rb +2 -2
  89. data/lib/arel_extensions/nodes/union.rb +5 -5
  90. data/lib/arel_extensions/nodes/union_all.rb +4 -4
  91. data/lib/arel_extensions/nodes/wday.rb +0 -0
  92. data/lib/arel_extensions/nodes.rb +0 -0
  93. data/lib/arel_extensions/null_functions.rb +16 -0
  94. data/lib/arel_extensions/predications.rb +10 -10
  95. data/lib/arel_extensions/railtie.rb +1 -1
  96. data/lib/arel_extensions/set_functions.rb +3 -3
  97. data/lib/arel_extensions/string_functions.rb +19 -10
  98. data/lib/arel_extensions/tasks.rb +2 -2
  99. data/lib/arel_extensions/version.rb +1 -1
  100. data/lib/arel_extensions/visitors/convert_format.rb +0 -0
  101. data/lib/arel_extensions/visitors/ibm_db.rb +20 -20
  102. data/lib/arel_extensions/visitors/mssql.rb +394 -169
  103. data/lib/arel_extensions/visitors/mysql.rb +238 -151
  104. data/lib/arel_extensions/visitors/oracle.rb +170 -131
  105. data/lib/arel_extensions/visitors/oracle12.rb +16 -16
  106. data/lib/arel_extensions/visitors/postgresql.rb +170 -140
  107. data/lib/arel_extensions/visitors/sqlite.rb +88 -87
  108. data/lib/arel_extensions/visitors/to_sql.rb +185 -156
  109. data/lib/arel_extensions/visitors.rb +73 -60
  110. data/lib/arel_extensions.rb +173 -36
  111. data/test/arelx_test_helper.rb +49 -1
  112. data/test/database.yml +13 -7
  113. data/test/real_db_test.rb +101 -83
  114. data/test/support/fake_record.rb +8 -2
  115. data/test/test_comparators.rb +5 -5
  116. data/test/visitors/test_bulk_insert_oracle.rb +5 -5
  117. data/test/visitors/test_bulk_insert_sqlite.rb +5 -5
  118. data/test/visitors/test_bulk_insert_to_sql.rb +5 -5
  119. data/test/visitors/test_oracle.rb +14 -14
  120. data/test/visitors/test_to_sql.rb +121 -93
  121. data/test/with_ar/all_agnostic_test.rb +630 -320
  122. data/test/with_ar/insert_agnostic_test.rb +25 -18
  123. data/test/with_ar/test_bulk_sqlite.rb +11 -7
  124. data/test/with_ar/test_math_sqlite.rb +18 -14
  125. data/test/with_ar/test_string_mysql.rb +26 -22
  126. data/test/with_ar/test_string_sqlite.rb +26 -22
  127. data/version_v1.rb +1 -1
  128. data/version_v2.rb +1 -1
  129. metadata +24 -26
  130. data/.travis/oracle/download.js +0 -152
  131. data/.travis/oracle/download.sh +0 -30
  132. data/.travis/oracle/download_ojdbc.js +0 -116
  133. data/.travis/oracle/install.sh +0 -34
  134. data/.travis/setup_accounts.sh +0 -9
  135. data/.travis/sqlite3/extension-functions.sh +0 -6
  136. data/.travis.yml +0 -193
  137. data/gemfiles/rails4.gemfile +0 -29
  138. data/gemfiles/rails5_0.gemfile +0 -29
@@ -6,241 +6,252 @@ module ArelExtensions
6
6
  # Escape properly the string expression expr.
7
7
  # Take care of escaping.
8
8
  def make_json_string expr
9
- Arel::Nodes.build_quoted('"') \
9
+ Arel.quoted('"') \
10
10
  + expr
11
- .replace('\\','\\\\').replace('"','\"').replace("\n", '\n') \
11
+ .coalesce('')
12
+ .replace('\\', '\\\\')
13
+ .replace('"', '\"')
14
+ .replace("\b", '\b')
15
+ .replace("\f", '\f')
16
+ .replace("\n", '\n')
17
+ .replace("\r", '\r')
18
+ .replace("\t", '\t') \
12
19
  + '"'
13
20
  end
14
21
 
22
+ def make_json_null
23
+ Arel.quoted('null')
24
+ end
25
+
15
26
  # Math Functions
16
27
  def visit_ArelExtensions_Nodes_Abs o, collector
17
- collector << "ABS("
28
+ collector << 'ABS('
18
29
  o.expressions.each_with_index { |arg, i|
19
30
  collector << COMMA if i != 0
20
31
  collector = visit arg, collector
21
32
  }
22
- collector << ")"
33
+ collector << ')'
23
34
  collector
24
35
  end
25
36
 
26
37
  def visit_ArelExtensions_Nodes_Ceil o, collector
27
- collector << "CEIL("
38
+ collector << 'CEIL('
28
39
  o.expressions.each_with_index { |arg, i|
29
40
  collector << COMMA if i != 0
30
41
  collector = visit arg, collector
31
42
  }
32
- collector << ")"
43
+ collector << ')'
33
44
  collector
34
45
  end
35
46
 
36
47
  def visit_ArelExtensions_Nodes_Floor o, collector
37
- collector << "FLOOR("
48
+ collector << 'FLOOR('
38
49
  o.expressions.each_with_index { |arg, i|
39
50
  collector << COMMA if i != 0
40
51
  collector = visit arg, collector
41
52
  }
42
- collector << ")"
53
+ collector << ')'
43
54
  collector
44
55
  end
45
56
 
46
57
  def visit_ArelExtensions_Nodes_Rand o, collector
47
- collector << "RAND("
58
+ collector << 'RAND('
48
59
  o.expressions.each_with_index { |arg, i|
49
60
  collector << COMMA if i != 0
50
61
  collector = visit arg, collector
51
62
  }
52
- collector << ")"
63
+ collector << ')'
53
64
  collector
54
65
  end
55
66
 
56
67
  def visit_ArelExtensions_Nodes_Round o, collector
57
- collector << "ROUND("
68
+ collector << 'ROUND('
58
69
  o.expressions.each_with_index { |arg, i|
59
70
  collector << COMMA if i != 0
60
71
  collector = visit arg, collector
61
72
  }
62
- collector << ")"
73
+ collector << ')'
63
74
  collector
64
75
  end
65
76
 
66
77
  def visit_ArelExtensions_Nodes_Log10 o, collector
67
- collector << "LOG10("
78
+ collector << 'LOG10('
68
79
  collector = visit o.left, collector
69
- collector << ")"
80
+ collector << ')'
70
81
  collector
71
82
  end
72
83
 
73
84
  def visit_ArelExtensions_Nodes_Power o, collector
74
- collector << "POW("
85
+ collector << 'POW('
75
86
  o.expressions.each_with_index { |arg, i|
76
87
  collector << COMMA if i != 0
77
88
  collector = visit arg, collector
78
89
  }
79
- collector << ")"
90
+ collector << ')'
80
91
  collector
81
92
  end
82
93
 
83
94
  def visit_ArelExtensions_Nodes_Sum o, collector
84
- collector << "SUM("
95
+ collector << 'SUM('
85
96
  collector = visit o.expr, collector
86
- collector << ")"
97
+ collector << ')'
87
98
  collector
88
99
  end
89
100
 
90
101
  # String functions
91
102
  def visit_ArelExtensions_Nodes_Concat o, collector
92
- collector << "CONCAT("
103
+ collector << 'CONCAT('
93
104
  o.expressions.each_with_index { |arg, i|
94
- collector << COMMA if i != 0
95
- collector = visit arg, collector
105
+ collector << COMMA if i != 0
106
+ collector = visit arg, collector
96
107
  }
97
- collector << ")"
108
+ collector << ')'
98
109
  collector
99
110
  end
100
111
 
101
112
  def visit_ArelExtensions_Nodes_GroupConcat o, collector
102
- collector << "GROUP_CONCAT("
113
+ collector << 'GROUP_CONCAT('
103
114
  collector = visit o.left, collector
104
115
  if o.separator && o.separator != 'NULL'
105
116
  collector << COMMA
106
117
  collector = visit o.separator, collector
107
118
  end
108
- collector << ")"
119
+ collector << ')'
109
120
  collector
110
121
  end
111
122
 
112
123
  def visit_ArelExtensions_Nodes_MD5 o, collector
113
- collector << "MD5("
124
+ collector << 'MD5('
114
125
  collector = visit o.left, collector
115
- collector << ")"
126
+ collector << ')'
116
127
  collector
117
128
  end
118
129
 
119
130
  def visit_ArelExtensions_Nodes_Length o, collector
120
- collector << "LENGTH("
131
+ collector << "#{o.bytewise ? '' : 'CHAR_'}LENGTH("
121
132
  collector = visit o.left, collector
122
- collector << ")"
133
+ collector << ')'
123
134
  collector
124
135
  end
125
136
 
126
137
  def visit_ArelExtensions_Nodes_Locate o, collector
127
- collector << "LOCATE("
138
+ collector << 'LOCATE('
128
139
  collector = visit o.right, collector
129
140
  collector << COMMA
130
141
  collector = visit o.left, collector
131
- collector << ")"
142
+ collector << ')'
132
143
  collector
133
144
  end
134
145
 
135
146
  def visit_ArelExtensions_Nodes_Substring o, collector
136
- collector << "SUBSTRING("
147
+ collector << 'SUBSTRING('
137
148
  o.expressions.each_with_index { |arg, i|
138
149
  collector << COMMA if i != 0
139
150
  collector = visit arg, collector
140
151
  }
141
- collector << ")"
152
+ collector << ')'
142
153
  collector
143
154
  end
144
155
 
145
156
  def visit_ArelExtensions_Nodes_Replace o, collector
146
- collector << "REPLACE("
157
+ collector << 'REPLACE('
147
158
  visit o.left, collector
148
159
  collector << COMMA
149
160
  visit o.pattern, collector
150
161
  collector << COMMA
151
162
  visit o.substitute, collector
152
- collector << ")"
163
+ collector << ')'
153
164
  collector
154
165
  end
155
166
 
156
167
  def visit_ArelExtensions_Nodes_RegexpReplace o, collector
157
- collector << "REGEXP_REPLACE("
168
+ collector << 'REGEXP_REPLACE('
158
169
  visit o.left, collector
159
170
  collector << COMMA
160
- visit Arel::Nodes.build_quoted(o.pattern.to_s), collector
171
+ visit Arel.quoted(o.pattern.to_s), collector
161
172
  collector << COMMA
162
173
  visit o.substitute, collector
163
- collector << ")"
174
+ collector << ')'
164
175
  collector
165
176
  end
166
177
 
167
178
  def visit_ArelExtensions_Nodes_Repeat o, collector
168
- collector << "REPEAT("
179
+ collector << 'REPEAT('
169
180
  o.expressions.each_with_index { |arg, i|
170
181
  collector << COMMA if i != 0
171
182
  collector = visit arg, collector
172
183
  }
173
- collector << ")"
184
+ collector << ')'
174
185
  collector
175
186
  end
176
187
 
177
188
  def visit_ArelExtensions_Nodes_FindInSet o, collector
178
- collector << "FIND_IN_SET("
189
+ collector << 'FIND_IN_SET('
179
190
  o.expressions.each_with_index { |arg, i|
180
191
  collector << COMMA if i != 0
181
192
  collector = visit arg, collector
182
193
  }
183
- collector << ")"
194
+ collector << ')'
184
195
  collector
185
196
  end
186
197
 
187
198
  def visit_ArelExtensions_Nodes_Soundex o, collector
188
- collector << "SOUNDEX("
199
+ collector << 'SOUNDEX('
189
200
  o.expressions.each_with_index { |arg, i|
190
201
  collector << COMMA if i != 0
191
202
  collector = visit arg, collector
192
203
  }
193
- collector << ")"
204
+ collector << ')'
194
205
  collector
195
206
  end
196
207
 
197
208
  def visit_ArelExtensions_Nodes_Downcase o, collector
198
- collector << "LOWER("
209
+ collector << 'LOWER('
199
210
  o.expressions.each_with_index { |arg, i|
200
211
  collector << COMMA if i != 0
201
212
  collector = visit arg, collector
202
213
  }
203
- collector << ")"
214
+ collector << ')'
204
215
  collector
205
216
  end
206
217
 
207
218
  def visit_ArelExtensions_Nodes_Upcase o, collector
208
- collector << "UPPER("
219
+ collector << 'UPPER('
209
220
  o.expressions.each_with_index { |arg, i|
210
221
  collector << COMMA if i != 0
211
222
  collector = visit arg, collector
212
223
  }
213
- collector << ")"
224
+ collector << ')'
214
225
  collector
215
226
  end
216
227
 
217
228
  def visit_ArelExtensions_Nodes_Trim o, collector
218
- collector << "TRIM("
229
+ collector << 'TRIM('
219
230
  o.expressions.each_with_index { |arg, i|
220
231
  collector << COMMA if i != 0
221
232
  collector = visit arg, collector
222
233
  }
223
- collector << ")"
234
+ collector << ')'
224
235
  collector
225
236
  end
226
237
 
227
238
  def visit_ArelExtensions_Nodes_Ltrim o, collector
228
- collector << "LTRIM("
239
+ collector << 'LTRIM('
229
240
  o.expressions.each_with_index { |arg, i|
230
241
  collector << COMMA if i != 0
231
242
  collector = visit arg, collector
232
243
  }
233
- collector << ")"
244
+ collector << ')'
234
245
  collector
235
246
  end
236
247
 
237
248
  def visit_ArelExtensions_Nodes_Rtrim o, collector
238
- collector << "RTRIM("
249
+ collector << 'RTRIM('
239
250
  o.expressions.each_with_index { |arg, i|
240
251
  collector << COMMA if i != 0
241
252
  collector = visit arg, collector
242
253
  }
243
- collector << ")"
254
+ collector << ')'
244
255
  collector
245
256
  end
246
257
 
@@ -249,8 +260,8 @@ module ArelExtensions
249
260
  collector << 'LENGTH(TRIM(COALESCE('
250
261
  collector = visit o.expr, collector
251
262
  collector << COMMA
252
- collector = visit Arel::Nodes.build_quoted(''), collector
253
- collector << "))) = 0"
263
+ collector = visit Arel.quoted(''), collector
264
+ collector << '))) = 0'
254
265
  collector
255
266
  end
256
267
 
@@ -259,25 +270,45 @@ module ArelExtensions
259
270
  collector << 'LENGTH(TRIM(COALESCE('
260
271
  collector = visit o.expr, collector
261
272
  collector << COMMA
262
- collector = visit Arel::Nodes.build_quoted(''), collector
263
- collector << "))) > 0"
273
+ collector = visit Arel.quoted(''), collector
274
+ collector << '))) > 0'
264
275
  collector
265
276
  end
266
277
 
267
278
  def visit_ArelExtensions_Nodes_Format o, collector
268
279
  case o.col_type
269
280
  when :date, :datetime, :time
270
- collector << "STRFTIME("
281
+ collector << 'STRFTIME('
271
282
  collector = visit o.right, collector
272
283
  collector << COMMA
273
284
  collector = visit o.left, collector
274
- collector << ")"
285
+ collector << ')'
275
286
  when :integer, :float, :decimal
276
- collector << "FORMAT("
287
+ collector << 'FORMAT('
277
288
  collector = visit o.left, collector
278
289
  collector << COMMA
279
290
  collector = visit o.right, collector
280
- collector << ")"
291
+ collector << ')'
292
+ else
293
+ collector = visit o.left, collector
294
+ end
295
+ collector
296
+ end
297
+
298
+ def visit_ArelExtensions_Nodes_FormattedDate o, collector
299
+ case o.col_type
300
+ when :date, :datetime, :time
301
+ collector << 'STRFTIME('
302
+ collector = visit o.right, collector
303
+ collector << COMMA
304
+ collector = visit o.left, collector
305
+ collector << ')'
306
+ when :integer, :float, :decimal
307
+ collector << 'FORMAT('
308
+ collector = visit o.left, collector
309
+ collector << COMMA
310
+ collector = visit o.right, collector
311
+ collector << ')'
281
312
  else
282
313
  collector = visit o.left, collector
283
314
  end
@@ -287,61 +318,56 @@ module ArelExtensions
287
318
  # comparators
288
319
 
289
320
  def visit_ArelExtensions_Nodes_Cast o, collector
290
- collector << "CAST("
321
+ as_attr =
322
+ case o.as_attr
323
+ when :binary then 'binary'
324
+ when :datetime then 'datetime'
325
+ when :decimal, :float, :number then 'float'
326
+ when :int then 'int'
327
+ when :string then 'char'
328
+ when :text, :ntext then 'text'
329
+ when :time then 'time'
330
+ else o.as_attr.to_s
331
+ end
332
+
333
+ collector << 'CAST('
291
334
  collector = visit o.left, collector
292
- collector << " AS "
293
- case o.as_attr
294
- when :string
295
- as_attr = Arel::Nodes::SqlLiteral.new('char')
296
- when :int
297
- as_attr = Arel::Nodes::SqlLiteral.new('int')
298
- when :decimal, :float, :number
299
- as_attr = Arel::Nodes::SqlLiteral.new('float')
300
- when :datetime
301
- as_attr = Arel::Nodes::SqlLiteral.new('datetime')
302
- when :time
303
- as_attr = Arel::Nodes::SqlLiteral.new('time')
304
- when :binary
305
- as_attr = Arel::Nodes::SqlLiteral.new('binary')
306
- when :text, :ntext
307
- as_attr = Arel::Nodes::SqlLiteral.new('text')
308
- else
309
- as_attr = Arel::Nodes::SqlLiteral.new(o.as_attr.to_s)
310
- end
311
- collector = visit as_attr, collector
312
- collector << ")"
335
+ collector << ' AS '
336
+ collector = visit Arel::Nodes::SqlLiteral.new(as_attr), collector
337
+ collector << ')'
313
338
  collector
314
339
  end
315
340
 
316
341
  def visit_ArelExtensions_Nodes_Coalesce o, collector
317
- collector << "COALESCE("
342
+ collector << 'COALESCE('
318
343
  o.expressions.each_with_index { |arg, i|
319
344
  collector << COMMA if i != 0
320
345
  collector = visit arg, collector
321
346
  }
322
- collector << ")"
347
+ collector << ')'
323
348
  collector
324
349
  end
325
350
 
326
351
  def visit_ArelExtensions_Nodes_DateDiff o, collector
327
- collector << if o.left_node_type == :ruby_time || o.left_node_type == :datetime || o.left_node_type == :time
328
- 'TIMEDIFF('
329
- else
330
- 'DATEDIFF('
331
- end
352
+ collector <<
353
+ if o.left_node_type == :ruby_time || o.left_node_type == :datetime || o.left_node_type == :time
354
+ 'TIMEDIFF('
355
+ else
356
+ 'DATEDIFF('
357
+ end
332
358
  collector = visit o.left, collector
333
359
  collector << COMMA
334
360
  collector = visit o.right, collector
335
- collector << ")"
361
+ collector << ')'
336
362
  collector
337
363
  end
338
364
 
339
365
  def visit_ArelExtensions_Nodes_DateSub o, collector
340
- collector << "DATE_SUB("
366
+ collector << 'DATE_SUB('
341
367
  collector = visit o.left, collector
342
368
  collector << COMMA
343
369
  collector = visit o.right, collector
344
- collector << ")"
370
+ collector << ')'
345
371
  collector
346
372
  end
347
373
 
@@ -358,7 +384,7 @@ module ArelExtensions
358
384
  else
359
385
  collector = visit o.left, collector
360
386
  end
361
- collector << " AS "
387
+ collector << ' AS '
362
388
  collector = visit o.right, collector
363
389
  collector
364
390
  end
@@ -366,7 +392,7 @@ module ArelExtensions
366
392
  remove_method(:visit_Arel_Nodes_Regexp) rescue nil # if Arel::Visitors::ToSql.method_defined?(:visit_Arel_Nodes_Regexp)
367
393
  def visit_Arel_Nodes_Regexp o, collector
368
394
  collector = visit o.left, collector
369
- collector << " REGEXP "
395
+ collector << ' REGEXP '
370
396
  collector = visit o.right, collector
371
397
  collector
372
398
  end
@@ -374,7 +400,7 @@ module ArelExtensions
374
400
  remove_method(:visit_Arel_Nodes_NotRegexp) rescue nil # if Arel::Visitors::ToSql.method_defined?(:visit_Arel_Nodes_NotRegexp)
375
401
  def visit_Arel_Nodes_NotRegexp o, collector
376
402
  collector = visit o.left, collector
377
- collector << " NOT REGEXP "
403
+ collector << ' NOT REGEXP '
378
404
  collector = visit o.right, collector
379
405
  collector
380
406
  end
@@ -399,35 +425,35 @@ module ArelExtensions
399
425
  end
400
426
 
401
427
  def visit_ArelExtensions_Nodes_IsNull o, collector
402
- collector << "ISNULL("
428
+ collector << 'ISNULL('
403
429
  collector = visit o.expr, collector
404
- collector << ")"
430
+ collector << ')'
405
431
  collector
406
432
  end
407
433
 
408
434
  def visit_ArelExtensions_Nodes_IsNotNull o, collector
409
- collector << "NOT ISNULL("
410
- collector = visit o.expr, collector
411
- collector << ")"
412
- collector
435
+ collector << 'NOT ISNULL('
436
+ collector = visit o.expr, collector
437
+ collector << ')'
438
+ collector
413
439
  end
414
440
 
415
441
  def visit_ArelExtensions_Nodes_Then o, collector
416
- collector << "CASE WHEN ("
442
+ collector << 'CASE WHEN ('
417
443
  collector = visit o.left, collector
418
- collector << ") THEN "
444
+ collector << ') THEN '
419
445
  collector = visit o.right, collector
420
446
  if o.expressions[2]
421
- collector << " ELSE "
447
+ collector << ' ELSE '
422
448
  collector = visit o.expressions[2], collector
423
449
  end
424
- collector << " END"
450
+ collector << ' END'
425
451
  collector
426
452
  end
427
453
 
428
454
  # Date operations
429
455
  def visit_ArelExtensions_Nodes_DateAdd o, collector
430
- collector << "DATE_ADD("
456
+ collector << 'DATE_ADD('
431
457
  collector = visit o.left, collector
432
458
  collector << COMMA
433
459
  collector = visit o.sqlite_value(o.right), collector
@@ -451,7 +477,7 @@ module ArelExtensions
451
477
  end
452
478
  collector << COMMA unless i == len
453
479
  }
454
- collector << (idx == row_nb-1 ? ')' : '), ')
480
+ collector << (idx == row_nb - 1 ? ')' : '), ')
455
481
  end
456
482
  collector
457
483
  end
@@ -473,7 +499,7 @@ module ArelExtensions
473
499
  end
474
500
  collector << COMMA unless i == len
475
501
  }
476
- collector << (idx == row_nb-1 ? ')' : '), ')
502
+ collector << (idx == row_nb - 1 ? ')' : '), ')
477
503
  end
478
504
  collector
479
505
  end
@@ -481,45 +507,45 @@ module ArelExtensions
481
507
 
482
508
  def visit_ArelExtensions_Nodes_Union o, collector
483
509
  collector = visit o.left, collector
484
- collector << " UNION "
510
+ collector << ' UNION '
485
511
  collector = visit o.right, collector
486
512
  collector
487
513
  end
488
514
 
489
515
  def visit_ArelExtensions_Nodes_UnionAll o, collector
490
516
  collector = visit o.left, collector
491
- collector << " UNION ALL "
517
+ collector << ' UNION ALL '
492
518
  collector = visit o.right, collector
493
519
  collector
494
520
  end
495
521
 
496
522
  def visit_ArelExtensions_Nodes_Case o, collector
497
- collector << "CASE "
523
+ collector << 'CASE '
498
524
  if o.case
499
525
  visit o.case, collector
500
- collector << " "
526
+ collector << ' '
501
527
  end
502
528
  o.conditions.each do |condition|
503
529
  visit condition, collector
504
- collector << " "
530
+ collector << ' '
505
531
  end
506
532
  if o.default
507
533
  visit o.default, collector
508
- collector << " "
534
+ collector << ' '
509
535
  end
510
- collector << "END"
536
+ collector << 'END'
511
537
  end
512
538
 
513
539
  def visit_ArelExtensions_Nodes_Case_When o, collector
514
- collector << "WHEN "
515
- visit Arel::Nodes.build_quoted(o.left), collector
516
- collector << " THEN "
517
- visit Arel::Nodes.build_quoted(o.right), collector
540
+ collector << 'WHEN '
541
+ visit Arel.quoted(o.left), collector
542
+ collector << ' THEN '
543
+ visit Arel.quoted(o.right), collector
518
544
  end
519
545
 
520
546
  def visit_ArelExtensions_Nodes_Case_Else o, collector
521
- collector << "ELSE "
522
- visit Arel::Nodes.build_quoted(o.expr), collector
547
+ collector << 'ELSE '
548
+ visit Arel.quoted(o.expr), collector
523
549
  end
524
550
 
525
551
  def visit_ArelExtensions_Nodes_FormattedNumber o, collector
@@ -529,26 +555,26 @@ module ArelExtensions
529
555
  remove_method(:visit_Arel_Nodes_LessThan) rescue nil
530
556
  def visit_Arel_Nodes_LessThan o, collector
531
557
  collector = visit o.left, collector
532
- collector << " < "
558
+ collector << ' < '
533
559
  visit o.right, collector
534
560
  end
535
561
 
536
562
  def visit_ArelExtensions_Nodes_Std o, collector
537
- collector << "STD("
563
+ collector << 'STD('
538
564
  visit o.left, collector
539
- collector << ")"
565
+ collector << ')'
540
566
  collector
541
567
  end
542
568
 
543
569
  def visit_ArelExtensions_Nodes_Variance o, collector
544
- collector << "VARIANCE("
570
+ collector << 'VARIANCE('
545
571
  visit o.left, collector
546
- collector << ")"
572
+ collector << ')'
547
573
  collector
548
574
  end
549
575
 
550
576
  def visit_ArelExtensions_Nodes_LevenshteinDistance o, collector
551
- collector << "LEVENSHTEIN_DISTANCE("
577
+ collector << 'LEVENSHTEIN_DISTANCE('
552
578
  collector = visit o.left, collector
553
579
  collector << COMMA
554
580
  collector = visit o.right, collector
@@ -586,58 +612,58 @@ module ArelExtensions
586
612
  when 1
587
613
  collector = visit o.children[0], collector
588
614
  else
589
- collector << '('
590
- o.children.each_with_index { |arg, i|
591
- if i != 0
592
- collector << ') OR ('
593
- end
594
- collector = visit arg, collector
595
- }
596
- collector << ')'
615
+ collector << '('
616
+ o.children.each_with_index { |arg, i|
617
+ if i != 0
618
+ collector << ') OR ('
619
+ end
620
+ collector = visit arg, collector
621
+ }
622
+ collector << ')'
597
623
  end
598
624
  collector
599
625
  end
600
626
 
601
- def json_value(o,v)
627
+ def json_value(o, v)
602
628
  case o.type_of_node(v)
603
629
  when :string
604
- Arel.when(v.is_null).then(Arel::Nodes.build_quoted("null")).else(make_json_string(v))
630
+ Arel.when(v.is_null).then(make_json_null).else(make_json_string(v))
605
631
  when :date
606
632
  s = v.format('%Y-%m-%d')
607
- Arel.when(s.is_null).then(Arel::Nodes.build_quoted("null")).else(Arel::Nodes.build_quoted('"') + s + '"')
633
+ Arel.when(s.is_null).then(make_json_null).else(make_json_string(s))
608
634
  when :datetime
609
635
  s = v.format('%Y-%m-%dT%H:%M:%S')
610
- Arel.when(s.is_null).then(Arel::Nodes.build_quoted("null")).else(Arel::Nodes.build_quoted('"') + s + '"')
636
+ Arel.when(s.is_null).then(make_json_null).else(make_json_string(s))
611
637
  when :time
612
638
  s = v.format('%H:%M:%S')
613
- Arel.when(s.is_null).then(Arel::Nodes.build_quoted("null")).else(Arel::Nodes.build_quoted('"') + s + '"')
639
+ Arel.when(s.is_null).then(make_json_null).else(make_json_string(s))
614
640
  when :nil
615
- Arel::Nodes.build_quoted("null")
641
+ make_json_null
616
642
  else
617
- ArelExtensions::Nodes::Cast.new([v, :string]).coalesce("null")
643
+ ArelExtensions::Nodes::Cast.new([v, :string]).coalesce(make_json_null)
618
644
  end
619
645
  end
620
646
 
621
- def visit_ArelExtensions_Nodes_Json o,collector
647
+ def visit_ArelExtensions_Nodes_Json o, collector
622
648
  case o.dict
623
649
  when Array
624
- res = Arel::Nodes.build_quoted('[')
625
- o.dict.each.with_index do |v,i|
650
+ res = Arel.quoted('[')
651
+ o.dict.each.with_index do |v, i|
626
652
  if i != 0
627
653
  res += ', '
628
654
  end
629
- res += json_value(o,v)
655
+ res += json_value(o, v)
630
656
  end
631
657
  res += ']'
632
658
  collector = visit res, collector
633
659
  when Hash
634
- res = Arel::Nodes.build_quoted('{')
635
- o.dict.each.with_index do |(k,v),i|
660
+ res = Arel.quoted('{')
661
+ o.dict.each.with_index do |(k, v), i|
636
662
  if i != 0
637
663
  res += ', '
638
664
  end
639
- res += make_json_string(ArelExtensions::Nodes::Cast.new([k, :string]).coalesce("")) + ': '
640
- res += json_value(o,v)
665
+ res += make_json_string(ArelExtensions::Nodes::Cast.new([k, :string])) + ': '
666
+ res += json_value(o, v)
641
667
  end
642
668
  res += '}'
643
669
  collector = visit res, collector
@@ -649,17 +675,20 @@ module ArelExtensions
649
675
 
650
676
  def visit_ArelExtensions_Nodes_JsonGroup o, collector
651
677
  if o.as_array
652
- res = Arel::Nodes.build_quoted('[') + (o.orders ? o.dict.group_concat(', ', order: Array(o.orders)) : o.dict.group_concat(', ')).coalesce('') + ']'
678
+ res =
679
+ Arel.quoted('[') \
680
+ + (o.orders ? o.dict.group_concat(', ', order: Array(o.orders)) : o.dict.group_concat(', ')).coalesce('') \
681
+ + ']'
653
682
  collector = visit res, collector
654
683
  else
655
- res = Arel::Nodes.build_quoted('{')
684
+ res = Arel.quoted('{')
656
685
  orders = o.orders || o.dict.keys
657
- o.dict.each.with_index do |(k,v),i|
686
+ o.dict.each.with_index do |(k, v), i|
658
687
  if i != 0
659
688
  res = res + ', '
660
689
  end
661
- kv = make_json_string(ArelExtensions::Nodes::Cast.new([k, :string]).coalesce("")) + ': '
662
- kv += json_value(o,v)
690
+ kv = make_json_string(ArelExtensions::Nodes::Cast.new([k, :string])) + ': '
691
+ kv += json_value(o, v)
663
692
  res = res + kv.group_concat(', ', order: Array(orders)).coalesce('')
664
693
  end
665
694
  res = res + '}'