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