From: <fab...@us...> - 2011-03-25 20:29:40
|
Revision: 5534 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5534&view=rev Author: fabiomaulo Date: 2011-03-25 20:29:34 +0000 (Fri, 25 Mar 2011) Log Message: ----------- Partial fix NH-2488 Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Persister/Entity/SingleTableEntityPersister.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2488/ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2488/Fixture.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2488/Mappings.hbm.xml trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2488/Model.cs Modified: trunk/nhibernate/src/NHibernate/Persister/Entity/SingleTableEntityPersister.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Persister/Entity/SingleTableEntityPersister.cs 2011-03-25 20:28:08 UTC (rev 5533) +++ trunk/nhibernate/src/NHibernate/Persister/Entity/SingleTableEntityPersister.cs 2011-03-25 20:29:34 UTC (rev 5534) @@ -1,7 +1,7 @@ using System; using System.Collections.Generic; using System.Text; -using Iesi.Collections.Generic; +using System.Linq; using NHibernate.Cache; using NHibernate.Engine; using NHibernate.Mapping; @@ -638,15 +638,16 @@ //note that this method could easily be moved up to BasicEntityPersister, //if we ever needed to reuse it from other subclasses - //figure out which tables need to be fetched + //figure out which tables need to be fetched (only those that contains at least a no-lazy-property) AbstractEntityPersister subclassPersister = (AbstractEntityPersister)persister; - HashedSet<int> tableNumbers = new HashedSet<int>(); + var tableNumbers = new HashSet<int>(); string[] props = subclassPersister.PropertyNames; string[] classes = subclassPersister.PropertySubclassNames; + bool[] propertyLazies = subclassPersister.PropertyLaziness; for (int i = 0; i < props.Length; i++) { int propTableNumber = GetSubclassPropertyTableNumber(props[i], classes[i]); - if (IsSubclassTableSequentialSelect(propTableNumber) && !IsSubclassTableLazy(propTableNumber)) + if (IsSubclassTableSequentialSelect(propTableNumber) && !IsSubclassTableLazy(propTableNumber) && propertyLazies[i] == false) { tableNumbers.Add(propTableNumber); } @@ -654,26 +655,32 @@ if ((tableNumbers.Count == 0)) return null; - //figure out which columns are needed + //figure out which columns are needed (excludes lazy-properties) List<int> columnNumbers = new List<int>(); int[] columnTableNumbers = SubclassColumnTableNumberClosure; + bool[] subclassColumnLaziness = SubclassColumnLaziness; for (int i = 0; i < SubclassColumnClosure.Length; i++) { - if (tableNumbers.Contains(columnTableNumbers[i])) + if (tableNumbers.Contains(columnTableNumbers[i]) && !subclassColumnLaziness[i]) + { columnNumbers.Add(i); + } } - //figure out which formulas are needed + //figure out which formulas are needed (excludes lazy-properties) List<int> formulaNumbers = new List<int>(); int[] formulaTableNumbers = SubclassColumnTableNumberClosure; + bool[] subclassFormulaLaziness = SubclassFormulaLaziness; for (int i = 0; i < SubclassFormulaTemplateClosure.Length; i++) { - if (tableNumbers.Contains(formulaTableNumbers[i])) + if (tableNumbers.Contains(formulaTableNumbers[i]) && !subclassFormulaLaziness[i]) + { formulaNumbers.Add(i); + } } //render the SQL - return RenderSelect(ArrayHelper.ToIntArray(tableNumbers), columnNumbers.ToArray(), formulaNumbers.ToArray()); + return RenderSelect(tableNumbers.ToArray(), columnNumbers.ToArray(), formulaNumbers.ToArray()); } protected override string[] GetSubclassTableKeyColumns(int j) Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2488/Fixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2488/Fixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2488/Fixture.cs 2011-03-25 20:29:34 UTC (rev 5534) @@ -0,0 +1,136 @@ +using System; +using System.Collections.Generic; +using NUnit.Framework; +using SharpTestsEx; + +namespace NHibernate.Test.NHSpecificTest.NH2488 +{ + public class Fixture : BugTestCase + { + #region Scenarios + + private class FetchSelectScenario: IDisposable + { + private readonly ISessionFactory factory; + + public FetchSelectScenario(ISessionFactory factory) + { + this.factory = factory; + using (ISession s = factory.OpenSession()) + { + using (ITransaction t = s.BeginTransaction()) + { + var entity = new Derived1 + { + ShortContent = "Short", + LongContent = "LongLongLongLongLong", + }; + s.Save(entity); + t.Commit(); + } + } + } + + public void Dispose() + { + using (ISession s = factory.OpenSession()) + { + using (ITransaction t = s.BeginTransaction()) + { + s.Delete("from Derived1"); + t.Commit(); + } + } + } + } + private class FetchJoinScenario : IDisposable + { + private readonly ISessionFactory factory; + + public FetchJoinScenario(ISessionFactory factory) + { + this.factory = factory; + using (ISession s = factory.OpenSession()) + { + using (ITransaction t = s.BeginTransaction()) + { + var entity = new Derived2 + { + ShortContent = "Short", + LongContent = "LongLongLongLongLong", + }; + s.Save(entity); + t.Commit(); + } + } + } + + public void Dispose() + { + using (ISession s = factory.OpenSession()) + { + using (ITransaction t = s.BeginTransaction()) + { + s.Delete("from Derived2"); + t.Commit(); + } + } + } + } + + #endregion + + [Test, Ignore("Not fixed yet")] + public void ShouldNotQueryLazyProperties_FetchJoin() + { + using (new FetchJoinScenario(Sfi)) + { + using (ISession s = OpenSession()) + { + using (ITransaction t = s.BeginTransaction()) + { + IList<Base2> items; + using (var ls = new SqlLogSpy()) + { + items = s.CreateQuery("from Base2").List<Base2>(); + ls.GetWholeLog().Should().Not.Contain("LongContent"); + } + var item = (Derived2) items[0]; + NHibernateUtil.IsPropertyInitialized(item, "LongContent").Should().Be.False(); + string lc = item.LongContent; + lc.Should().Not.Be.NullOrEmpty(); + NHibernateUtil.IsPropertyInitialized(item, "LongContent").Should().Be.True(); + } + } + } + } + + [Test] + public void ShouldNotQueryLazyProperties_FetchSelect() + { + // this is the real meat of the test + // for most edifying results, run this with show_sql enabled + + using (new FetchSelectScenario(Sfi)) + { + using (ISession s = OpenSession()) + { + using (ITransaction t = s.BeginTransaction()) + { + IList<Base1> items; + using(var ls = new SqlLogSpy()) + { + items = s.CreateQuery("from Base1").List<Base1>(); + ls.GetWholeLog().Should().Not.Contain("LongContent"); + } + var item = (Derived1) items[0]; + NHibernateUtil.IsPropertyInitialized(item, "LongContent").Should().Be.False(); + string lc = item.LongContent; + lc.Should().Not.Be.NullOrEmpty(); + NHibernateUtil.IsPropertyInitialized(item, "LongContent").Should().Be.True(); + } + } + } + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2488/Mappings.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2488/Mappings.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2488/Mappings.hbm.xml 2011-03-25 20:29:34 UTC (rev 5534) @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" + namespace="NHibernate.Test.NHSpecificTest.NH2488" + assembly="NHibernate.Test" +> + <class name="Base1" abstract="true"> + <id name="Id"> + <generator class="increment"/> + </id> + <discriminator column="Discriminator" type="String" /> + <property name="ShortContent"/> + </class> + <subclass name="Derived1" extends="Base1" discriminator-value="Derived1"> + <join table="Derived1" fetch="select"> + <key column="Id" /> + <property name="LongContent" lazy="true" not-null="true" /> + </join> + </subclass> + <class name="Base2" abstract="true"> + <id name="Id"> + <generator class="increment"/> + </id> + <discriminator column="Discriminator" type="String" /> + <property name="ShortContent"/> + </class> + <subclass name="Derived2" extends="Base2" discriminator-value="Derived2"> + <join table="Derived2" fetch="join"> + <key column="Id" /> + <property name="LongContent" lazy="true" not-null="true" /> + </join> + </subclass> +</hibernate-mapping> \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2488/Model.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2488/Model.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2488/Model.cs 2011-03-25 20:29:34 UTC (rev 5534) @@ -0,0 +1,26 @@ +namespace NHibernate.Test.NHSpecificTest.NH2488 +{ + public class Base1 + { + public virtual int Id { get; set; } + + public virtual string ShortContent { get; set; } + } + + public class Base2 + { + public virtual int Id { get; set; } + + public virtual string ShortContent { get; set; } + } + + public class Derived1 : Base1 + { + public virtual string LongContent { get; set; } + } + + public class Derived2 : Base2 + { + public virtual string LongContent { get; set; } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-03-25 20:28:08 UTC (rev 5533) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-03-25 20:29:34 UTC (rev 5534) @@ -654,6 +654,8 @@ <Compile Include="NHSpecificTest\NH2470\DTO.cs" /> <Compile Include="NHSpecificTest\NH2484\Fixture.cs" /> <Compile Include="NHSpecificTest\NH2484\Model.cs" /> + <Compile Include="NHSpecificTest\NH2488\Fixture.cs" /> + <Compile Include="NHSpecificTest\NH2488\Model.cs" /> <Compile Include="NHSpecificTest\NH2490\Fixture.cs" /> <Compile Include="NHSpecificTest\NH2490\Model.cs" /> <Compile Include="NHSpecificTest\NH2491\Fixture.cs" /> @@ -2492,6 +2494,7 @@ <EmbeddedResource Include="NHSpecificTest\NH1291AnonExample\Mappings.hbm.xml" /> </ItemGroup> <ItemGroup> + <EmbeddedResource Include="NHSpecificTest\NH2488\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2490\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1925\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2527\Mappings.hbm.xml" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |