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