arel_extensions 1.5.2 → 2.0.0.rc3

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