arel_extensions 1.2.3 → 1.2.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.travis.yml +10 -10
- data/Gemfile +2 -2
- data/README.md +10 -10
- data/appveyor.yml +1 -1
- data/functions.html +1 -1
- data/init/mssql.sql +4 -4
- data/init/mysql.sql +38 -38
- data/init/postgresql.sql +21 -21
- data/lib/arel_extensions.rb +17 -1
- data/lib/arel_extensions/common_sql_functions.rb +1 -1
- data/lib/arel_extensions/comparators.rb +4 -2
- data/lib/arel_extensions/math_functions.rb +9 -4
- data/lib/arel_extensions/nodes.rb +1 -1
- data/lib/arel_extensions/nodes/aggregate_function.rb +14 -0
- data/lib/arel_extensions/nodes/coalesce.rb +2 -2
- data/lib/arel_extensions/nodes/concat.rb +6 -13
- data/lib/arel_extensions/nodes/date_diff.rb +2 -2
- data/lib/arel_extensions/nodes/format.rb +8 -8
- data/lib/arel_extensions/nodes/formatted_number.rb +6 -6
- data/lib/arel_extensions/nodes/function.rb +2 -0
- data/lib/arel_extensions/nodes/matches.rb +4 -4
- data/lib/arel_extensions/nodes/power.rb +2 -2
- data/lib/arel_extensions/nodes/repeat.rb +2 -2
- data/lib/arel_extensions/nodes/replace.rb +1 -1
- data/lib/arel_extensions/nodes/soundex.rb +4 -4
- data/lib/arel_extensions/nodes/std.rb +19 -21
- data/lib/arel_extensions/nodes/substring.rb +1 -1
- data/lib/arel_extensions/nodes/sum.rb +7 -0
- data/lib/arel_extensions/nodes/trim.rb +2 -2
- data/lib/arel_extensions/nodes/union.rb +2 -2
- data/lib/arel_extensions/null_functions.rb +2 -2
- data/lib/arel_extensions/string_functions.rb +10 -7
- data/lib/arel_extensions/version.rb +1 -1
- data/lib/arel_extensions/visitors/mssql.rb +4 -4
- data/lib/arel_extensions/visitors/mysql.rb +28 -4
- data/lib/arel_extensions/visitors/oracle.rb +4 -4
- data/lib/arel_extensions/visitors/postgresql.rb +34 -6
- data/lib/arel_extensions/visitors/to_sql.rb +29 -22
- data/test/helper.rb +1 -1
- data/test/real_db_test.rb +1 -1
- data/test/test_comparators.rb +1 -1
- data/test/visitors/test_bulk_insert_sqlite.rb +1 -1
- 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 +6 -0
- data/test/with_ar/all_agnostic_test.rb +14 -3
- data/test/with_ar/insert_agnostic_test.rb +2 -1
- data/test/with_ar/test_bulk_sqlite.rb +1 -1
- data/test/with_ar/test_math_sqlite.rb +2 -2
- data/test/with_ar/test_string_mysql.rb +3 -3
- data/test/with_ar/test_string_sqlite.rb +2 -2
- metadata +5 -4
@@ -139,16 +139,16 @@ module ArelExtensions
|
|
139
139
|
def visit_ArelExtensions_Nodes_GroupConcat o, collector
|
140
140
|
collector << "GROUP_CONCAT("
|
141
141
|
collector = visit o.left, collector
|
142
|
-
if !o.
|
142
|
+
if !o.order.blank?
|
143
143
|
collector << ' ORDER BY '
|
144
|
-
o.
|
144
|
+
o.order.each_with_index do |order,i|
|
145
145
|
collector << Arel::Visitors::ToSql::COMMA unless i == 0
|
146
146
|
collector = visit order, collector
|
147
147
|
end
|
148
148
|
end
|
149
|
-
if o.
|
149
|
+
if o.separator && o.separator != 'NULL'
|
150
150
|
collector << ' SEPARATOR '
|
151
|
-
collector = visit o.
|
151
|
+
collector = visit o.separator, collector
|
152
152
|
end
|
153
153
|
collector << ")"
|
154
154
|
collector
|
@@ -398,10 +398,34 @@ module ArelExtensions
|
|
398
398
|
collector
|
399
399
|
end
|
400
400
|
|
401
|
+
def visit_Aggregate_For_AggregateFunction o, collector
|
402
|
+
if !(Arel::Table.engine.connection.send(:version) >= (Arel::Table.engine.connection.send(:mariadb?) ? '10.2.3' : '8.0'))
|
403
|
+
warn("Warning : ArelExtensions: Window Functions are not available in the current version on the DBMS.")
|
404
|
+
return collector
|
405
|
+
end
|
406
|
+
|
407
|
+
if o.order || o.group
|
408
|
+
collector << " OVER ("
|
409
|
+
if o.group
|
410
|
+
collector << " PARTITION BY ("
|
411
|
+
visit o.group, collector
|
412
|
+
collector << ")"
|
413
|
+
end
|
414
|
+
if o.order
|
415
|
+
collector << " ORDER BY ("
|
416
|
+
visit o.order, collector
|
417
|
+
collector << ")"
|
418
|
+
end
|
419
|
+
collector << ")"
|
420
|
+
end
|
421
|
+
collector
|
422
|
+
end
|
423
|
+
|
401
424
|
def visit_ArelExtensions_Nodes_Std o, collector
|
402
425
|
collector << (o.unbiased_estimator ? "STDDEV_SAMP(" : "STDDEV_POP(")
|
403
426
|
visit o.left, collector
|
404
427
|
collector << ")"
|
428
|
+
visit_Aggregate_For_AggregateFunction o, collector
|
405
429
|
collector
|
406
430
|
end
|
407
431
|
|
@@ -131,14 +131,14 @@ module ArelExtensions
|
|
131
131
|
collector << "(LISTAGG("
|
132
132
|
collector = visit o.left, collector
|
133
133
|
collector << Arel::Visitors::Oracle::COMMA
|
134
|
-
if o.
|
135
|
-
collector = visit o.
|
134
|
+
if o.separator && o.separator != 'NULL'
|
135
|
+
collector = visit o.separator, collector
|
136
136
|
else
|
137
137
|
collector = visit Arel::Nodes.build_quoted(','), collector
|
138
138
|
end
|
139
139
|
collector << ") WITHIN GROUP (ORDER BY "
|
140
|
-
if !o.
|
141
|
-
o.
|
140
|
+
if !o.order.blank?
|
141
|
+
o.order.each_with_index do |order,i|
|
142
142
|
collector << Arel::Visitors::Oracle::COMMA unless i == 0
|
143
143
|
collector = visit order, collector
|
144
144
|
end
|
@@ -83,20 +83,45 @@ 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
|
-
if o.
|
99
|
-
collector = visit o.
|
123
|
+
if o.separator && o.separator != 'NULL'
|
124
|
+
collector = visit o.separator, collector
|
100
125
|
else
|
101
126
|
collector = visit Arel::Nodes.build_quoted(','), collector
|
102
127
|
end
|
@@ -293,6 +318,7 @@ module ArelExtensions
|
|
293
318
|
collector << "sum("
|
294
319
|
collector = visit o.expr, collector
|
295
320
|
collector << ")"
|
321
|
+
visit_Aggregate_For_AggregateFunction o, collector
|
296
322
|
collector
|
297
323
|
end
|
298
324
|
|
@@ -420,6 +446,7 @@ module ArelExtensions
|
|
420
446
|
collector << (o.unbiased_estimator ? "STDDEV_SAMP(" : "STDDEV_POP(")
|
421
447
|
visit o.left, collector
|
422
448
|
collector << ")"
|
449
|
+
visit_Aggregate_For_AggregateFunction o, collector
|
423
450
|
collector
|
424
451
|
end
|
425
452
|
|
@@ -427,6 +454,7 @@ module ArelExtensions
|
|
427
454
|
collector << (o.unbiased_estimator ? "VAR_SAMP(" : "VAR_POP(")
|
428
455
|
visit o.left, collector
|
429
456
|
collector << ")"
|
457
|
+
visit_Aggregate_For_AggregateFunction o, collector
|
430
458
|
collector
|
431
459
|
end
|
432
460
|
|
@@ -52,14 +52,14 @@ module ArelExtensions
|
|
52
52
|
collector << ")"
|
53
53
|
collector
|
54
54
|
end
|
55
|
-
|
55
|
+
|
56
56
|
def visit_ArelExtensions_Nodes_Log10 o, collector
|
57
57
|
collector << "LOG10("
|
58
58
|
collector = visit o.left, collector
|
59
59
|
collector << ")"
|
60
60
|
collector
|
61
61
|
end
|
62
|
-
|
62
|
+
|
63
63
|
def visit_ArelExtensions_Nodes_Power o, collector
|
64
64
|
collector << "POW("
|
65
65
|
o.expressions.each_with_index { |arg, i|
|
@@ -70,6 +70,13 @@ module ArelExtensions
|
|
70
70
|
collector
|
71
71
|
end
|
72
72
|
|
73
|
+
def visit_ArelExtensions_Nodes_Sum o, collector
|
74
|
+
collector << "SUM("
|
75
|
+
collector = visit o.expr, collector
|
76
|
+
collector << ")"
|
77
|
+
collector
|
78
|
+
end
|
79
|
+
|
73
80
|
# String functions
|
74
81
|
def visit_ArelExtensions_Nodes_Concat o, collector
|
75
82
|
collector << "CONCAT("
|
@@ -84,9 +91,9 @@ module ArelExtensions
|
|
84
91
|
def visit_ArelExtensions_Nodes_GroupConcat o, collector
|
85
92
|
collector << "GROUP_CONCAT("
|
86
93
|
collector = visit o.left, collector
|
87
|
-
if o.
|
94
|
+
if o.separator && o.separator != 'NULL'
|
88
95
|
collector << Arel::Visitors::ToSql::COMMA
|
89
|
-
collector = visit o.
|
96
|
+
collector = visit o.separator, collector
|
90
97
|
end
|
91
98
|
collector << ")"
|
92
99
|
collector
|
@@ -134,7 +141,7 @@ module ArelExtensions
|
|
134
141
|
collector << ")"
|
135
142
|
collector
|
136
143
|
end
|
137
|
-
|
144
|
+
|
138
145
|
def visit_ArelExtensions_Nodes_Repeat o, collector
|
139
146
|
collector << "REPEAT("
|
140
147
|
o.expressions.each_with_index { |arg, i|
|
@@ -269,12 +276,12 @@ module ArelExtensions
|
|
269
276
|
as_attr = Arel::Nodes::SqlLiteral.new('int')
|
270
277
|
when :decimal, :float, :number
|
271
278
|
as_attr = Arel::Nodes::SqlLiteral.new('float')
|
272
|
-
when :datetime
|
279
|
+
when :datetime
|
273
280
|
as_attr = Arel::Nodes::SqlLiteral.new('datetime')
|
274
281
|
when :time
|
275
282
|
as_attr = Arel::Nodes::SqlLiteral.new('time')
|
276
|
-
when :binary
|
277
|
-
as_attr = Arel::Nodes::SqlLiteral.new('binary')
|
283
|
+
when :binary
|
284
|
+
as_attr = Arel::Nodes::SqlLiteral.new('binary')
|
278
285
|
else
|
279
286
|
as_attr = Arel::Nodes::SqlLiteral.new(o.as_attr.to_s)
|
280
287
|
end
|
@@ -305,7 +312,7 @@ module ArelExtensions
|
|
305
312
|
collector << ")"
|
306
313
|
collector
|
307
314
|
end
|
308
|
-
|
315
|
+
|
309
316
|
def visit_ArelExtensions_Nodes_DateSub o, collector
|
310
317
|
collector << "DATE_SUB("
|
311
318
|
collector = visit o.left, collector
|
@@ -384,7 +391,7 @@ module ArelExtensions
|
|
384
391
|
collector = visit o.left, collector
|
385
392
|
collector << ") THEN "
|
386
393
|
collector = visit o.right, collector
|
387
|
-
if o.expressions[2]
|
394
|
+
if o.expressions[2]
|
388
395
|
collector << " ELSE "
|
389
396
|
collector = visit o.expressions[2], collector
|
390
397
|
end
|
@@ -452,7 +459,7 @@ module ArelExtensions
|
|
452
459
|
collector = visit o.right, collector
|
453
460
|
collector
|
454
461
|
end
|
455
|
-
|
462
|
+
|
456
463
|
def visit_ArelExtensions_Nodes_UnionAll o, collector
|
457
464
|
collector = visit o.left, collector
|
458
465
|
collector << " UNION ALL "
|
@@ -489,25 +496,25 @@ module ArelExtensions
|
|
489
496
|
visit Arel::Nodes.build_quoted(o.expr), collector
|
490
497
|
end
|
491
498
|
|
492
|
-
def visit_ArelExtensions_Nodes_FormattedNumber o, collector
|
499
|
+
def visit_ArelExtensions_Nodes_FormattedNumber o, collector
|
493
500
|
visit o.left, collector
|
494
501
|
end
|
495
|
-
|
496
|
-
remove_method(:visit_Arel_Nodes_LessThan) rescue nil
|
502
|
+
|
503
|
+
remove_method(:visit_Arel_Nodes_LessThan) rescue nil
|
497
504
|
def visit_Arel_Nodes_LessThan o, collector
|
498
505
|
collector = visit o.left, collector
|
499
506
|
collector << " < "
|
500
507
|
visit o.right, collector
|
501
508
|
end
|
502
|
-
|
503
|
-
def visit_ArelExtensions_Nodes_Std o, collector
|
509
|
+
|
510
|
+
def visit_ArelExtensions_Nodes_Std o, collector
|
504
511
|
collector << "STD("
|
505
512
|
visit o.left, collector
|
506
513
|
collector << ")"
|
507
514
|
collector
|
508
515
|
end
|
509
|
-
|
510
|
-
def visit_ArelExtensions_Nodes_Variance o, collector
|
516
|
+
|
517
|
+
def visit_ArelExtensions_Nodes_Variance o, collector
|
511
518
|
collector << "VARIANCE("
|
512
519
|
visit o.left, collector
|
513
520
|
collector << ")"
|
@@ -525,40 +532,40 @@ module ArelExtensions
|
|
525
532
|
|
526
533
|
alias_method :old_visit_Arel_Nodes_And, :visit_Arel_Nodes_And
|
527
534
|
def visit_Arel_Nodes_And o, collector
|
535
|
+
collector << '('
|
528
536
|
case o.children.length
|
529
537
|
when 0
|
530
538
|
collector << '1=1' # but this should not happen
|
531
539
|
when 1
|
532
540
|
collector = visit o.children[0], collector
|
533
541
|
else
|
534
|
-
collector << '('
|
535
542
|
o.children.each_with_index { |arg, i|
|
536
543
|
if i != 0
|
537
544
|
collector << ') AND ('
|
538
545
|
end
|
539
546
|
collector = visit arg, collector
|
540
547
|
}
|
541
|
-
collector << ')'
|
542
548
|
end
|
549
|
+
collector << ')'
|
543
550
|
collector
|
544
551
|
end
|
545
552
|
|
546
553
|
def visit_ArelExtensions_Nodes_Or o, collector
|
554
|
+
collector << '('
|
547
555
|
case o.children.length
|
548
556
|
when 0
|
549
557
|
collector << '0=1' # but this should not happen
|
550
558
|
when 1
|
551
559
|
collector = visit o.children[0], collector
|
552
560
|
else
|
553
|
-
collector << '('
|
554
561
|
o.children.each_with_index { |arg, i|
|
555
562
|
if i != 0
|
556
563
|
collector << ') OR ('
|
557
564
|
end
|
558
565
|
collector = visit arg, collector
|
559
566
|
}
|
560
|
-
collector << ')'
|
561
567
|
end
|
568
|
+
collector << ')'
|
562
569
|
collector
|
563
570
|
end
|
564
571
|
|
data/test/helper.rb
CHANGED
data/test/real_db_test.rb
CHANGED
data/test/test_comparators.rb
CHANGED
@@ -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
|
@@ -50,6 +50,7 @@ module ArelExtensions
|
|
50
50
|
compile((c >= 'test').as('new_name')).must_be_like %{("users"."name" >= 'test') AS new_name}
|
51
51
|
compile(c <= @table[:comments]).must_be_like %{"users"."name" <= "users"."comments"}
|
52
52
|
compile(c =~ /\Atest\Z/).must_be_like %{REGEXP_LIKE("users"."name", '^test$')}
|
53
|
+
compile(c =~ /\Atest\z/).must_be_like %{REGEXP_LIKE("users"."name", '^test$')}
|
53
54
|
compile(c =~ '^test$').must_be_like %{REGEXP_LIKE("users"."name", '^test$')}
|
54
55
|
compile(c !~ /\Ate\Dst\Z/).must_be_like %{NOT REGEXP_LIKE("users"."name", '^te[^0-9]st$')}
|
55
56
|
compile(c.imatches('%test%')).must_be_like %{LOWER("users"."name") LIKE LOWER('%test%')}
|
@@ -88,6 +88,7 @@ module ArelExtensions
|
|
88
88
|
compile((c >= 'test').as('new_name')).must_be_like %{("users"."name" >= 'test') AS new_name}
|
89
89
|
compile(c <= @table[:comments]).must_be_like %{"users"."name" <= "users"."comments"}
|
90
90
|
compile(c =~ /\Atest\Z/).must_be_like %{"users"."name" REGEXP '^test$'}
|
91
|
+
compile(c =~ /\Atest\z/).must_be_like %{"users"."name" REGEXP '^test$'}
|
91
92
|
compile(c !~ /\Ate\Dst\Z/).must_be_like %{"users"."name" NOT REGEXP '^te[^0-9]st$'}
|
92
93
|
compile(c.imatches('%test%')).must_be_like %{"users"."name" ILIKE '%test%'}
|
93
94
|
compile(c.imatches_any(['%test%', 't2'])).must_be_like %{(("users"."name" ILIKE '%test%') OR ("users"."name" ILIKE 't2'))}
|
@@ -120,6 +121,11 @@ module ArelExtensions
|
|
120
121
|
compile(@table[:id] < 42).must_match %{"users"."id" < 42}
|
121
122
|
compile(@table[:id] <= 42).must_match %{"users"."id" <= 42}
|
122
123
|
compile((@table[:id] <= 42).as('new_name')).must_match %{("users"."id" <= 42) AS new_name}
|
124
|
+
puts @table[:id].count.class
|
125
|
+
compile(@table[:id].count.eq 42).must_match %{COUNT("users"."id") = 42}
|
126
|
+
#compile(@table[:id].count == 42).must_match %{COUNT("users"."id") = 42} # TODO
|
127
|
+
#compile(@table[:id].count != 42).must_match %{COUNT("users"."id") != 42}
|
128
|
+
#compile(@table[:id].count >= 42).must_match %{COUNT("users"."id") >= 42}
|
123
129
|
end
|
124
130
|
|
125
131
|
it "should accept comparators on dates" do
|
@@ -154,7 +154,7 @@ module ArelExtensions
|
|
154
154
|
else
|
155
155
|
assert_equal 68, User.select((@age.sum + 1).as("res")).take(50).first.res
|
156
156
|
assert_equal 134, User.select((@age.sum + @age.sum).as("res")).take(50).first.res
|
157
|
-
assert_equal 201, User.select((
|
157
|
+
assert_equal 201, User.select((@age * 3).sum.as("res")).take(50).first.res
|
158
158
|
assert_equal 4009, User.select(((@age * @age).sum).as("res")).take(50).first.res
|
159
159
|
end
|
160
160
|
end
|
@@ -175,6 +175,7 @@ module ArelExtensions
|
|
175
175
|
assert_equal "Sophie,Lucas,Arthur", t(User.where(:name => ['Lucas', 'Sophie','Arthur']), @name.group_concat(',',@name.desc))
|
176
176
|
assert_equal "Lucas,Sophie,Arthur", t(User.where(:name => ['Lucas', 'Sophie','Arthur']), @name.group_concat(',',[@score.asc,@name.asc]))
|
177
177
|
assert_equal "Lucas,Sophie,Arthur", t(User.where(:name => ['Lucas', 'Sophie','Arthur']), @name.group_concat(',',@score.asc,@name.asc))
|
178
|
+
assert_equal "Lucas,Sophie,Arthur", t(User.where(:name => ['Lucas', 'Sophie','Arthur']), @name.group_concat(',',order: [@score.asc,@name.asc]))
|
178
179
|
end
|
179
180
|
|
180
181
|
def test_length
|
@@ -733,9 +734,14 @@ module ArelExtensions
|
|
733
734
|
|
734
735
|
assert ( 15.98625 - t(User.where(nil), @score.average)).abs < 0.01
|
735
736
|
assert (613.75488 - t(User.where(nil), @score.variance)).abs < 0.01
|
736
|
-
assert ( 537.0355 - t(User.where(nil), @score.variance(false))).abs < 0.01
|
737
|
+
assert ( 537.0355 - t(User.where(nil), @score.variance(unbiased: false))).abs < 0.01
|
737
738
|
assert ( 24.77408 - t(User.where(nil), @score.std)).abs < 0.01
|
738
|
-
assert ( 23.17403 - t(User.where(nil), @score.std(false))).abs < 0.01
|
739
|
+
assert ( 23.17403 - t(User.where(nil), @score.std(unbiased: false))).abs < 0.01
|
740
|
+
skip "Not Yet Implemented" if !['postgresql'].include?(@env_db)
|
741
|
+
assert_equal 2, User.select(@score.std(group: Arel.when(@name > "M").then(0).else(1)).as('res')).map(&:res).uniq.length
|
742
|
+
assert_equal 2, User.select(@score.variance(group: Arel.when(@name > "M").then(0).else(1)).as('res')).map(&:res).uniq.length
|
743
|
+
assert_equal 2, User.select(@score.sum(group: Arel.when(@name > "M").then(0).else(1)).as('res')).map(&:res).uniq.length
|
744
|
+
assert_equal 2, User.select(@comments.group_concat(group: Arel.when(@name > "M").then(0).else(1)).as('res')).map(&:res).uniq.length
|
739
745
|
end
|
740
746
|
|
741
747
|
def test_levenshtein_distance
|
@@ -791,6 +797,11 @@ module ArelExtensions
|
|
791
797
|
assert_equal 'ArthurArthur', @arthur.select((@name+@name).as('Na-Me')).first.attributes["Na-Me"]
|
792
798
|
end
|
793
799
|
|
800
|
+
def test_exists_in_subquery
|
801
|
+
assert User.where(User.where(nil).exists).first
|
802
|
+
end
|
803
|
+
|
804
|
+
|
794
805
|
end
|
795
806
|
end
|
796
807
|
end
|