Skip to content

Commit 218add4

Browse files
bahusoidhazzik
authored andcommitted
Support projections arguments in Coalesce and other QueryOver extensions
Fixes #767
1 parent c4b806c commit 218add4

File tree

4 files changed

+23
-13
lines changed

4 files changed

+23
-13
lines changed

src/NHibernate.Test/Criteria/Lambda/Mappings.hbm.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
</id>
1010
<discriminator type="string" />
1111
<property name="Name" />
12+
<property name="Nickname" />
1213
<property name="Age" />
1314
<property name="BirthDate" />
1415
<property name="BirthDateAsDateTimeOffset" type="NHibernate.Test.DateTimeOffsetUserType, NHibernate.Test" />

src/NHibernate.Test/Criteria/Lambda/Model.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ public Person()
2626

2727
public virtual int Id { get; set; }
2828
public virtual string Name { get; set; }
29+
public virtual string Nickname { get; set; }
2930
public virtual int Age { get; set; }
3031
public virtual PersonGender Gender { get; set; }
3132
public virtual int Height { get; set; }

src/NHibernate.Test/Criteria/Lambda/RestrictionsFixture.cs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -284,11 +284,15 @@ public void FunctionExtensions()
284284
.Add(Restrictions.Eq(Projections.SqlFunction("length", NHibernateUtil.String, Projections.Property("Name")), 4))
285285
.Add(Restrictions.Eq(Projections.SqlFunction("bit_length", NHibernateUtil.String, Projections.Property("Name")), 32))
286286
.Add(Restrictions.Eq(Projections.SqlFunction("substring", NHibernateUtil.String, Projections.Property("Name"), Projections.Constant(1), Projections.Constant(2)), "te"))
287+
.Add(Restrictions.Eq(Projections.SqlFunction("substring", NHibernateUtil.String, Projections.Property("Name"), Projections.Property("Age"), Projections.Constant(2)), "te"))
287288
.Add(Restrictions.Eq(Projections.SqlFunction("locate", NHibernateUtil.String, Projections.Constant("e"), Projections.Property("Name"), Projections.Constant(1)), 2))
289+
.Add(Restrictions.Eq(Projections.SqlFunction("locate", NHibernateUtil.String, Projections.Constant("e"), Projections.Property("Name"), Projections.Property("Age")), 2))
288290
.Add(Restrictions.Eq(Projections.SqlFunction("coalesce", NHibernateUtil.Object, Projections.Property("Name"), Projections.Constant("not-null-val")), "test"))
291+
.Add(Restrictions.Eq(Projections.SqlFunction("coalesce", NHibernateUtil.Object, Projections.Property("Name"), Projections.Property("Nickname")), "test"))
289292
.Add(Restrictions.Eq(Projections.SqlFunction("coalesce", NHibernateUtil.Object, Projections.Property("NullableIsParent"), Projections.Constant(true)), true))
290293
.Add(Restrictions.Eq(Projections.SqlFunction("concat", NHibernateUtil.String, Projections.Property("Name"), Projections.Constant(", "), Projections.Property("Name")), "test, test"))
291-
.Add(Restrictions.Eq(Projections.SqlFunction("mod", NHibernateUtil.Int32, Projections.Property("Height"), Projections.Constant(10)), 0));
294+
.Add(Restrictions.Eq(Projections.SqlFunction("mod", NHibernateUtil.Int32, Projections.Property("Height"), Projections.Constant(10)), 0))
295+
.Add(Restrictions.Eq(Projections.SqlFunction("mod", NHibernateUtil.Int32, Projections.Property("Height"), Projections.Property("Age")), 0));
292296

293297
IQueryOver<Person> actual =
294298
CreateTestQueryOver<Person>()
@@ -314,11 +318,15 @@ public void FunctionExtensions()
314318
.And(p => p.Name.StrLength() == 4)
315319
.And(p => p.Name.BitLength() == 32)
316320
.And(p => p.Name.Substr(1, 2) == "te")
321+
.And(p => p.Name.Substr(p.Age, 2) == "te")
317322
.And(p => p.Name.CharIndex("e", 1) == 2)
323+
.And(p => p.Name.CharIndex("e", p.Age) == 2)
318324
.And(p => p.Name.Coalesce("not-null-val") == "test")
325+
.And(p => p.Name.Coalesce(p.Nickname) == "test")
319326
.And(p => p.NullableIsParent.Coalesce(true) == true)
320327
.And(p => Projections.Concat(p.Name, ", ", p.Name) == "test, test")
321-
.And(p => p.Height.Mod(10) == 0);
328+
.And(p => p.Height.Mod(10) == 0)
329+
.And(p => p.Height.Mod(p.Age) == 0);
322330

