From 28c73f012328c8386acfc608f0dfb1a459dbf170 Mon Sep 17 00:00:00 2001
From: John Mileham <jmileham@gmail.com>
Date: Thu, 24 Mar 2011 15:09:24 -0400
Subject: Use Arel to build subquery.  Adapt tests to changed fixtures.

---
 .../lib/active_record/relation/calculations.rb     | 25 +++++++++++-----------
 activerecord/test/cases/relations_test.rb          |  6 +++---
 2 files changed, 15 insertions(+), 16 deletions(-)

(limited to 'activerecord')

diff --git a/activerecord/lib/active_record/relation/calculations.rb b/activerecord/lib/active_record/relation/calculations.rb
index 7bfeb20a2b..869eebfa34 100644
--- a/activerecord/lib/active_record/relation/calculations.rb
+++ b/activerecord/lib/active_record/relation/calculations.rb
@@ -183,13 +183,10 @@ module ActiveRecord
       end
     end
 
-    def aggregate_column(column_name, subquery_alias = nil)
+    def aggregate_column(column_name)
       if @klass.column_names.include?(column_name.to_s)
-        Arel::Attribute.new(subquery_alias || @klass.unscoped.table, column_name)
+        Arel::Attribute.new(@klass.unscoped.table, column_name)
       else
-        if subquery_alias && (split_name = column_name.to_s.split(".")).length > 1
-          column_name = split_name.last
-        end
         Arel.sql(column_name == :all ? "*" : column_name.to_s)
       end
     end
@@ -315,14 +312,16 @@ module ActiveRecord
     end
 
     def build_count_subquery(relation, column_name, distinct)
-      # Arel doesn't do subqueries
-      subquery_alias = arel_table.alias("subquery_for_count")
-      aliased_column = aggregate_column(column_name, subquery_alias)
-      select_value = operation_over_aggregate_column(aliased_column, 'count', distinct)
-
-      relation.select_values = [(column_name == :all ? 1 : aggregate_column(column_name))]
-      subquery_sql = "(#{relation.arel.to_sql}) #{subquery_alias.name}"
-      subquery_alias.relation.select_manager.project(select_value).from(subquery_sql)
+      column_alias = Arel.sql('count_column')
+      subquery_alias = Arel.sql('subquery_for_count')
+
+      aliased_column = aggregate_column(column_name == :all ? 1 : column_name).as(column_alias)
+      relation.select_values = [aliased_column]
+      subquery = relation.arel.as(subquery_alias)
+
+      sm = Arel::SelectManager.new relation.engine
+      select_value = operation_over_aggregate_column(column_alias, 'count', distinct)
+      sm.project(select_value).from(subquery)
     end
   end
 end
diff --git a/activerecord/test/cases/relations_test.rb b/activerecord/test/cases/relations_test.rb
index dad6665990..dfb5735b5d 100644
--- a/activerecord/test/cases/relations_test.rb
+++ b/activerecord/test/cases/relations_test.rb
@@ -667,14 +667,14 @@ class RelationTest < ActiveRecord::TestCase
   end
 
   def test_size_with_limit
-    posts = Post.limit(6)
+    posts = Post.limit(10)
 
-    assert_queries(1) { assert_equal 6, posts.size }
+    assert_queries(1) { assert_equal 10, posts.size }
     assert ! posts.loaded?
 
     best_posts = posts.where(:comments_count => 0)
     best_posts.to_a # force load
-    assert_no_queries { assert_equal 5, best_posts.size }
+    assert_no_queries { assert_equal 9, best_posts.size }
   end
 
   def test_size_with_zero_limit
-- 
cgit v1.2.3