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