323331
AssertCriteriaAreEqual(expected, actual);
324332
}
@@ -339,4 +347,4 @@ public void FunctionExtensionsProperty()
339347
AssertCriteriaAreEqual(expected, actual);
340348
}
341349
}
342-
}
350+
}

src/NHibernate/Criterion/ProjectionsExtensions.cs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -272,9 +272,9 @@ public static string Substr(this string stringProperty, int startIndex, int leng
272272
internal static IProjection ProcessSubstr(MethodCallExpression methodCallExpression)
273273
{
274274
IProjection property = ExpressionProcessor.FindMemberProjection(methodCallExpression.Arguments[0]).AsProjection();
275-
object startIndex = ExpressionProcessor.FindValue(methodCallExpression.Arguments[1]);
276-
object length = ExpressionProcessor.FindValue(methodCallExpression.Arguments[2]);
277-
return Projections.SqlFunction("substring", NHibernateUtil.String, property, Projections.Constant(startIndex), Projections.Constant(length));
275+
var startIndex = ExpressionProcessor.FindMemberProjection(methodCallExpression.Arguments[1]);
276+
var length = ExpressionProcessor.FindMemberProjection(methodCallExpression.Arguments[2]);
277+
return Projections.SqlFunction("substring", NHibernateUtil.String, property, startIndex.AsProjection(), length.AsProjection());
278278
}
279279

280280
/// <summary>
@@ -289,9 +289,9 @@ public static int CharIndex(this string stringProperty, string theChar, int star
289289
internal static IProjection ProcessCharIndex(MethodCallExpression methodCallExpression)
290290
{
291291
IProjection property = ExpressionProcessor.FindMemberProjection(methodCallExpression.Arguments[0]).AsProjection();
292-
object theChar = ExpressionProcessor.FindValue(methodCallExpression.Arguments[1]);
293-
object startLocation = ExpressionProcessor.FindValue(methodCallExpression.Arguments[2]);
294-
return Projections.SqlFunction("locate", NHibernateUtil.String, Projections.Constant(theChar), property, Projections.Constant(startLocation));
292+
var theChar = ExpressionProcessor.FindMemberProjection(methodCallExpression.Arguments[1]);
293+
var startLocation = ExpressionProcessor.FindMemberProjection(methodCallExpression.Arguments[2]);
294+
return Projections.SqlFunction("locate", NHibernateUtil.String, theChar.AsProjection(), property, startLocation.AsProjection());
295295
}
296296

297297
/// <summary>
@@ -315,8 +315,8 @@ public static T Coalesce<T>(this T objectProperty, T replaceValueIfIsNull)
315315
internal static IProjection ProcessCoalesce(MethodCallExpression methodCallExpression)
316316
{
317317
IProjection property = ExpressionProcessor.FindMemberProjection(methodCallExpression.Arguments[0]).AsProjection();
318-
object replaceValueIfIsNull = ExpressionProcessor.FindValue(methodCallExpression.Arguments[1]);
319-
return Projections.SqlFunction("coalesce", NHibernateUtil.Object, property, Projections.Constant(replaceValueIfIsNull));
318+
var replaceValueIfIsNull = ExpressionProcessor.FindMemberProjection(methodCallExpression.Arguments[1]);
319+
return Projections.SqlFunction("coalesce", NHibernateUtil.Object, property, replaceValueIfIsNull.AsProjection());
320320
}
321321

322322
/// <summary>
@@ -331,8 +331,8 @@ public static int Mod(this int numericProperty, int divisor)
331331
internal static IProjection ProcessMod(MethodCallExpression methodCallExpression)
332332
{
333333
IProjection property = ExpressionProcessor.FindMemberProjection(methodCallExpression.Arguments[0]).AsProjection();
334-
object divisor = ExpressionProcessor.FindValue(methodCallExpression.Arguments[1]);
335-
return Projections.SqlFunction("mod", NHibernateUtil.Int32, property, Projections.Constant(divisor));
334+
var divisor = ExpressionProcessor.FindMemberProjection(methodCallExpression.Arguments[1]);
335+
return Projections.SqlFunction("mod", NHibernateUtil.Int32, property, divisor.AsProjection());
336336
}
337337

338338
/// <summary>

0 commit comments

Comments
 (0)