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