From: <te...@us...> - 2008-09-26 23:25:23
|
Revision: 3784 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=3784&view=rev Author: tehlike Date: 2008-09-26 23:25:05 +0000 (Fri, 26 Sep 2008) Log Message: ----------- Applying patch for NH1502 by Jaroslav Mart?\195?\161sek with a little modification. Converting "string orderByString" to "SqlString orderByString" in order to keep placeholder Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Criterion/Order.cs trunk/nhibernate/src/NHibernate/Loader/AbstractEntityJoinWalker.cs trunk/nhibernate/src/NHibernate/Loader/Criteria/CriteriaQueryTranslator.cs trunk/nhibernate/src/NHibernate/Loader/Entity/CascadeEntityJoinWalker.cs trunk/nhibernate/src/NHibernate/Loader/Entity/EntityJoinWalker.cs trunk/nhibernate/src/NHibernate/Loader/JoinWalker.cs trunk/nhibernate/src/NHibernate/SqlCommand/SqlSelectBuilder.cs trunk/nhibernate/src/NHibernate.Test/Criteria/CriteriaQueryTest.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test-3.5.csproj trunk/nhibernate/src/NHibernate.Test/SqlCommandTest/SqlSelectBuilderFixture.cs Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1502/ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1502/Fixture.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1502/Mappings.hbm.xml trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1502/Person.cs Modified: trunk/nhibernate/src/NHibernate/Criterion/Order.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Criterion/Order.cs 2008-09-26 20:18:17 UTC (rev 3783) +++ trunk/nhibernate/src/NHibernate/Criterion/Order.cs 2008-09-26 23:25:05 UTC (rev 3784) @@ -43,7 +43,7 @@ /// <summary> /// Render the SQL fragment /// </summary> - public virtual string ToSqlString(ICriteria criteria, ICriteriaQuery criteriaQuery) + public virtual SqlString ToSqlString(ICriteria criteria, ICriteriaQuery criteriaQuery) { if(projection!=null) { @@ -52,7 +52,7 @@ SqlString truncated = NHibernate.Util.StringHelper.RemoveAsAliasesFromSql(produced); sb = sb.Append(truncated); sb = sb.Append(ascending ? " asc" : " desc"); - return sb.ToString(); + return sb; } string[] columns = criteriaQuery.GetColumnAliasesUsingProjection(criteria, propertyName); @@ -67,13 +67,13 @@ if (lower) { fragment.Append(factory.Dialect.LowercaseFunction) - .Append('('); + .Append("("); } fragment.Append(columns[i]); if (lower) { - fragment.Append(')'); + fragment.Append(")"); } fragment.Append(ascending ? " asc" : " desc"); @@ -84,7 +84,7 @@ } } - return fragment.ToString(); + return new SqlString(fragment.ToString()); } public override string ToString() Modified: trunk/nhibernate/src/NHibernate/Loader/AbstractEntityJoinWalker.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Loader/AbstractEntityJoinWalker.cs 2008-09-26 20:18:17 UTC (rev 3783) +++ trunk/nhibernate/src/NHibernate/Loader/AbstractEntityJoinWalker.cs 2008-09-26 23:25:05 UTC (rev 3784) @@ -28,7 +28,7 @@ alias = rootSqlAlias; } - protected void InitAll(SqlString whereString,string orderByString,LockMode lockMode) + protected void InitAll(SqlString whereString, SqlString orderByString, LockMode lockMode) { WalkEntityTree(persister, Alias); IList<OuterJoinableAssociation> allAssociations = new List<OuterJoinableAssociation>(associations); @@ -41,20 +41,20 @@ } protected void InitProjection(SqlString projectionString, SqlString whereString, - string orderByString, string groupByString, SqlString havingString, LockMode lockMode) + SqlString orderByString, string groupByString, SqlString havingString, LockMode lockMode) { WalkEntityTree(persister, Alias); Persisters = new ILoadable[0]; InitStatementString(projectionString, whereString, orderByString, groupByString, havingString, lockMode); } - private void InitStatementString(SqlString condition, string orderBy, LockMode lockMode) + private void InitStatementString(SqlString condition, SqlString orderBy, LockMode lockMode) { InitStatementString(null, condition, orderBy, string.Empty, null, lockMode); } private void InitStatementString(SqlString projection,SqlString condition, - string orderBy,string groupBy, SqlString having, LockMode lockMode) + SqlString orderBy,string groupBy, SqlString having, LockMode lockMode) { int joins = CountEntityPersisters(associations); Suffixes = BasicLoader.GenerateSuffixes(joins + 1); Modified: trunk/nhibernate/src/NHibernate/Loader/Criteria/CriteriaQueryTranslator.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Loader/Criteria/CriteriaQueryTranslator.cs 2008-09-26 20:18:17 UTC (rev 3783) +++ trunk/nhibernate/src/NHibernate/Loader/Criteria/CriteriaQueryTranslator.cs 2008-09-26 23:25:05 UTC (rev 3784) @@ -189,21 +189,21 @@ return condition.ToSqlString(); } - public string GetOrderBy() + public SqlString GetOrderBy() { - StringBuilder orderBy = new StringBuilder(30); + SqlStringBuilder orderBy = new SqlStringBuilder(30); bool first = true; foreach (CriteriaImpl.OrderEntry oe in rootCriteria.IterateOrderings()) { if (!first) { - orderBy.Append(StringHelper.CommaSpace); + orderBy.Add(StringHelper.CommaSpace); } first = false; - orderBy.Append(oe.Order.ToSqlString(oe.Criteria, this)); + orderBy.Add(oe.Order.ToSqlString(oe.Criteria, this)); } - return orderBy.ToString(); + return orderBy.ToSqlString(); } public ISessionFactoryImplementor Factory @@ -718,4 +718,4 @@ #endregion } -} \ No newline at end of file +} Modified: trunk/nhibernate/src/NHibernate/Loader/Entity/CascadeEntityJoinWalker.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Loader/Entity/CascadeEntityJoinWalker.cs 2008-09-26 20:18:17 UTC (rev 3783) +++ trunk/nhibernate/src/NHibernate/Loader/Entity/CascadeEntityJoinWalker.cs 2008-09-26 23:25:05 UTC (rev 3784) @@ -19,7 +19,7 @@ //include the discriminator and class-level where, but not filters .Add(persister.FilterFragment(Alias, new CollectionHelper.EmptyMapClass<string, IFilter>())); - InitAll(whereCondition.ToSqlString(), string.Empty, LockMode.Read); + InitAll(whereCondition.ToSqlString(), SqlString.Empty, LockMode.Read); } protected override bool IsJoinedFetchEnabled(IAssociationType type, FetchMode config, CascadeStyle cascadeStyle) @@ -38,4 +38,4 @@ get { return "load " + Persister.EntityName; } } } -} \ No newline at end of file +} Modified: trunk/nhibernate/src/NHibernate/Loader/Entity/EntityJoinWalker.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Loader/Entity/EntityJoinWalker.cs 2008-09-26 20:18:17 UTC (rev 3783) +++ trunk/nhibernate/src/NHibernate/Loader/Entity/EntityJoinWalker.cs 2008-09-26 23:25:05 UTC (rev 3784) @@ -25,7 +25,7 @@ //include the discriminator and class-level where, but not filters .Add(persister.FilterFragment(Alias, new CollectionHelper.EmptyMapClass<string, IFilter>())); - InitAll(whereCondition.ToSqlString(), string.Empty, lockMode); + InitAll(whereCondition.ToSqlString(), SqlString.Empty, lockMode); } /// <summary> @@ -42,4 +42,4 @@ get { return "load " + Persister.EntityName; } } } -} \ No newline at end of file +} Modified: trunk/nhibernate/src/NHibernate/Loader/JoinWalker.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Loader/JoinWalker.cs 2008-09-26 20:18:17 UTC (rev 3783) +++ trunk/nhibernate/src/NHibernate/Loader/JoinWalker.cs 2008-09-26 23:25:05 UTC (rev 3784) @@ -525,21 +525,34 @@ return !tooDeep && !IsDuplicateAssociation(lhsTable, lhsColumnNames, type); } - protected string OrderBy(IList<OuterJoinableAssociation> associations, string orderBy) + protected SqlString OrderBy(IList<OuterJoinableAssociation> associations, SqlString orderBy) { return MergeOrderings(OrderBy(associations), orderBy); } - protected string MergeOrderings(string ass, string orderBy) + protected SqlString OrderBy(IList<OuterJoinableAssociation> associations, string orderBy) { + return MergeOrderings(OrderBy(associations), new SqlString(orderBy)); + } + + protected SqlString MergeOrderings(SqlString ass, SqlString orderBy) + { if (ass.Length == 0) return orderBy; else if (orderBy.Length == 0) return ass; else - return ass + StringHelper.CommaSpace + orderBy; + return ass.Append(StringHelper.CommaSpace).Append(orderBy); } + protected SqlString MergeOrderings(string ass, SqlString orderBy) { + return this.MergeOrderings(new SqlString(ass), orderBy); + } + + protected SqlString MergeOrderings(string ass, string orderBy) { + return this.MergeOrderings(new SqlString(ass), new SqlString(orderBy)); + } + /// <summary> /// Generate a sequence of <c>LEFT OUTER JOIN</c> clauses for the given associations. /// </summary> @@ -597,9 +610,9 @@ /// <summary> /// Get the order by string required for collection fetching /// </summary> - protected static string OrderBy(IList<OuterJoinableAssociation> associations) + protected SqlString OrderBy(IList<OuterJoinableAssociation> associations) { - StringBuilder buf = new StringBuilder(); + SqlStringBuilder buf = new SqlStringBuilder(); OuterJoinableAssociation last = null; foreach (OuterJoinableAssociation oj in associations) @@ -612,7 +625,7 @@ if (queryableCollection.HasOrdering) { string orderByString = queryableCollection.GetSQLOrderByString(oj.RHSAlias); - buf.Append(orderByString).Append(StringHelper.CommaSpace); + buf.Add(orderByString).Add(StringHelper.CommaSpace); } } else @@ -627,7 +640,7 @@ if (queryableCollection.HasManyToManyOrdering) { string orderByString = queryableCollection.GetManyToManyOrderByString(oj.RHSAlias); - buf.Append(orderByString).Append(StringHelper.CommaSpace); + buf.Add(orderByString).Add(StringHelper.CommaSpace); } } } @@ -636,10 +649,11 @@ last = oj; } - if (buf.Length > 0) - buf.Length = buf.Length - 2; + if (buf.Count > 0) { + buf.RemoveAt(buf.Count-1); + } - return buf.ToString(); + return buf.ToSqlString(); } /// <summary> Modified: trunk/nhibernate/src/NHibernate/SqlCommand/SqlSelectBuilder.cs =================================================================== --- trunk/nhibernate/src/NHibernate/SqlCommand/SqlSelectBuilder.cs 2008-09-26 20:18:17 UTC (rev 3783) +++ trunk/nhibernate/src/NHibernate/SqlCommand/SqlSelectBuilder.cs 2008-09-26 23:25:05 UTC (rev 3784) @@ -17,7 +17,7 @@ private SqlString outerJoinsAfterFrom; private SqlString whereClause; private SqlString outerJoinsAfterWhere; - private string orderByClause; + private SqlString orderByClause; private string groupByClause; private SqlString havingClause; private LockMode lockMode; @@ -72,7 +72,7 @@ /// </summary> /// <param name="orderByClause">The orderByClause to set</param> /// <returns>The SqlSelectBuilder</returns> - public SqlSelectBuilder SetOrderByClause(string orderByClause) + public SqlSelectBuilder SetOrderByClause(SqlString orderByClause) { this.orderByClause = orderByClause; return this; Modified: trunk/nhibernate/src/NHibernate.Test/Criteria/CriteriaQueryTest.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Criteria/CriteriaQueryTest.cs 2008-09-26 20:18:17 UTC (rev 3783) +++ trunk/nhibernate/src/NHibernate.Test/Criteria/CriteriaQueryTest.cs 2008-09-26 23:25:05 UTC (rev 3784) @@ -1675,5 +1675,22 @@ t.Rollback(); s.Close(); } + + [Test] + public void OrderProjectionTest() { + using (ISession session = this.OpenSession()) { + ICriteria criteria = session.CreateCriteria(typeof (Student), "c"); + + criteria + .AddOrder(Order.Asc( + Projections.Conditional( + Restrictions.Eq("StudentNumber", (long)1), + Projections.Constant(0), + Projections.Constant(1) + ))); + + criteria.List(); + } + } } } Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1502/Fixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1502/Fixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1502/Fixture.cs 2008-09-26 23:25:05 UTC (rev 3784) @@ -0,0 +1,63 @@ +using System.Collections; +using System.Collections.Generic; +using NHibernate.Criterion; +using NHibernate.Dialect.Function; +using NUnit.Framework; + +namespace NHibernate.Test.NHSpecificTest.NH1502 +{ + [TestFixture] + public class Fixture : BugTestCase + { + protected override void OnTearDown() + { + base.OnTearDown(); + using (ISession session = OpenSession()) + { + using (ITransaction tx = session.BeginTransaction()) + { + session.Delete("from Person"); + tx.Commit(); + } + } + } + + protected override void OnSetUp() + { + using (ISession s = OpenSession()) + { + using (ITransaction tx = s.BeginTransaction()) + { + Person e1 = new Person("Joe", 10, 9); + Person e2 = new Person("Sally", 100, 8); + Person e3 = new Person("Tim", 20, 7); //20 + Person e4 = new Person("Fred", 40, 40); + Person e5 = new Person("Mike", 50, 50); + s.Save(e1); + s.Save(e2); + s.Save(e3); + s.Save(e4); + s.Save(e5); + tx.Commit(); + } + } + } + + [Test] + public void OrderProjectionTest() + { + ISQLFunction arithmaticMultiplication = new VarArgsSQLFunction("(", "*", ")"); + using (ISession session = this.OpenSession()) { + ICriteria criteria = session.CreateCriteria(typeof (Person), "c"); + + criteria.AddOrder(Order.Asc( + Projections.SqlFunction(arithmaticMultiplication, NHibernateUtil.GuessType(typeof (int)), + Projections.Property("IQ"), Projections.Constant(-1)))); + IList<Person> results=criteria.List<Person>(); + Assert.AreEqual(5, results.Count); + Assert.AreEqual("Sally", results[0].Name); + Assert.AreEqual("Joe", results[4].Name); + } + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1502/Mappings.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1502/Mappings.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1502/Mappings.hbm.xml 2008-09-26 23:25:05 UTC (rev 3784) @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" + assembly="NHibernate.Test" + namespace="NHibernate.Test.NHSpecificTest.NH1502"> + + <class name="Person" lazy="false"> + <id name="Id"> + <generator class="native" /> + </id> + <property name="Name"/> + <property name="IQ"/> + <property name="ShoeSize"/> + </class> +</hibernate-mapping> Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1502/Person.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1502/Person.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1502/Person.cs 2008-09-26 23:25:05 UTC (rev 3784) @@ -0,0 +1,51 @@ +using System.Collections; + +namespace NHibernate.Test.NHSpecificTest.NH1502 +{ + public class Person + { + private int id; + private int iq; + private string name; + private IList pets; + private int shoeSize; + + public Person() + { + pets = new ArrayList(); + } + + public Person(string name, int iq, int shoeSize) + { + this.name = name; + this.iq = iq; + this.shoeSize = shoeSize; + pets = new ArrayList(); + } + + public virtual int Id + { + get { return id; } + set { id = value; } + } + + public virtual string Name + { + get { return name; } + set { name = value; } + } + + public virtual int IQ + { + get { return iq; } + set { iq = value; } + } + + public virtual int ShoeSize + { + get { return shoeSize; } + set { shoeSize = value; } + } + + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test-3.5.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test-3.5.csproj 2008-09-26 20:18:17 UTC (rev 3783) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test-3.5.csproj 2008-09-26 23:25:05 UTC (rev 3784) @@ -494,6 +494,8 @@ <Compile Include="NHSpecificTest\NH1499\Document.cs" /> <Compile Include="NHSpecificTest\NH1499\Fixture.cs" /> <Compile Include="NHSpecificTest\NH1499\Person.cs" /> + <Compile Include="NHSpecificTest\NH1502\Fixture.cs" /> + <Compile Include="NHSpecificTest\NH1502\Person.cs" /> <Compile Include="NHSpecificTest\NH280\Fixture.cs" /> <Compile Include="NHSpecificTest\NH280\Foo.cs" /> <Compile Include="NHSpecificTest\NH1018\Employee.cs" /> @@ -1470,6 +1472,9 @@ <EmbeddedResource Include="NHSpecificTest\NH1499\Mappings.hbm.xml" /> </ItemGroup> <ItemGroup> + <EmbeddedResource Include="NHSpecificTest\NH1502\Mappings.hbm.xml" /> + </ItemGroup> + <ItemGroup> <Folder Include="Properties\" /> <Folder Include="Unionsubclass2\" /> </ItemGroup> Modified: trunk/nhibernate/src/NHibernate.Test/SqlCommandTest/SqlSelectBuilderFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/SqlCommandTest/SqlSelectBuilderFixture.cs 2008-09-26 20:18:17 UTC (rev 3783) +++ trunk/nhibernate/src/NHibernate.Test/SqlCommandTest/SqlSelectBuilderFixture.cs 2008-09-26 23:25:05 UTC (rev 3784) @@ -27,7 +27,7 @@ select.SetOuterJoins( new SqlString(" LEFT OUTER JOIN before ON select_test_alias.column1 = before.column1"), new SqlString(" after.some_field = after.another_field ")); - select.SetOrderByClause("column1 DESC"); + select.SetOrderByClause(new SqlString("column1 DESC")); select.SetWhereClause("select_test_alias", new string[] {"identity_column"}, NHibernateUtil.Int64); @@ -49,4 +49,4 @@ Assert.AreEqual(1, sqlString.GetParameterCount(), "One parameter"); } } -} \ No newline at end of file +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |