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