diff --git a/src/NHibernate.Test/Async/Criteria/SelectModeTest/SelectModeTest.cs b/src/NHibernate.Test/Async/Criteria/SelectModeTest/SelectModeTest.cs index b9b0302043c..c9446e1dd6d 100644 --- a/src/NHibernate.Test/Async/Criteria/SelectModeTest/SelectModeTest.cs +++ b/src/NHibernate.Test/Async/Criteria/SelectModeTest/SelectModeTest.cs @@ -480,6 +480,72 @@ public async Task OrderedInnerJoinFetchAsync() } } + //GH-2440 + [Test] + public async Task FetchWithAliasedJoinFutureAsync() + { + using (var session = OpenSession()) + { + EntityComplex alias = null; + EntitySimpleChild child1 = null; + var list = (await (session.QueryOver(() => alias) + .Where(ec => ec.Id == _parentEntityComplexId) + .JoinQueryOver(() => alias.Child1, () => child1) + .Fetch(SelectMode.Fetch, () => alias.ChildrenList) + .TransformUsing(Transformers.DistinctRootEntity) + .Future() + .GetEnumerableAsync())) + .ToList(); + + var childList = list[0].ChildrenList; + Assert.That(list[0].ChildrenList.Count, Is.GreaterThan(1)); + Assert.That(list[0].ChildrenList, Is.EqualTo(list[0].ChildrenList.OrderByDescending(c => c.OrderIdx)), "wrong order"); + } + } + + //GH-2440 + [Test] + public async Task CacheableFetchWithAliasedJoinFutureAsync() + { + using (var session = OpenSession()) + { + EntityComplex alias = null; + EntitySimpleChild child1 = null; + var list = (await (session.QueryOver(() => alias) + .Where(ec => ec.Id == _parentEntityComplexId) + .JoinQueryOver(() => alias.Child1, () => child1) + .Fetch(SelectMode.Fetch, () => alias.ChildrenList) + .TransformUsing(Transformers.DistinctRootEntity) + .Cacheable() + .Future() + .GetEnumerableAsync())) + .ToList(); + EntityComplex value = null; + Assert.DoesNotThrow(() => value = list[0]); + Assert.That(value, Is.Not.Null); + } + + using (var sqlLog = new SqlLogSpy()) + using (var session = OpenSession()) + { + EntityComplex alias = null; + EntitySimpleChild child1 = null; + var list = session.QueryOver(() => alias) + .Where(ec => ec.Id == _parentEntityComplexId) + .JoinQueryOver(() => alias.Child1, () => child1) + .Fetch(SelectMode.Fetch, () => alias.ChildrenList) + .TransformUsing(Transformers.DistinctRootEntity) + .Cacheable() + .Future() + .ToList(); + EntityComplex value = null; + Assert.DoesNotThrow(() => value = list[0]); + Assert.That(value, Is.Not.Null); + + Assert.That(sqlLog.Appender.GetEvents().Length, Is.EqualTo(0), "Query is expected to be retrieved from cache"); + } + } + [Test, Obsolete] public async Task FetchModeEagerForLazyAsync() { diff --git a/src/NHibernate.Test/Criteria/SelectModeTest/SelectModeTest.cs b/src/NHibernate.Test/Criteria/SelectModeTest/SelectModeTest.cs index 4e8d4d5c923..0fcaa767920 100644 --- a/src/NHibernate.Test/Criteria/SelectModeTest/SelectModeTest.cs +++ b/src/NHibernate.Test/Criteria/SelectModeTest/SelectModeTest.cs @@ -511,6 +511,72 @@ public void OrderedInnerJoinFetch() } } + //GH-2440 + [Test] + public void FetchWithAliasedJoinFuture() + { + using (var session = OpenSession()) + { + EntityComplex alias = null; + EntitySimpleChild child1 = null; + var list = session.QueryOver(() => alias) + .Where(ec => ec.Id == _parentEntityComplexId) + .JoinQueryOver(() => alias.Child1, () => child1) + .Fetch(SelectMode.Fetch, () => alias.ChildrenList) + .TransformUsing(Transformers.DistinctRootEntity) + .Future() + .GetEnumerable() + .ToList(); + + var childList = list[0].ChildrenList; + Assert.That(list[0].ChildrenList.Count, Is.GreaterThan(1)); + Assert.That(list[0].ChildrenList, Is.EqualTo(list[0].ChildrenList.OrderByDescending(c => c.OrderIdx)), "wrong order"); + } + } + + //GH-2440 + [Test] + public void CacheableFetchWithAliasedJoinFuture() + { + using (var session = OpenSession()) + { + EntityComplex alias = null; + EntitySimpleChild child1 = null; + var list = session.QueryOver(() => alias) + .Where(ec => ec.Id == _parentEntityComplexId) + .JoinQueryOver(() => alias.Child1, () => child1) + .Fetch(SelectMode.Fetch, () => alias.ChildrenList) + .TransformUsing(Transformers.DistinctRootEntity) + .Cacheable() + .Future() + .GetEnumerable() + .ToList(); + EntityComplex value = null; + Assert.DoesNotThrow(() => value = list[0]); + Assert.That(value, Is.Not.Null); + } + + using (var sqlLog = new SqlLogSpy()) + using (var session = OpenSession()) + { + EntityComplex alias = null; + EntitySimpleChild child1 = null; + var list = session.QueryOver(() => alias) + .Where(ec => ec.Id == _parentEntityComplexId) + .JoinQueryOver(() => alias.Child1, () => child1) + .Fetch(SelectMode.Fetch, () => alias.ChildrenList) + .TransformUsing(Transformers.DistinctRootEntity) + .Cacheable() + .Future() + .ToList(); + EntityComplex value = null; + Assert.DoesNotThrow(() => value = list[0]); + Assert.That(value, Is.Not.Null); + + Assert.That(sqlLog.Appender.GetEvents().Length, Is.EqualTo(0), "Query is expected to be retrieved from cache"); + } + } + [Test, Obsolete] public void FetchModeEagerForLazy() { diff --git a/src/NHibernate/Async/Multi/QueryBatchItemBase.cs b/src/NHibernate/Async/Multi/QueryBatchItemBase.cs index a15dc80cf27..e590cc77f6f 100644 --- a/src/NHibernate/Async/Multi/QueryBatchItemBase.cs +++ b/src/NHibernate/Async/Multi/QueryBatchItemBase.cs @@ -76,7 +76,7 @@ public async Task ProcessResultsSetAsync(DbDataReader reader, CancellationT var lockModeArray = loader.GetLockModes(queryParameters.LockModes); var optionalObjectKey = Loader.Loader.GetOptionalObjectKey(queryParameters, Session); var tmpResults = new List(); - var queryCacheBuilder = new QueryCacheResultBuilder(loader); + var queryCacheBuilder = queryInfo.IsCacheable ? new QueryCacheResultBuilder(loader) : null; var cacheBatcher = queryInfo.CacheBatcher; var ownCacheBatcher = cacheBatcher == null; if (ownCacheBatcher) diff --git a/src/NHibernate/Multi/QueryBatchItemBase.cs b/src/NHibernate/Multi/QueryBatchItemBase.cs index b63dd679ed1..5a0123650f3 100644 --- a/src/NHibernate/Multi/QueryBatchItemBase.cs +++ b/src/NHibernate/Multi/QueryBatchItemBase.cs @@ -222,7 +222,7 @@ public int ProcessResultsSet(DbDataReader reader) var lockModeArray = loader.GetLockModes(queryParameters.LockModes); var optionalObjectKey = Loader.Loader.GetOptionalObjectKey(queryParameters, Session); var tmpResults = new List(); - var queryCacheBuilder = new QueryCacheResultBuilder(loader); + var queryCacheBuilder = queryInfo.IsCacheable ? new QueryCacheResultBuilder(loader) : null; var cacheBatcher = queryInfo.CacheBatcher; var ownCacheBatcher = cacheBatcher == null; if (ownCacheBatcher)