arel_extensions 1.6.0 → 2.0.0.rc3

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 (146) 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 +91 -258
  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 +20 -0
  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 +25 -24
  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 -29
  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 -46
  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 +8 -6
  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 +44 -45
  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 -91
  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 +194 -440
  83. data/lib/arel_extensions/visitors/mysql.rb +212 -368
  84. data/lib/arel_extensions/visitors/oracle.rb +179 -236
  85. data/lib/arel_extensions/visitors/oracle12.rb +31 -18
  86. data/lib/arel_extensions/visitors/postgresql.rb +173 -271
  87. data/lib/arel_extensions/visitors/sqlite.rb +127 -157
  88. data/lib/arel_extensions/visitors/to_sql.rb +238 -300
  89. data/lib/arel_extensions/visitors.rb +62 -83
  90. data/lib/arel_extensions.rb +31 -235
  91. data/test/database.yml +10 -20
  92. data/test/helper.rb +18 -0
  93. data/test/real_db_test.rb +118 -121
  94. data/test/support/fake_record.rb +3 -11
  95. data/test/test_comparators.rb +17 -14
  96. data/test/visitors/test_bulk_insert_oracle.rb +12 -12
  97. data/test/visitors/test_bulk_insert_sqlite.rb +14 -13
  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 +370 -773
  102. data/test/with_ar/insert_agnostic_test.rb +22 -28
  103. data/test/with_ar/test_bulk_sqlite.rb +17 -18
  104. data/test/with_ar/test_math_sqlite.rb +27 -27
  105. data/test/with_ar/test_string_mysql.rb +34 -32
  106. data/test/with_ar/test_string_sqlite.rb +35 -31
  107. metadata +38 -52
  108. data/.github/workflows/publish.yml +0 -30
  109. data/.github/workflows/release.yml +0 -30
  110. data/.github/workflows/ruby.yml +0 -452
  111. data/CONTRIBUTING.md +0 -102
  112. data/Makefile +0 -18
  113. data/NEWS.md +0 -116
  114. data/bin/build +0 -15
  115. data/bin/publish +0 -8
  116. data/dev/arelx.dockerfile +0 -41
  117. data/dev/compose.yaml +0 -69
  118. data/dev/postgres.dockerfile +0 -5
  119. data/dev/rbenv +0 -189
  120. data/gemfiles/rails5.gemfile +0 -29
  121. data/gemfiles/rails6.gemfile +0 -34
  122. data/gemfiles/rails6_1.gemfile +0 -42
  123. data/gemfiles/rails7.gemfile +0 -42
  124. data/gemfiles/rails7_1.gemfile +0 -41
  125. data/gemfiles/rails7_2.gemfile +0 -41
  126. data/gemfiles/rails8.gemfile +0 -40
  127. data/gemfiles/rails8_1.gemfile +0 -41
  128. data/gemspecs/arel_extensions-v1.gemspec +0 -27
  129. data/gemspecs/arel_extensions-v2.gemspec +0 -27
  130. data/generate_gems.sh +0 -15
  131. data/lib/arel_extensions/aliases.rb +0 -14
  132. data/lib/arel_extensions/constants.rb +0 -13
  133. data/lib/arel_extensions/helpers.rb +0 -61
  134. data/lib/arel_extensions/nodes/aggregate_function.rb +0 -13
  135. data/lib/arel_extensions/nodes/byte_size.rb +0 -11
  136. data/lib/arel_extensions/nodes/char_length.rb +0 -11
  137. data/lib/arel_extensions/nodes/formatted_date.rb +0 -42
  138. data/lib/arel_extensions/nodes/rollup.rb +0 -36
  139. data/lib/arel_extensions/nodes/select.rb +0 -10
  140. data/lib/arel_extensions/nodes/sum.rb +0 -7
  141. data/lib/arel_extensions/visitors/convert_format.rb +0 -37
  142. data/lib/arel_extensions/warning.rb +0 -42
  143. data/test/arelx_test_helper.rb +0 -94
  144. data/test/config_loader.rb +0 -9
  145. data/version_v1.rb +0 -3
  146. 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,59 +367,60 @@ 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
463
404
  end
464
405
 
465
- if AREL_VERSION < V7
406
+ if Arel::VERSION.to_i < 7
466
407
  def visit_ArelExtensions_InsertManager_BulkValues o, collector
467
408
  collector << 'VALUES '
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