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. |