arel_extensions 2.4.0 → 2.5.0
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.
- checksums.yaml +4 -4
- data/.gitignore +2 -1
- data/.rubocop.yml +131 -5
- data/Makefile +31 -1
- data/NEWS.md +15 -0
- data/README.md +11 -2
- data/Rakefile +5 -3
- data/arel_extensions.gemspec +3 -5
- data/gemfiles/rails5.gemfile +15 -8
- data/gemfiles/rails5_1_4.gemfile +11 -9
- data/gemfiles/rails5_2.gemfile +16 -9
- data/gemfiles/rails6.gemfile +13 -7
- data/gemfiles/rails6_1.gemfile +13 -7
- data/gemfiles/rails7.gemfile +15 -9
- data/gemfiles/rails7_1.gemfile +15 -8
- data/gemfiles/rails7_2.gemfile +12 -6
- data/gemfiles/rails8.gemfile +7 -7
- data/gemfiles/rails8_1.gemfile +4 -4
- data/gemspecs/arel_extensions-v1.gemspec +3 -5
- data/gemspecs/arel_extensions-v2.gemspec +3 -5
- data/lib/arel_extensions/aliases.rb +3 -3
- data/lib/arel_extensions/attributes.rb +2 -0
- data/lib/arel_extensions/boolean_functions.rb +9 -7
- data/lib/arel_extensions/common_sql_functions.rb +5 -3
- data/lib/arel_extensions/comparators.rb +6 -4
- data/lib/arel_extensions/date_duration.rb +2 -0
- data/lib/arel_extensions/helpers.rb +17 -17
- data/lib/arel_extensions/insert_manager.rb +5 -1
- data/lib/arel_extensions/math.rb +40 -44
- data/lib/arel_extensions/math_functions.rb +28 -30
- data/lib/arel_extensions/nodes/aggregate_function.rb +4 -4
- data/lib/arel_extensions/nodes/blank.rb +6 -4
- data/lib/arel_extensions/nodes/case.rb +15 -12
- data/lib/arel_extensions/nodes/cast.rb +3 -5
- data/lib/arel_extensions/nodes/coalesce.rb +1 -1
- data/lib/arel_extensions/nodes/collate.rb +1 -1
- data/lib/arel_extensions/nodes/concat.rb +6 -6
- data/lib/arel_extensions/nodes/date_diff.rb +40 -49
- data/lib/arel_extensions/nodes/duration.rb +2 -2
- data/lib/arel_extensions/nodes/format.rb +2 -2
- data/lib/arel_extensions/nodes/formatted_date.rb +2 -2
- data/lib/arel_extensions/nodes/formatted_number.rb +2 -2
- data/lib/arel_extensions/nodes/function.rb +6 -4
- data/lib/arel_extensions/nodes/is_null.rb +2 -0
- data/lib/arel_extensions/nodes/json.rb +27 -15
- data/lib/arel_extensions/nodes/levenshtein_distance.rb +2 -2
- data/lib/arel_extensions/nodes/locate.rb +1 -1
- data/lib/arel_extensions/nodes/power.rb +2 -2
- data/lib/arel_extensions/nodes/rand.rb +2 -2
- data/lib/arel_extensions/nodes/repeat.rb +2 -2
- data/lib/arel_extensions/nodes/replace.rb +3 -3
- data/lib/arel_extensions/nodes/rollup.rb +4 -4
- data/lib/arel_extensions/nodes/round.rb +3 -3
- data/lib/arel_extensions/nodes/select.rb +1 -1
- data/lib/arel_extensions/nodes/std.rb +4 -4
- data/lib/arel_extensions/nodes/substring.rb +52 -2
- data/lib/arel_extensions/nodes/then.rb +1 -1
- data/lib/arel_extensions/nodes/trim.rb +2 -2
- data/lib/arel_extensions/nodes/union.rb +3 -3
- data/lib/arel_extensions/nodes/union_all.rb +3 -3
- data/lib/arel_extensions/nodes/wday.rb +2 -2
- data/lib/arel_extensions/null_functions.rb +5 -7
- data/lib/arel_extensions/predications.rb +22 -18
- data/lib/arel_extensions/string_functions.rb +26 -27
- data/lib/arel_extensions/version.rb +3 -1
- data/lib/arel_extensions/visitors/convert_format.rb +2 -2
- data/lib/arel_extensions/visitors/ibm_db.rb +5 -5
- data/lib/arel_extensions/visitors/mssql.rb +91 -92
- data/lib/arel_extensions/visitors/mysql.rb +89 -69
- data/lib/arel_extensions/visitors/oracle.rb +100 -104
- data/lib/arel_extensions/visitors/oracle12.rb +5 -6
- data/lib/arel_extensions/visitors/postgresql.rb +107 -94
- data/lib/arel_extensions/visitors/sqlite.rb +57 -65
- data/lib/arel_extensions/visitors/to_sql.rb +84 -74
- data/lib/arel_extensions/visitors.rb +6 -6
- data/lib/arel_extensions/warning.rb +5 -5
- data/lib/arel_extensions.rb +34 -27
- data/test/real_db_test.rb +31 -31
- data/test/visitors/test_to_sql.rb +2 -2
- data/test/with_ar/all_agnostic_test.rb +149 -15
- data/version_v1.rb +3 -1
- data/version_v2.rb +3 -1
- metadata +2 -30
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
module ArelExtensions
|
|
2
2
|
module Visitors
|
|
3
3
|
module MSSQL
|
|
4
|
-
|
|
5
4
|
MSSQL_CLASS_NAMES = %i[MSSQL SQLServer].freeze
|
|
6
5
|
|
|
7
6
|
mssql_class =
|
|
8
7
|
Arel::Visitors
|
|
9
8
|
.constants
|
|
10
|
-
.select { |c| Arel::Visitors.const_get(c).is_a?(Class)
|
|
9
|
+
.select { |c| Arel::Visitors.const_get(c).is_a?(Class) }
|
|
11
10
|
.find { |c| MSSQL_CLASS_NAMES.include?(c) }
|
|
12
11
|
|
|
13
12
|
# This guard is necessary because:
|
|
@@ -47,7 +46,7 @@ module ArelExtensions
|
|
|
47
46
|
Regexp.new(
|
|
48
47
|
LOADED_VISITOR::DATE_FORMAT_DIRECTIVES
|
|
49
48
|
.keys
|
|
50
|
-
.map{|k| Regexp.escape(k)}
|
|
49
|
+
.map { |k| Regexp.escape(k) }
|
|
51
50
|
.join('|')
|
|
52
51
|
).freeze
|
|
53
52
|
|
|
@@ -59,7 +58,7 @@ module ArelExtensions
|
|
|
59
58
|
'MM-DD-YYYY' => 110,
|
|
60
59
|
'YYYY/MM/DD' => 111,
|
|
61
60
|
'DD-MM-YYYY' => 105,
|
|
62
|
-
'DD-MM-YY'
|
|
61
|
+
'DD-MM-YY' => 5,
|
|
63
62
|
'DD.MM.YYYY' => 104,
|
|
64
63
|
'YYYY-MM-DDTHH:MM:SS:MMM' => 126
|
|
65
64
|
}.freeze
|
|
@@ -89,15 +88,15 @@ module ArelExtensions
|
|
|
89
88
|
if value.acts_like?(:time)
|
|
90
89
|
if (ActiveRecord.respond_to?(:default_timezone) && ActiveRecord.default_timezone == :utc) || ActiveRecord::Base.default_timezone == :utc
|
|
91
90
|
value = value.getutc if value.respond_to?(:getutc) && !value.utc?
|
|
92
|
-
|
|
93
|
-
value = value.getlocal
|
|
91
|
+
elsif value.respond_to?(:getlocal)
|
|
92
|
+
value = value.getlocal
|
|
94
93
|
end
|
|
95
94
|
end
|
|
96
95
|
# new versions of AR use `to_fs`, but we want max compatibility, and we're
|
|
97
96
|
# not going to write it over and over, so it's fine like that.
|
|
98
97
|
result = value.to_formatted_s(:db)
|
|
99
98
|
if value.respond_to?(:usec) && value.usec > 0
|
|
100
|
-
result << '.' <<
|
|
99
|
+
result << '.' << format('%06d', value.usec)
|
|
101
100
|
else
|
|
102
101
|
result
|
|
103
102
|
end
|
|
@@ -113,10 +112,10 @@ module ArelExtensions
|
|
|
113
112
|
|
|
114
113
|
def quoted_time(value) # :nodoc:
|
|
115
114
|
value = value.change(year: 2000, month: 1, day: 1)
|
|
116
|
-
quoted_date(value).sub(/\A\d{4}-\d{2}-\d{2} /,
|
|
115
|
+
quoted_date(value).sub(/\A\d{4}-\d{2}-\d{2} /, '')
|
|
117
116
|
end
|
|
118
117
|
|
|
119
|
-
def quote
|
|
118
|
+
def quote(value, _column = nil)
|
|
120
119
|
case value
|
|
121
120
|
when Arel::Nodes::SqlLiteral
|
|
122
121
|
value
|
|
@@ -145,8 +144,8 @@ module ArelExtensions
|
|
|
145
144
|
end
|
|
146
145
|
end
|
|
147
146
|
|
|
148
|
-
|
|
149
|
-
def primary_Key_From_Table
|
|
147
|
+
alias old_primary_Key_From_Table primary_Key_From_Table rescue nil
|
|
148
|
+
def primary_Key_From_Table(t)
|
|
150
149
|
return unless t
|
|
151
150
|
|
|
152
151
|
column_name = @connection.schema_cache.primary_keys(t.name) ||
|
|
@@ -155,48 +154,48 @@ module ArelExtensions
|
|
|
155
154
|
end
|
|
156
155
|
|
|
157
156
|
# Math Functions
|
|
158
|
-
def visit_ArelExtensions_Nodes_Ceil
|
|
157
|
+
def visit_ArelExtensions_Nodes_Ceil(o, collector)
|
|
159
158
|
collector << 'CEILING('
|
|
160
159
|
collector = visit o.expr, collector
|
|
161
160
|
collector << ')'
|
|
162
161
|
collector
|
|
163
162
|
end
|
|
164
163
|
|
|
165
|
-
def visit_ArelExtensions_Nodes_Log10
|
|
164
|
+
def visit_ArelExtensions_Nodes_Log10(o, collector)
|
|
166
165
|
collector << 'LOG10('
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
166
|
+
o.expressions.each_with_index { |arg, i|
|
|
167
|
+
collector << LOADED_VISITOR::COMMA if i != 0
|
|
168
|
+
collector = visit arg, collector
|
|
169
|
+
}
|
|
170
|
+
collector << ')'
|
|
171
|
+
collector
|
|
173
172
|
end
|
|
174
173
|
|
|
175
|
-
def visit_ArelExtensions_Nodes_Power
|
|
174
|
+
def visit_ArelExtensions_Nodes_Power(o, collector)
|
|
176
175
|
collector << 'POWER('
|
|
177
176
|
o.expressions.each_with_index { |arg, i|
|
|
178
|
-
collector <<
|
|
177
|
+
collector << LOADED_VISITOR::COMMA if i != 0
|
|
179
178
|
collector = visit arg, collector
|
|
180
179
|
}
|
|
181
180
|
collector << ')'
|
|
182
181
|
collector
|
|
183
182
|
end
|
|
184
183
|
|
|
185
|
-
def visit_ArelExtensions_Nodes_IsNull
|
|
184
|
+
def visit_ArelExtensions_Nodes_IsNull(o, collector)
|
|
186
185
|
collector << '('
|
|
187
186
|
collector = visit o.expr, collector
|
|
188
187
|
collector << ' IS NULL)'
|
|
189
188
|
collector
|
|
190
189
|
end
|
|
191
190
|
|
|
192
|
-
def visit_ArelExtensions_Nodes_IsNotNull
|
|
191
|
+
def visit_ArelExtensions_Nodes_IsNotNull(o, collector)
|
|
193
192
|
collector << '('
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
193
|
+
collector = visit o.expr, collector
|
|
194
|
+
collector << ' IS NOT NULL)'
|
|
195
|
+
collector
|
|
197
196
|
end
|
|
198
197
|
|
|
199
|
-
def visit_ArelExtensions_Nodes_Concat
|
|
198
|
+
def visit_ArelExtensions_Nodes_Concat(o, collector)
|
|
200
199
|
collector << 'CONCAT('
|
|
201
200
|
o.expressions.each_with_index { |arg, i|
|
|
202
201
|
collector << LOADED_VISITOR::COMMA if i != 0
|
|
@@ -206,23 +205,23 @@ module ArelExtensions
|
|
|
206
205
|
collector
|
|
207
206
|
end
|
|
208
207
|
|
|
209
|
-
def visit_ArelExtensions_Nodes_Repeat
|
|
208
|
+
def visit_ArelExtensions_Nodes_Repeat(o, collector)
|
|
210
209
|
collector << 'REPLICATE('
|
|
211
210
|
o.expressions.each_with_index { |arg, i|
|
|
212
|
-
collector <<
|
|
211
|
+
collector << LOADED_VISITOR::COMMA if i != 0
|
|
213
212
|
collector = visit arg, collector
|
|
214
213
|
}
|
|
215
214
|
collector << ')'
|
|
216
215
|
collector
|
|
217
216
|
end
|
|
218
217
|
|
|
219
|
-
def visit_ArelExtensions_Nodes_DateDiff
|
|
218
|
+
def visit_ArelExtensions_Nodes_DateDiff(o, collector)
|
|
220
219
|
case o.right_node_type
|
|
221
220
|
when :ruby_date, :ruby_time, :date, :datetime, :time
|
|
222
221
|
collector << case o.left_node_type
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
222
|
+
when :ruby_time, :datetime, :time then 'DATEDIFF(second'
|
|
223
|
+
else 'DATEDIFF(day'
|
|
224
|
+
end
|
|
226
225
|
collector << LOADED_VISITOR::COMMA
|
|
227
226
|
collector = visit o.right, collector
|
|
228
227
|
collector << LOADED_VISITOR::COMMA
|
|
@@ -244,7 +243,7 @@ module ArelExtensions
|
|
|
244
243
|
collector
|
|
245
244
|
end
|
|
246
245
|
|
|
247
|
-
def visit_ArelExtensions_Nodes_DateAdd
|
|
246
|
+
def visit_ArelExtensions_Nodes_DateAdd(o, collector)
|
|
248
247
|
collector << 'DATEADD('
|
|
249
248
|
collector = visit o.mssql_datepart(o.right), collector
|
|
250
249
|
collector << LOADED_VISITOR::COMMA
|
|
@@ -255,7 +254,7 @@ module ArelExtensions
|
|
|
255
254
|
collector
|
|
256
255
|
end
|
|
257
256
|
|
|
258
|
-
def visit_ArelExtensions_Nodes_Duration
|
|
257
|
+
def visit_ArelExtensions_Nodes_Duration(o, collector)
|
|
259
258
|
if o.with_interval && o.left.end_with?('i')
|
|
260
259
|
collector = visit o.right, collector
|
|
261
260
|
else
|
|
@@ -272,14 +271,14 @@ module ArelExtensions
|
|
|
272
271
|
collector
|
|
273
272
|
end
|
|
274
273
|
|
|
275
|
-
def visit_ArelExtensions_Nodes_ByteSize
|
|
274
|
+
def visit_ArelExtensions_Nodes_ByteSize(o, collector)
|
|
276
275
|
collector << 'DATALENGTH(CAST('
|
|
277
276
|
collector = visit o.expr.coalesce(''), collector
|
|
278
277
|
collector << ' AS VARCHAR(MAX)))'
|
|
279
278
|
collector
|
|
280
279
|
end
|
|
281
280
|
|
|
282
|
-
def visit_ArelExtensions_Nodes_CharLength
|
|
281
|
+
def visit_ArelExtensions_Nodes_CharLength(o, collector)
|
|
283
282
|
# According to the docs https://learn.microsoft.com/en-us/sql/t-sql/functions/len-transact-sql?view=sql-server-ver17
|
|
284
283
|
# LEN doesn't take into account the trailing white space, and that's why
|
|
285
284
|
# we need to do acrobatics.
|
|
@@ -289,7 +288,7 @@ module ArelExtensions
|
|
|
289
288
|
collector
|
|
290
289
|
end
|
|
291
290
|
|
|
292
|
-
def visit_ArelExtensions_Nodes_Length
|
|
291
|
+
def visit_ArelExtensions_Nodes_Length(o, collector)
|
|
293
292
|
if o.bytewise
|
|
294
293
|
collector << '(DATALENGTH('
|
|
295
294
|
collector = visit o.expr, collector
|
|
@@ -305,7 +304,7 @@ module ArelExtensions
|
|
|
305
304
|
end
|
|
306
305
|
end
|
|
307
306
|
|
|
308
|
-
def visit_ArelExtensions_Nodes_Round
|
|
307
|
+
def visit_ArelExtensions_Nodes_Round(o, collector)
|
|
309
308
|
collector << 'ROUND('
|
|
310
309
|
o.expressions.each_with_index { |arg, i|
|
|
311
310
|
collector << LOADED_VISITOR::COMMA if i != 0
|
|
@@ -319,7 +318,7 @@ module ArelExtensions
|
|
|
319
318
|
collector
|
|
320
319
|
end
|
|
321
320
|
|
|
322
|
-
def visit_ArelExtensions_Nodes_Locate
|
|
321
|
+
def visit_ArelExtensions_Nodes_Locate(o, collector)
|
|
323
322
|
collector << 'CHARINDEX('
|
|
324
323
|
collector = visit o.right, collector
|
|
325
324
|
collector << LOADED_VISITOR::COMMA
|
|
@@ -328,7 +327,9 @@ module ArelExtensions
|
|
|
328
327
|
collector
|
|
329
328
|
end
|
|
330
329
|
|
|
331
|
-
def visit_ArelExtensions_Nodes_Substring
|
|
330
|
+
def visit_ArelExtensions_Nodes_Substring(o, collector)
|
|
331
|
+
return visit(o.range_substring_node, collector) if o.range?
|
|
332
|
+
|
|
332
333
|
collector << 'SUBSTRING('
|
|
333
334
|
collector = visit o.expressions[0], collector
|
|
334
335
|
collector << LOADED_VISITOR::COMMA
|
|
@@ -339,24 +340,24 @@ module ArelExtensions
|
|
|
339
340
|
collector
|
|
340
341
|
end
|
|
341
342
|
|
|
342
|
-
def visit_ArelExtensions_Nodes_Trim
|
|
343
|
+
def visit_ArelExtensions_Nodes_Trim(o, collector)
|
|
343
344
|
# NOTE: in MSSQL's `blank`, o.right is the space char so we need to
|
|
344
345
|
# account for it.
|
|
345
346
|
if o.right && !/\A\s\Z/.match(o.right.expr)
|
|
346
347
|
collector << 'dbo.TrimChar('
|
|
347
348
|
collector = visit o.left, collector
|
|
348
|
-
collector <<
|
|
349
|
+
collector << LOADED_VISITOR::COMMA
|
|
349
350
|
collector = visit o.right, collector
|
|
350
351
|
collector << ')'
|
|
351
352
|
else
|
|
352
|
-
collector <<
|
|
353
|
+
collector << 'LTRIM(RTRIM('
|
|
353
354
|
collector = visit o.left, collector
|
|
354
|
-
collector <<
|
|
355
|
+
collector << '))'
|
|
355
356
|
end
|
|
356
357
|
collector
|
|
357
358
|
end
|
|
358
359
|
|
|
359
|
-
def visit_ArelExtensions_Nodes_Ltrim
|
|
360
|
+
def visit_ArelExtensions_Nodes_Ltrim(o, collector)
|
|
360
361
|
if o.right
|
|
361
362
|
collector << 'REPLACE(REPLACE(LTRIM(REPLACE(REPLACE('
|
|
362
363
|
collector = visit o.left, collector
|
|
@@ -373,7 +374,7 @@ module ArelExtensions
|
|
|
373
374
|
collector
|
|
374
375
|
end
|
|
375
376
|
|
|
376
|
-
def visit_ArelExtensions_Nodes_Rtrim
|
|
377
|
+
def visit_ArelExtensions_Nodes_Rtrim(o, collector)
|
|
377
378
|
if o.right
|
|
378
379
|
collector << 'REPLACE(REPLACE(RTRIM(REPLACE(REPLACE('
|
|
379
380
|
collector = visit o.left, collector
|
|
@@ -390,20 +391,20 @@ module ArelExtensions
|
|
|
390
391
|
collector
|
|
391
392
|
end
|
|
392
393
|
|
|
393
|
-
def visit_ArelExtensions_Nodes_Blank
|
|
394
|
+
def visit_ArelExtensions_Nodes_Blank(o, collector)
|
|
394
395
|
visit o.expr.coalesce('').trim.length.eq(0), collector
|
|
395
396
|
end
|
|
396
397
|
|
|
397
|
-
def visit_ArelExtensions_Nodes_NotBlank
|
|
398
|
+
def visit_ArelExtensions_Nodes_NotBlank(o, collector)
|
|
398
399
|
visit o.expr.coalesce('').trim.length.gt(0), collector
|
|
399
400
|
end
|
|
400
401
|
|
|
401
|
-
def visit_ArelExtensions_Nodes_Format
|
|
402
|
+
def visit_ArelExtensions_Nodes_Format(o, collector)
|
|
402
403
|
visit_ArelExtensions_Nodes_FormattedDate o, collector
|
|
403
404
|
end
|
|
404
405
|
|
|
405
|
-
def visit_ArelExtensions_Nodes_FormattedDate
|
|
406
|
-
f = ArelExtensions::Visitors
|
|
406
|
+
def visit_ArelExtensions_Nodes_FormattedDate(o, collector)
|
|
407
|
+
f = ArelExtensions::Visitors.strftime_to_format(o.iso_format, LOADED_VISITOR::DATE_FORMAT_DIRECTIVES)
|
|
407
408
|
if fmt = LOADED_VISITOR::DATE_CONVERT_FORMATS[f]
|
|
408
409
|
collector << "CONVERT(VARCHAR(#{f.length})"
|
|
409
410
|
collector << LOADED_VISITOR::COMMA
|
|
@@ -435,8 +436,7 @@ module ArelExtensions
|
|
|
435
436
|
while !s.eos?
|
|
436
437
|
collector << sep
|
|
437
438
|
sep = ' + '
|
|
438
|
-
|
|
439
|
-
when s.scan(LOADED_VISITOR::DATE_FORMAT_REGEX)
|
|
439
|
+
if s.scan(LOADED_VISITOR::DATE_FORMAT_REGEX)
|
|
440
440
|
dir = LOADED_VISITOR::DATE_FORMAT_DIRECTIVES[s.matched]
|
|
441
441
|
fmt = LOADED_VISITOR::DATE_FORMAT_FORMAT[dir]
|
|
442
442
|
date_name = LOADED_VISITOR::DATE_NAME.include?(s.matched)
|
|
@@ -454,7 +454,8 @@ module ArelExtensions
|
|
|
454
454
|
collector = visit o.left, collector
|
|
455
455
|
case o.time_zone
|
|
456
456
|
when Hash
|
|
457
|
-
src_tz
|
|
457
|
+
src_tz = o.time_zone.first.first
|
|
458
|
+
dst_tz = o.time_zone.first.second
|
|
458
459
|
collector << ') AT TIME ZONE '
|
|
459
460
|
collector = visit Arel.quoted(src_tz), collector
|
|
460
461
|
collector << ' AT TIME ZONE '
|
|
@@ -467,9 +468,9 @@ module ArelExtensions
|
|
|
467
468
|
collector << ')' if !fmt && !date_name
|
|
468
469
|
collector << LOADED_VISITOR::COMMA << "'#{fmt}')" if fmt
|
|
469
470
|
collector << '))'
|
|
470
|
-
|
|
471
|
+
elsif s.scan(/^%%/)
|
|
471
472
|
collector = visit Arel.quoted('%'), collector
|
|
472
|
-
|
|
473
|
+
elsif s.scan(/[^%]+|./)
|
|
473
474
|
collector = visit Arel.quoted(s.matched), collector
|
|
474
475
|
end
|
|
475
476
|
end
|
|
@@ -478,7 +479,7 @@ module ArelExtensions
|
|
|
478
479
|
end
|
|
479
480
|
end
|
|
480
481
|
|
|
481
|
-
def visit_ArelExtensions_Nodes_Replace
|
|
482
|
+
def visit_ArelExtensions_Nodes_Replace(o, collector)
|
|
482
483
|
collector << 'REPLACE('
|
|
483
484
|
o.expressions.each_with_index { |arg, i|
|
|
484
485
|
collector << LOADED_VISITOR::COMMA if i != 0
|
|
@@ -488,7 +489,7 @@ module ArelExtensions
|
|
|
488
489
|
collector
|
|
489
490
|
end
|
|
490
491
|
|
|
491
|
-
def visit_ArelExtensions_Nodes_FindInSet
|
|
492
|
+
def visit_ArelExtensions_Nodes_FindInSet(o, collector)
|
|
492
493
|
collector << 'dbo.FIND_IN_SET('
|
|
493
494
|
o.expressions.each_with_index { |arg, i|
|
|
494
495
|
collector << LOADED_VISITOR::COMMA if i != 0
|
|
@@ -499,7 +500,7 @@ module ArelExtensions
|
|
|
499
500
|
end
|
|
500
501
|
|
|
501
502
|
# TODO; manage case insensitivity
|
|
502
|
-
def visit_ArelExtensions_Nodes_IMatches
|
|
503
|
+
def visit_ArelExtensions_Nodes_IMatches(o, collector)
|
|
503
504
|
collector = visit o.left.ci_collate, collector
|
|
504
505
|
collector << ' LIKE '
|
|
505
506
|
collector = visit o.right.ci_collate, collector
|
|
@@ -512,7 +513,7 @@ module ArelExtensions
|
|
|
512
513
|
end
|
|
513
514
|
|
|
514
515
|
# TODO; manage case insensitivity
|
|
515
|
-
def visit_ArelExtensions_Nodes_IDoesNotMatch
|
|
516
|
+
def visit_ArelExtensions_Nodes_IDoesNotMatch(o, collector)
|
|
516
517
|
collector = visit o.left.ci_collate, collector
|
|
517
518
|
collector << ' NOT LIKE '
|
|
518
519
|
collector = visit o.right.ci_collate, collector
|
|
@@ -524,7 +525,7 @@ module ArelExtensions
|
|
|
524
525
|
end
|
|
525
526
|
end
|
|
526
527
|
|
|
527
|
-
def visit_ArelExtensions_Nodes_AiMatches
|
|
528
|
+
def visit_ArelExtensions_Nodes_AiMatches(o, collector)
|
|
528
529
|
collector = visit o.left.ai_collate, collector
|
|
529
530
|
collector << ' LIKE '
|
|
530
531
|
collector = visit o.right.ai_collate, collector
|
|
@@ -536,7 +537,7 @@ module ArelExtensions
|
|
|
536
537
|
end
|
|
537
538
|
end
|
|
538
539
|
|
|
539
|
-
def visit_ArelExtensions_Nodes_AiIMatches
|
|
540
|
+
def visit_ArelExtensions_Nodes_AiIMatches(o, collector)
|
|
540
541
|
collector = visit o.left.collate(true, true), collector
|
|
541
542
|
collector << ' LIKE '
|
|
542
543
|
collector = visit o.right.collate(true, true), collector
|
|
@@ -548,7 +549,7 @@ module ArelExtensions
|
|
|
548
549
|
end
|
|
549
550
|
end
|
|
550
551
|
|
|
551
|
-
def visit_ArelExtensions_Nodes_SMatches
|
|
552
|
+
def visit_ArelExtensions_Nodes_SMatches(o, collector)
|
|
552
553
|
collector = visit o.left.collate, collector
|
|
553
554
|
collector << ' LIKE '
|
|
554
555
|
collector = visit o.right.collate, collector
|
|
@@ -560,7 +561,7 @@ module ArelExtensions
|
|
|
560
561
|
end
|
|
561
562
|
end
|
|
562
563
|
|
|
563
|
-
def visit_ArelExtensions_Nodes_Collate
|
|
564
|
+
def visit_ArelExtensions_Nodes_Collate(o, collector)
|
|
564
565
|
if o.ai && o.ci
|
|
565
566
|
collector = visit o.expressions.first, collector
|
|
566
567
|
collector << ' COLLATE Latin1_General_CI_AI'
|
|
@@ -577,8 +578,8 @@ module ArelExtensions
|
|
|
577
578
|
collector
|
|
578
579
|
end
|
|
579
580
|
|
|
580
|
-
|
|
581
|
-
def visit_Arel_Nodes_As
|
|
581
|
+
alias old_visit_Arel_Nodes_As visit_Arel_Nodes_As rescue nil
|
|
582
|
+
def visit_Arel_Nodes_As(o, collector)
|
|
582
583
|
if o.left.is_a?(Arel::Nodes::Binary)
|
|
583
584
|
collector << '('
|
|
584
585
|
collector = visit o.left, collector
|
|
@@ -594,7 +595,7 @@ module ArelExtensions
|
|
|
594
595
|
# This is a lie, it's not about arel version, but SQL Server's (>= 2000).
|
|
595
596
|
%w([ ])
|
|
596
597
|
elsif ACTIVE_RECORD_VERSION < V8_1 && o.right[0] != '"' && o.right[-1] != '"'
|
|
597
|
-
%w
|
|
598
|
+
%w[" "]
|
|
598
599
|
else
|
|
599
600
|
[]
|
|
600
601
|
end
|
|
@@ -606,38 +607,38 @@ module ArelExtensions
|
|
|
606
607
|
end
|
|
607
608
|
|
|
608
609
|
# SQL Server does not know about REGEXP
|
|
609
|
-
def visit_Arel_Nodes_Regexp
|
|
610
|
+
def visit_Arel_Nodes_Regexp(o, collector)
|
|
610
611
|
collector = visit o.left, collector
|
|
611
612
|
collector << "LIKE '%#{o.right}%'"
|
|
612
613
|
collector
|
|
613
614
|
end
|
|
614
615
|
|
|
615
|
-
def visit_Arel_Nodes_NotRegexp
|
|
616
|
+
def visit_Arel_Nodes_NotRegexp(o, collector)
|
|
616
617
|
collector = visit o.left, collector
|
|
617
618
|
collector << "NOT LIKE '%#{o.right}%'"
|
|
618
619
|
collector
|
|
619
620
|
end
|
|
620
621
|
|
|
621
622
|
def visit_Arel_Nodes_RollUp(o, collector)
|
|
622
|
-
collector <<
|
|
623
|
+
collector << 'ROLLUP'
|
|
623
624
|
grouping_array_or_grouping_element o, collector
|
|
624
625
|
end
|
|
625
626
|
|
|
626
|
-
def visit_ArelExtensions_Nodes_GroupConcat
|
|
627
|
+
def visit_ArelExtensions_Nodes_GroupConcat(o, collector)
|
|
627
628
|
collector << '(STRING_AGG('
|
|
628
629
|
collector = visit o.left, collector
|
|
629
|
-
collector <<
|
|
630
|
+
collector << LOADED_VISITOR::COMMA
|
|
630
631
|
sep = o.separator.is_a?(Arel::Nodes::Quoted) ? o.separator.expr : o.separator
|
|
631
632
|
collector =
|
|
632
|
-
if 'NULL'
|
|
633
|
-
visit o.separator, collector
|
|
634
|
-
else
|
|
633
|
+
if 'NULL' == sep
|
|
635
634
|
visit Arel.quoted(','), collector
|
|
635
|
+
else
|
|
636
|
+
visit o.separator, collector
|
|
636
637
|
end
|
|
637
638
|
collector << ') WITHIN GROUP (ORDER BY '
|
|
638
639
|
if o.order.present?
|
|
639
640
|
o.order.each_with_index do |order, i|
|
|
640
|
-
collector <<
|
|
641
|
+
collector << LOADED_VISITOR::COMMA if i != 0
|
|
641
642
|
collector = visit order, collector
|
|
642
643
|
end
|
|
643
644
|
else
|
|
@@ -647,18 +648,18 @@ module ArelExtensions
|
|
|
647
648
|
collector
|
|
648
649
|
end
|
|
649
650
|
|
|
650
|
-
def visit_ArelExtensions_Nodes_MD5
|
|
651
|
-
collector << "LOWER(CONVERT(NVARCHAR(32),HashBytes('MD5',CONVERT(VARCHAR,"
|
|
651
|
+
def visit_ArelExtensions_Nodes_MD5(o, collector)
|
|
652
|
+
collector << "LOWER(CONVERT(NVARCHAR(32),HashBytes('MD5',CONVERT(VARCHAR(MAX),"
|
|
652
653
|
collector = visit o.left, collector
|
|
653
654
|
collector << ')),2))'
|
|
654
655
|
collector
|
|
655
656
|
end
|
|
656
657
|
|
|
657
|
-
def visit_ArelExtensions_Nodes_Cast
|
|
658
|
+
def visit_ArelExtensions_Nodes_Cast(o, collector)
|
|
658
659
|
as_attr =
|
|
659
660
|
case o.as_attr
|
|
660
661
|
when :string
|
|
661
|
-
'varchar'
|
|
662
|
+
'varchar(MAX)'
|
|
662
663
|
when :time
|
|
663
664
|
'time'
|
|
664
665
|
when :date
|
|
@@ -685,7 +686,7 @@ module ArelExtensions
|
|
|
685
686
|
collector
|
|
686
687
|
end
|
|
687
688
|
|
|
688
|
-
def visit_ArelExtensions_Nodes_FormattedNumber
|
|
689
|
+
def visit_ArelExtensions_Nodes_FormattedNumber(o, collector)
|
|
689
690
|
col = o.left.coalesce(0)
|
|
690
691
|
locale = Arel.quoted(o.locale.tr('_', '-'))
|
|
691
692
|
param = Arel.quoted("N#{o.precision}")
|
|
@@ -746,35 +747,33 @@ module ArelExtensions
|
|
|
746
747
|
collector
|
|
747
748
|
end
|
|
748
749
|
|
|
749
|
-
def visit_ArelExtensions_Nodes_Std
|
|
750
|
+
def visit_ArelExtensions_Nodes_Std(o, collector)
|
|
750
751
|
collector << (o.unbiased_estimator ? 'STDEV(' : 'STDEVP(')
|
|
751
752
|
visit o.left, collector
|
|
752
753
|
collector << ')'
|
|
753
754
|
collector
|
|
754
755
|
end
|
|
755
756
|
|
|
756
|
-
def visit_ArelExtensions_Nodes_Variance
|
|
757
|
+
def visit_ArelExtensions_Nodes_Variance(o, collector)
|
|
757
758
|
collector << (o.unbiased_estimator ? 'VAR(' : 'VARP(')
|
|
758
759
|
visit o.left, collector
|
|
759
760
|
collector << ')'
|
|
760
761
|
collector
|
|
761
762
|
end
|
|
762
763
|
|
|
763
|
-
|
|
764
|
-
def visit_ArelExtensions_Nodes_LevenshteinDistance o, collector
|
|
764
|
+
def visit_ArelExtensions_Nodes_LevenshteinDistance(o, collector)
|
|
765
765
|
collector << 'dbo.LEVENSHTEIN_DISTANCE('
|
|
766
766
|
collector = visit o.left, collector
|
|
767
|
-
collector <<
|
|
767
|
+
collector << LOADED_VISITOR::COMMA
|
|
768
768
|
collector = visit o.right, collector
|
|
769
769
|
collector << ')'
|
|
770
770
|
collector
|
|
771
771
|
end
|
|
772
772
|
|
|
773
|
-
|
|
774
|
-
def visit_ArelExtensions_Nodes_JsonGet o, collector
|
|
773
|
+
def visit_ArelExtensions_Nodes_JsonGet(o, collector)
|
|
775
774
|
collector << 'JSON_VALUE('
|
|
776
775
|
collector = visit o.dict, collector
|
|
777
|
-
collector <<
|
|
776
|
+
collector << LOADED_VISITOR::COMMA
|
|
778
777
|
if o.key.is_a?(Integer)
|
|
779
778
|
collector << "\"$[#{o.key}]\""
|
|
780
779
|
else
|
|
@@ -788,9 +787,9 @@ module ArelExtensions
|
|
|
788
787
|
# handle grouping aggregation semantics
|
|
789
788
|
def grouping_array_or_grouping_element(o, collector)
|
|
790
789
|
if o.expr.is_a? Array
|
|
791
|
-
collector <<
|
|
790
|
+
collector << '( '
|
|
792
791
|
visit o.expr, collector
|
|
793
|
-
collector <<
|
|
792
|
+
collector << ' )'
|
|
794
793
|
else
|
|
795
794
|
visit o.expr, collector
|
|
796
795
|
end
|