|
From: <ric...@us...> - 2010-02-07 12:39:09
|
Revision: 4943
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4943&view=rev
Author: ricbrown
Date: 2010-02-07 12:15:51 +0000 (Sun, 07 Feb 2010)
Log Message:
-----------
Fix NH-2101 (Missing IsNotIn for WhereRestrictionOn)
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/Criterion/Lambda/QueryOverRestrictionBuilder.cs
trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/RestrictionsFixture.cs
Modified: trunk/nhibernate/src/NHibernate/Criterion/Lambda/QueryOverRestrictionBuilder.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Criterion/Lambda/QueryOverRestrictionBuilder.cs 2010-02-01 20:48:56 UTC (rev 4942)
+++ trunk/nhibernate/src/NHibernate/Criterion/Lambda/QueryOverRestrictionBuilder.cs 2010-02-07 12:15:51 UTC (rev 4943)
@@ -16,6 +16,15 @@
public QueryOverRestrictionBuilder(QueryOver<TRoot,TSubType> root, string propertyName)
: base(root, propertyName) { }
+ public QueryOverRestrictionBuilder<TRoot,TSubType> Not
+ {
+ get
+ {
+ isNot = !isNot;
+ return this;
+ }
+ }
+
}
public class IQueryOverRestrictionBuilder<TRoot,TSubType> : QueryOverRestrictionBuilderBase<IQueryOver<TRoot,TSubType>, TRoot, TSubType>
@@ -24,6 +33,15 @@
public IQueryOverRestrictionBuilder(IQueryOver<TRoot,TSubType> root, string propertyName)
: base(root, propertyName) { }
+ public IQueryOverRestrictionBuilder<TRoot,TSubType> Not
+ {
+ get
+ {
+ isNot = !isNot;
+ return this;
+ }
+ }
+
}
public class QueryOverRestrictionBuilderBase<TReturn,TRoot,TSubType>
@@ -33,23 +51,34 @@
{
private TReturn root;
private string propertyName;
+ private bool isNot;
private object lo;
- public LambdaBetweenBuilder(TReturn root, string propertyName, object lo)
+ public LambdaBetweenBuilder(TReturn root, string propertyName, bool isNot, object lo)
{
this.root = root;
this.propertyName = propertyName;
+ this.isNot = isNot;
this.lo = lo;
}
+ private TReturn Add(ICriterion criterion)
+ {
+ if (isNot)
+ criterion = Restrictions.Not(criterion);
+
+ return (TReturn)root.And(criterion);
+ }
+
public TReturn And(object hi)
{
- return (TReturn)root.And(Restrictions.Between(propertyName, lo, hi));
+ return Add(Restrictions.Between(propertyName, lo, hi));
}
}
private TReturn root;
private string propertyName;
+ protected bool isNot;
/// <summary>
/// Constructed with property name
@@ -60,12 +89,20 @@
this.propertyName = propertyName;
}
+ private TReturn Add(ICriterion criterion)
+ {
+ if (isNot)
+ criterion = Restrictions.Not(criterion);
+
+ return (TReturn)root.And(criterion);
+ }
+
/// <summary>
/// Apply a "between" constraint to the named property
/// </summary>
public LambdaBetweenBuilder IsBetween(object lo)
{
- return new LambdaBetweenBuilder(root, propertyName, lo);
+ return new LambdaBetweenBuilder(root, propertyName, isNot, lo);
}
/// <summary>
@@ -73,7 +110,7 @@
/// </summary>
public TReturn IsIn(ICollection values)
{
- return (TReturn)root.And(Restrictions.In(propertyName, values));
+ return Add(Restrictions.In(propertyName, values));
}
/// <summary>
@@ -81,7 +118,7 @@
/// </summary>
public TReturn IsIn(object[] values)
{
- return (TReturn)root.And(Restrictions.In(propertyName, values));
+ return Add(Restrictions.In(propertyName, values));
}
/// <summary>
@@ -89,7 +126,7 @@
/// </summary>
public TReturn IsInG<T>(ICollection<T> values)
{
- return (TReturn)root.And(Restrictions.InG(propertyName, values));
+ return Add(Restrictions.InG(propertyName, values));
}
/// <summary>
@@ -97,7 +134,7 @@
/// </summary>
public TReturn IsInsensitiveLike(object value)
{
- return (TReturn)root.And(Restrictions.InsensitiveLike(propertyName, value));
+ return Add(Restrictions.InsensitiveLike(propertyName, value));
}
/// <summary>
@@ -105,7 +142,7 @@
/// </summary>
public TReturn IsInsensitiveLike(string value, MatchMode matchMode)
{
- return (TReturn)root.And(Restrictions.InsensitiveLike(propertyName, value, matchMode));
+ return Add(Restrictions.InsensitiveLike(propertyName, value, matchMode));
}
/// <summary>
@@ -113,7 +150,7 @@
/// </summary>
public TReturn IsEmpty
{
- get { return (TReturn)root.And(Restrictions.IsEmpty(propertyName)); }
+ get { return Add(Restrictions.IsEmpty(propertyName)); }
}
/// <summary>
@@ -121,7 +158,7 @@
/// </summary>
public TReturn IsNotEmpty
{
- get { return (TReturn)root.And(Restrictions.IsNotEmpty(propertyName)); }
+ get { return Add(Restrictions.IsNotEmpty(propertyName)); }
}
/// <summary>
@@ -129,7 +166,7 @@
/// </summary>
public TReturn IsNull
{
- get { return (TReturn)root.And(Restrictions.IsNull(propertyName)); }
+ get { return Add(Restrictions.IsNull(propertyName)); }
}
/// <summary>
@@ -137,7 +174,7 @@
/// </summary>
public TReturn IsNotNull
{
- get { return (TReturn)root.And(Restrictions.IsNotNull(propertyName)); }
+ get { return Add(Restrictions.IsNotNull(propertyName)); }
}
/// <summary>
@@ -145,7 +182,7 @@
/// </summary>
public TReturn IsLike(object value)
{
- return (TReturn)root.And(Restrictions.Like(propertyName, value));
+ return Add(Restrictions.Like(propertyName, value));
}
/// <summary>
@@ -153,7 +190,7 @@
/// </summary>
public TReturn IsLike(string value, MatchMode matchMode)
{
- return (TReturn)root.And(Restrictions.Like(propertyName, value, matchMode));
+ return Add(Restrictions.Like(propertyName, value, matchMode));
}
/// <summary>
@@ -161,7 +198,7 @@
/// </summary>
public TReturn IsLike(string value, MatchMode matchMode, char? escapeChar)
{
- return (TReturn)root.And(Restrictions.Like(propertyName, value, matchMode, escapeChar));
+ return Add(Restrictions.Like(propertyName, value, matchMode, escapeChar));
}
}
Modified: trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/RestrictionsFixture.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/RestrictionsFixture.cs 2010-02-01 20:48:56 UTC (rev 4942)
+++ trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/RestrictionsFixture.cs 2010-02-07 12:15:51 UTC (rev 4943)
@@ -112,6 +112,7 @@
CreateTestCriteria(typeof(Person), "personAlias")
.Add(Restrictions.Between("Age", 18, 65))
.Add(Restrictions.Between("personAlias.Age", 18, 65))
+ .Add(Restrictions.Not(Restrictions.Between("Age", 18, 65)))
.Add(Restrictions.In("Name", new string[] { "name1", "name2", "name3" }))
.Add(Restrictions.In("personAlias.Name", new ArrayList() { "name1", "name2", "name3" }))
.Add(Restrictions.InG<int>("Age", new int[] { 1, 2, 3 }))
@@ -123,13 +124,15 @@
.Add(Restrictions.IsNull("Name"))
.Add(Restrictions.Like("Name", "%test%"))
.Add(Restrictions.Like("Name", "test", MatchMode.Anywhere))
- .Add(Restrictions.Like("Name", "test", MatchMode.Anywhere, '?'));
+ .Add(Restrictions.Like("Name", "test", MatchMode.Anywhere, '?'))
+ .Add(Restrictions.Not(Restrictions.Like("Name", "%test%")));
Person personAlias = null;
var actual =
CreateTestQueryOver<Person>(() => personAlias)
.WhereRestrictionOn(p => p.Age).IsBetween(18).And(65)
.WhereRestrictionOn(() => personAlias.Age).IsBetween(18).And(65)
+ .WhereRestrictionOn(p => p.Age).Not.IsBetween(18).And(65)
.AndRestrictionOn(p => p.Name).IsIn(new string[] { "name1", "name2", "name3" })
.AndRestrictionOn(() => personAlias.Name).IsIn(new ArrayList() { "name1", "name2", "name3" })
.AndRestrictionOn(p => p.Age).IsInG<int>(new int[] { 1, 2, 3 })
@@ -141,7 +144,8 @@
.AndRestrictionOn(p => p.Name).IsNull
.AndRestrictionOn(p => p.Name).IsLike("%test%")
.AndRestrictionOn(p => p.Name).IsLike("test", MatchMode.Anywhere)
- .AndRestrictionOn(p => p.Name).IsLike("test", MatchMode.Anywhere, '?');
+ .AndRestrictionOn(p => p.Name).IsLike("test", MatchMode.Anywhere, '?')
+ .AndRestrictionOn(p => p.Name).Not.IsLike("%test%");
AssertCriteriaAreEqual(expected, actual);
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|