From: T. T. <te...@gm...> - 2008-10-15 22:24:51
|
I think this commit will resolve several other issues related to paging such as http://jira.nhibernate.org/browse/NH-1424 i need some free time to check those, maybe on friday. On Wed, Oct 15, 2008 at 9:32 PM, <aye...@us...> wrote: > Revision: 3860 > > http://nhibernate.svn.sourceforge.net/nhibernate/?rev=3860&view=rev > Author: ayenderahien > Date: 2008-10-15 18:32:16 +0000 (Wed, 15 Oct 2008) > > Log Message: > ----------- > NH-1528 - fixing problem with limit clauses with order by clauses that has > parameters on sql 2005. > > Modified Paths: > -------------- > trunk/nhibernate/src/NHibernate/Dialect/MsSql2005Dialect.cs > trunk/nhibernate/src/NHibernate/Driver/SqlStringFormatter.cs > trunk/nhibernate/src/NHibernate/Loader/Loader.cs > trunk/nhibernate/src/NHibernate/SqlCommand/ISqlStringVisitor.cs > trunk/nhibernate/src/NHibernate/SqlCommand/Parameter.cs > trunk/nhibernate/src/NHibernate/SqlCommand/SqlString.cs > trunk/nhibernate/src/NHibernate/SqlCommand/SqlStringBuilder.cs > trunk/nhibernate/src/NHibernate.Test/ProjectionFixtures/Fixture.cs > trunk/nhibernate/src/NHibernate.Test/ProjectionFixtures/Mapping.hbm.xml > trunk/nhibernate/src/NHibernate.Test/ProjectionFixtures/TreeNode.cs > > Modified: trunk/nhibernate/src/NHibernate/Dialect/MsSql2005Dialect.cs > =================================================================== > --- trunk/nhibernate/src/NHibernate/Dialect/MsSql2005Dialect.cs 2008-10-15 > 16:59:19 UTC (rev 3859) > +++ trunk/nhibernate/src/NHibernate/Dialect/MsSql2005Dialect.cs 2008-10-15 > 18:32:16 UTC (rev 3860) > @@ -44,6 +44,20 @@ > /// </remarks> > public override SqlString GetLimitString(SqlString > querySqlString, int offset, int last) > { > + // we have to do this in order to support parameters in order > clause, the foramt > + // that sql 2005 uses for paging means that we move the > parameters around, which means, > + // that positions are lost, so we record them before making > any changes. > + // NH-1528 > + int parameterPositon = 0; > + foreach (var part in querySqlString.Parts) > + { > + Parameter param = part as Parameter; > + if (param == null) > + continue; > + param.OriginalPositionInQuery = parameterPositon; > + parameterPositon += 1; > + } > + > int fromIndex = GetFromIndex(querySqlString); > SqlString select = querySqlString.Substring(0, > fromIndex); > List<SqlString> columnsOrAliases; > > Modified: trunk/nhibernate/src/NHibernate/Driver/SqlStringFormatter.cs > =================================================================== > --- trunk/nhibernate/src/NHibernate/Driver/SqlStringFormatter.cs > 2008-10-15 16:59:19 UTC (rev 3859) > +++ trunk/nhibernate/src/NHibernate/Driver/SqlStringFormatter.cs > 2008-10-15 18:32:16 UTC (rev 3860) > @@ -35,9 +35,10 @@ > result.Append(sqlString.ToString()); > } > > - void ISqlStringVisitor.Parameter() > + void ISqlStringVisitor.Parameter(Parameter parameter) > { > - string name = > formatter.GetParameterName(parameterIndex); > + string name = formatter.GetParameterName( > + parameter.OriginalPositionInQuery ?? parameterIndex); > parameterIndex++; > result.Append(name); > } > > Modified: trunk/nhibernate/src/NHibernate/Loader/Loader.cs > =================================================================== > --- trunk/nhibernate/src/NHibernate/Loader/Loader.cs 2008-10-15 16:59:19 > UTC (rev 3859) > +++ trunk/nhibernate/src/NHibernate/Loader/Loader.cs 2008-10-15 18:32:16 > UTC (rev 3860) > @@ -445,6 +445,11 @@ > log.Debug(string.Format("done > processing result set ({0} rows)", count)); > } > } > + catch(Exception e) > + { > + e.Data["actual-sql-query"] = st.CommandText; > + throw; > + } > finally > { > session.Batcher.CloseCommand(st, rs); > > Modified: trunk/nhibernate/src/NHibernate/SqlCommand/ISqlStringVisitor.cs > =================================================================== > --- trunk/nhibernate/src/NHibernate/SqlCommand/ISqlStringVisitor.cs > 2008-10-15 16:59:19 UTC (rev 3859) > +++ trunk/nhibernate/src/NHibernate/SqlCommand/ISqlStringVisitor.cs > 2008-10-15 18:32:16 UTC (rev 3860) > @@ -6,6 +6,6 @@ > { > void String(string text); > void String(SqlString sqlString); > - void Parameter(); > + void Parameter(Parameter parameter); > } > } > > Modified: trunk/nhibernate/src/NHibernate/SqlCommand/Parameter.cs > =================================================================== > --- trunk/nhibernate/src/NHibernate/SqlCommand/Parameter.cs 2008-10-15 > 16:59:19 UTC (rev 3859) > +++ trunk/nhibernate/src/NHibernate/SqlCommand/Parameter.cs 2008-10-15 > 18:32:16 UTC (rev 3860) > @@ -10,11 +10,25 @@ > [Serializable] > public class Parameter > { > - /// <summary> > - /// Used as a placeholder when parsing HQL or SQL queries. > - /// </summary> > - public static readonly Parameter Placeholder = new > Parameter(); > + /// <summary> > + /// We need to know what the position of the parameter was in a > query > + /// before we rearranged the query. > + /// This is used only by dialects that rearrange the query, > unforantely, > + /// the MS SQL 2005 dialect have to re shuffle the query (and ruin > positional parameter > + /// support) because the SQL 2005 and 2008 SQL dialects have a > completely broken > + /// support for paging, which is just a tad less important than > SELECT. > + /// See NH-1528 > + /// </summary> > + public int? OriginalPositionInQuery; > > + /// <summary> > + /// Used as a placeholder when parsing HQL or SQL queries. > + /// </summary> > + public static Parameter Placeholder > + { > + get { return new Parameter(); } > + } > + > private Parameter() > { > } > @@ -44,8 +58,9 @@ > /// </returns> > public override bool Equals(object obj) > { > - // All parameters are equal > - return obj == this || obj is Parameter; > + // All parameters are equal, this check that > + // the other one is not null and a parameter > + return obj is Parameter; > } > > /// <summary> > @@ -64,5 +79,35 @@ > { > return StringHelper.SqlParameter; > } > + > + public static bool operator ==(Parameter a, Parameter b) > + { > + return Equals(a, b); > + } > + > + public static bool operator ==(object a, Parameter b) > + { > + return Equals(a, b); > + } > + > + public static bool operator ==(Parameter a, object b) > + { > + return Equals(a, b); > + } > + > + public static bool operator !=(Parameter a, object b) > + { > + return !(a == b); > + } > + > + public static bool operator !=(object a, Parameter b) > + { > + return !(a == b); > + } > + > + public static bool operator !=(Parameter a, Parameter b) > + { > + return !(a == b); > + } > } > } > > Modified: trunk/nhibernate/src/NHibernate/SqlCommand/SqlString.cs > =================================================================== > --- trunk/nhibernate/src/NHibernate/SqlCommand/SqlString.cs 2008-10-15 > 16:59:19 UTC (rev 3859) > +++ trunk/nhibernate/src/NHibernate/SqlCommand/SqlString.cs 2008-10-15 > 18:32:16 UTC (rev 3860) > @@ -664,7 +664,7 @@ > } > else > { > - visitor.Parameter(); > + visitor.Parameter((Parameter)part); > } > } > } > > Modified: trunk/nhibernate/src/NHibernate/SqlCommand/SqlStringBuilder.cs > =================================================================== > --- trunk/nhibernate/src/NHibernate/SqlCommand/SqlStringBuilder.cs > 2008-10-15 16:59:19 UTC (rev 3859) > +++ trunk/nhibernate/src/NHibernate/SqlCommand/SqlStringBuilder.cs > 2008-10-15 18:32:16 UTC (rev 3860) > @@ -338,9 +338,9 @@ > parent.Add(sqlString); > } > > - public void Parameter() > + public void Parameter(Parameter parameter) > { > - parent.AddParameter(); > + parent.Add(parameter); > } > } > > > Modified: > trunk/nhibernate/src/NHibernate.Test/ProjectionFixtures/Fixture.cs > =================================================================== > --- trunk/nhibernate/src/NHibernate.Test/ProjectionFixtures/Fixture.cs > 2008-10-15 16:59:19 UTC (rev 3859) > +++ trunk/nhibernate/src/NHibernate.Test/ProjectionFixtures/Fixture.cs > 2008-10-15 18:32:16 UTC (rev 3860) > @@ -140,5 +140,25 @@ > criteria.List(); > } > } > + > + [Test] > + public void QueryingWithParemetersAndParaemtersInOrderBy() > + { > + using (var s = OpenSession()) > + { > + ICriteria criteria = s.CreateCriteria(typeof(TreeNode), > "parent") > + .Add(Restrictions.Like("Name","ayende")) > + .Add(Restrictions.Gt("Key.Id", 0)); > + > + var currentAssessment = > DetachedCriteria.For<TreeNode>("child") > + .Add(Restrictions.Eq("Type", NodeType.Smart)) > + .SetProjection(Projections.Property("Type")); > + > + > criteria.AddOrder(Order.Asc(Projections.SubQuery(currentAssessment))) > + .SetMaxResults(1000); > + > + criteria.List(); > + } > + } > } > } > \ No newline at end of file > > Modified: > trunk/nhibernate/src/NHibernate.Test/ProjectionFixtures/Mapping.hbm.xml > =================================================================== > --- trunk/nhibernate/src/NHibernate.Test/ProjectionFixtures/Mapping.hbm.xml > 2008-10-15 16:59:19 UTC (rev 3859) > +++ trunk/nhibernate/src/NHibernate.Test/ProjectionFixtures/Mapping.hbm.xml > 2008-10-15 18:32:16 UTC (rev 3860) > @@ -20,6 +20,7 @@ > <one-to-many class="TreeNode"/> > </set> > <property name="Type"/> > + <property name="Name"/> > </class> > > </hibernate-mapping> > \ No newline at end of file > > Modified: > trunk/nhibernate/src/NHibernate.Test/ProjectionFixtures/TreeNode.cs > =================================================================== > --- trunk/nhibernate/src/NHibernate.Test/ProjectionFixtures/TreeNode.cs > 2008-10-15 16:59:19 UTC (rev 3859) > +++ trunk/nhibernate/src/NHibernate.Test/ProjectionFixtures/TreeNode.cs > 2008-10-15 18:32:16 UTC (rev 3860) > @@ -5,6 +5,7 @@ > { > public class TreeNode > { > + public virtual string Name { get; set; } > public virtual Key Key { get; set; } > public virtual TreeNode Parent { get; set; } > public virtual NodeType Type { get; set; } > > > This was sent by the SourceForge.net collaborative development platform, > the world's largest Open Source development site. > > ------------------------------------------------------------------------- > This SF.Net email is sponsored by the Moblin Your Move Developer's > challenge > Build the coolest Linux based applications with Moblin SDK & win great > prizes > Grand prize is a trip for two to an Open Source event anywhere in the world > http://moblin-contest.org/redirect.php?banner_id=100&url=/ > _______________________________________________ > Nhibernate-commit mailing list > Nhi...@li... > https://lists.sourceforge.net/lists/listinfo/nhibernate-commit > -- Tuna Toksöz Typos included to enhance the readers attention! |