From: <fab...@us...> - 2011-06-13 13:04:30
|
Revision: 5920 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5920&view=rev Author: fabiomaulo Date: 2011-06-13 13:04:23 +0000 (Mon, 13 Jun 2011) Log Message: ----------- Refactoring: - DRY - removed dead-code Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Loader/QueryLoader.cs trunk/nhibernate/src/NHibernate/Loader/Criteria/CriteriaLoader.cs trunk/nhibernate/src/NHibernate/Loader/Custom/CustomLoader.cs trunk/nhibernate/src/NHibernate/Loader/Loader.cs Modified: trunk/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Loader/QueryLoader.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Loader/QueryLoader.cs 2011-06-13 12:51:47 UTC (rev 5919) +++ trunk/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Loader/QueryLoader.cs 2011-06-13 13:04:23 UTC (rev 5920) @@ -1,5 +1,4 @@ using System; -using System.Linq; using System.Collections; using System.Collections.Generic; using System.Data; @@ -7,14 +6,12 @@ using NHibernate.Engine; using NHibernate.Event; using NHibernate.Hql.Ast.ANTLR.Tree; -using NHibernate.Hql.Classic; using NHibernate.Impl; using NHibernate.Loader; using NHibernate.Param; using NHibernate.Persister.Collection; using NHibernate.Persister.Entity; using NHibernate.SqlCommand; -using NHibernate.SqlTypes; using NHibernate.Transform; using NHibernate.Type; using NHibernate.Util; @@ -506,151 +503,5 @@ } return command; } - - private void AdjustQueryParametersForSubSelectFetching(SqlString sqlString, IEnumerable<IParameterSpecification> parameterSpecs, ISessionImplementor session, QueryParameters queryParameters) - { - // TODO: Remove this when all parameters are managed using IParameterSpecification (QueryParameters does not need to have decomposed values for filters) - - var dynamicFilterParameterSpecifications = parameterSpecs.OfType<DynamicFilterParameterSpecification>().ToList(); - var filteredParameterValues = new List<object>(); - var filteredParameterTypes = new List<IType>(); - var filteredParameterLocations = new List<int>(); - - if (dynamicFilterParameterSpecifications.Count != 0) - { - var sqlQueryParametersList = sqlString.GetParameters().ToList(); - foreach (DynamicFilterParameterSpecification specification in dynamicFilterParameterSpecifications) - { - string backTrackId = specification.GetIdsForBackTrack(session.Factory).First(); - object value = session.GetFilterParameterValue(specification.FilterParameterFullName); - var elementType = specification.ExpectedType; - foreach (int position in sqlQueryParametersList.GetEffectiveParameterLocations(backTrackId)) - { - filteredParameterValues.Add(value); - filteredParameterTypes.Add(elementType); - filteredParameterLocations.Add(position); - } - } - } - - queryParameters.ProcessedSql = sqlString; - queryParameters.FilteredParameterLocations = filteredParameterLocations; - queryParameters.FilteredParameterTypes = filteredParameterTypes; - queryParameters.FilteredParameterValues = filteredParameterValues; - } - - private SqlString ExpandDynamicFilterParameters(SqlString sqlString, ICollection<IParameterSpecification> parameterSpecs, ISessionImplementor session) - { - var enabledFilters = session.EnabledFilters; - if (enabledFilters.Count == 0 || sqlString.ToString().IndexOf(ParserHelper.HqlVariablePrefix) < 0) - { - return sqlString; - } - - Dialect.Dialect dialect = session.Factory.Dialect; - string symbols = ParserHelper.HqlSeparators + dialect.OpenQuote + dialect.CloseQuote; - - var originSql = sqlString.Compact(); - var result = new SqlStringBuilder(); - foreach (var sqlPart in originSql.Parts) - { - var parameter = sqlPart as Parameter; - if (parameter != null) - { - result.Add(parameter); - continue; - } - - var sqlFragment = sqlPart.ToString(); - var tokens = new StringTokenizer(sqlFragment, symbols, true); - - foreach (string token in tokens) - { - if (token.StartsWith(ParserHelper.HqlVariablePrefix)) - { - string filterParameterName = token.Substring(1); - string[] parts = StringHelper.ParseFilterParameterName(filterParameterName); - string filterName = parts[0]; - string parameterName = parts[1]; - var filter = (FilterImpl)enabledFilters[filterName]; - - object value = filter.GetParameter(parameterName); - IType type = filter.FilterDefinition.GetParameterType(parameterName); - int parameterColumnSpan = type.GetColumnSpan(session.Factory); - var collectionValue = value as ICollection; - int? collectionSpan = null; - - // Add query chunk - string typeBindFragment = string.Join(", ", Enumerable.Repeat("?", parameterColumnSpan).ToArray()); - string bindFragment; - if (collectionValue != null && !type.ReturnedClass.IsArray) - { - collectionSpan = collectionValue.Count; - bindFragment = string.Join(", ", Enumerable.Repeat(typeBindFragment, collectionValue.Count).ToArray()); - } - else - { - bindFragment = typeBindFragment; - } - - // dynamic-filter parameter tracking - var filterParameterFragment = SqlString.Parse(bindFragment); - var dynamicFilterParameterSpecification = new DynamicFilterParameterSpecification(filterName, parameterName, type, collectionSpan); - var parameters = filterParameterFragment.GetParameters().ToArray(); - var sqlParameterPos = 0; - var paramTrackers = dynamicFilterParameterSpecification.GetIdsForBackTrack(session.Factory); - foreach (var paramTracker in paramTrackers) - { - parameters[sqlParameterPos++].BackTrack = paramTracker; - } - - parameterSpecs.Add(dynamicFilterParameterSpecification); - result.Add(filterParameterFragment); - } - else - { - result.Add(token); - } - } - } - return result.ToSqlString().Compact(); - } - - private SqlString AddLimitsParametersIfNeeded(SqlString sqlString, ICollection<IParameterSpecification> parameterSpecs, QueryParameters queryParameters, ISessionImplementor session) - { - var sessionFactory = session.Factory; - Dialect.Dialect dialect = sessionFactory.Dialect; - - RowSelection selection = queryParameters.RowSelection; - bool useLimit = UseLimit(selection, dialect); - if (useLimit) - { - bool hasFirstRow = GetFirstRow(selection) > 0; - bool useOffset = hasFirstRow && dialect.SupportsLimitOffset; - int max = GetMaxOrLimit(dialect, selection); - int? skip = useOffset ? (int?) dialect.GetOffsetValue(GetFirstRow(selection)) : null; - int? take = max != int.MaxValue ? (int?) max : null; - - Parameter skipSqlParameter = null; - Parameter takeSqlParameter = null; - if (skip.HasValue) - { - var skipParameter = new QuerySkipParameterSpecification(); - skipSqlParameter = Parameter.Placeholder; - skipSqlParameter.BackTrack = skipParameter.GetIdsForBackTrack(sessionFactory).First(); - parameterSpecs.Add(skipParameter); - } - if (take.HasValue) - { - var takeParameter = new QueryTakeParameterSpecification(); - takeSqlParameter = Parameter.Placeholder; - takeSqlParameter.BackTrack = takeParameter.GetIdsForBackTrack(sessionFactory).First(); - parameterSpecs.Add(takeParameter); - } - // The dialect can move the given parameters where he need, what it can't do is generates new parameters loosing the BackTrack. - return dialect.GetLimitString(sqlString, skip, take, skipSqlParameter, takeSqlParameter); - } - return sqlString; - } } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Loader/Criteria/CriteriaLoader.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Loader/Criteria/CriteriaLoader.cs 2011-06-13 12:51:47 UTC (rev 5919) +++ trunk/nhibernate/src/NHibernate/Loader/Criteria/CriteriaLoader.cs 2011-06-13 13:04:23 UTC (rev 5920) @@ -2,15 +2,12 @@ using System.Collections; using System.Collections.Generic; using System.Data; -using System.Linq; using Iesi.Collections.Generic; using NHibernate.Engine; -using NHibernate.Hql.Classic; using NHibernate.Impl; using NHibernate.Param; using NHibernate.Persister.Entity; using NHibernate.SqlCommand; -using NHibernate.SqlTypes; using NHibernate.Transform; using NHibernate.Type; using NHibernate.Util; @@ -256,151 +253,5 @@ { return new int[0]; } - - private void AdjustQueryParametersForSubSelectFetching(SqlString sqlString, IEnumerable<IParameterSpecification> parameterSpecs, ISessionImplementor session, QueryParameters queryParameters) - { - // TODO: Remove this when all parameters are managed using IParameterSpecification (QueryParameters does not need to have decomposed values for filters) - - var dynamicFilterParameterSpecifications = parameterSpecs.OfType<DynamicFilterParameterSpecification>().ToList(); - var filteredParameterValues = new List<object>(); - var filteredParameterTypes = new List<IType>(); - var filteredParameterLocations = new List<int>(); - - if (dynamicFilterParameterSpecifications.Count != 0) - { - var sqlQueryParametersList = sqlString.GetParameters().ToList(); - foreach (DynamicFilterParameterSpecification specification in dynamicFilterParameterSpecifications) - { - string backTrackId = specification.GetIdsForBackTrack(session.Factory).First(); - object value = session.GetFilterParameterValue(specification.FilterParameterFullName); - var elementType = specification.ExpectedType; - foreach (int position in sqlQueryParametersList.GetEffectiveParameterLocations(backTrackId)) - { - filteredParameterValues.Add(value); - filteredParameterTypes.Add(elementType); - filteredParameterLocations.Add(position); - } - } - } - - queryParameters.ProcessedSql = sqlString; - queryParameters.FilteredParameterLocations = filteredParameterLocations; - queryParameters.FilteredParameterTypes = filteredParameterTypes; - queryParameters.FilteredParameterValues = filteredParameterValues; - } - - private SqlString ExpandDynamicFilterParameters(SqlString sqlString, ICollection<IParameterSpecification> parameterSpecs, ISessionImplementor session) - { - var enabledFilters = session.EnabledFilters; - if (enabledFilters.Count == 0 || sqlString.ToString().IndexOf(ParserHelper.HqlVariablePrefix) < 0) - { - return sqlString; - } - - Dialect.Dialect dialect = session.Factory.Dialect; - string symbols = ParserHelper.HqlSeparators + dialect.OpenQuote + dialect.CloseQuote; - - var originSql = sqlString.Compact(); - var result = new SqlStringBuilder(); - foreach (var sqlPart in originSql.Parts) - { - var parameter = sqlPart as Parameter; - if (parameter != null) - { - result.Add(parameter); - continue; - } - - var sqlFragment = sqlPart.ToString(); - var tokens = new StringTokenizer(sqlFragment, symbols, true); - - foreach (string token in tokens) - { - if (token.StartsWith(ParserHelper.HqlVariablePrefix)) - { - string filterParameterName = token.Substring(1); - string[] parts = StringHelper.ParseFilterParameterName(filterParameterName); - string filterName = parts[0]; - string parameterName = parts[1]; - var filter = (FilterImpl)enabledFilters[filterName]; - - object value = filter.GetParameter(parameterName); - IType type = filter.FilterDefinition.GetParameterType(parameterName); - int parameterColumnSpan = type.GetColumnSpan(session.Factory); - var collectionValue = value as ICollection; - int? collectionSpan = null; - - // Add query chunk - string typeBindFragment = string.Join(", ", Enumerable.Repeat("?", parameterColumnSpan).ToArray()); - string bindFragment; - if (collectionValue != null && !type.ReturnedClass.IsArray) - { - collectionSpan = collectionValue.Count; - bindFragment = string.Join(", ", Enumerable.Repeat(typeBindFragment, collectionValue.Count).ToArray()); - } - else - { - bindFragment = typeBindFragment; - } - - // dynamic-filter parameter tracking - var filterParameterFragment = SqlString.Parse(bindFragment); - var dynamicFilterParameterSpecification = new DynamicFilterParameterSpecification(filterName, parameterName, type, collectionSpan); - var parameters = filterParameterFragment.GetParameters().ToArray(); - var sqlParameterPos = 0; - var paramTrackers = dynamicFilterParameterSpecification.GetIdsForBackTrack(session.Factory); - foreach (var paramTracker in paramTrackers) - { - parameters[sqlParameterPos++].BackTrack = paramTracker; - } - - parameterSpecs.Add(dynamicFilterParameterSpecification); - result.Add(filterParameterFragment); - } - else - { - result.Add(token); - } - } - } - return result.ToSqlString().Compact(); - } - - private SqlString AddLimitsParametersIfNeeded(SqlString sqlString, ICollection<IParameterSpecification> parameterSpecs, QueryParameters queryParameters, ISessionImplementor session) - { - var sessionFactory = session.Factory; - Dialect.Dialect dialect = sessionFactory.Dialect; - - RowSelection selection = queryParameters.RowSelection; - bool useLimit = UseLimit(selection, dialect); - if (useLimit) - { - bool hasFirstRow = GetFirstRow(selection) > 0; - bool useOffset = hasFirstRow && dialect.SupportsLimitOffset; - int max = GetMaxOrLimit(dialect, selection); - int? skip = useOffset ? (int?)dialect.GetOffsetValue(GetFirstRow(selection)) : null; - int? take = max != int.MaxValue ? (int?)max : null; - - Parameter skipSqlParameter = null; - Parameter takeSqlParameter = null; - if (skip.HasValue) - { - var skipParameter = new QuerySkipParameterSpecification(); - skipSqlParameter = Parameter.Placeholder; - skipSqlParameter.BackTrack = skipParameter.GetIdsForBackTrack(sessionFactory).First(); - parameterSpecs.Add(skipParameter); - } - if (take.HasValue) - { - var takeParameter = new QueryTakeParameterSpecification(); - takeSqlParameter = Parameter.Placeholder; - takeSqlParameter.BackTrack = takeParameter.GetIdsForBackTrack(sessionFactory).First(); - parameterSpecs.Add(takeParameter); - } - // The dialect can move the given parameters where he need, what it can't do is generates new parameters loosing the BackTrack. - return dialect.GetLimitString(sqlString, skip, take, skipSqlParameter, takeSqlParameter); - } - return sqlString; - } } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Loader/Custom/CustomLoader.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Loader/Custom/CustomLoader.cs 2011-06-13 12:51:47 UTC (rev 5919) +++ trunk/nhibernate/src/NHibernate/Loader/Custom/CustomLoader.cs 2011-06-13 13:04:23 UTC (rev 5920) @@ -374,43 +374,6 @@ return new SqlCommand.SqlCommandImpl(sqlString, parameterSpecs, queryParameters, session.Factory); } - private SqlString AddLimitsParametersIfNeeded(SqlString sqlString, ICollection<IParameterSpecification> parameterSpecs, QueryParameters queryParameters, ISessionImplementor session) - { - var sessionFactory = session.Factory; - Dialect.Dialect dialect = sessionFactory.Dialect; - - RowSelection selection = queryParameters.RowSelection; - bool useLimit = UseLimit(selection, dialect); - if (useLimit) - { - bool hasFirstRow = GetFirstRow(selection) > 0; - bool useOffset = hasFirstRow && dialect.SupportsLimitOffset; - int max = GetMaxOrLimit(dialect, selection); - int? skip = useOffset ? (int?)dialect.GetOffsetValue(GetFirstRow(selection)) : null; - int? take = max != int.MaxValue ? (int?)max : null; - - Parameter skipSqlParameter = null; - Parameter takeSqlParameter = null; - if (skip.HasValue) - { - var skipParameter = new QuerySkipParameterSpecification(); - skipSqlParameter = Parameter.Placeholder; - skipSqlParameter.BackTrack = skipParameter.GetIdsForBackTrack(sessionFactory).First(); - parameterSpecs.Add(skipParameter); - } - if (take.HasValue) - { - var takeParameter = new QueryTakeParameterSpecification(); - takeSqlParameter = Parameter.Placeholder; - takeSqlParameter.BackTrack = takeParameter.GetIdsForBackTrack(sessionFactory).First(); - parameterSpecs.Add(takeParameter); - } - // The dialect can move the given parameters where he need, what it can't do is generates new parameters loosing the BackTrack. - return dialect.GetLimitString(sqlString, skip, take, skipSqlParameter, takeSqlParameter); - } - return sqlString; - } - public IType[] ResultTypes { get { return resultTypes; } Modified: trunk/nhibernate/src/NHibernate/Loader/Loader.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Loader/Loader.cs 2011-06-13 12:51:47 UTC (rev 5919) +++ trunk/nhibernate/src/NHibernate/Loader/Loader.cs 2011-06-13 13:04:23 UTC (rev 5920) @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Data; using System.Diagnostics; +using System.Linq; using System.Runtime.CompilerServices; using Iesi.Collections; using Iesi.Collections.Generic; @@ -13,8 +14,10 @@ using NHibernate.Engine; using NHibernate.Event; using NHibernate.Exceptions; +using NHibernate.Hql.Classic; using NHibernate.Hql.Util; using NHibernate.Impl; +using NHibernate.Param; using NHibernate.Persister.Collection; using NHibernate.Persister.Entity; using NHibernate.Proxy; @@ -1753,43 +1756,157 @@ #region NHibernate specific - public virtual SqlCommandInfo GetQueryStringAndTypes(ISessionImplementor session, QueryParameters parameters, int startParameterIndex) + public virtual ISqlCommand CreateSqlCommand(QueryParameters queryParameters, ISessionImplementor session) { - SqlString sqlString = ProcessFilters(parameters, session); - Dialect.Dialect dialect = session.Factory.Dialect; + throw new NotSupportedException("This loader does not support extraction of single command."); + } - RowSelection selection = parameters.RowSelection; - bool useLimit = UseLimit(selection, dialect); - bool hasFirstRow = GetFirstRow(selection) > 0; - bool useOffset = hasFirstRow && useLimit && dialect.SupportsLimitOffset; - int limitParameterCount = GetFirstLimitParameterCount(dialect, useLimit, hasFirstRow, useOffset); + protected void AdjustQueryParametersForSubSelectFetching(SqlString sqlString, IEnumerable<IParameterSpecification> parameterSpecs, ISessionImplementor session, QueryParameters queryParameters) + { + // TODO: Remove this when all parameters are managed using IParameterSpecification (QueryParameters does not need to have decomposed values for filters) - SqlType[] sqlTypes = parameters.PrepareParameterTypes(sqlString, Factory, GetNamedParameterLocs, startParameterIndex + limitParameterCount, useLimit, useOffset); + var dynamicFilterParameterSpecifications = parameterSpecs.OfType<DynamicFilterParameterSpecification>().ToList(); + var filteredParameterValues = new List<object>(); + var filteredParameterTypes = new List<IType>(); + var filteredParameterLocations = new List<int>(); - if (useLimit) + if (dynamicFilterParameterSpecifications.Count != 0) { - int? offset = GetOffsetUsingDialect(selection, dialect); - int? limit = GetLimitUsingDialect(selection, dialect); - Parameter offsetParameter = parameters.OffsetParameterIndex.HasValue ? Parameter.WithIndex(parameters.OffsetParameterIndex.Value) : null; - Parameter limitParameter = parameters.LimitParameterIndex.HasValue ? Parameter.WithIndex(parameters.LimitParameterIndex.Value) : null; - sqlString = - dialect.GetLimitString( - sqlString.Trim(), - useOffset ? offset : null, - limit, - useOffset ? offsetParameter : null, - limitParameter); - } + var sqlQueryParametersList = sqlString.GetParameters().ToList(); + foreach (DynamicFilterParameterSpecification specification in dynamicFilterParameterSpecifications) + { + string backTrackId = specification.GetIdsForBackTrack(session.Factory).First(); + object value = session.GetFilterParameterValue(specification.FilterParameterFullName); + var elementType = specification.ExpectedType; + foreach (int position in sqlQueryParametersList.GetEffectiveParameterLocations(backTrackId)) + { + filteredParameterValues.Add(value); + filteredParameterTypes.Add(elementType); + filteredParameterLocations.Add(position); + } + } + } - sqlString = PreprocessSQL(sqlString, parameters, dialect); - return new SqlCommandInfo(sqlString, sqlTypes); + queryParameters.ProcessedSql = sqlString; + queryParameters.FilteredParameterLocations = filteredParameterLocations; + queryParameters.FilteredParameterTypes = filteredParameterTypes; + queryParameters.FilteredParameterValues = filteredParameterValues; } - public virtual ISqlCommand CreateSqlCommand(QueryParameters queryParameters, ISessionImplementor session) + protected SqlString ExpandDynamicFilterParameters(SqlString sqlString, ICollection<IParameterSpecification> parameterSpecs, ISessionImplementor session) { - throw new NotSupportedException("This loader does not support extraction of single command."); + var enabledFilters = session.EnabledFilters; + if (enabledFilters.Count == 0 || sqlString.ToString().IndexOf(ParserHelper.HqlVariablePrefix) < 0) + { + return sqlString; + } + + Dialect.Dialect dialect = session.Factory.Dialect; + string symbols = ParserHelper.HqlSeparators + dialect.OpenQuote + dialect.CloseQuote; + + var originSql = sqlString.Compact(); + var result = new SqlStringBuilder(); + foreach (var sqlPart in originSql.Parts) + { + var parameter = sqlPart as Parameter; + if (parameter != null) + { + result.Add(parameter); + continue; + } + + var sqlFragment = sqlPart.ToString(); + var tokens = new StringTokenizer(sqlFragment, symbols, true); + + foreach (string token in tokens) + { + if (token.StartsWith(ParserHelper.HqlVariablePrefix)) + { + string filterParameterName = token.Substring(1); + string[] parts = StringHelper.ParseFilterParameterName(filterParameterName); + string filterName = parts[0]; + string parameterName = parts[1]; + var filter = (FilterImpl)enabledFilters[filterName]; + + object value = filter.GetParameter(parameterName); + IType type = filter.FilterDefinition.GetParameterType(parameterName); + int parameterColumnSpan = type.GetColumnSpan(session.Factory); + var collectionValue = value as ICollection; + int? collectionSpan = null; + + // Add query chunk + string typeBindFragment = string.Join(", ", Enumerable.Repeat("?", parameterColumnSpan).ToArray()); + string bindFragment; + if (collectionValue != null && !type.ReturnedClass.IsArray) + { + collectionSpan = collectionValue.Count; + bindFragment = string.Join(", ", Enumerable.Repeat(typeBindFragment, collectionValue.Count).ToArray()); + } + else + { + bindFragment = typeBindFragment; + } + + // dynamic-filter parameter tracking + var filterParameterFragment = SqlString.Parse(bindFragment); + var dynamicFilterParameterSpecification = new DynamicFilterParameterSpecification(filterName, parameterName, type, collectionSpan); + var parameters = filterParameterFragment.GetParameters().ToArray(); + var sqlParameterPos = 0; + var paramTrackers = dynamicFilterParameterSpecification.GetIdsForBackTrack(session.Factory); + foreach (var paramTracker in paramTrackers) + { + parameters[sqlParameterPos++].BackTrack = paramTracker; + } + + parameterSpecs.Add(dynamicFilterParameterSpecification); + result.Add(filterParameterFragment); + } + else + { + result.Add(token); + } + } + } + return result.ToSqlString().Compact(); } + protected SqlString AddLimitsParametersIfNeeded(SqlString sqlString, ICollection<IParameterSpecification> parameterSpecs, QueryParameters queryParameters, ISessionImplementor session) + { + var sessionFactory = session.Factory; + Dialect.Dialect dialect = sessionFactory.Dialect; + + RowSelection selection = queryParameters.RowSelection; + bool useLimit = UseLimit(selection, dialect); + if (useLimit) + { + bool hasFirstRow = GetFirstRow(selection) > 0; + bool useOffset = hasFirstRow && dialect.SupportsLimitOffset; + int max = GetMaxOrLimit(dialect, selection); + int? skip = useOffset ? (int?)dialect.GetOffsetValue(GetFirstRow(selection)) : null; + int? take = max != int.MaxValue ? (int?)max : null; + + Parameter skipSqlParameter = null; + Parameter takeSqlParameter = null; + if (skip.HasValue) + { + var skipParameter = new QuerySkipParameterSpecification(); + skipSqlParameter = Parameter.Placeholder; + skipSqlParameter.BackTrack = EnumerableExtensions.First(skipParameter.GetIdsForBackTrack(sessionFactory)); + parameterSpecs.Add(skipParameter); + } + if (take.HasValue) + { + var takeParameter = new QueryTakeParameterSpecification(); + takeSqlParameter = Parameter.Placeholder; + takeSqlParameter.BackTrack = EnumerableExtensions.First(takeParameter.GetIdsForBackTrack(sessionFactory)); + parameterSpecs.Add(takeParameter); + } + // The dialect can move the given parameters where he need, what it can't do is generates new parameters loosing the BackTrack. + return dialect.GetLimitString(sqlString, skip, take, skipSqlParameter, takeSqlParameter); + } + return sqlString; + } + #endregion } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |