From: <pa...@us...> - 2011-01-13 23:27:00
|
Revision: 5348 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5348&view=rev Author: patearl Date: 2011-01-13 23:26:54 +0000 (Thu, 13 Jan 2011) Log Message: ----------- NH-2203: Move OrderBy clauses to end of query model. (Thanks to Jose F. Romaniello) Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Linq/Visitors/QueryModelVisitor.cs trunk/nhibernate/src/NHibernate/NHibernate.csproj trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate/Linq/ReWriters/MoveOrderByToEndRewriter.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2203/ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2203/Domain.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2203/Fixture.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2203/Mappings.hbm.xml Added: trunk/nhibernate/src/NHibernate/Linq/ReWriters/MoveOrderByToEndRewriter.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Linq/ReWriters/MoveOrderByToEndRewriter.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Linq/ReWriters/MoveOrderByToEndRewriter.cs 2011-01-13 23:26:54 UTC (rev 5348) @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using Remotion.Data.Linq; +using Remotion.Data.Linq.Clauses; + +namespace NHibernate.Linq.ReWriters +{ + public class MoveOrderByToEndRewriter + { + public static void ReWrite(QueryModel queryModel) + { + int len = queryModel.BodyClauses.Count; + for(int i=0; i<len; i++) + { + if (queryModel.BodyClauses[i] is OrderByClause) + { + // If we find an order by clause, move it to the end of the list. + // This preserves the ordering of multiple orderby clauses if there are any. + IBodyClause clause = queryModel.BodyClauses[i]; + queryModel.BodyClauses.RemoveAt(i); + queryModel.BodyClauses.Add(clause); + i--; + len--; + } + } + } + } +} Modified: trunk/nhibernate/src/NHibernate/Linq/Visitors/QueryModelVisitor.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Linq/Visitors/QueryModelVisitor.cs 2011-01-13 22:46:25 UTC (rev 5347) +++ trunk/nhibernate/src/NHibernate/Linq/Visitors/QueryModelVisitor.cs 2011-01-13 23:26:54 UTC (rev 5348) @@ -45,6 +45,9 @@ // Add left joins for references AddLeftJoinsReWriter.ReWrite(queryModel, parameters.SessionFactory); + // Move OrderBy clauses to end + MoveOrderByToEndRewriter.ReWrite(queryModel); + // rewrite any operators that should be applied on the outer query // by flattening out the sub-queries that they are located in ResultOperatorRewriterResult result = ResultOperatorRewriter.Rewrite(queryModel); Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj =================================================================== --- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2011-01-13 22:46:25 UTC (rev 5347) +++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2011-01-13 23:26:54 UTC (rev 5348) @@ -257,6 +257,7 @@ <Compile Include="ITransaction.cs" /> <Compile Include="LazyInitializationException.cs" /> <Compile Include="Linq\Functions\DictionaryGenerator.cs" /> + <Compile Include="Linq\ReWriters\MoveOrderByToEndRewriter.cs" /> <Compile Include="Linq\ReWriters\ResultOperatorRewriter.cs" /> <Compile Include="Linq\ReWriters\ResultOperatorRewriterResult.cs" /> <Compile Include="Loader\Loader.cs" /> Property changes on: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2203 ___________________________________________________________________ Added: bugtraq:url + http://jira.nhibernate.org/browse/%BUGID% Added: bugtraq:logregex + NH-\d+ Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2203/Domain.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2203/Domain.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2203/Domain.cs 2011-01-13 23:26:54 UTC (rev 5348) @@ -0,0 +1,8 @@ +namespace NHibernate.Test.NHSpecificTest.NH2203 +{ + public class Artist + { + public virtual int Id { get; set; } + public virtual string Name { get; set; } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2203/Fixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2203/Fixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2203/Fixture.cs 2011-01-13 23:26:54 UTC (rev 5348) @@ -0,0 +1,51 @@ +using System.Linq; +using NHibernate.Linq; +using NUnit.Framework; +using SharpTestsEx; + +namespace NHibernate.Test.NHSpecificTest.NH2203 +{ + [TestFixture] + public class Fixture : BugTestCase + { + protected override void OnSetUp() + { + base.OnSetUp(); + using (var session = sessions.OpenStatelessSession()) + using (var tx = session.BeginTransaction()) + { + foreach (var artistName in new[] { "Foo", "Bar", "Baz", "Soz", "Tiz", "Fez" }) + { + session.Insert(new Artist { Name = artistName }); + } + tx.Commit(); + } + } + + [Test] + public void QueryShouldWork() + { + using (var session = sessions.OpenSession()) + using(session.BeginTransaction()) + { + var actual = session.Query<Artist>() + .OrderBy(a => a.Name) + .Where(a => a.Name.StartsWith("F")) + .ToArray(); + + actual.Select(a => a.Name).Should().Have.SameSequenceAs("Fez", "Foo"); + } + } + + protected override void OnTearDown() + { + using(var session = sessions.OpenStatelessSession()) + using (var tx = session.BeginTransaction()) + { + session.CreateQuery("delete Artist").ExecuteUpdate(); + tx.Commit(); + } + base.OnTearDown(); + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2203/Mappings.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2203/Mappings.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2203/Mappings.hbm.xml 2011-01-13 23:26:54 UTC (rev 5348) @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" + assembly="NHibernate.Test" + namespace="NHibernate.Test.NHSpecificTest.NH2203"> + + <class name="Artist"> + <id name="Id" type="int"> + <generator class="hilo"/> + </id> + <property name="Name" /> + </class> + </hibernate-mapping> \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-01-13 22:46:25 UTC (rev 5347) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-01-13 23:26:54 UTC (rev 5348) @@ -496,6 +496,8 @@ <Compile Include="NHSpecificTest\NH2188\AppDomainWithMultipleSearchPath.cs" /> <Compile Include="NHSpecificTest\NH2202\Fixture.cs" /> <Compile Include="NHSpecificTest\NH2202\Model.cs" /> + <Compile Include="NHSpecificTest\NH2203\Domain.cs" /> + <Compile Include="NHSpecificTest\NH2203\Fixture.cs" /> <Compile Include="NHSpecificTest\NH2224\Domain.cs" /> <Compile Include="NHSpecificTest\NH2224\Fixture.cs" /> <Compile Include="NHSpecificTest\NH2228\Domain.cs" /> @@ -2371,6 +2373,7 @@ <EmbeddedResource Include="NHSpecificTest\NH1291AnonExample\Mappings.hbm.xml" /> </ItemGroup> <ItemGroup> + <EmbeddedResource Include="NHSpecificTest\NH2203\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\BagWithLazyExtraAndFilter\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2470\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2056\Mappings.hbm.xml" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |