public void TestReturnedOperations() { ProjectionExitOperationFactory factory = ProjectionExitOperationFactory.GetFactory(); var sessionFactory = Mock <ISessionFactoryImplementor>(); using (Mocks.Record()) { } using (Mocks.Playback()) { Assert.IsInstanceOf(typeof(RowCountExitOperation), factory.GetProjectionExitOperation(Projections.RowCount(), sessionFactory)); Assert.IsInstanceOf(typeof(AggregateExitOperation), factory.GetProjectionExitOperation(Projections.Max("foo"), sessionFactory)); Assert.IsInstanceOf(typeof(AggregateExitOperation), factory.GetProjectionExitOperation(Projections.Min("foo"), sessionFactory)); Assert.IsInstanceOf(typeof(AggregateExitOperation), factory.GetProjectionExitOperation(Projections.Sum("foo"), sessionFactory)); try { factory.GetProjectionExitOperation(Projections.Avg("foo"), sessionFactory); Assert.Fail("example of one that we don't yet support"); } catch (ArgumentException e) { // good } } }
public IList Apply(IList result) { /** * Herein lies the glory * * hibernate has done as much as it can, we're going to have to deal with * the rest in memory. * * The heirarchy of operations is this so far: * Distinct * Order * FirstResult * MaxResult * RowCount * Average * Min/Max/Sum */ // ordering of the following operations *really* matters! if (distinct != null) { result = new DistinctExitOperation(distinct).Apply(result); } foreach (Order order in orders) { result = new OrderExitOperation(order).Apply(result); } if (firstResult != null) { result = new FirstResultExitOperation((int)firstResult).Apply(result); } if (maxResults != null) { result = new MaxResultsExitOperation((int)maxResults).Apply(result); } ProjectionExitOperationFactory factory = ProjectionExitOperationFactory.GetFactory(); if (rowCountProjection != null) { result = factory.GetProjectionExitOperation(rowCountProjection, sessionFactoryImplementor).Apply(result); } if (avgProjection != null) { result = new AvgResultsExitOperation().Apply(result); } // min, max, sum if (aggregateProjection != null) { result = factory.GetProjectionExitOperation(aggregateProjection, sessionFactoryImplementor).Apply(result); } return(result); }