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