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