From: <ric...@us...> - 2009-11-23 17:38:18
|
Revision: 4855 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4855&view=rev Author: ricbrown Date: 2009-11-23 17:38:07 +0000 (Mon, 23 Nov 2009) Log Message: ----------- Added first cut of projections using Lambda expressions. Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Criterion/ProjectionList.cs trunk/nhibernate/src/NHibernate/Criterion/Projections.cs trunk/nhibernate/src/NHibernate/NHibernate.csproj trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate/Criterion/ProjectionsExtensions.cs trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/ProjectionsFixture.cs Modified: trunk/nhibernate/src/NHibernate/Criterion/ProjectionList.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Criterion/ProjectionList.cs 2009-11-22 15:34:59 UTC (rev 4854) +++ trunk/nhibernate/src/NHibernate/Criterion/ProjectionList.cs 2009-11-23 17:38:07 UTC (rev 4855) @@ -1,7 +1,9 @@ using System; +using System.Collections.Generic; +using System.Linq.Expressions; +using NHibernate.Impl; using NHibernate.SqlCommand; using NHibernate.Type; -using System.Collections.Generic; namespace NHibernate.Criterion { @@ -32,6 +34,11 @@ return Add(Projections.Alias(projection, alias)); } + public ProjectionList Add<T>(IProjection projection, Expression<Func<T>> alias) + { + return Add(projection, ExpressionProcessor.FindMemberExpression(alias.Body)); + } + public IType[] GetTypes(ICriteria criteria, ICriteriaQuery criteriaQuery) { IList<IType> types = new List<IType>(Length); Modified: trunk/nhibernate/src/NHibernate/Criterion/Projections.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Criterion/Projections.cs 2009-11-22 15:34:59 UTC (rev 4854) +++ trunk/nhibernate/src/NHibernate/Criterion/Projections.cs 2009-11-23 17:38:07 UTC (rev 4855) @@ -1,4 +1,6 @@ using System; +using System.Linq.Expressions; +using NHibernate.Impl; using NHibernate.Type; namespace NHibernate.Criterion @@ -316,5 +318,138 @@ SelectSubqueryExpression expr = new SelectSubqueryExpression(detachedCriteria); return new SubqueryProjection(expr); } + + /// <summary> + /// A property average value + /// </summary> + public static AggregateProjection Avg<T>(Expression<Func<T, object>> expression) + { + return Projections.Avg(ExpressionProcessor.FindMemberExpression(expression.Body)); + } + + /// <summary> + /// A property average value + /// </summary> + public static AggregateProjection Avg(Expression<Func<object>> expression) + { + return Projections.Avg(ExpressionProcessor.FindMemberExpression(expression.Body)); + } + + /// <summary> + /// A property value count + /// </summary> + public static CountProjection Count<T>(Expression<Func<T, object>> expression) + { + return Projections.Count(ExpressionProcessor.FindMemberExpression(expression.Body)); + } + + /// <summary> + /// A property value count + /// </summary> + public static CountProjection Count(Expression<Func<object>> expression) + { + return Projections.Count(ExpressionProcessor.FindMemberExpression(expression.Body)); + } + + /// <summary> + /// A distinct property value count + /// </summary> + public static CountProjection CountDistinct<T>(Expression<Func<T, object>> expression) + { + return Projections.CountDistinct(ExpressionProcessor.FindMemberExpression(expression.Body)); + } + + /// <summary> + /// A distinct property value count + /// </summary> + public static CountProjection CountDistinct(Expression<Func<object>> expression) + { + return Projections.CountDistinct(ExpressionProcessor.FindMemberExpression(expression.Body)); + } + + /// <summary> + /// A grouping property value + /// </summary> + public static PropertyProjection GroupProperty<T>(Expression<Func<T, object>> expression) + { + return Projections.GroupProperty(ExpressionProcessor.FindMemberExpression(expression.Body)); + } + + /// <summary> + /// A grouping property value + /// </summary> + public static PropertyProjection GroupProperty(Expression<Func<object>> expression) + { + return Projections.GroupProperty(ExpressionProcessor.FindMemberExpression(expression.Body)); + } + + /// <summary> + /// A property maximum value + /// </summary> + public static AggregateProjection Max<T>(Expression<Func<T, object>> expression) + { + return Projections.Max(ExpressionProcessor.FindMemberExpression(expression.Body)); + } + + /// <summary> + /// A property maximum value + /// </summary> + public static AggregateProjection Max(Expression<Func<object>> expression) + { + return Projections.Max(ExpressionProcessor.FindMemberExpression(expression.Body)); + } + + /// <summary> + /// A property minimum value + /// </summary> + public static AggregateProjection Min<T>(Expression<Func<T, object>> expression) + { + return Projections.Min(ExpressionProcessor.FindMemberExpression(expression.Body)); + } + + /// <summary> + /// A property minimum value + /// </summary> + public static AggregateProjection Min(Expression<Func<object>> expression) + { + return Projections.Min(ExpressionProcessor.FindMemberExpression(expression.Body)); + } + + /// <summary> + /// A projected property value + /// </summary> + public static PropertyProjection Property<T>(Expression<Func<T, object>> expression) + { + return Projections.Property(ExpressionProcessor.FindMemberExpression(expression.Body)); + } + + /// <summary> + /// A projected property value + /// </summary> + public static PropertyProjection Property(Expression<Func<object>> expression) + { + return Projections.Property(ExpressionProcessor.FindMemberExpression(expression.Body)); + } + + public static IProjection SubQuery<T>(QueryOver<T> detachedQueryOver) + { + return Projections.SubQuery(detachedQueryOver.DetachedCriteria); + } + + /// <summary> + /// A property value sum + /// </summary> + public static AggregateProjection Sum<T>(Expression<Func<T, object>> expression) + { + return Projections.Sum(ExpressionProcessor.FindMemberExpression(expression.Body)); + } + + /// <summary> + /// A property value sum + /// </summary> + public static AggregateProjection Sum(Expression<Func<object>> expression) + { + return Projections.Sum(ExpressionProcessor.FindMemberExpression(expression.Body)); + } } } Added: trunk/nhibernate/src/NHibernate/Criterion/ProjectionsExtensions.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Criterion/ProjectionsExtensions.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Criterion/ProjectionsExtensions.cs 2009-11-23 17:38:07 UTC (rev 4855) @@ -0,0 +1,23 @@ +using System; +using System.Linq.Expressions; + +using NHibernate.Impl; + +namespace NHibernate.Criterion +{ + public static class ProjectionsExtensions + { + /// <summary> + /// Create an alias for a projection + /// </summary> + /// <param name="projection">the projection instance</param> + /// <param name="alias">LambdaExpression returning an alias</param> + /// <returns>return NHibernate.Criterion.IProjection</returns> + public static IProjection WithAlias(this IProjection projection, + Expression<Func<object>> alias) + { + string aliasContainer = ExpressionProcessor.FindMemberExpression(alias.Body); + return Projections.Alias(projection, aliasContainer); + } + } +} Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj =================================================================== --- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2009-11-22 15:34:59 UTC (rev 4854) +++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2009-11-23 17:38:07 UTC (rev 4855) @@ -515,6 +515,7 @@ <Compile Include="Criterion\Lambda\QueryOverRestrictionBuilder.cs" /> <Compile Include="Criterion\Lambda\QueryOverSubqueryBuilder.cs" /> <Compile Include="Criterion\Lambda\QueryOverSubqueryPropertyBuilder.cs" /> + <Compile Include="Criterion\ProjectionsExtensions.cs" /> <Compile Include="Dialect\MsSql2008Dialect.cs" /> <Compile Include="Dialect\InformixDialect0940.cs" /> <Compile Include="Dialect\InformixDialect1000.cs" /> Added: trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/ProjectionsFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/ProjectionsFixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/ProjectionsFixture.cs 2009-11-23 17:38:07 UTC (rev 4855) @@ -0,0 +1,90 @@ +using System; +using System.Collections; + +using NUnit.Framework; + +using NHibernate.Criterion; + +namespace NHibernate.Test.Criteria.Lambda +{ + + [TestFixture] + public class ProjectionsFixture : LambdaFixtureBase + { + + private Child _subqueryChildAlias = null; + + private DetachedCriteria DetachedCriteriaAge + { + get + { + return ToDetachedCriteria(DetachedQueryOverAge); + } + } + + private QueryOver<Child> DetachedQueryOverAge + { + get + { + return + new QueryOver<Child>(() => _subqueryChildAlias) + .Where(() => _subqueryChildAlias.Nickname == "subquery name") + .Select(p => p.Age); + } + } + + [Test] + public void ArbitraryProjections() + { + ICriteria expected = + CreateTestCriteria(typeof(Person), "personAlias") + .SetProjection(Projections.ProjectionList() + .Add(Projections.Alias(Projections.Avg("Age"), "personAgeProjectionAlias")) + .Add(Projections.Avg("Age"), "personAgeProjectionAlias") + .Add(Projections.Avg("personAlias.Age")) + .Add(Projections.Count("Age")) + .Add(Projections.Count("personAlias.Age")) + .Add(Projections.CountDistinct("Age")) + .Add(Projections.CountDistinct("personAlias.Age")) + .Add(Projections.GroupProperty("Age")) + .Add(Projections.GroupProperty("personAlias.Age")) + .Add(Projections.Max("Age")) + .Add(Projections.Max("personAlias.Age")) + .Add(Projections.Min("Age")) + .Add(Projections.Min("personAlias.Age")) + .Add(Projections.Property("Age")) + .Add(Projections.Property("personAlias.Age")) + .Add(Projections.SubQuery(DetachedCriteriaAge)) + .Add(Projections.Sum("Age")) + .Add(Projections.Sum("personAlias.Age"))); + + Person personAlias = null; + Person personAgeProjectionAlias = null; + var actual = + CreateTestQueryOver<Person>(() => personAlias) + .Select(Projections.ProjectionList() + .Add(Projections.Avg<Person>(p => p.Age).WithAlias(() => personAgeProjectionAlias)) + .Add(Projections.Avg<Person>(p => p.Age), () => personAgeProjectionAlias) + .Add(Projections.Avg(() => personAlias.Age)) + .Add(Projections.Count<Person>(p => p.Age)) + .Add(Projections.Count(() => personAlias.Age)) + .Add(Projections.CountDistinct<Person>(p => p.Age)) + .Add(Projections.CountDistinct(() => personAlias.Age)) + .Add(Projections.GroupProperty<Person>(p => p.Age)) + .Add(Projections.GroupProperty(() => personAlias.Age)) + .Add(Projections.Max<Person>(p => p.Age)) + .Add(Projections.Max(() => personAlias.Age)) + .Add(Projections.Min<Person>(p => p.Age)) + .Add(Projections.Min(() => personAlias.Age)) + .Add(Projections.Property<Person>(p => p.Age)) + .Add(Projections.Property(() => personAlias.Age)) + .Add(Projections.SubQuery(DetachedQueryOverAge)) + .Add(Projections.Sum<Person>(p => p.Age)) + .Add(Projections.Sum(() => personAlias.Age))); + + AssertCriteriaAreEqual(expected, actual); + } + + } + +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-11-22 15:34:59 UTC (rev 4854) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-11-23 17:38:07 UTC (rev 4855) @@ -160,6 +160,7 @@ <Compile Include="Criteria\Enrolment.cs" /> <Compile Include="Criteria\Lambda\CriteriaAssertFixture.cs" /> <Compile Include="Criteria\Lambda\ExpressionProcessorFixture.cs" /> + <Compile Include="Criteria\Lambda\ProjectionsFixture.cs" /> <Compile Include="Criteria\Lambda\QueryOverFixture.cs" /> <Compile Include="Criteria\Lambda\IntegrationFixture.cs" /> <Compile Include="Criteria\Lambda\LambdaFixtureBase.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |