From: <ric...@us...> - 2011-05-22 14:22:28
|
Revision: 5853 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5853&view=rev Author: ricbrown Date: 2011-05-22 14:22:22 +0000 (Sun, 22 May 2011) Log Message: ----------- NH-2683: Added projection of SQL function extensions in QueryOver. Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Criterion/Lambda/QueryOverProjectionBuilder.cs trunk/nhibernate/src/NHibernate/Criterion/ProjectionsExtensions.cs trunk/nhibernate/src/NHibernate/Criterion/QueryOver.cs trunk/nhibernate/src/NHibernate/Impl/ExpressionProcessor.cs trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/IntegrationFixture.cs trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/ProjectionsFixture.cs trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/RestrictionsFixture.cs Modified: trunk/nhibernate/src/NHibernate/Criterion/Lambda/QueryOverProjectionBuilder.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Criterion/Lambda/QueryOverProjectionBuilder.cs 2011-05-22 13:28:51 UTC (rev 5852) +++ trunk/nhibernate/src/NHibernate/Criterion/Lambda/QueryOverProjectionBuilder.cs 2011-05-22 14:22:22 UTC (rev 5853) @@ -173,7 +173,7 @@ /// </summary> public QueryOverProjectionBuilder<T> Select(Expression<Func<T, object>> expression) { - PushProjection(Projections.Property(expression)); + PushProjection(ExpressionProcessor.FindMemberProjection(expression.Body)); return this; } @@ -182,7 +182,7 @@ /// </summary> public QueryOverProjectionBuilder<T> Select(Expression<Func<object>> expression) { - PushProjection(Projections.Property(expression)); + PushProjection(ExpressionProcessor.FindMemberProjection(expression.Body)); return this; } Modified: trunk/nhibernate/src/NHibernate/Criterion/ProjectionsExtensions.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Criterion/ProjectionsExtensions.cs 2011-05-22 13:28:51 UTC (rev 5852) +++ trunk/nhibernate/src/NHibernate/Criterion/ProjectionsExtensions.cs 2011-05-22 14:22:22 UTC (rev 5853) @@ -32,7 +32,7 @@ internal static IProjection ProcessYearPart(MethodCallExpression methodCallExpression) { IProjection property = ExpressionProcessor.FindMemberProjection(methodCallExpression.Arguments[0]); - return Projections.SqlFunction("year", NHibernateUtil.DateTime, property); + return Projections.SqlFunction("year", NHibernateUtil.Int32, property); } /// <summary> @@ -47,7 +47,7 @@ internal static IProjection ProcessDayPart(MethodCallExpression methodCallExpression) { IProjection property = ExpressionProcessor.FindMemberProjection(methodCallExpression.Arguments[0]); - return Projections.SqlFunction("day", NHibernateUtil.DateTime, property); + return Projections.SqlFunction("day", NHibernateUtil.Int32, property); } /// <summary> @@ -62,7 +62,7 @@ internal static IProjection ProcessMonthPart(MethodCallExpression methodCallExpression) { IProjection property = ExpressionProcessor.FindMemberProjection(methodCallExpression.Arguments[0]); - return Projections.SqlFunction("month", NHibernateUtil.DateTime, property); + return Projections.SqlFunction("month", NHibernateUtil.Int32, property); } /// <summary> @@ -77,7 +77,7 @@ internal static IProjection ProcessHourPart(MethodCallExpression methodCallExpression) { IProjection property = ExpressionProcessor.FindMemberProjection(methodCallExpression.Arguments[0]); - return Projections.SqlFunction("hour", NHibernateUtil.DateTime, property); + return Projections.SqlFunction("hour", NHibernateUtil.Int32, property); } /// <summary> @@ -92,7 +92,7 @@ internal static IProjection ProcessMinutePart(MethodCallExpression methodCallExpression) { IProjection property = ExpressionProcessor.FindMemberProjection(methodCallExpression.Arguments[0]); - return Projections.SqlFunction("minute", NHibernateUtil.DateTime, property); + return Projections.SqlFunction("minute", NHibernateUtil.Int32, property); } /// <summary> @@ -107,7 +107,7 @@ internal static IProjection ProcessSecondPart(MethodCallExpression methodCallExpression) { IProjection property = ExpressionProcessor.FindMemberProjection(methodCallExpression.Arguments[0]); - return Projections.SqlFunction("second", NHibernateUtil.DateTime, property); + return Projections.SqlFunction("second", NHibernateUtil.Int32, property); } /// <summary> Modified: trunk/nhibernate/src/NHibernate/Criterion/QueryOver.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Criterion/QueryOver.cs 2011-05-22 13:28:51 UTC (rev 5852) +++ trunk/nhibernate/src/NHibernate/Criterion/QueryOver.cs 2011-05-22 14:22:22 UTC (rev 5853) @@ -392,7 +392,7 @@ List<IProjection> projectionList = new List<IProjection>(); foreach (var projection in projections) - projectionList.Add(Projections.Property(ExpressionProcessor.FindMemberExpression(projection.Body))); + projectionList.Add(ExpressionProcessor.FindMemberProjection(projection.Body)); criteria.SetProjection(projectionList.ToArray()); return this; Modified: trunk/nhibernate/src/NHibernate/Impl/ExpressionProcessor.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/ExpressionProcessor.cs 2011-05-22 13:28:51 UTC (rev 5852) +++ trunk/nhibernate/src/NHibernate/Impl/ExpressionProcessor.cs 2011-05-22 14:22:22 UTC (rev 5853) @@ -163,6 +163,16 @@ /// </summary> public static IProjection FindMemberProjection(Expression expression) { + if (expression is UnaryExpression) + { + UnaryExpression unaryExpression = (UnaryExpression)expression; + + if (unaryExpression.NodeType != ExpressionType.Convert) + throw new Exception("Cannot interpret member from " + expression.ToString()); + + return FindMemberProjection(unaryExpression.Operand); + } + if (expression is MethodCallExpression) { MethodCallExpression methodCallExpression = (MethodCallExpression)expression; Modified: trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/IntegrationFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/IntegrationFixture.cs 2011-05-22 13:28:51 UTC (rev 5852) +++ trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/IntegrationFixture.cs 2011-05-22 14:22:22 UTC (rev 5853) @@ -591,6 +591,17 @@ persons[0].Name.Should().Be("p2"); } + using (ISession s = OpenSession()) + { + var yearOfBirth = + s.QueryOver<Person>() + .Where(p => p.Name == "p2") + .Select(p => p.BirthDate.YearPart()) + .SingleOrDefault<object>(); + + yearOfBirth.GetType().Should().Be(typeof(int)); + yearOfBirth.Should().Be(2008); + } } [Test] Modified: trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/ProjectionsFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/ProjectionsFixture.cs 2011-05-22 13:28:51 UTC (rev 5852) +++ trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/ProjectionsFixture.cs 2011-05-22 14:22:22 UTC (rev 5853) @@ -137,6 +137,39 @@ AssertCriteriaAreEqual(expected, actual); } + [Test] + public void SelectSingleFunction() + { + ICriteria expected = + CreateTestCriteria(typeof(Person)) + .SetProjection(Projections.SqlFunction("year", NHibernateUtil.Int32, Projections.Property("BirthDate"))); + + var actual = + CreateTestQueryOver<Person>() + .Select(p => p.BirthDate.YearPart()); + + AssertCriteriaAreEqual(expected, actual); + } + + [Test] + public void SelectMultipleFunction() + { + ICriteria expected = + CreateTestCriteria(typeof(Person), "personAlias") + .SetProjection(Projections.ProjectionList() + .Add(Projections.SqlFunction("year", NHibernateUtil.Int32, Projections.Property("BirthDate"))) + .Add(Projections.SqlFunction("month", NHibernateUtil.Int32, Projections.Property("personAlias.BirthDate")))); + + Person personAlias = null; + var actual = + CreateTestQueryOver<Person>(() => personAlias) + .SelectList(list => list + .Select(p => p.BirthDate.YearPart()) + .Select(() => personAlias.BirthDate.MonthPart())); + + AssertCriteriaAreEqual(expected, actual); + } + } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/RestrictionsFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/RestrictionsFixture.cs 2011-05-22 13:28:51 UTC (rev 5852) +++ trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/RestrictionsFixture.cs 2011-05-22 14:22:22 UTC (rev 5853) @@ -260,12 +260,12 @@ { ICriteria expected = CreateTestCriteria(typeof(Person)) - .Add(Restrictions.Eq(Projections.SqlFunction("year", NHibernateUtil.DateTime, Projections.Property("BirthDate")), 1970)) - .Add(Restrictions.Eq(Projections.SqlFunction("day", NHibernateUtil.DateTime, Projections.Property("BirthDate")), 1)) - .Add(Restrictions.Eq(Projections.SqlFunction("month", NHibernateUtil.DateTime, Projections.Property("BirthDate")), 1)) - .Add(Restrictions.Eq(Projections.SqlFunction("hour", NHibernateUtil.DateTime, Projections.Property("BirthDate")), 1)) - .Add(Restrictions.Eq(Projections.SqlFunction("minute", NHibernateUtil.DateTime, Projections.Property("BirthDate")), 1)) - .Add(Restrictions.Eq(Projections.SqlFunction("second", NHibernateUtil.DateTime, Projections.Property("BirthDate")), 1)) + .Add(Restrictions.Eq(Projections.SqlFunction("year", NHibernateUtil.Int32, Projections.Property("BirthDate")), 1970)) + .Add(Restrictions.Eq(Projections.SqlFunction("day", NHibernateUtil.Int32, Projections.Property("BirthDate")), 1)) + .Add(Restrictions.Eq(Projections.SqlFunction("month", NHibernateUtil.Int32, Projections.Property("BirthDate")), 1)) + .Add(Restrictions.Eq(Projections.SqlFunction("hour", NHibernateUtil.Int32, Projections.Property("BirthDate")), 1)) + .Add(Restrictions.Eq(Projections.SqlFunction("minute", NHibernateUtil.Int32, Projections.Property("BirthDate")), 1)) + .Add(Restrictions.Eq(Projections.SqlFunction("second", NHibernateUtil.Int32, Projections.Property("BirthDate")), 1)) .Add(Restrictions.Eq(Projections.SqlFunction("sqrt", NHibernateUtil.Int32, Projections.Property("Height")), 10)) .Add(Restrictions.Eq(Projections.SqlFunction("lower", NHibernateUtil.String, Projections.Property("Name")), "test")) .Add(Restrictions.Eq(Projections.SqlFunction("upper", NHibernateUtil.String, Projections.Property("Name")), "TEST")) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |