From: <te...@us...> - 2008-10-04 19:28:01
|
Revision: 3814 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=3814&view=rev Author: tehlike Date: 2008-10-04 19:27:55 +0000 (Sat, 04 Oct 2008) Log Message: ----------- Fix for NH-1505 by Jaroslav Mart?\195?\161sek Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Criterion/CriterionUtil.cs trunk/nhibernate/src/NHibernate/Criterion/LikeExpression.cs trunk/nhibernate/src/NHibernate.Test/Criteria/CriteriaQueryTest.cs Modified: trunk/nhibernate/src/NHibernate/Criterion/CriterionUtil.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Criterion/CriterionUtil.cs 2008-10-04 19:20:12 UTC (rev 3813) +++ trunk/nhibernate/src/NHibernate/Criterion/CriterionUtil.cs 2008-10-04 19:27:55 UTC (rev 3814) @@ -46,7 +46,7 @@ } } - private static SqlString[] GetColumnNamesUsingProjection(IProjection projection, ICriteriaQuery criteriaQuery, ICriteria criteria, + internal static SqlString[] GetColumnNamesUsingProjection(IProjection projection, ICriteriaQuery criteriaQuery, ICriteria criteria, IDictionary<string, IFilter> enabledFilters) { SqlString sqlString = projection.ToSqlString(criteria, Modified: trunk/nhibernate/src/NHibernate/Criterion/LikeExpression.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Criterion/LikeExpression.cs 2008-10-04 19:20:12 UTC (rev 3813) +++ trunk/nhibernate/src/NHibernate/Criterion/LikeExpression.cs 2008-10-04 19:27:55 UTC (rev 3814) @@ -17,15 +17,14 @@ [Serializable] public class LikeExpression : AbstractCriterion { - private readonly string propertyName; private readonly string value; private char? escapeChar; private readonly bool ignoreCase; - private readonly IProjection _projection; + private readonly IProjection projection; public LikeExpression(string propertyName, string value, char? escapeChar, bool ignoreCase) { - this.propertyName = propertyName; + this.projection = Projections.Property(propertyName); this.value = value; this.escapeChar = escapeChar; this.ignoreCase = ignoreCase; @@ -33,7 +32,7 @@ public LikeExpression(IProjection projection, string value, MatchMode matchMode) { - _projection = projection; + this.projection = projection; this.value = matchMode.ToMatchString(value); } @@ -57,21 +56,23 @@ public override SqlString ToSqlString(ICriteria criteria, ICriteriaQuery criteriaQuery, IDictionary<string, IFilter> enabledFilters) { - string[] columns = criteriaQuery.GetColumnsUsingProjection(criteria, propertyName); + SqlString[] columns = CriterionUtil.GetColumnNamesUsingProjection(projection, criteriaQuery, criteria, enabledFilters); if (columns.Length != 1) - throw new HibernateException("Like may only be used with single-column properties"); + throw new HibernateException("Like may only be used with single-column properties / projections."); SqlStringBuilder lhs = new SqlStringBuilder(6); - if(ignoreCase) + if (ignoreCase) { Dialect.Dialect dialect = criteriaQuery.Factory.Dialect; - lhs.Add(dialect.LowercaseFunction).Add(StringHelper.OpenParen).Add(columns[0]).Add( - StringHelper.ClosedParen); + lhs.Add(dialect.LowercaseFunction) + .Add(StringHelper.OpenParen) + .Add(columns[0]) + .Add(StringHelper.ClosedParen); } - else + else lhs.Add(columns[0]); - + criteriaQuery.AddUsedTypedValues(GetTypedValues(criteria, criteriaQuery)); lhs.Add(" like ").AddParameter(); if (escapeChar.HasValue) @@ -81,23 +82,21 @@ public override TypedValue[] GetTypedValues(ICriteria criteria, ICriteriaQuery criteriaQuery) { - return new TypedValue[] {criteriaQuery.GetTypedValue(criteria, propertyName, ignoreCase ? value.ToLower() : value)}; + return new TypedValue[] { + new TypedValue(NHibernateUtil.String, value, EntityMode.Poco), + }; } public override IProjection[] GetProjections() { - if(_projection != null) - { - return new IProjection[] {_projection}; - } - return null; + return new IProjection[] { projection }; } #endregion public override string ToString() { - return (_projection != null ? _projection.ToString() : propertyName) + " like " + value; + return projection + " like " + value; } } -} +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/Criteria/CriteriaQueryTest.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Criteria/CriteriaQueryTest.cs 2008-10-04 19:20:12 UTC (rev 3813) +++ trunk/nhibernate/src/NHibernate.Test/Criteria/CriteriaQueryTest.cs 2008-10-04 19:27:55 UTC (rev 3814) @@ -1655,8 +1655,8 @@ t.Commit(); } } - + [Test] public void TransformToRowCountTest() { @@ -1677,9 +1677,11 @@ } [Test] - public void OrderProjectionTest() { - using (ISession session = this.OpenSession()) { - ICriteria criteria = session.CreateCriteria(typeof (Student), "c"); + public void OrderProjectionTest() + { + using (ISession session = this.OpenSession()) + { + ICriteria criteria = session.CreateCriteria(typeof(Student), "c"); criteria .AddOrder(Order.Asc( @@ -1692,5 +1694,67 @@ criteria.List(); } } + + [Test] + public void LikeProjectionTest() + { + Student john = new Student { Name = "John" }; + using (ISession session = this.OpenSession()) + { + session.Save(john); + session.Flush(); + } + + + using (ISession session = this.OpenSession()) + { + ICriteria criteria = session.CreateCriteria(typeof(Student), "c"); + + criteria.Add(new LikeExpression(Projections.Property("Name"), "John", MatchMode.Anywhere)); + + Assert.AreEqual(1, criteria.List().Count); + } + + using (ISession session = this.OpenSession()) + { + ICriteria criteria = session.CreateCriteria(typeof(Student), "c"); + + criteria.Add(new LikeExpression("Name", "John")); + + Assert.AreEqual(1, criteria.List().Count); + } + + using (ISession session = this.OpenSession()) + { + session.Delete(john); + session.Flush(); + } + } + + [Test] + public void LikeProjectionUsingRestrictionsTest() + { + using (ISession session = this.OpenSession()) + { + ICriteria criteria = session.CreateCriteria(typeof(Student), "c"); + + criteria.Add(Restrictions.Like(Projections.Constant("Name"), "John", MatchMode.Anywhere)); + + criteria.List(); + } + } + + [Test] + public void InsensitiveLikeProjectionUsingRestrictionsTest() + { + using (ISession session = this.OpenSession()) + { + ICriteria criteria = session.CreateCriteria(typeof(Student), "c"); + + criteria.Add(Restrictions.InsensitiveLike(Projections.Constant("Name"), "John", MatchMode.Anywhere)); + + criteria.List(); + } + } } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |