|
From: <fab...@us...> - 2011-06-17 16:48:45
|
Revision: 5944
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5944&view=rev
Author: fabiomaulo
Date: 2011-06-17 16:48:39 +0000 (Fri, 17 Jun 2011)
Log Message:
-----------
Collections loaders with parameter specifications
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/Loader/Collection/CollectionLoader.cs
trunk/nhibernate/src/NHibernate/Loader/Entity/AbstractEntityLoader.cs
trunk/nhibernate/src/NHibernate/Loader/Entity/CollectionElementLoader.cs
trunk/nhibernate/src/NHibernate/Loader/OuterJoinLoader.cs
Modified: trunk/nhibernate/src/NHibernate/Loader/Collection/CollectionLoader.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Loader/Collection/CollectionLoader.cs 2011-06-17 13:48:05 UTC (rev 5943)
+++ trunk/nhibernate/src/NHibernate/Loader/Collection/CollectionLoader.cs 2011-06-17 16:48:39 UTC (rev 5944)
@@ -1,6 +1,9 @@
using System.Collections.Generic;
+using System.Linq;
using NHibernate.Engine;
+using NHibernate.Param;
using NHibernate.Persister.Collection;
+using NHibernate.SqlCommand;
using NHibernate.Type;
namespace NHibernate.Loader.Collection
@@ -13,6 +16,7 @@
public class CollectionLoader : OuterJoinLoader, ICollectionInitializer
{
private readonly IQueryableCollection collectionPersister;
+ private IParameterSpecification[] parametersSpecifications;
public CollectionLoader(IQueryableCollection persister, ISessionFactoryImplementor factory,
IDictionary<string, IFilter> enabledFilters) : base(factory, enabledFilters)
@@ -39,5 +43,29 @@
{
return GetType().FullName + '(' + collectionPersister.Role + ')';
}
+
+ protected virtual IEnumerable<IParameterSpecification> CreateParameterSpecificationsAndAssignBackTrack(IEnumerable<Parameter> sqlPatameters)
+ {
+ // This implementation can manage even the case of batch-loading
+ var specifications = new List<IParameterSpecification>();
+ int position = 0;
+ var parameters = sqlPatameters.ToArray();
+ for (var sqlParameterPos = 0; sqlParameterPos < parameters.Length; )
+ {
+ var specification = new PositionalParameterSpecification(1, 0, position++) { ExpectedType = KeyType };
+ var paramTrackers = specification.GetIdsForBackTrack(Factory);
+ foreach (var paramTracker in paramTrackers)
+ {
+ parameters[sqlParameterPos++].BackTrack = paramTracker;
+ }
+ specifications.Add(specification);
+ }
+ return specifications;
+ }
+
+ protected override IEnumerable<IParameterSpecification> GetParameterSpecifications(QueryParameters queryParameters, ISessionFactoryImplementor sessionFactory)
+ {
+ return parametersSpecifications ?? (parametersSpecifications = CreateParameterSpecificationsAndAssignBackTrack(SqlString.GetParameters()).ToArray());
+ }
}
}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate/Loader/Entity/AbstractEntityLoader.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Loader/Entity/AbstractEntityLoader.cs 2011-06-17 13:48:05 UTC (rev 5943)
+++ trunk/nhibernate/src/NHibernate/Loader/Entity/AbstractEntityLoader.cs 2011-06-17 16:48:39 UTC (rev 5944)
@@ -74,12 +74,6 @@
protected IType UniqueKeyType { get; private set; }
- protected override void InitFromWalker(JoinWalker walker)
- {
- base.InitFromWalker(walker);
- parametersSpecifications = CreateParameterSpecificationsAndAssignBackTrack(SqlString.GetParameters()).ToArray();
- }
-
private IEnumerable<IParameterSpecification> CreateParameterSpecificationsAndAssignBackTrack(IEnumerable<Parameter> sqlPatameters)
{
var specifications = new List<IParameterSpecification>();
@@ -100,7 +94,7 @@
protected override IEnumerable<IParameterSpecification> GetParameterSpecifications(QueryParameters queryParameters, ISessionFactoryImplementor sessionFactory)
{
- return parametersSpecifications;
+ return parametersSpecifications ?? (parametersSpecifications = CreateParameterSpecificationsAndAssignBackTrack(SqlString.GetParameters()).ToArray());
}
}
}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate/Loader/Entity/CollectionElementLoader.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Loader/Entity/CollectionElementLoader.cs 2011-06-17 13:48:05 UTC (rev 5943)
+++ trunk/nhibernate/src/NHibernate/Loader/Entity/CollectionElementLoader.cs 2011-06-17 16:48:39 UTC (rev 5944)
@@ -1,10 +1,12 @@
using System.Collections;
using System.Collections.Generic;
using System.Data;
-
+using System.Linq;
using NHibernate.Engine;
+using NHibernate.Param;
using NHibernate.Persister.Collection;
using NHibernate.Persister.Entity;
+using NHibernate.SqlCommand;
using NHibernate.Transform;
using NHibernate.Type;
using NHibernate.Util;
@@ -19,6 +21,7 @@
private readonly IType keyType;
private readonly IType indexType;
private readonly string entityName;
+ private IParameterSpecification[] parametersSpecifications;
public CollectionElementLoader(IQueryableCollection collectionPersister, ISessionFactoryImplementor factory,
IDictionary<string, IFilter> enabledFilters) : base(factory, enabledFilters)
@@ -39,6 +42,28 @@
log.Debug("Static select for entity " + entityName + ": " + SqlString);
}
+ private IEnumerable<IParameterSpecification> CreateParameterSpecificationsAndAssignBackTrack(IEnumerable<Parameter> sqlPatameters)
+ {
+ var specifications = new IParameterSpecification[]
+ {
+ new PositionalParameterSpecification(1, 0, 0) {ExpectedType = keyType},
+ new PositionalParameterSpecification(1, 0, 1) {ExpectedType = indexType},
+ };
+ Parameter[] parameters = sqlPatameters.ToArray();
+ int sqlParameterPos = 0;
+ IEnumerable<string> paramTrackers = specifications.SelectMany(specification => specification.GetIdsForBackTrack(Factory));
+ foreach (string paramTracker in paramTrackers)
+ {
+ parameters[sqlParameterPos++].BackTrack = paramTracker;
+ }
+ return specifications;
+ }
+
+ protected override IEnumerable<IParameterSpecification> GetParameterSpecifications(QueryParameters queryParameters, ISessionFactoryImplementor sessionFactory)
+ {
+ return parametersSpecifications ?? (parametersSpecifications = CreateParameterSpecificationsAndAssignBackTrack(SqlString.GetParameters()).ToArray());
+ }
+
protected override bool IsSingleRowLoader
{
get { return true; }
Modified: trunk/nhibernate/src/NHibernate/Loader/OuterJoinLoader.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Loader/OuterJoinLoader.cs 2011-06-17 13:48:05 UTC (rev 5943)
+++ trunk/nhibernate/src/NHibernate/Loader/OuterJoinLoader.cs 2011-06-17 16:48:39 UTC (rev 5944)
@@ -98,7 +98,7 @@
get { return collectionPersisters; }
}
- protected virtual void InitFromWalker(JoinWalker walker)
+ protected void InitFromWalker(JoinWalker walker)
{
persisters = walker.Persisters;
collectionPersisters = walker.CollectionPersisters;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|