|
From: <pa...@us...> - 2011-05-28 06:39:20
|
Revision: 5874
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5874&view=rev
Author: patearl
Date: 2011-05-28 06:39:13 +0000 (Sat, 28 May 2011)
Log Message:
-----------
Linq: Support Trim function.
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/Linq/Functions/DefaultLinqToHqlGeneratorsRegistry.cs
trunk/nhibernate/src/NHibernate/Linq/Functions/StringGenerator.cs
trunk/nhibernate/src/NHibernate.Test/Linq/FunctionTests.cs
trunk/nhibernate/src/NHibernate.Test/TestDialect.cs
Added Paths:
-----------
trunk/nhibernate/src/NHibernate.Test/TestDialects/MsSql2008TestDialect.cs
Modified: trunk/nhibernate/src/NHibernate/Linq/Functions/DefaultLinqToHqlGeneratorsRegistry.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Linq/Functions/DefaultLinqToHqlGeneratorsRegistry.cs 2011-05-28 05:34:42 UTC (rev 5873)
+++ trunk/nhibernate/src/NHibernate/Linq/Functions/DefaultLinqToHqlGeneratorsRegistry.cs 2011-05-28 06:39:13 UTC (rev 5874)
@@ -30,6 +30,7 @@
this.Merge(new IndexOfGenerator());
this.Merge(new ReplaceGenerator());
this.Merge(new LengthGenerator());
+ this.Merge(new TrimGenerator());
this.Merge(new AnyHqlGenerator());
this.Merge(new AllHqlGenerator());
Modified: trunk/nhibernate/src/NHibernate/Linq/Functions/StringGenerator.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Linq/Functions/StringGenerator.cs 2011-05-28 05:34:42 UTC (rev 5873)
+++ trunk/nhibernate/src/NHibernate/Linq/Functions/StringGenerator.cs 2011-05-28 06:39:13 UTC (rev 5874)
@@ -195,6 +195,46 @@
}
}
+ public class TrimGenerator : BaseHqlGeneratorForMethod
+ {
+ public TrimGenerator()
+ {
+ SupportedMethods = new[]
+ {
+ ReflectionHelper.GetMethodDefinition<string>(s => s.Trim()),
+ ReflectionHelper.GetMethodDefinition<string>(s => s.Trim('a')),
+ ReflectionHelper.GetMethodDefinition<string>(s => s.TrimStart('a')),
+ ReflectionHelper.GetMethodDefinition<string>(s => s.TrimEnd('a'))
+ };
+ }
+
+ public override HqlTreeNode BuildHql(MethodInfo method, Expression targetObject, ReadOnlyCollection<Expression> arguments, HqlTreeBuilder treeBuilder, IHqlExpressionVisitor visitor)
+ {
+ string trimWhere;
+ if (method.Name == "TrimStart")
+ trimWhere = "leading";
+ else if (method.Name == "TrimEnd")
+ trimWhere = "trailing";
+ else
+ trimWhere = "both";
+
+ string trimChars = "";
+ if (method.GetParameters().Length > 0)
+ foreach (char c in (char[])((ConstantExpression)arguments[0]).Value)
+ trimChars += c;
+
+
+ if (trimChars == "")
+ {
+ return treeBuilder.MethodCall("trim", treeBuilder.Ident(trimWhere), treeBuilder.Ident("from"), visitor.Visit(targetObject).AsExpression());
+ }
+ else
+ {
+ return treeBuilder.MethodCall("trim", treeBuilder.Ident(trimWhere), treeBuilder.Constant(trimChars), treeBuilder.Ident("from"), visitor.Visit(targetObject).AsExpression());
+ }
+ }
+ }
+
public class ToStringRuntimeMethodHqlGenerator : IRuntimeMethodHqlGenerator
{
private readonly ToStringHqlGeneratorForMethod generator = new ToStringHqlGeneratorForMethod();
Modified: trunk/nhibernate/src/NHibernate.Test/Linq/FunctionTests.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/Linq/FunctionTests.cs 2011-05-28 05:34:42 UTC (rev 5873)
+++ trunk/nhibernate/src/NHibernate.Test/Linq/FunctionTests.cs 2011-05-28 06:39:13 UTC (rev 5874)
@@ -118,5 +118,29 @@
{
Assert.AreEqual(2, session.Query<AnotherEntity>().Where(e => (e.Input ?? "hello") == "hello").Count());
}
+
+ [Test]
+ public void Trim()
+ {
+ try
+ {
+ session.Save(new AnotherEntity { Id = 100, Input = " hi " });
+ session.Save(new AnotherEntity { Id = 101, Input = "hi" });
+ session.Save(new AnotherEntity { Id = 102, Input = "heh" });
+
+ Assert.AreEqual(2, session.Query<AnotherEntity>().Where(e => e.Input.Trim() == "hi").Count());
+ Assert.AreEqual(TestDialect.IgnoresTrailingWhitespace ? 2 : 1, session.Query<AnotherEntity>().Where(e => e.Input.TrimStart() == "hi ").Count());
+ Assert.AreEqual(1, session.Query<AnotherEntity>().Where(e => e.Input.TrimEnd() == " hi").Count());
+
+ // Emulated trim does not support multiple trim characters, but for many databases it should work fine anyways.
+ Assert.AreEqual(1, session.Query<AnotherEntity>().Where(e => e.Input.Trim('h') == "e").Count());
+ Assert.AreEqual(1, session.Query<AnotherEntity>().Where(e => e.Input.TrimStart('h') == "eh").Count());
+ Assert.AreEqual(1, session.Query<AnotherEntity>().Where(e => e.Input.TrimEnd('h') == "he").Count());
+ }
+ finally
+ {
+ session.Delete("from AnotherEntity where Id >= 100");
+ }
+ }
}
}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate.Test/TestDialect.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/TestDialect.cs 2011-05-28 05:34:42 UTC (rev 5873)
+++ trunk/nhibernate/src/NHibernate.Test/TestDialect.cs 2011-05-28 06:39:13 UTC (rev 5874)
@@ -53,6 +53,8 @@
public virtual bool SupportsHavingWithoutGroupBy { get { return true; } }
+ public virtual bool IgnoresTrailingWhitespace { get { return false; } }
+
public bool SupportsSqlType(SqlType sqlType)
{
try
Copied: trunk/nhibernate/src/NHibernate.Test/TestDialects/MsSql2008TestDialect.cs (from rev 5872, trunk/nhibernate/src/NHibernate.Test/TestDialects/SQLiteTestDialect.cs)
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/TestDialects/MsSql2008TestDialect.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/TestDialects/MsSql2008TestDialect.cs 2011-05-28 06:39:13 UTC (rev 5874)
@@ -0,0 +1,20 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace NHibernate.Test.TestDialects
+{
+ public class MsSql2008TestDialect : TestDialect
+ {
+ public MsSql2008TestDialect(Dialect.Dialect dialect)
+ : base(dialect)
+ {
+ }
+
+ public override bool IgnoresTrailingWhitespace
+ {
+ get { return true; }
+ }
+ }
+}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|