|
From: <pa...@us...> - 2011-06-28 05:47:15
|
Revision: 5973
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5973&view=rev
Author: patearl
Date: 2011-06-28 05:47:09 +0000 (Tue, 28 Jun 2011)
Log Message:
-----------
Linq: Support basic non-aggregating group-by.
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/Linq/GroupBy/NonAggregatingGroupByRewriter.cs
trunk/nhibernate/src/NHibernate.Test/Linq/ByMethod/GroupByTests.cs
Modified: trunk/nhibernate/src/NHibernate/Linq/GroupBy/NonAggregatingGroupByRewriter.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Linq/GroupBy/NonAggregatingGroupByRewriter.cs 2011-06-27 04:19:03 UTC (rev 5972)
+++ trunk/nhibernate/src/NHibernate/Linq/GroupBy/NonAggregatingGroupByRewriter.cs 2011-06-28 05:47:09 UTC (rev 5973)
@@ -18,6 +18,17 @@
public static void ReWrite(QueryModel queryModel)
{
+ if (queryModel.ResultOperators.Count == 1 &&
+ queryModel.ResultOperators[0] is GroupResultOperator &&
+ IsNonAggregatingGroupBy(queryModel))
+ {
+ GroupResultOperator resultOperator = (GroupResultOperator)queryModel.ResultOperators[0];
+ queryModel.ResultOperators.Clear();
+ queryModel.ResultOperators.Add(new NonAggregatingGroupBy(resultOperator));
+
+ return;
+ }
+
var subQueryExpression = queryModel.MainFromClause.FromExpression as SubQueryExpression;
if ((subQueryExpression != null) &&
Modified: trunk/nhibernate/src/NHibernate.Test/Linq/ByMethod/GroupByTests.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/Linq/ByMethod/GroupByTests.cs 2011-06-27 04:19:03 UTC (rev 5972)
+++ trunk/nhibernate/src/NHibernate.Test/Linq/ByMethod/GroupByTests.cs 2011-06-28 05:47:09 UTC (rev 5973)
@@ -28,20 +28,20 @@
}
[Test]
- [Ignore("Not working yet.")]
public void SingleKeyGrouping()
{
var orders = db.Orders.GroupBy(o => o.Customer).ToList();
- Assert.That(orders.Count, Is.EqualTo(830));
+ Assert.That(orders.Count(), Is.EqualTo(89));
+ Assert.That(orders.Sum(o => o.Count()), Is.EqualTo(830));
CheckGrouping(orders, o => o.Customer);
}
[Test]
- [Ignore("Not working yet.")]
public void MultipleKeyGrouping()
{
var orders = db.Orders.GroupBy(o => new { o.Customer, o.Employee }).ToList();
- Assert.That(orders.Count, Is.EqualTo(830));
+ Assert.That(orders.Count(), Is.EqualTo(464));
+ Assert.That(orders.Sum(o => o.Count()), Is.EqualTo(830));
CheckGrouping(
orders.Select(g => new TupGrouping<Customer, Employee, Order>(g.Key.Customer, g.Key.Employee, g)),
@@ -69,10 +69,8 @@
HashSet<object> used = new HashSet<object>();
foreach (IGrouping<Tup<TKey1, TKey2>, TElement> group in groupedItems)
{
- Assert.IsFalse(used.Contains(group.Key.Item1));
- used.Add(group.Key.Item1);
- Assert.IsFalse(used.Contains(group.Key.Item2));
- used.Add(group.Key.Item2);
+ Assert.IsFalse(used.Contains(group.Key));
+ used.Add(group.Key);
foreach (var item in group)
{
@@ -115,6 +113,24 @@
Item1 = item1;
Item2 = item2;
}
+
+ public override bool Equals(object obj)
+ {
+ if (obj == null)
+ return false;
+
+ if (obj.GetType() != GetType())
+ return false;
+
+ Tup<T1, T2> other = (Tup<T1, T2>) obj;
+
+ return Equals(Item1, other.Item1) && Equals(Item2, other.Item2);
+ }
+
+ public override int GetHashCode()
+ {
+ return Item1.GetHashCode() ^ Item2.GetHashCode();
+ }
}
}
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|