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