arel_extensions 2.0.1 → 2.0.4
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/.rubocop.yml +7 -4
- data/.travis.yml +10 -10
- data/Gemfile +14 -19
- data/README.md +17 -12
- data/Rakefile +23 -23
- data/appveyor.yml +1 -1
- data/arel_extensions.gemspec +2 -2
- data/functions.html +3 -3
- data/gemfiles/rails6.gemfile +30 -0
- data/gemspec_v2/arel_extensions-v2.gemspec +28 -0
- data/generate_gems.sh +13 -0
- data/init/mssql.sql +4 -4
- data/init/mysql.sql +38 -38
- data/init/postgresql.sql +21 -21
- data/lib/arel_extensions/boolean_functions.rb +0 -2
- data/lib/arel_extensions/common_sql_functions.rb +5 -4
- data/lib/arel_extensions/comparators.rb +4 -2
- data/lib/arel_extensions/insert_manager.rb +12 -12
- data/lib/arel_extensions/math.rb +3 -3
- data/lib/arel_extensions/math_functions.rb +10 -5
- data/lib/arel_extensions/nodes/aggregate_function.rb +14 -0
- data/lib/arel_extensions/nodes/case.rb +0 -2
- data/lib/arel_extensions/nodes/coalesce.rb +2 -2
- data/lib/arel_extensions/nodes/collate.rb +1 -1
- data/lib/arel_extensions/nodes/concat.rb +6 -13
- data/lib/arel_extensions/nodes/date_diff.rb +3 -5
- data/lib/arel_extensions/nodes/duration.rb +0 -2
- data/lib/arel_extensions/nodes/format.rb +8 -8
- data/lib/arel_extensions/nodes/formatted_number.rb +23 -23
- data/lib/arel_extensions/nodes/function.rb +2 -0
- data/lib/arel_extensions/nodes/json.rb +28 -30
- data/lib/arel_extensions/nodes/matches.rb +4 -4
- data/lib/arel_extensions/nodes/power.rb +6 -5
- data/lib/arel_extensions/nodes/repeat.rb +2 -2
- data/lib/arel_extensions/nodes/replace.rb +24 -6
- data/lib/arel_extensions/nodes/round.rb +5 -5
- data/lib/arel_extensions/nodes/soundex.rb +16 -15
- data/lib/arel_extensions/nodes/std.rb +19 -21
- data/lib/arel_extensions/nodes/substring.rb +8 -15
- data/lib/arel_extensions/nodes/sum.rb +7 -0
- data/lib/arel_extensions/nodes/trim.rb +3 -3
- data/lib/arel_extensions/nodes/union.rb +2 -3
- data/lib/arel_extensions/nodes/union_all.rb +0 -1
- data/lib/arel_extensions/nodes.rb +1 -1
- data/lib/arel_extensions/null_functions.rb +2 -2
- data/lib/arel_extensions/predications.rb +16 -17
- data/lib/arel_extensions/string_functions.rb +21 -12
- data/lib/arel_extensions/tasks.rb +5 -5
- data/lib/arel_extensions/version.rb +1 -1
- data/lib/arel_extensions/visitors/mssql.rb +14 -13
- data/lib/arel_extensions/visitors/mysql.rb +72 -37
- data/lib/arel_extensions/visitors/oracle.rb +12 -11
- data/lib/arel_extensions/visitors/oracle12.rb +1 -1
- data/lib/arel_extensions/visitors/postgresql.rb +77 -31
- data/lib/arel_extensions/visitors/sqlite.rb +54 -40
- data/lib/arel_extensions/visitors/to_sql.rb +50 -31
- data/lib/arel_extensions.rb +20 -1
- data/test/helper.rb +1 -1
- data/test/real_db_test.rb +1 -1
- data/test/support/fake_record.rb +0 -4
- data/test/test_comparators.rb +1 -1
- data/test/visitors/test_bulk_insert_oracle.rb +6 -6
- data/test/visitors/test_bulk_insert_sqlite.rb +6 -6
- data/test/visitors/test_bulk_insert_to_sql.rb +7 -9
- data/test/visitors/test_oracle.rb +1 -0
- data/test/visitors/test_to_sql.rb +15 -1
- data/test/with_ar/all_agnostic_test.rb +54 -32
- data/test/with_ar/insert_agnostic_test.rb +2 -1
- data/test/with_ar/test_bulk_sqlite.rb +2 -2
- data/test/with_ar/test_math_sqlite.rb +3 -3
- data/test/with_ar/test_string_mysql.rb +3 -5
- data/test/with_ar/test_string_sqlite.rb +2 -6
- data/version_v1.rb +3 -0
- data/version_v2.rb +3 -0
- metadata +13 -6
@@ -83,23 +83,49 @@ module ArelExtensions
|
|
83
83
|
collector
|
84
84
|
end
|
85
85
|
|
86
|
+
def visit_Aggregate_For_AggregateFunction o, collector
|
87
|
+
if !o.order.blank? || !o.group.blank?
|
88
|
+
collector << " OVER ("
|
89
|
+
if !o.group.blank?
|
90
|
+
collector << " PARTITION BY "
|
91
|
+
o.group.each_with_index do |group, i|
|
92
|
+
collector << Arel::Visitors::PostgreSQL::COMMA unless i == 0
|
93
|
+
visit group, collector
|
94
|
+
end
|
95
|
+
end
|
96
|
+
if !o.order.blank?
|
97
|
+
collector << " ORDER BY "
|
98
|
+
o.order.each_with_index do |order, i|
|
99
|
+
collector << Arel::Visitors::PostgreSQL::COMMA unless i == 0
|
100
|
+
visit order, collector
|
101
|
+
end
|
102
|
+
end
|
103
|
+
collector << ")"
|
104
|
+
end
|
105
|
+
collector
|
106
|
+
end
|
107
|
+
|
86
108
|
def visit_ArelExtensions_Nodes_GroupConcat o, collector
|
87
109
|
collector << "array_to_string(array_agg("
|
88
110
|
collector = visit o.left, collector
|
89
|
-
if !o.
|
90
|
-
collector <<
|
91
|
-
o.
|
111
|
+
if o.order && !o.order.blank?
|
112
|
+
collector << " ORDER BY"
|
113
|
+
o.order.each_with_index do |order, i|
|
92
114
|
collector << Arel::Visitors::PostgreSQL::COMMA unless i == 0
|
93
|
-
collector
|
115
|
+
collector << " "
|
116
|
+
visit order, collector
|
94
117
|
end
|
95
118
|
end
|
96
119
|
collector << ")"
|
120
|
+
o.order = nil
|
121
|
+
visit_Aggregate_For_AggregateFunction o, collector
|
97
122
|
collector << Arel::Visitors::PostgreSQL::COMMA
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
123
|
+
collector =
|
124
|
+
if o.separator && o.separator != 'NULL'
|
125
|
+
visit o.separator, collector
|
126
|
+
else
|
127
|
+
visit Arel::Nodes.build_quoted(','), collector
|
128
|
+
end
|
103
129
|
collector << ")"
|
104
130
|
collector
|
105
131
|
end
|
@@ -277,6 +303,22 @@ module ArelExtensions
|
|
277
303
|
collector
|
278
304
|
end
|
279
305
|
|
306
|
+
def visit_ArelExtensions_Nodes_RegexpReplace o, collector
|
307
|
+
collector << "REGEXP_REPLACE("
|
308
|
+
visit o.left, collector
|
309
|
+
collector << Arel::Visitors::ToSql::COMMA
|
310
|
+
tab = o.pattern.inspect+ 'g' # Make it always global
|
311
|
+
pattern = tab.split('/')[1..-2].join('/')
|
312
|
+
flags = tab.split('/')[-1]
|
313
|
+
visit Arel::Nodes.build_quoted(pattern), collector
|
314
|
+
collector << Arel::Visitors::ToSql::COMMA
|
315
|
+
visit o.substitute, collector
|
316
|
+
collector << Arel::Visitors::ToSql::COMMA
|
317
|
+
visit Arel::Nodes.build_quoted(flags+"g"), collector
|
318
|
+
collector << ")"
|
319
|
+
collector
|
320
|
+
end
|
321
|
+
|
280
322
|
def visit_ArelExtensions_Nodes_IsNull o, collector
|
281
323
|
collector = visit o.expr, collector
|
282
324
|
collector << ' IS NULL'
|
@@ -293,6 +335,7 @@ module ArelExtensions
|
|
293
335
|
collector << "sum("
|
294
336
|
collector = visit o.expr, collector
|
295
337
|
collector << ")"
|
338
|
+
visit_Aggregate_For_AggregateFunction o, collector
|
296
339
|
collector
|
297
340
|
end
|
298
341
|
|
@@ -345,27 +388,28 @@ module ArelExtensions
|
|
345
388
|
else(o.flags.include?('+') ? '+' : (o.flags.include?(' ') ? ' ' : ''))
|
346
389
|
sign_length = ArelExtensions::Nodes::Length.new([sign])
|
347
390
|
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
391
|
+
number =
|
392
|
+
if o.scientific_notation
|
393
|
+
ArelExtensions::Nodes::Concat.new([
|
394
|
+
Arel::Nodes::NamedFunction.new('TRIM',[
|
395
|
+
Arel::Nodes::NamedFunction.new('TO_CHAR',[
|
396
|
+
col.abs/Arel::Nodes.build_quoted(10).pow(col.abs.log10.floor),
|
397
|
+
Arel::Nodes.build_quoted('FM'+nines_before+'"'+comma+'"V'+nines_after)
|
398
|
+
])]),
|
399
|
+
o.type,
|
400
|
+
Arel::Nodes::NamedFunction.new('TRIM',[
|
401
|
+
Arel::Nodes::NamedFunction.new('TO_CHAR',[
|
402
|
+
col.abs.log10.floor,
|
403
|
+
Arel::Nodes.build_quoted('FM'+nines_before)
|
404
|
+
])])
|
405
|
+
])
|
406
|
+
else
|
407
|
+
Arel::Nodes::NamedFunction.new('TRIM',[
|
408
|
+
Arel::Nodes::NamedFunction.new('TO_CHAR',[
|
409
|
+
Arel::Nodes.build_quoted(col.abs),
|
410
|
+
Arel::Nodes.build_quoted('FM'+nines_before+'"'+comma+'"V'+nines_after)
|
411
|
+
])])
|
412
|
+
end
|
369
413
|
|
370
414
|
repeated_char = (o.width == 0) ? Arel::Nodes.build_quoted('') : ArelExtensions::Nodes::Case.new().
|
371
415
|
when(Arel::Nodes.build_quoted(o.width).abs-(number.length+sign_length)>0).
|
@@ -420,6 +464,7 @@ module ArelExtensions
|
|
420
464
|
collector << (o.unbiased_estimator ? "STDDEV_SAMP(" : "STDDEV_POP(")
|
421
465
|
visit o.left, collector
|
422
466
|
collector << ")"
|
467
|
+
visit_Aggregate_For_AggregateFunction o, collector
|
423
468
|
collector
|
424
469
|
end
|
425
470
|
|
@@ -427,6 +472,7 @@ module ArelExtensions
|
|
427
472
|
collector << (o.unbiased_estimator ? "VAR_SAMP(" : "VAR_POP(")
|
428
473
|
visit o.left, collector
|
429
474
|
collector << ")"
|
475
|
+
visit_Aggregate_For_AggregateFunction o, collector
|
430
476
|
collector
|
431
477
|
end
|
432
478
|
|
@@ -438,7 +484,7 @@ module ArelExtensions
|
|
438
484
|
if i != 0
|
439
485
|
collector << Arel::Visitors::MySQL::COMMA
|
440
486
|
end
|
441
|
-
collector
|
487
|
+
collector = visit v, collector
|
442
488
|
end
|
443
489
|
collector << '])'
|
444
490
|
when Hash
|
@@ -193,18 +193,28 @@ module ArelExtensions
|
|
193
193
|
collector
|
194
194
|
end
|
195
195
|
|
196
|
-
#
|
197
|
-
#
|
196
|
+
# CAST(
|
197
|
+
# CASE
|
198
|
+
# WHEN 3.42 >= 0 THEN CAST(3.42 AS INT)
|
199
|
+
# WHEN CAST(3.42 AS INT) = 3.42 THEN CAST(3.42 AS INT)
|
200
|
+
# ELSE CAST((3.42 - 1.0) AS INT)
|
201
|
+
# END
|
202
|
+
# AS FLOAT
|
203
|
+
# )
|
198
204
|
def visit_ArelExtensions_Nodes_Floor o, collector
|
199
|
-
collector << "CASE WHEN
|
205
|
+
collector << "CAST(CASE WHEN "
|
200
206
|
collector = visit o.left, collector
|
201
|
-
collector << "
|
207
|
+
collector << " >= 0 THEN CAST("
|
202
208
|
collector = visit o.left, collector
|
203
|
-
collector << ")
|
209
|
+
collector << " AS INT) WHEN CAST("
|
210
|
+
collector = visit o.left, collector
|
211
|
+
collector << " AS INT) = "
|
212
|
+
collector = visit o.left, collector
|
213
|
+
collector << " THEN CAST("
|
204
214
|
collector = visit o.left, collector
|
205
|
-
collector << ") ELSE
|
215
|
+
collector << " AS INT) ELSE CAST(("
|
206
216
|
collector = visit o.left, collector
|
207
|
-
collector << "
|
217
|
+
collector << " - 1.0) AS INT) END AS FLOAT)"
|
208
218
|
collector
|
209
219
|
end
|
210
220
|
|
@@ -248,20 +258,20 @@ module ArelExtensions
|
|
248
258
|
def visit_ArelExtensions_InsertManager_BulkValues o, collector
|
249
259
|
o.left.each_with_index do |row, idx|
|
250
260
|
collector << 'SELECT '
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
261
|
+
v = Arel::Nodes::Values.new(row, o.cols)
|
262
|
+
len = v.expressions.length - 1
|
263
|
+
v.expressions.zip(v.columns).each_with_index { |(value, attr), i|
|
264
|
+
case value
|
265
|
+
when Arel::Nodes::SqlLiteral, Arel::Nodes::BindParam
|
266
|
+
collector = visit value.as(attr.name), collector
|
267
|
+
else
|
268
|
+
collector << (attr && attr.able_to_type_cast? ? quote(attr.type_cast_for_database(value)) : quote(value).to_s)
|
269
|
+
if idx == 0
|
270
|
+
collector << " AS "
|
271
|
+
collector << quote(attr.name)
|
272
|
+
end
|
262
273
|
end
|
263
|
-
|
264
|
-
collector << Arel::Visitors::SQLite::COMMA unless i == len
|
274
|
+
collector << Arel::Visitors::SQLite::COMMA unless i == len
|
265
275
|
}
|
266
276
|
collector << ' UNION ALL ' unless idx == o.left.length - 1
|
267
277
|
end
|
@@ -270,32 +280,36 @@ module ArelExtensions
|
|
270
280
|
end
|
271
281
|
|
272
282
|
def visit_ArelExtensions_Nodes_Union o, collector
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
283
|
+
collector =
|
284
|
+
if o.left.is_a?(Arel::SelectManager)
|
285
|
+
visit o.left.ast, collector
|
286
|
+
else
|
287
|
+
visit o.left, collector
|
288
|
+
end
|
278
289
|
collector << " UNION "
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
290
|
+
collector =
|
291
|
+
if o.right.is_a?(Arel::SelectManager)
|
292
|
+
visit o.right.ast, collector
|
293
|
+
else
|
294
|
+
visit o.right, collector
|
295
|
+
end
|
284
296
|
collector
|
285
297
|
end
|
286
298
|
|
287
299
|
def visit_ArelExtensions_Nodes_UnionAll o, collector
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
300
|
+
collector =
|
301
|
+
if o.left.is_a?(Arel::SelectManager)
|
302
|
+
visit o.left.ast, collector
|
303
|
+
else
|
304
|
+
visit o.left, collector
|
305
|
+
end
|
293
306
|
collector << " UNION ALL "
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
307
|
+
collector =
|
308
|
+
if o.right.is_a?(Arel::SelectManager)
|
309
|
+
visit o.right.ast, collector
|
310
|
+
else
|
311
|
+
visit o.right, collector
|
312
|
+
end
|
299
313
|
collector
|
300
314
|
end
|
301
315
|
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module ArelExtensions
|
2
2
|
module Visitors
|
3
|
-
|
4
|
-
Arel::Visitors::ToSql::COMMA =
|
3
|
+
Arel::Visitors::ToSql.class_eval do
|
4
|
+
Arel::Visitors::ToSql::COMMA = ', ' unless defined?(Arel::Visitors::ToSql::COMMA)
|
5
5
|
|
6
6
|
# Math Functions
|
7
7
|
def visit_ArelExtensions_Nodes_Abs o, collector
|
@@ -53,14 +53,14 @@ module ArelExtensions
|
|
53
53
|
collector << ")"
|
54
54
|
collector
|
55
55
|
end
|
56
|
-
|
56
|
+
|
57
57
|
def visit_ArelExtensions_Nodes_Log10 o, collector
|
58
58
|
collector << "LOG10("
|
59
59
|
collector = visit o.left, collector
|
60
60
|
collector << ")"
|
61
61
|
collector
|
62
62
|
end
|
63
|
-
|
63
|
+
|
64
64
|
def visit_ArelExtensions_Nodes_Power o, collector
|
65
65
|
collector << "POW("
|
66
66
|
o.expressions.each_with_index { |arg, i|
|
@@ -71,6 +71,13 @@ module ArelExtensions
|
|
71
71
|
collector
|
72
72
|
end
|
73
73
|
|
74
|
+
def visit_ArelExtensions_Nodes_Sum o, collector
|
75
|
+
collector << "SUM("
|
76
|
+
collector = visit o.expr, collector
|
77
|
+
collector << ")"
|
78
|
+
collector
|
79
|
+
end
|
80
|
+
|
74
81
|
# String functions
|
75
82
|
def visit_ArelExtensions_Nodes_Concat o, collector
|
76
83
|
collector << "CONCAT("
|
@@ -85,9 +92,9 @@ module ArelExtensions
|
|
85
92
|
def visit_ArelExtensions_Nodes_GroupConcat o, collector
|
86
93
|
collector << "GROUP_CONCAT("
|
87
94
|
collector = visit o.left, collector
|
88
|
-
if o.
|
95
|
+
if o.separator && o.separator != 'NULL'
|
89
96
|
collector << Arel::Visitors::ToSql::COMMA
|
90
|
-
collector = visit o.
|
97
|
+
collector = visit o.separator, collector
|
91
98
|
end
|
92
99
|
collector << ")"
|
93
100
|
collector
|
@@ -128,14 +135,26 @@ module ArelExtensions
|
|
128
135
|
|
129
136
|
def visit_ArelExtensions_Nodes_Replace o, collector
|
130
137
|
collector << "REPLACE("
|
131
|
-
o.
|
132
|
-
|
133
|
-
|
134
|
-
|
138
|
+
visit o.left, collector
|
139
|
+
collector << Arel::Visitors::ToSql::COMMA
|
140
|
+
visit o.pattern, collector
|
141
|
+
collector << Arel::Visitors::ToSql::COMMA
|
142
|
+
visit o.substitute, collector
|
143
|
+
collector << ")"
|
144
|
+
collector
|
145
|
+
end
|
146
|
+
|
147
|
+
def visit_ArelExtensions_Nodes_RegexpReplace o, collector
|
148
|
+
collector << "REGEXP_REPLACE("
|
149
|
+
visit o.left, collector
|
150
|
+
collector << Arel::Visitors::ToSql::COMMA
|
151
|
+
visit Arel::Nodes.build_quoted(o.pattern.to_s), collector
|
152
|
+
collector << Arel::Visitors::ToSql::COMMA
|
153
|
+
visit o.substitute, collector
|
135
154
|
collector << ")"
|
136
155
|
collector
|
137
156
|
end
|
138
|
-
|
157
|
+
|
139
158
|
def visit_ArelExtensions_Nodes_Repeat o, collector
|
140
159
|
collector << "REPEAT("
|
141
160
|
o.expressions.each_with_index { |arg, i|
|
@@ -270,12 +289,12 @@ module ArelExtensions
|
|
270
289
|
as_attr = Arel::Nodes::SqlLiteral.new('int')
|
271
290
|
when :decimal, :float, :number
|
272
291
|
as_attr = Arel::Nodes::SqlLiteral.new('float')
|
273
|
-
when :datetime
|
292
|
+
when :datetime
|
274
293
|
as_attr = Arel::Nodes::SqlLiteral.new('datetime')
|
275
294
|
when :time
|
276
295
|
as_attr = Arel::Nodes::SqlLiteral.new('time')
|
277
|
-
when :binary
|
278
|
-
as_attr = Arel::Nodes::SqlLiteral.new('binary')
|
296
|
+
when :binary
|
297
|
+
as_attr = Arel::Nodes::SqlLiteral.new('binary')
|
279
298
|
else
|
280
299
|
as_attr = Arel::Nodes::SqlLiteral.new(o.as_attr.to_s)
|
281
300
|
end
|
@@ -306,7 +325,7 @@ module ArelExtensions
|
|
306
325
|
collector << ")"
|
307
326
|
collector
|
308
327
|
end
|
309
|
-
|
328
|
+
|
310
329
|
def visit_ArelExtensions_Nodes_DateSub o, collector
|
311
330
|
collector << "DATE_SUB("
|
312
331
|
collector = visit o.left, collector
|
@@ -385,7 +404,7 @@ module ArelExtensions
|
|
385
404
|
collector = visit o.left, collector
|
386
405
|
collector << ") THEN "
|
387
406
|
collector = visit o.right, collector
|
388
|
-
if o.expressions[2]
|
407
|
+
if o.expressions[2]
|
389
408
|
collector << " ELSE "
|
390
409
|
collector = visit o.expressions[2], collector
|
391
410
|
end
|
@@ -430,9 +449,9 @@ module ArelExtensions
|
|
430
449
|
row_nb = o.left.length
|
431
450
|
o.left.each_with_index do |row, idx|
|
432
451
|
collector << '('
|
433
|
-
|
434
|
-
|
435
|
-
|
452
|
+
v = Arel::Nodes::Values.new(row, o.cols)
|
453
|
+
len = v.expressions.length - 1
|
454
|
+
v.expressions.zip(v.columns).each_with_index { |(value, attr), i|
|
436
455
|
case value
|
437
456
|
when Arel::Nodes::SqlLiteral, Arel::Nodes::BindParam
|
438
457
|
collector = visit value, collector
|
@@ -453,7 +472,7 @@ module ArelExtensions
|
|
453
472
|
collector = visit o.right, collector
|
454
473
|
collector
|
455
474
|
end
|
456
|
-
|
475
|
+
|
457
476
|
def visit_ArelExtensions_Nodes_UnionAll o, collector
|
458
477
|
collector = visit o.left, collector
|
459
478
|
collector << " UNION ALL "
|
@@ -490,25 +509,25 @@ module ArelExtensions
|
|
490
509
|
visit Arel::Nodes.build_quoted(o.expr), collector
|
491
510
|
end
|
492
511
|
|
493
|
-
def visit_ArelExtensions_Nodes_FormattedNumber o, collector
|
512
|
+
def visit_ArelExtensions_Nodes_FormattedNumber o, collector
|
494
513
|
visit o.left, collector
|
495
514
|
end
|
496
|
-
|
497
|
-
remove_method(:visit_Arel_Nodes_LessThan) rescue nil
|
515
|
+
|
516
|
+
remove_method(:visit_Arel_Nodes_LessThan) rescue nil
|
498
517
|
def visit_Arel_Nodes_LessThan o, collector
|
499
518
|
collector = visit o.left, collector
|
500
519
|
collector << " < "
|
501
520
|
visit o.right, collector
|
502
521
|
end
|
503
|
-
|
504
|
-
def visit_ArelExtensions_Nodes_Std o, collector
|
522
|
+
|
523
|
+
def visit_ArelExtensions_Nodes_Std o, collector
|
505
524
|
collector << "STD("
|
506
525
|
visit o.left, collector
|
507
526
|
collector << ")"
|
508
527
|
collector
|
509
528
|
end
|
510
|
-
|
511
|
-
def visit_ArelExtensions_Nodes_Variance o, collector
|
529
|
+
|
530
|
+
def visit_ArelExtensions_Nodes_Variance o, collector
|
512
531
|
collector << "VARIANCE("
|
513
532
|
visit o.left, collector
|
514
533
|
collector << ")"
|
@@ -526,40 +545,40 @@ module ArelExtensions
|
|
526
545
|
|
527
546
|
alias_method :old_visit_Arel_Nodes_And, :visit_Arel_Nodes_And
|
528
547
|
def visit_Arel_Nodes_And o, collector
|
548
|
+
collector << '('
|
529
549
|
case o.children.length
|
530
550
|
when 0
|
531
551
|
collector << '1=1' # but this should not happen
|
532
552
|
when 1
|
533
553
|
collector = visit o.children[0], collector
|
534
554
|
else
|
535
|
-
collector << '('
|
536
555
|
o.children.each_with_index { |arg, i|
|
537
556
|
if i != 0
|
538
557
|
collector << ') AND ('
|
539
558
|
end
|
540
559
|
collector = visit arg, collector
|
541
560
|
}
|
542
|
-
collector << ')'
|
543
561
|
end
|
562
|
+
collector << ')'
|
544
563
|
collector
|
545
564
|
end
|
546
565
|
|
547
566
|
def visit_ArelExtensions_Nodes_Or o, collector
|
567
|
+
collector << '('
|
548
568
|
case o.children.length
|
549
569
|
when 0
|
550
570
|
collector << '0=1' # but this should not happen
|
551
571
|
when 1
|
552
572
|
collector = visit o.children[0], collector
|
553
573
|
else
|
554
|
-
collector << '('
|
555
574
|
o.children.each_with_index { |arg, i|
|
556
575
|
if i != 0
|
557
576
|
collector << ') OR ('
|
558
577
|
end
|
559
578
|
collector = visit arg, collector
|
560
579
|
}
|
561
|
-
collector << ')'
|
562
580
|
end
|
581
|
+
collector << ')'
|
563
582
|
collector
|
564
583
|
end
|
565
584
|
|
data/lib/arel_extensions.rb
CHANGED
@@ -93,6 +93,14 @@ module Arel
|
|
93
93
|
ArelExtensions::Nodes::Duration.new(s.to_s+'i',expr)
|
94
94
|
end
|
95
95
|
|
96
|
+
def self.true
|
97
|
+
Arel::Nodes::Equality.new(1,1)
|
98
|
+
end
|
99
|
+
|
100
|
+
def self.false
|
101
|
+
Arel::Nodes::Equality.new(1,0)
|
102
|
+
end
|
103
|
+
|
96
104
|
end
|
97
105
|
|
98
106
|
Arel::Attributes::Attribute.class_eval do
|
@@ -109,6 +117,12 @@ Arel::Nodes::Function.class_eval do
|
|
109
117
|
include ArelExtensions::BooleanFunctions
|
110
118
|
include ArelExtensions::NullFunctions
|
111
119
|
include ArelExtensions::Predications
|
120
|
+
|
121
|
+
alias_method :old_as, :as
|
122
|
+
def as other
|
123
|
+
Arel::Nodes::As.new(self, Arel.sql(other))
|
124
|
+
end
|
125
|
+
|
112
126
|
end
|
113
127
|
|
114
128
|
Arel::Nodes::Unary.class_eval do
|
@@ -149,4 +163,9 @@ Arel::Nodes::As.class_eval do
|
|
149
163
|
include ArelExtensions::Nodes
|
150
164
|
end
|
151
165
|
|
152
|
-
|
166
|
+
Arel::Table.class_eval do
|
167
|
+
alias_method :old_alias, :alias
|
168
|
+
def alias(name = "#{self.name}_2")
|
169
|
+
name.blank? ? self : Arel::Nodes::TableAlias.new(self,name)
|
170
|
+
end
|
171
|
+
end
|
data/test/helper.rb
CHANGED
data/test/real_db_test.rb
CHANGED
data/test/support/fake_record.rb
CHANGED
data/test/test_comparators.rb
CHANGED
@@ -9,8 +9,8 @@ module ArelExtensions
|
|
9
9
|
@table = Arel::Table.new(:users)
|
10
10
|
@cols = ['name', 'comments', 'created_at']
|
11
11
|
@data = [
|
12
|
-
|
13
|
-
|
12
|
+
['nom1', "sdfdsfdsfsdf", '2016-01-01'],
|
13
|
+
['nom2', "sdfdsfdsfsdf", '2016-01-01']
|
14
14
|
]
|
15
15
|
end
|
16
16
|
|
@@ -24,11 +24,11 @@ module ArelExtensions
|
|
24
24
|
|
25
25
|
it "should import large set of data in Oracle" do
|
26
26
|
insert_manager = Arel::VERSION.to_i > 6 ? Arel::InsertManager.new().into(@table) : Arel::InsertManager.new(@conn).into(@table)
|
27
|
-
|
28
|
-
|
29
|
-
|
27
|
+
insert_manager.bulk_insert(@cols, @data)
|
28
|
+
sql = compile(insert_manager.ast)
|
29
|
+
sql.must_be_like %Q[INSERT INTO "users" ("name", "comments", "created_at") ((SELECT 'nom1', 'sdfdsfdsfsdf', '2016-01-01' FROM DUAL) UNION ALL (SELECT 'nom2', 'sdfdsfdsfsdf', '2016-01-01' FROM DUAL))]
|
30
30
|
end
|
31
31
|
|
32
|
-
|
32
|
+
end
|
33
33
|
end
|
34
34
|
end
|
@@ -11,11 +11,11 @@ module ArelExtensions
|
|
11
11
|
Arel::Table.engine = @conn
|
12
12
|
@cols = ['id', 'name', 'comments', 'created_at']
|
13
13
|
@data = [
|
14
|
-
|
15
|
-
|
14
|
+
[23, 'nom1', "sdfdsfdsfsdf", '2016-01-01'],
|
15
|
+
[25, 'nom2', "sdfdsfdsfsdf", '2016-01-01']
|
16
16
|
]
|
17
17
|
end
|
18
|
-
|
18
|
+
|
19
19
|
def compile node
|
20
20
|
if Arel::VERSION.to_i > 5
|
21
21
|
@visitor.accept(node, Arel::Collectors::SQLString.new).value
|
@@ -28,9 +28,9 @@ module ArelExtensions
|
|
28
28
|
insert_manager = Arel::VERSION.to_i > 6 ? Arel::InsertManager.new().into(@table) : Arel::InsertManager.new(@conn).into(@table)
|
29
29
|
insert_manager.bulk_insert(@cols, @data)
|
30
30
|
sql = compile(insert_manager.ast)
|
31
|
-
|
31
|
+
sql.must_be_like %Q[INSERT INTO "users" ("id", "name", "comments", "created_at") SELECT 23 AS 'id', 'nom1' AS 'name', 'sdfdsfdsfsdf' AS 'comments', '2016-01-01' AS 'created_at' UNION ALL SELECT 25, 'nom2', 'sdfdsfdsfsdf', '2016-01-01']
|
32
32
|
end
|
33
33
|
|
34
|
-
|
34
|
+
end
|
35
35
|
end
|
36
|
-
end
|
36
|
+
end
|
@@ -10,8 +10,8 @@ module ArelExtensions
|
|
10
10
|
@table = Arel::Table.new(:users)
|
11
11
|
@cols = ['id', 'name', 'comments', 'created_at']
|
12
12
|
@data = [
|
13
|
-
|
14
|
-
|
13
|
+
[23, 'nom1', "sdfdsfdsfsdf", '2016-01-01'],
|
14
|
+
[25, 'nom2', "sdfdsfdsfsdf", '2016-01-01']
|
15
15
|
]
|
16
16
|
end
|
17
17
|
|
@@ -26,12 +26,10 @@ module ArelExtensions
|
|
26
26
|
|
27
27
|
it "should import large set of data using ToSql" do
|
28
28
|
insert_manager = Arel::VERSION.to_i > 6 ? Arel::InsertManager.new().into(@table) : Arel::InsertManager.new(@conn).into(@table)
|
29
|
-
|
30
|
-
|
31
|
-
|
29
|
+
insert_manager.bulk_insert(@cols, @data)
|
30
|
+
sql = compile(insert_manager.ast)
|
31
|
+
sql.must_be_like %Q[INSERT INTO "users" ("id", "name", "comments", "created_at") VALUES (23, 'nom1', 'sdfdsfdsfsdf', '2016-01-01'), (25, 'nom2', 'sdfdsfdsfsdf', '2016-01-01')]
|
32
32
|
end
|
33
|
-
|
34
|
-
|
35
|
-
end
|
33
|
+
end
|
36
34
|
end
|
37
|
-
end
|
35
|
+
end
|