You can subscribe to this list here.
2004 |
Jan
|
Feb
|
Mar
|
Apr
(248) |
May
(82) |
Jun
(90) |
Jul
(177) |
Aug
(253) |
Sep
(157) |
Oct
(151) |
Nov
(143) |
Dec
(278) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2005 |
Jan
(152) |
Feb
(107) |
Mar
(177) |
Apr
(133) |
May
(259) |
Jun
(81) |
Jul
(119) |
Aug
(306) |
Sep
(416) |
Oct
(240) |
Nov
(329) |
Dec
(206) |
2006 |
Jan
(466) |
Feb
(382) |
Mar
(153) |
Apr
(162) |
May
(133) |
Jun
(21) |
Jul
(18) |
Aug
(37) |
Sep
(97) |
Oct
(114) |
Nov
(110) |
Dec
(28) |
2007 |
Jan
(74) |
Feb
(65) |
Mar
(49) |
Apr
(76) |
May
(43) |
Jun
(15) |
Jul
(68) |
Aug
(55) |
Sep
(63) |
Oct
(59) |
Nov
(70) |
Dec
(66) |
2008 |
Jan
(71) |
Feb
(60) |
Mar
(120) |
Apr
(31) |
May
(48) |
Jun
(81) |
Jul
(107) |
Aug
(51) |
Sep
(80) |
Oct
(83) |
Nov
(83) |
Dec
(79) |
2009 |
Jan
(83) |
Feb
(110) |
Mar
(97) |
Apr
(91) |
May
(291) |
Jun
(250) |
Jul
(197) |
Aug
(58) |
Sep
(54) |
Oct
(122) |
Nov
(68) |
Dec
(34) |
2010 |
Jan
(50) |
Feb
(17) |
Mar
(63) |
Apr
(61) |
May
(84) |
Jun
(81) |
Jul
(138) |
Aug
(144) |
Sep
(78) |
Oct
(26) |
Nov
(30) |
Dec
(61) |
2011 |
Jan
(33) |
Feb
(35) |
Mar
(166) |
Apr
(221) |
May
(109) |
Jun
(76) |
Jul
(27) |
Aug
(37) |
Sep
(1) |
Oct
(4) |
Nov
(2) |
Dec
(1) |
2012 |
Jan
|
Feb
|
Mar
(2) |
Apr
(2) |
May
|
Jun
|
Jul
(1) |
Aug
|
Sep
(1) |
Oct
|
Nov
(1) |
Dec
|
2013 |
Jan
|
Feb
(1) |
Mar
|
Apr
|
May
|
Jun
|
Jul
(1) |
Aug
(1) |
Sep
(3) |
Oct
(2) |
Nov
|
Dec
(1) |
2014 |
Jan
(1) |
Feb
(1) |
Mar
(3) |
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: <fab...@us...> - 2011-04-02 19:14:14
|
Revision: 5578 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5578&view=rev Author: fabiomaulo Date: 2011-04-02 19:14:08 +0000 (Sat, 02 Apr 2011) Log Message: ----------- union-subclass classes registration Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Mapping/ByCode/ExplicitlyDeclaredModel.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExplicitlyDeclaredModelTests/UnionSubclassMappingStrategyTests.cs Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/ExplicitlyDeclaredModel.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/ExplicitlyDeclaredModel.cs 2011-04-02 19:06:54 UTC (rev 5577) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/ExplicitlyDeclaredModel.cs 2011-04-02 19:14:08 UTC (rev 5578) @@ -155,7 +155,7 @@ { throw new MappingException(string.Format("Abiguous mapping of {0}. It was registered as root-entity and as subclass for table-per-class strategy", type.FullName)); } - if (IsMappedFor(tablePerClassHierarchyEntities, type)) + if (IsMappedFor(tablePerClassHierarchyEntities, type) || IsMappedFor(tablePerConcreteClassEntities, type)) { throw new MappingException(string.Format("Abiguous mapping of {0}. It was registered with more than one class-hierarchy strategy", type.FullName)); } @@ -172,7 +172,7 @@ { throw new MappingException(string.Format("Abiguous mapping of {0}. It was registered as root-entity and as subclass for table-per-class-hierarchy strategy", type.FullName)); } - if (IsMappedFor(tablePerClassEntities, type) || tablePerClassHierarchyJoinEntities.Contains(type)) + if (IsMappedFor(tablePerClassEntities, type) || tablePerClassHierarchyJoinEntities.Contains(type) || IsMappedFor(tablePerConcreteClassEntities, type)) { throw new MappingException(string.Format("Abiguous mapping of {0}. It was registered with more than one class-hierarchy strategy", type.FullName)); } @@ -189,7 +189,7 @@ { throw new MappingException(string.Format("Abiguous mapping of {0}. It was registered as root-entity and as subclass for table-per-class-hierarchy strategy", type.FullName)); } - if (IsMappedFor(tablePerClassEntities, type) || IsMappedFor(tablePerClassHierarchyEntities, type)) + if (IsMappedFor(tablePerClassEntities, type) || IsMappedFor(tablePerClassHierarchyEntities, type) || IsMappedFor(tablePerConcreteClassEntities, type)) { throw new MappingException(string.Format("Abiguous mapping of {0}. It was registered with more than one class-hierarchy strategy", type.FullName)); } @@ -345,7 +345,7 @@ public bool IsTablePerConcreteClass(System.Type type) { - return tablePerConcreteClassEntities.Contains(type); + return IsMappedFor(tablePerConcreteClassEntities, type); } public bool IsOneToOne(MemberInfo member) Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExplicitlyDeclaredModelTests/UnionSubclassMappingStrategyTests.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExplicitlyDeclaredModelTests/UnionSubclassMappingStrategyTests.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExplicitlyDeclaredModelTests/UnionSubclassMappingStrategyTests.cs 2011-04-02 19:14:08 UTC (rev 5578) @@ -0,0 +1,78 @@ +using NHibernate.Mapping.ByCode; +using NUnit.Framework; +using SharpTestsEx; + +namespace NHibernate.Test.MappingByCode.ExplicitlyDeclaredModelTests +{ + public class UnionSubclassMappingStrategyTests + { + private class MyClass + { + + } + private class Inherited1 : MyClass + { + + } + private class Inherited2 : Inherited1 + { + + } + + [Test] + public void WhenRegisteredAsUnionSubclassThenIsRegistered() + { + var inspector = new ExplicitlyDeclaredModel(); + inspector.AddAsRootEntity(typeof(MyClass)); + inspector.AddAsTablePerConcreteClassEntity(typeof(Inherited1)); + + inspector.IsTablePerClass(typeof(Inherited1)).Should().Be.False(); + inspector.IsTablePerClassHierarchy(typeof(Inherited1)).Should().Be.False(); + inspector.IsTablePerClassHierarchyJoin(typeof(Inherited1)).Should().Be.False(); + inspector.IsTablePerConcreteClass(typeof(Inherited1)).Should().Be.True(); + } + + [Test] + public void WhenRegisteredAsDeepUnionSubclassThenIsRegistered() + { + var inspector = new ExplicitlyDeclaredModel(); + inspector.AddAsRootEntity(typeof(MyClass)); + inspector.AddAsTablePerConcreteClassEntity(typeof(Inherited2)); + + inspector.IsTablePerClass(typeof(Inherited2)).Should().Be.False(); + inspector.IsTablePerClassHierarchy(typeof(Inherited2)).Should().Be.False(); + inspector.IsTablePerClassHierarchyJoin(typeof(Inherited2)).Should().Be.False(); + inspector.IsTablePerConcreteClass(typeof(Inherited2)).Should().Be.True(); + } + + [Test] + public void WhenRegisteredAsUnionSubclassThenCantRegisterAsSubclass() + { + var inspector = new ExplicitlyDeclaredModel(); + inspector.AddAsRootEntity(typeof(MyClass)); + inspector.AddAsTablePerConcreteClassEntity(typeof(Inherited1)); + + inspector.Executing(x => x.AddAsTablePerClassHierarchyEntity(typeof(Inherited1))).Throws<MappingException>(); + } + + [Test] + public void WhenRegisteredAsUnionSubclassThenCantRegisterAsSubclassJoin() + { + var inspector = new ExplicitlyDeclaredModel(); + inspector.AddAsRootEntity(typeof(MyClass)); + inspector.AddAsTablePerConcreteClassEntity(typeof(Inherited1)); + + inspector.Executing(x => x.AddAsTablePerClassHierarchyJoinEntity(typeof(Inherited1))).Throws<MappingException>(); + } + + [Test] + public void WhenRegisteredAsUnionSubclassThenCantRegisterAsJoinedSubclass() + { + var inspector = new ExplicitlyDeclaredModel(); + inspector.AddAsRootEntity(typeof(MyClass)); + inspector.AddAsTablePerConcreteClassEntity(typeof(Inherited1)); + + inspector.Executing(x => x.AddAsTablePerClassEntity(typeof(Inherited1))).Throws<MappingException>(); + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-02 19:06:54 UTC (rev 5577) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-02 19:14:08 UTC (rev 5578) @@ -512,6 +512,7 @@ <Compile Include="MappingByCode\ExplicitlyDeclaredModelTests\RootClassMappingStrategyTests.cs" /> <Compile Include="MappingByCode\ExplicitlyDeclaredModelTests\SubclassJoinMappingStrategyTests.cs" /> <Compile Include="MappingByCode\ExplicitlyDeclaredModelTests\SubclassMappingStrategyTests.cs" /> + <Compile Include="MappingByCode\ExplicitlyDeclaredModelTests\UnionSubclassMappingStrategyTests.cs" /> <Compile Include="MappingByCode\MappingOfPrivateMembersOnRootEntity.cs" /> <Compile Include="NHSpecificTest\AccessAndCorrectPropertyName\Fixture.cs" /> <Compile Include="NHSpecificTest\AccessAndCorrectPropertyName\Model.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2011-04-02 19:07:01
|
Revision: 5577 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5577&view=rev Author: fabiomaulo Date: 2011-04-02 19:06:54 +0000 (Sat, 02 Apr 2011) Log Message: ----------- subclass-join classes registration Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Mapping/ByCode/ExplicitlyDeclaredModel.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExplicitlyDeclaredModelTests/SubclassJoinMappingStrategyTests.cs Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/ExplicitlyDeclaredModel.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/ExplicitlyDeclaredModel.cs 2011-04-02 18:58:51 UTC (rev 5576) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/ExplicitlyDeclaredModel.cs 2011-04-02 19:06:54 UTC (rev 5577) @@ -172,7 +172,7 @@ { throw new MappingException(string.Format("Abiguous mapping of {0}. It was registered as root-entity and as subclass for table-per-class-hierarchy strategy", type.FullName)); } - if(IsMappedFor(tablePerClassEntities, type)) + if (IsMappedFor(tablePerClassEntities, type) || tablePerClassHierarchyJoinEntities.Contains(type)) { throw new MappingException(string.Format("Abiguous mapping of {0}. It was registered with more than one class-hierarchy strategy", type.FullName)); } Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExplicitlyDeclaredModelTests/SubclassJoinMappingStrategyTests.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExplicitlyDeclaredModelTests/SubclassJoinMappingStrategyTests.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExplicitlyDeclaredModelTests/SubclassJoinMappingStrategyTests.cs 2011-04-02 19:06:54 UTC (rev 5577) @@ -0,0 +1,78 @@ +using NHibernate.Mapping.ByCode; +using NUnit.Framework; +using SharpTestsEx; + +namespace NHibernate.Test.MappingByCode.ExplicitlyDeclaredModelTests +{ + public class SubclassJoinMappingStrategyTests + { + private class MyClass + { + + } + private class Inherited1 : MyClass + { + + } + private class Inherited2 : Inherited1 + { + + } + + [Test] + public void WhenRegisteredAsSubclassJoinThenIsRegistered() + { + var inspector = new ExplicitlyDeclaredModel(); + inspector.AddAsRootEntity(typeof(MyClass)); + inspector.AddAsTablePerClassHierarchyJoinEntity(typeof(Inherited1)); + + inspector.IsTablePerClass(typeof(Inherited1)).Should().Be.False(); + inspector.IsTablePerClassHierarchy(typeof(Inherited1)).Should().Be.True(); + inspector.IsTablePerClassHierarchyJoin(typeof(Inherited1)).Should().Be.True(); + inspector.IsTablePerConcreteClass(typeof(Inherited1)).Should().Be.False(); + } + + [Test] + public void WhenRegisteredAsDeepSubclassJoinThenIsRegistered() + { + var inspector = new ExplicitlyDeclaredModel(); + inspector.AddAsRootEntity(typeof(MyClass)); + inspector.AddAsTablePerClassHierarchyJoinEntity(typeof(Inherited2)); + + inspector.IsTablePerClass(typeof(Inherited2)).Should().Be.False(); + inspector.IsTablePerClassHierarchy(typeof(Inherited2)).Should().Be.True(); + inspector.IsTablePerClassHierarchyJoin(typeof(Inherited2)).Should().Be.True(); + inspector.IsTablePerConcreteClass(typeof(Inherited2)).Should().Be.False(); + } + + [Test] + public void WhenRegisteredAsSubclassJoinThenCantRegisterAsJoinedSubclass() + { + var inspector = new ExplicitlyDeclaredModel(); + inspector.AddAsRootEntity(typeof(MyClass)); + inspector.AddAsTablePerClassHierarchyJoinEntity(typeof(Inherited1)); + + inspector.Executing(x => x.AddAsTablePerClassEntity(typeof(Inherited1))).Throws<MappingException>(); + } + + [Test] + public void WhenRegisteredAsSubclassJoinThenCantRegisterAsSubclass() + { + var inspector = new ExplicitlyDeclaredModel(); + inspector.AddAsRootEntity(typeof(MyClass)); + inspector.AddAsTablePerClassHierarchyJoinEntity(typeof(Inherited1)); + + inspector.Executing(x => x.AddAsTablePerClassHierarchyEntity(typeof(Inherited1))).Throws<MappingException>(); + } + + [Test] + public void WhenRegisteredAsSubclassJoinThenCantRegisterAsUnionSubclass() + { + var inspector = new ExplicitlyDeclaredModel(); + inspector.AddAsRootEntity(typeof(MyClass)); + inspector.AddAsTablePerClassHierarchyJoinEntity(typeof(Inherited1)); + + inspector.Executing(x => x.AddAsTablePerConcreteClassEntity(typeof(Inherited1))).Throws<MappingException>(); + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-02 18:58:51 UTC (rev 5576) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-02 19:06:54 UTC (rev 5577) @@ -510,6 +510,7 @@ <Compile Include="MappingByCode\ColumnsNamingConvetions.cs" /> <Compile Include="MappingByCode\ExplicitlyDeclaredModelTests\JoinedSubclassMappingStrategyTests.cs" /> <Compile Include="MappingByCode\ExplicitlyDeclaredModelTests\RootClassMappingStrategyTests.cs" /> + <Compile Include="MappingByCode\ExplicitlyDeclaredModelTests\SubclassJoinMappingStrategyTests.cs" /> <Compile Include="MappingByCode\ExplicitlyDeclaredModelTests\SubclassMappingStrategyTests.cs" /> <Compile Include="MappingByCode\MappingOfPrivateMembersOnRootEntity.cs" /> <Compile Include="NHSpecificTest\AccessAndCorrectPropertyName\Fixture.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2011-04-02 18:58:57
|
Revision: 5576 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5576&view=rev Author: fabiomaulo Date: 2011-04-02 18:58:51 +0000 (Sat, 02 Apr 2011) Log Message: ----------- subclasses registration Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Mapping/ByCode/ExplicitlyDeclaredModel.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExplicitlyDeclaredModelTests/SubclassMappingStrategyTests.cs Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/ExplicitlyDeclaredModel.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/ExplicitlyDeclaredModel.cs 2011-04-02 18:49:26 UTC (rev 5575) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/ExplicitlyDeclaredModel.cs 2011-04-02 18:58:51 UTC (rev 5576) @@ -155,6 +155,10 @@ { throw new MappingException(string.Format("Abiguous mapping of {0}. It was registered as root-entity and as subclass for table-per-class strategy", type.FullName)); } + if (IsMappedFor(tablePerClassHierarchyEntities, type)) + { + throw new MappingException(string.Format("Abiguous mapping of {0}. It was registered with more than one class-hierarchy strategy", type.FullName)); + } tablePerClassEntities.Add(rootEntity); } } @@ -185,7 +189,7 @@ { throw new MappingException(string.Format("Abiguous mapping of {0}. It was registered as root-entity and as subclass for table-per-class-hierarchy strategy", type.FullName)); } - if (IsMappedFor(tablePerClassEntities, type)) + if (IsMappedFor(tablePerClassEntities, type) || IsMappedFor(tablePerClassHierarchyEntities, type)) { throw new MappingException(string.Format("Abiguous mapping of {0}. It was registered with more than one class-hierarchy strategy", type.FullName)); } @@ -203,7 +207,7 @@ { throw new MappingException(string.Format("Abiguous mapping of {0}. It was registered as root-entity and as subclass for table-per-concrete-class strategy", type.FullName)); } - if (IsMappedFor(tablePerClassEntities, type)) + if (IsMappedFor(tablePerClassEntities, type) || IsMappedFor(tablePerClassHierarchyEntities, type)) { throw new MappingException(string.Format("Abiguous mapping of {0}. It was registered with more than one class-hierarchy strategy", type.FullName)); } @@ -331,7 +335,7 @@ public bool IsTablePerClassHierarchy(System.Type type) { - return tablePerClassHierarchyEntities.Contains(type); + return IsMappedFor(tablePerClassHierarchyEntities, type); } public bool IsTablePerClassHierarchyJoin(System.Type type) Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExplicitlyDeclaredModelTests/SubclassMappingStrategyTests.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExplicitlyDeclaredModelTests/SubclassMappingStrategyTests.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExplicitlyDeclaredModelTests/SubclassMappingStrategyTests.cs 2011-04-02 18:58:51 UTC (rev 5576) @@ -0,0 +1,79 @@ +using NHibernate.Mapping.ByCode; +using NUnit.Framework; +using SharpTestsEx; + +namespace NHibernate.Test.MappingByCode.ExplicitlyDeclaredModelTests +{ + public class SubclassMappingStrategyTests + { + private class MyClass + { + + } + private class Inherited1 : MyClass + { + + } + private class Inherited2 : Inherited1 + { + + } + + [Test] + public void WhenRegisteredAsSubclassThenIsRegistered() + { + var inspector = new ExplicitlyDeclaredModel(); + inspector.AddAsRootEntity(typeof(MyClass)); + inspector.AddAsTablePerClassHierarchyEntity(typeof(Inherited1)); + + inspector.IsTablePerClass(typeof(Inherited1)).Should().Be.False(); + inspector.IsTablePerClassHierarchy(typeof(Inherited1)).Should().Be.True(); + inspector.IsTablePerClassHierarchyJoin(typeof(Inherited1)).Should().Be.False(); + inspector.IsTablePerConcreteClass(typeof(Inherited1)).Should().Be.False(); + } + + [Test] + public void WhenRegisteredAsDeepSubclassThenIsRegistered() + { + var inspector = new ExplicitlyDeclaredModel(); + inspector.AddAsRootEntity(typeof(MyClass)); + inspector.AddAsTablePerClassHierarchyEntity(typeof(Inherited2)); + + inspector.IsTablePerClass(typeof(Inherited2)).Should().Be.False(); + inspector.IsTablePerClassHierarchy(typeof(Inherited2)).Should().Be.True(); + inspector.IsTablePerClassHierarchyJoin(typeof(Inherited2)).Should().Be.False(); + inspector.IsTablePerConcreteClass(typeof(Inherited2)).Should().Be.False(); + } + + [Test] + public void WhenRegisteredAsSubclassThenCantRegisterAsJoinedSubclass() + { + var inspector = new ExplicitlyDeclaredModel(); + inspector.AddAsRootEntity(typeof(MyClass)); + inspector.AddAsTablePerClassHierarchyEntity(typeof(Inherited1)); + + inspector.Executing(x => x.AddAsTablePerClassEntity(typeof(Inherited1))).Throws<MappingException>(); + } + + [Test] + public void WhenRegisteredAsSubclassThenCantRegisterAsSubclassJoin() + { + var inspector = new ExplicitlyDeclaredModel(); + inspector.AddAsRootEntity(typeof(MyClass)); + inspector.AddAsTablePerClassHierarchyEntity(typeof(Inherited1)); + + inspector.Executing(x => x.AddAsTablePerClassHierarchyJoinEntity(typeof(Inherited1))).Throws<MappingException>(); + } + + [Test] + public void WhenRegisteredAsSubclassThenCantRegisterAsUnionSubclass() + { + var inspector = new ExplicitlyDeclaredModel(); + inspector.AddAsRootEntity(typeof(MyClass)); + inspector.AddAsTablePerClassHierarchyEntity(typeof(Inherited1)); + + inspector.Executing(x => x.AddAsTablePerConcreteClassEntity(typeof(Inherited1))).Throws<MappingException>(); + } + + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-02 18:49:26 UTC (rev 5575) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-02 18:58:51 UTC (rev 5576) @@ -510,6 +510,7 @@ <Compile Include="MappingByCode\ColumnsNamingConvetions.cs" /> <Compile Include="MappingByCode\ExplicitlyDeclaredModelTests\JoinedSubclassMappingStrategyTests.cs" /> <Compile Include="MappingByCode\ExplicitlyDeclaredModelTests\RootClassMappingStrategyTests.cs" /> + <Compile Include="MappingByCode\ExplicitlyDeclaredModelTests\SubclassMappingStrategyTests.cs" /> <Compile Include="MappingByCode\MappingOfPrivateMembersOnRootEntity.cs" /> <Compile Include="NHSpecificTest\AccessAndCorrectPropertyName\Fixture.cs" /> <Compile Include="NHSpecificTest\AccessAndCorrectPropertyName\Model.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2011-04-02 18:49:32
|
Revision: 5575 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5575&view=rev Author: fabiomaulo Date: 2011-04-02 18:49:26 +0000 (Sat, 02 Apr 2011) Log Message: ----------- joined subclasses registration Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Mapping/ByCode/ExplicitlyDeclaredModel.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExplicitlyDeclaredModelTests/JoinedSubclassMappingStrategyTests.cs Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/ExplicitlyDeclaredModel.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/ExplicitlyDeclaredModel.cs 2011-04-02 18:31:03 UTC (rev 5574) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/ExplicitlyDeclaredModel.cs 2011-04-02 18:49:26 UTC (rev 5575) @@ -168,6 +168,10 @@ { throw new MappingException(string.Format("Abiguous mapping of {0}. It was registered as root-entity and as subclass for table-per-class-hierarchy strategy", type.FullName)); } + if(IsMappedFor(tablePerClassEntities, type)) + { + throw new MappingException(string.Format("Abiguous mapping of {0}. It was registered with more than one class-hierarchy strategy", type.FullName)); + } tablePerClassHierarchyEntities.Add(rootEntity); } } @@ -181,6 +185,10 @@ { throw new MappingException(string.Format("Abiguous mapping of {0}. It was registered as root-entity and as subclass for table-per-class-hierarchy strategy", type.FullName)); } + if (IsMappedFor(tablePerClassEntities, type)) + { + throw new MappingException(string.Format("Abiguous mapping of {0}. It was registered with more than one class-hierarchy strategy", type.FullName)); + } tablePerClassHierarchyEntities.Add(rootEntity); } tablePerClassHierarchyJoinEntities.Add(type); @@ -195,6 +203,10 @@ { throw new MappingException(string.Format("Abiguous mapping of {0}. It was registered as root-entity and as subclass for table-per-concrete-class strategy", type.FullName)); } + if (IsMappedFor(tablePerClassEntities, type)) + { + throw new MappingException(string.Format("Abiguous mapping of {0}. It was registered with more than one class-hierarchy strategy", type.FullName)); + } tablePerConcreteClassEntities.Add(rootEntity); } } @@ -314,7 +326,7 @@ public bool IsTablePerClass(System.Type type) { - return tablePerClassEntities.Contains(type); + return IsMappedFor(tablePerClassEntities, type); } public bool IsTablePerClassHierarchy(System.Type type) @@ -426,5 +438,21 @@ } return entityType.GetBaseTypes().SingleOrDefault(IsRootEntity); } + + protected bool IsMappedFor(ICollection<System.Type> explicitMappedEntities, System.Type type) + { + bool isExplicitMapped = explicitMappedEntities.Contains(type); + bool isDerived = false; + + if (!isExplicitMapped) + { + isDerived = type.GetBaseTypes().Any(explicitMappedEntities.Contains); + if (isDerived) + { + explicitMappedEntities.Add(type); + } + } + return isExplicitMapped || isDerived; + } } } \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExplicitlyDeclaredModelTests/JoinedSubclassMappingStrategyTests.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExplicitlyDeclaredModelTests/JoinedSubclassMappingStrategyTests.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExplicitlyDeclaredModelTests/JoinedSubclassMappingStrategyTests.cs 2011-04-02 18:49:26 UTC (rev 5575) @@ -0,0 +1,78 @@ +using NHibernate.Mapping.ByCode; +using NUnit.Framework; +using SharpTestsEx; + +namespace NHibernate.Test.MappingByCode.ExplicitlyDeclaredModelTests +{ + public class JoinedSubclassMappingStrategyTests + { + private class MyClass + { + + } + private class Inherited1 : MyClass + { + + } + private class Inherited2 : Inherited1 + { + + } + + [Test] + public void WhenRegisteredAsJoinedSubclassThenIsRegistered() + { + var inspector = new ExplicitlyDeclaredModel(); + inspector.AddAsRootEntity(typeof(MyClass)); + inspector.AddAsTablePerClassEntity(typeof(Inherited1)); + + inspector.IsTablePerClass(typeof(Inherited1)).Should().Be.True(); + inspector.IsTablePerClassHierarchy(typeof(Inherited1)).Should().Be.False(); + inspector.IsTablePerClassHierarchyJoin(typeof(Inherited1)).Should().Be.False(); + inspector.IsTablePerConcreteClass(typeof(Inherited1)).Should().Be.False(); + } + + [Test] + public void WhenRegisteredAsDeppJoinedSubclassThenIsRegistered() + { + var inspector = new ExplicitlyDeclaredModel(); + inspector.AddAsRootEntity(typeof(MyClass)); + inspector.AddAsTablePerClassEntity(typeof(Inherited2)); + + inspector.IsTablePerClass(typeof(Inherited2)).Should().Be.True(); + inspector.IsTablePerClassHierarchy(typeof(Inherited2)).Should().Be.False(); + inspector.IsTablePerClassHierarchyJoin(typeof(Inherited2)).Should().Be.False(); + inspector.IsTablePerConcreteClass(typeof(Inherited2)).Should().Be.False(); + } + + [Test] + public void WhenRegisteredAsJoinedSubclassThenCantRegisterAsSubclass() + { + var inspector = new ExplicitlyDeclaredModel(); + inspector.AddAsRootEntity(typeof(MyClass)); + inspector.AddAsTablePerClassEntity(typeof(Inherited1)); + + inspector.Executing(x => x.AddAsTablePerClassHierarchyEntity(typeof(Inherited1))).Throws<MappingException>(); + } + + [Test] + public void WhenRegisteredAsJoinedSubclassThenCantRegisterAsSubclassJoin() + { + var inspector = new ExplicitlyDeclaredModel(); + inspector.AddAsRootEntity(typeof(MyClass)); + inspector.AddAsTablePerClassEntity(typeof(Inherited1)); + + inspector.Executing(x => x.AddAsTablePerClassHierarchyJoinEntity(typeof(Inherited1))).Throws<MappingException>(); + } + + [Test] + public void WhenRegisteredAsJoinedSubclassThenCantRegisterAsUnionSubclass() + { + var inspector = new ExplicitlyDeclaredModel(); + inspector.AddAsRootEntity(typeof(MyClass)); + inspector.AddAsTablePerClassEntity(typeof(Inherited1)); + + inspector.Executing(x => x.AddAsTablePerConcreteClassEntity(typeof(Inherited1))).Throws<MappingException>(); + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-02 18:31:03 UTC (rev 5574) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-02 18:49:26 UTC (rev 5575) @@ -508,6 +508,7 @@ <Compile Include="Logging\LoggerProviderTest.cs" /> <Compile Include="MappingByCode\BasicMappingOfSimpleClass.cs" /> <Compile Include="MappingByCode\ColumnsNamingConvetions.cs" /> + <Compile Include="MappingByCode\ExplicitlyDeclaredModelTests\JoinedSubclassMappingStrategyTests.cs" /> <Compile Include="MappingByCode\ExplicitlyDeclaredModelTests\RootClassMappingStrategyTests.cs" /> <Compile Include="MappingByCode\MappingOfPrivateMembersOnRootEntity.cs" /> <Compile Include="NHSpecificTest\AccessAndCorrectPropertyName\Fixture.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2011-04-02 18:31:10
|
Revision: 5574 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5574&view=rev Author: fabiomaulo Date: 2011-04-02 18:31:03 +0000 (Sat, 02 Apr 2011) Log Message: ----------- Root classes registration Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Mapping/ByCode/ExplicitlyDeclaredModel.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExplicitlyDeclaredModelTests/ trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExplicitlyDeclaredModelTests/RootClassMappingStrategyTests.cs Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/ExplicitlyDeclaredModel.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/ExplicitlyDeclaredModel.cs 2011-04-02 15:10:48 UTC (rev 5573) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/ExplicitlyDeclaredModel.cs 2011-04-02 18:31:03 UTC (rev 5574) @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Linq; using System.Reflection; namespace NHibernate.Mapping.ByCode @@ -147,22 +148,55 @@ public void AddAsTablePerClassEntity(System.Type type) { - tablePerClassEntities.Add(type); + var rootEntity = GetRootEntityOrNull(type); + if(rootEntity != null) + { + if(rootEntity.Equals(type)) + { + throw new MappingException(string.Format("Abiguous mapping of {0}. It was registered as root-entity and as subclass for table-per-class strategy", type.FullName)); + } + tablePerClassEntities.Add(rootEntity); + } } public void AddAsTablePerClassHierarchyEntity(System.Type type) { - tablePerClassHierarchyEntities.Add(type); + var rootEntity = GetRootEntityOrNull(type); + if (rootEntity != null) + { + if (rootEntity.Equals(type)) + { + throw new MappingException(string.Format("Abiguous mapping of {0}. It was registered as root-entity and as subclass for table-per-class-hierarchy strategy", type.FullName)); + } + tablePerClassHierarchyEntities.Add(rootEntity); + } } public void AddAsTablePerClassHierarchyJoinEntity(System.Type type) { + var rootEntity = GetRootEntityOrNull(type); + if (rootEntity != null) + { + if (rootEntity.Equals(type)) + { + throw new MappingException(string.Format("Abiguous mapping of {0}. It was registered as root-entity and as subclass for table-per-class-hierarchy strategy", type.FullName)); + } + tablePerClassHierarchyEntities.Add(rootEntity); + } tablePerClassHierarchyJoinEntities.Add(type); } public void AddAsTablePerConcreteClassEntity(System.Type type) { - tablePerConcreteClassEntities.Add(type); + var rootEntity = GetRootEntityOrNull(type); + if (rootEntity != null) + { + if (rootEntity.Equals(type)) + { + throw new MappingException(string.Format("Abiguous mapping of {0}. It was registered as root-entity and as subclass for table-per-concrete-class strategy", type.FullName)); + } + tablePerConcreteClassEntities.Add(rootEntity); + } } public void AddAsOneToOneRelation(MemberInfo member) @@ -379,5 +413,18 @@ } #endregion + + private System.Type GetRootEntityOrNull(System.Type entityType) + { + if (entityType == null) + { + return null; + } + if (IsRootEntity(entityType)) + { + return entityType; + } + return entityType.GetBaseTypes().SingleOrDefault(IsRootEntity); + } } } \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExplicitlyDeclaredModelTests/RootClassMappingStrategyTests.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExplicitlyDeclaredModelTests/RootClassMappingStrategyTests.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExplicitlyDeclaredModelTests/RootClassMappingStrategyTests.cs 2011-04-02 18:31:03 UTC (rev 5574) @@ -0,0 +1,158 @@ +using NHibernate.Mapping.ByCode; +using NUnit.Framework; +using SharpTestsEx; + +namespace NHibernate.Test.MappingByCode.ExplicitlyDeclaredModelTests +{ + public class RootClassMappingStrategyTests + { + private class MyClass + { + + } + private class Inherited1: MyClass + { + + } + private class Inherited2 : Inherited1 + { + + } + + [Test] + public void WhenRegisteredAsRootThenDoesNotRegisterTheStrategy() + { + var inspector = new ExplicitlyDeclaredModel(); + inspector.AddAsRootEntity(typeof(MyClass)); + inspector.IsTablePerClass(typeof(MyClass)).Should().Be.False(); + inspector.IsTablePerClassHierarchy(typeof(MyClass)).Should().Be.False(); + inspector.IsTablePerClassHierarchyJoin(typeof(MyClass)).Should().Be.False(); + inspector.IsTablePerConcreteClass(typeof(MyClass)).Should().Be.False(); + } + + [Test] + public void WhenRegisteredJoinedSubclassThenTheStrategyIsDefinedEvenForRoot() + { + var inspector = new ExplicitlyDeclaredModel(); + inspector.AddAsRootEntity(typeof(MyClass)); + inspector.AddAsTablePerClassEntity(typeof(Inherited1)); + inspector.IsTablePerClass(typeof(MyClass)).Should().Be.True(); + inspector.IsTablePerClassHierarchy(typeof(MyClass)).Should().Be.False(); + inspector.IsTablePerClassHierarchyJoin(typeof(MyClass)).Should().Be.False(); + inspector.IsTablePerConcreteClass(typeof(MyClass)).Should().Be.False(); + } + + [Test] + public void WhenRegisteredJoinedDeepSubclassThenTheStrategyIsDefinedEvenForRoot() + { + var inspector = new ExplicitlyDeclaredModel(); + inspector.AddAsRootEntity(typeof(MyClass)); + inspector.AddAsTablePerClassEntity(typeof(Inherited2)); + inspector.IsTablePerClass(typeof(MyClass)).Should().Be.True(); + inspector.IsTablePerClassHierarchy(typeof(MyClass)).Should().Be.False(); + inspector.IsTablePerClassHierarchyJoin(typeof(MyClass)).Should().Be.False(); + inspector.IsTablePerConcreteClass(typeof(MyClass)).Should().Be.False(); + } + + [Test] + public void WhenRegisteredSubclassThenTheStrategyIsDefinedEvenForRoot() + { + var inspector = new ExplicitlyDeclaredModel(); + inspector.AddAsRootEntity(typeof(MyClass)); + inspector.AddAsTablePerClassHierarchyEntity(typeof(Inherited1)); + inspector.IsTablePerClass(typeof(MyClass)).Should().Be.False(); + inspector.IsTablePerClassHierarchy(typeof(MyClass)).Should().Be.True(); + inspector.IsTablePerClassHierarchyJoin(typeof(MyClass)).Should().Be.False(); + inspector.IsTablePerConcreteClass(typeof(MyClass)).Should().Be.False(); + } + + [Test] + public void WhenRegisteredDeepSubclassThenTheStrategyIsDefinedEvenForRoot() + { + var inspector = new ExplicitlyDeclaredModel(); + inspector.AddAsRootEntity(typeof(MyClass)); + inspector.AddAsTablePerClassHierarchyEntity(typeof(Inherited2)); + + inspector.IsTablePerClass(typeof(MyClass)).Should().Be.False(); + inspector.IsTablePerClassHierarchy(typeof(MyClass)).Should().Be.True(); + inspector.IsTablePerClassHierarchyJoin(typeof(MyClass)).Should().Be.False(); + inspector.IsTablePerConcreteClass(typeof(MyClass)).Should().Be.False(); + } + + [Test] + public void WhenRegisteredSubclassJoinThenTheStrategyIsDefinedEvenForRoot() + { + var inspector = new ExplicitlyDeclaredModel(); + inspector.AddAsRootEntity(typeof(MyClass)); + inspector.AddAsTablePerClassHierarchyJoinEntity(typeof(Inherited1)); + + inspector.IsTablePerClass(typeof(MyClass)).Should().Be.False(); + inspector.IsTablePerClassHierarchy(typeof(MyClass)).Should().Be.True(); + inspector.IsTablePerClassHierarchyJoin(typeof(MyClass)).Should().Be.False(); + inspector.IsTablePerConcreteClass(typeof(MyClass)).Should().Be.False(); + } + + [Test] + public void WhenRegisteredDeepSubclassJoinThenTheStrategyIsDefinedEvenForRoot() + { + var inspector = new ExplicitlyDeclaredModel(); + inspector.AddAsRootEntity(typeof(MyClass)); + inspector.AddAsTablePerClassHierarchyJoinEntity(typeof(Inherited2)); + + inspector.IsTablePerClass(typeof(MyClass)).Should().Be.False(); + inspector.IsTablePerClassHierarchy(typeof(MyClass)).Should().Be.True(); + inspector.IsTablePerClassHierarchyJoin(typeof(MyClass)).Should().Be.False(); + inspector.IsTablePerConcreteClass(typeof(MyClass)).Should().Be.False(); + } + + [Test] + public void WhenRegisteredConcreteClassThenTheStrategyIsDefinedEvenForRoot() + { + var inspector = new ExplicitlyDeclaredModel(); + inspector.AddAsRootEntity(typeof(MyClass)); + inspector.AddAsTablePerConcreteClassEntity(typeof(Inherited1)); + + inspector.IsTablePerClass(typeof(MyClass)).Should().Be.False(); + inspector.IsTablePerClassHierarchy(typeof(MyClass)).Should().Be.False(); + inspector.IsTablePerClassHierarchyJoin(typeof(MyClass)).Should().Be.False(); + inspector.IsTablePerConcreteClass(typeof(MyClass)).Should().Be.True(); + } + + [Test] + public void WhenRegisteredDeepConcreteClassThenTheStrategyIsDefinedEvenForRoot() + { + var inspector = new ExplicitlyDeclaredModel(); + inspector.AddAsRootEntity(typeof(MyClass)); + inspector.AddAsTablePerConcreteClassEntity(typeof(Inherited2)); + + inspector.IsTablePerClass(typeof(MyClass)).Should().Be.False(); + inspector.IsTablePerClassHierarchy(typeof(MyClass)).Should().Be.False(); + inspector.IsTablePerClassHierarchyJoin(typeof(MyClass)).Should().Be.False(); + inspector.IsTablePerConcreteClass(typeof(MyClass)).Should().Be.True(); + } + + [Test] + public void WhenRegisteredAsRootThenCantRegisterAsSubclass() + { + var inspector = new ExplicitlyDeclaredModel(); + inspector.AddAsRootEntity(typeof(MyClass)); + inspector.Executing(x=> x.AddAsTablePerClassEntity(typeof(MyClass))).Throws<MappingException>(); + } + + [Test] + public void WhenRegisteredAsRootThenCantRegisterAsJoinedSubclass() + { + var inspector = new ExplicitlyDeclaredModel(); + inspector.AddAsRootEntity(typeof(MyClass)); + inspector.Executing(x => x.AddAsTablePerClassEntity(typeof(MyClass))).Throws<MappingException>(); + } + + [Test] + public void WhenRegisteredAsRootThenCantRegisterAsUnionSubclass() + { + var inspector = new ExplicitlyDeclaredModel(); + inspector.AddAsRootEntity(typeof(MyClass)); + inspector.Executing(x => x.AddAsTablePerClassEntity(typeof(MyClass))).Throws<MappingException>(); + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-02 15:10:48 UTC (rev 5573) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-02 18:31:03 UTC (rev 5574) @@ -508,6 +508,7 @@ <Compile Include="Logging\LoggerProviderTest.cs" /> <Compile Include="MappingByCode\BasicMappingOfSimpleClass.cs" /> <Compile Include="MappingByCode\ColumnsNamingConvetions.cs" /> + <Compile Include="MappingByCode\ExplicitlyDeclaredModelTests\RootClassMappingStrategyTests.cs" /> <Compile Include="MappingByCode\MappingOfPrivateMembersOnRootEntity.cs" /> <Compile Include="NHSpecificTest\AccessAndCorrectPropertyName\Fixture.cs" /> <Compile Include="NHSpecificTest\AccessAndCorrectPropertyName\Model.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pa...@us...> - 2011-04-02 15:10:54
|
Revision: 5573 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5573&view=rev Author: patearl Date: 2011-04-02 15:10:48 +0000 (Sat, 02 Apr 2011) Log Message: ----------- Added missing PostgreSQL82TestDialect to test project file. Modified Paths: -------------- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-01 17:11:05 UTC (rev 5572) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-02 15:10:48 UTC (rev 5573) @@ -708,6 +708,7 @@ <Compile Include="Subselect\ClassSubselectFixture.cs" /> <Compile Include="Subselect\Domain.cs" /> <Compile Include="TestDialect.cs" /> + <Compile Include="TestDialects\PostgreSQL82TestDialect.cs" /> <Compile Include="TestDialects\SQLiteTestDialect.cs" /> <Compile Include="TypesTest\CharClass.cs" /> <Compile Include="TypesTest\CharClassFixture.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2011-04-01 17:11:15
|
Revision: 5572 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5572&view=rev Author: fabiomaulo Date: 2011-04-01 17:11:05 +0000 (Fri, 01 Apr 2011) Log Message: ----------- Initial upload mapping by code Modified Paths: -------------- trunk/nhibernate/src/NHibernate/NHibernate.csproj trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate/Mapping/ByCode/ trunk/nhibernate/src/NHibernate/Mapping/ByCode/CacheInclude.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/CacheUsage.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Cascade.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/CascadeExtensions.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/CollectionFetchMode.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/CollectionLazy.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/ExplicitlyDeclaredModel.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/FakeModelExplicitDeclarationsHolder.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/FetchMode.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/ForClass.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/IAccessorPropertyMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/IAnyMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/IBagPropertiesMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/ICacheMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/IClassMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/ICollectionElementRelation.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/ICollectionPropertiesMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/ICollectionSqlsMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/IColumnMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/IColumnsMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/IComponentElementMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/IComponentMapKeyMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/IComponentMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/IComponentParentMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/IDiscriminatorMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/IElementMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/IEntityAttributesMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/IEntityPropertyMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/IEntitySqlsMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/IFilterMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/IGenerator.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/IGeneratorDef.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/IGeneratorMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/IIdMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/IJoinedSubclassMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/IKeyMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/IListIndexMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/IListPropertiesMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/IManyToManyMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/IManyToOneMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/IMapKeyManyToManyMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/IMapKeyMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/IMapKeyRelation.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/IMapPropertiesMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/IModelExplicitDeclarationsHolder.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/IModelInspector.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/INaturalIdMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/IOneToManyMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/IOneToOneMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/IPlainPropertyContainerMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/IPropertyContainerMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/IPropertyMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/ISetPropertiesMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/ISubclassMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/IUnionSubclassMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/IVersionMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/AbstractBasePropertyContainerMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/AbstractPropertyContainerMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/AccessorPropertyMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/AnyMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/BagMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CacheMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CascadeConverter.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ClassMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CollectionElementRelation.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ColumnMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ComponentElementMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ComponentMapKeyMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ComponentMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ComponentNestedElementMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ComponentParentMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersHolder.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/BagPropertiesCustomizer.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/ClassCustomizer.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/CollectionElementCustomizer.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/CollectionElementRelationCustomizer.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/CollectionKeyCustomizer.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/CollectionPropertiesCustomizer.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/ComponentCustomizer.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/ComponentElementCustomizer.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/JoinedSubclassCustomizer.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/JoinedSubclassKeyCustomizer.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/ListPropertiesCustomizer.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/ManyToManyCustomizer.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/MapKeyComponentCustomizer.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/MapKeyCustomizer.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/MapKeyManyToManyCustomizer.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/MapKeyRelationCustomizer.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/MapPropertiesCustomizer.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/OneToManyCustomizer.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/PropertyContainerCustomizer.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/SetPropertiesCustomizer.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/SubclassCustomizer.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/UnionSubclassCustomizer.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DefaultCandidatePersistentMembersProvider.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DiscriminatorMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ElementMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/FilterMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/GeneratorMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/Generators.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ICandidatePersistentMembersProvider.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ICustomizersHolder.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/IdMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/JoinedSubclassMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/KeyManyToOneMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/KeyMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/KeyPropertyMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ListIndexMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ListMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ManyToManyMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ManyToOneMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/MapKeyManyToManyMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/MapKeyMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/MapKeyRelation.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/MapMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/MapperEventsHandlersDefinitions.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/NaturalIdMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/NoMemberPropertyMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/OneToManyMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/OneToOneMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/PropertyMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/PropertyPath.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/PropertyPathExtensions.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/SetMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/SubclassMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/TypeNameUtil.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/UnionSubclassMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/VersionMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Lazy.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/ModelMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/NotFoundMode.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/SchemaAction.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/TypeExtensions.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/VersionGeneration.cs trunk/nhibernate/src/NHibernate.Test/MappingByCode/ trunk/nhibernate/src/NHibernate.Test/MappingByCode/BasicMappingOfSimpleClass.cs trunk/nhibernate/src/NHibernate.Test/MappingByCode/ColumnsNamingConvetions.cs trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappingOfPrivateMembersOnRootEntity.cs Added: trunk/nhibernate/src/NHibernate/Mapping/ByCode/CacheInclude.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/CacheInclude.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/CacheInclude.cs 2011-04-01 17:11:05 UTC (rev 5572) @@ -0,0 +1,36 @@ +using NHibernate.Cfg.MappingSchema; + +namespace NHibernate.Mapping.ByCode +{ + public abstract class CacheInclude + { + public static CacheInclude All = new AllCacheInclude(); + public static CacheInclude NonLazy = new NonLazyCacheInclude(); + + public abstract HbmCacheInclude ToHbm(); + + #region Nested type: AllCacheInclude + + public class AllCacheInclude : CacheInclude + { + public override HbmCacheInclude ToHbm() + { + return HbmCacheInclude.All; + } + } + + #endregion + + #region Nested type: NonLazyCacheInclude + + public class NonLazyCacheInclude : CacheInclude + { + public override HbmCacheInclude ToHbm() + { + return HbmCacheInclude.NonLazy; + } + } + + #endregion + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate/Mapping/ByCode/CacheUsage.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/CacheUsage.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/CacheUsage.cs 2011-04-01 17:11:05 UTC (rev 5572) @@ -0,0 +1,62 @@ +using NHibernate.Cfg.MappingSchema; + +namespace NHibernate.Mapping.ByCode +{ + public abstract class CacheUsage + { + public static CacheUsage ReadOnly = new ReadOnlyUsage(); + public static CacheUsage ReadWrite = new ReadWriteUsage(); + public static CacheUsage NonstrictReadWrite = new NonstrictReadWriteUsage(); + public static CacheUsage Transactional = new TransactionalUsage(); + + public abstract HbmCacheUsage ToHbm(); + + #region Nested type: NonstrictReadWriteUsage + + private class NonstrictReadWriteUsage : CacheUsage + { + public override HbmCacheUsage ToHbm() + { + return HbmCacheUsage.NonstrictReadWrite; + } + } + + #endregion + + #region Nested type: ReadOnlyUsage + + private class ReadOnlyUsage : CacheUsage + { + public override HbmCacheUsage ToHbm() + { + return HbmCacheUsage.ReadOnly; + } + } + + #endregion + + #region Nested type: ReadWriteUsage + + private class ReadWriteUsage : CacheUsage + { + public override HbmCacheUsage ToHbm() + { + return HbmCacheUsage.ReadWrite; + } + } + + #endregion + + #region Nested type: TransactionalUsage + + private class TransactionalUsage : CacheUsage + { + public override HbmCacheUsage ToHbm() + { + return HbmCacheUsage.Transactional; + } + } + + #endregion + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Cascade.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Cascade.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Cascade.cs 2011-04-01 17:11:05 UTC (rev 5572) @@ -0,0 +1,27 @@ +using System; + +namespace NHibernate.Mapping.ByCode +{ + /// <summary> + /// Defines behavior of soft-cascade actions. + /// </summary> + /// <remarks> + /// To check the content or to include/exclude values, from cascade, is strongly recommanded the usage of extensions methods defined in <see cref="CascadeExtensions"/> + /// </remarks> + /// <seealso cref="CascadeExtensions.Has"/> + /// <seealso cref="CascadeExtensions.Include"/> + /// <seealso cref="CascadeExtensions.Exclude"/> + [Flags] + public enum Cascade + { + None = 0, + Persist = 2, + Refresh = 4, + Merge = 8, + Remove = 16, + Detach = 32, + ReAttach = 64, + DeleteOrphans = 128, + All = 256, + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate/Mapping/ByCode/CascadeExtensions.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/CascadeExtensions.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/CascadeExtensions.cs 2011-04-01 17:11:05 UTC (rev 5572) @@ -0,0 +1,40 @@ +namespace NHibernate.Mapping.ByCode +{ + public static class CascadeExtensions + { + private const Cascade AnyButOrphans = Cascade.Persist | Cascade.Refresh | Cascade.Merge | Cascade.Remove | Cascade.Detach | Cascade.ReAttach; + + public static bool Has(this Cascade source, Cascade value) + { + return (source & value) == value; + } + + public static Cascade Include(this Cascade source, Cascade value) + { + return Cleanup(source | value); + } + + private static Cascade Cleanup(Cascade cascade) + { + bool hasAll = cascade.Has(Cascade.All) || cascade.Has(AnyButOrphans); + if (hasAll && cascade.Has(Cascade.DeleteOrphans)) + { + return Cascade.All | Cascade.DeleteOrphans; + } + if (hasAll) + { + return Cascade.All; + } + return cascade; + } + + public static Cascade Exclude(this Cascade source, Cascade value) + { + if (source.Has(Cascade.All) && !value.Has(Cascade.All)) + { + return Cleanup(((source & ~Cascade.All) | AnyButOrphans) & ~value); + } + return Cleanup(source & ~value); + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate/Mapping/ByCode/CollectionFetchMode.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/CollectionFetchMode.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/CollectionFetchMode.cs 2011-04-01 17:11:05 UTC (rev 5572) @@ -0,0 +1,49 @@ +using NHibernate.Cfg.MappingSchema; + +namespace NHibernate.Mapping.ByCode +{ + public abstract class CollectionFetchMode + { + public static CollectionFetchMode Select = new SelectFetchMode(); + public static CollectionFetchMode Join = new JoinFetchMode(); + public static CollectionFetchMode Subselect = new SubselectFetchMode(); + + public abstract HbmCollectionFetchMode ToHbm(); + + #region Nested type: JoinFetchMode + + private class JoinFetchMode : CollectionFetchMode + { + public override HbmCollectionFetchMode ToHbm() + { + return HbmCollectionFetchMode.Join; + } + } + + #endregion + + #region Nested type: SelectFetchMode + + private class SelectFetchMode : CollectionFetchMode + { + public override HbmCollectionFetchMode ToHbm() + { + return HbmCollectionFetchMode.Select; + } + } + + #endregion + + #region Nested type: SubselectFetchMode + + private class SubselectFetchMode : CollectionFetchMode + { + public override HbmCollectionFetchMode ToHbm() + { + return HbmCollectionFetchMode.Subselect; + } + } + + #endregion + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate/Mapping/ByCode/CollectionLazy.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/CollectionLazy.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/CollectionLazy.cs 2011-04-01 17:11:05 UTC (rev 5572) @@ -0,0 +1,9 @@ +namespace NHibernate.Mapping.ByCode +{ + public enum CollectionLazy + { + Lazy, + NoLazy, + Extra + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate/Mapping/ByCode/ExplicitlyDeclaredModel.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/ExplicitlyDeclaredModel.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/ExplicitlyDeclaredModel.cs 2011-04-01 17:11:05 UTC (rev 5572) @@ -0,0 +1,383 @@ +using System.Collections.Generic; +using System.Reflection; + +namespace NHibernate.Mapping.ByCode +{ + public class ExplicitlyDeclaredModel : IModelInspector, IModelExplicitDeclarationsHolder + { + private readonly HashSet<MemberInfo> any = new HashSet<MemberInfo>(); + private readonly HashSet<MemberInfo> arrays = new HashSet<MemberInfo>(); + private readonly HashSet<MemberInfo> bags = new HashSet<MemberInfo>(); + private readonly HashSet<System.Type> components = new HashSet<System.Type>(); + private readonly HashSet<MemberInfo> dictionaries = new HashSet<MemberInfo>(); + private readonly HashSet<MemberInfo> idBags = new HashSet<MemberInfo>(); + private readonly HashSet<MemberInfo> lists = new HashSet<MemberInfo>(); + private readonly HashSet<MemberInfo> manyToManyRelations = new HashSet<MemberInfo>(); + private readonly HashSet<MemberInfo> manyToOneRelations = new HashSet<MemberInfo>(); + private readonly HashSet<MemberInfo> naturalIds = new HashSet<MemberInfo>(); + private readonly HashSet<MemberInfo> oneToManyRelations = new HashSet<MemberInfo>(); + private readonly HashSet<MemberInfo> oneToOneRelations = new HashSet<MemberInfo>(); + private readonly HashSet<MemberInfo> persistentProperties = new HashSet<MemberInfo>(); + private readonly HashSet<MemberInfo> poids = new HashSet<MemberInfo>(); + private readonly HashSet<MemberInfo> properties = new HashSet<MemberInfo>(); + private readonly HashSet<System.Type> rootEntities = new HashSet<System.Type>(); + private readonly HashSet<MemberInfo> sets = new HashSet<MemberInfo>(); + private readonly HashSet<System.Type> tablePerClassEntities = new HashSet<System.Type>(); + private readonly HashSet<System.Type> tablePerClassHierarchyEntities = new HashSet<System.Type>(); + private readonly HashSet<System.Type> tablePerClassHierarchyJoinEntities = new HashSet<System.Type>(); + private readonly HashSet<System.Type> tablePerConcreteClassEntities = new HashSet<System.Type>(); + private readonly HashSet<MemberInfo> versionProperties = new HashSet<MemberInfo>(); + + #region IModelExplicitDeclarationsHolder Members + + public IEnumerable<System.Type> RootEntities + { + get { return rootEntities; } + } + + public IEnumerable<System.Type> Components + { + get { return components; } + } + + public IEnumerable<System.Type> TablePerClassEntities + { + get { return tablePerClassEntities; } + } + + public IEnumerable<System.Type> TablePerClassHierarchyEntities + { + get { return tablePerClassHierarchyEntities; } + } + + public IEnumerable<System.Type> TablePerClassHierarchyJoinEntities + { + get { return tablePerClassHierarchyJoinEntities; } + } + + public IEnumerable<System.Type> TablePerConcreteClassEntities + { + get { return tablePerConcreteClassEntities; } + } + + public IEnumerable<MemberInfo> OneToOneRelations + { + get { return oneToOneRelations; } + } + + public IEnumerable<MemberInfo> ManyToOneRelations + { + get { return manyToOneRelations; } + } + + public IEnumerable<MemberInfo> ManyToManyRelations + { + get { return manyToManyRelations; } + } + + public IEnumerable<MemberInfo> OneToManyRelations + { + get { return oneToManyRelations; } + } + + public IEnumerable<MemberInfo> Any + { + get { return any; } + } + + public IEnumerable<MemberInfo> Poids + { + get { return poids; } + } + + public IEnumerable<MemberInfo> VersionProperties + { + get { return versionProperties; } + } + + public IEnumerable<MemberInfo> NaturalIds + { + get { return naturalIds; } + } + + public IEnumerable<MemberInfo> Sets + { + get { return sets; } + } + + public IEnumerable<MemberInfo> Bags + { + get { return bags; } + } + + public IEnumerable<MemberInfo> IdBags + { + get { return idBags; } + } + + public IEnumerable<MemberInfo> Lists + { + get { return lists; } + } + + public IEnumerable<MemberInfo> Arrays + { + get { return arrays; } + } + + public IEnumerable<MemberInfo> Dictionaries + { + get { return dictionaries; } + } + + public IEnumerable<MemberInfo> Properties + { + get { return properties; } + } + + public void AddAsRootEntity(System.Type type) + { + rootEntities.Add(type); + } + + public void AddAsComponent(System.Type type) + { + components.Add(type); + } + + public void AddAsTablePerClassEntity(System.Type type) + { + tablePerClassEntities.Add(type); + } + + public void AddAsTablePerClassHierarchyEntity(System.Type type) + { + tablePerClassHierarchyEntities.Add(type); + } + + public void AddAsTablePerClassHierarchyJoinEntity(System.Type type) + { + tablePerClassHierarchyJoinEntities.Add(type); + } + + public void AddAsTablePerConcreteClassEntity(System.Type type) + { + tablePerConcreteClassEntities.Add(type); + } + + public void AddAsOneToOneRelation(MemberInfo member) + { + persistentProperties.Add(member); + oneToOneRelations.Add(member); + } + + public void AddAsManyToOneRelation(MemberInfo member) + { + persistentProperties.Add(member); + manyToOneRelations.Add(member); + } + + public void AddAsManyToManyRelation(MemberInfo member) + { + persistentProperties.Add(member); + manyToManyRelations.Add(member); + } + + public void AddAsOneToManyRelation(MemberInfo member) + { + persistentProperties.Add(member); + oneToManyRelations.Add(member); + } + + public void AddAsAny(MemberInfo member) + { + persistentProperties.Add(member); + any.Add(member); + } + + public void AddAsPoid(MemberInfo member) + { + persistentProperties.Add(member); + poids.Add(member); + } + + public void AddAsVersionProperty(MemberInfo member) + { + persistentProperties.Add(member); + versionProperties.Add(member); + } + + public void AddAsNaturalId(MemberInfo member) + { + persistentProperties.Add(member); + naturalIds.Add(member); + } + + public void AddAsSet(MemberInfo member) + { + persistentProperties.Add(member); + sets.Add(member); + } + + public void AddAsBag(MemberInfo member) + { + persistentProperties.Add(member); + bags.Add(member); + } + + public void AddAsIdBag(MemberInfo member) + { + persistentProperties.Add(member); + idBags.Add(member); + } + + public void AddAsList(MemberInfo member) + { + persistentProperties.Add(member); + lists.Add(member); + } + + public void AddAsArray(MemberInfo member) + { + persistentProperties.Add(member); + arrays.Add(member); + } + + public void AddAsMap(MemberInfo member) + { + persistentProperties.Add(member); + dictionaries.Add(member); + } + + public void AddAsProperty(MemberInfo member) + { + persistentProperties.Add(member); + properties.Add(member); + } + + #endregion + + #region Implementation of IModelInspector + + public bool IsRootEntity(System.Type type) + { + return rootEntities.Contains(type); + } + + public bool IsComponent(System.Type type) + { + return components.Contains(type); + } + + public bool IsEntity(System.Type type) + { + return rootEntities.Contains(type) || + tablePerClassEntities.Contains(type) || + tablePerClassHierarchyEntities.Contains(type) || + tablePerClassHierarchyJoinEntities.Contains(type) || + tablePerConcreteClassEntities.Contains(type); + } + + public bool IsTablePerClass(System.Type type) + { + return tablePerClassEntities.Contains(type); + } + + public bool IsTablePerClassHierarchy(System.Type type) + { + return tablePerClassHierarchyEntities.Contains(type); + } + + public bool IsTablePerClassHierarchyJoin(System.Type type) + { + return tablePerClassHierarchyJoinEntities.Contains(type); + } + + public bool IsTablePerConcreteClass(System.Type type) + { + return tablePerConcreteClassEntities.Contains(type); + } + + public bool IsOneToOne(MemberInfo member) + { + return oneToOneRelations.Contains(member); + } + + public bool IsManyToOne(MemberInfo member) + { + return manyToOneRelations.Contains(member); + } + + public bool IsManyToMany(MemberInfo member) + { + return manyToManyRelations.Contains(member); + } + + public bool IsOneToMany(MemberInfo member) + { + return oneToManyRelations.Contains(member); + } + + public bool IsHeterogeneousAssociation(MemberInfo member) + { + return any.Contains(member); + } + + public bool IsPersistentId(MemberInfo member) + { + return poids.Contains(member); + } + + public bool IsVersion(MemberInfo member) + { + return versionProperties.Contains(member); + } + + public bool IsMemberOfNaturalId(MemberInfo member) + { + return naturalIds.Contains(member); + } + + public bool IsPersistentProperty(MemberInfo member) + { + return persistentProperties.Contains(member); + } + + public bool IsSet(MemberInfo role) + { + return sets.Contains(role); + } + + public bool IsBag(MemberInfo role) + { + return bags.Contains(role); + } + + public bool IsIdBag(MemberInfo role) + { + return idBags.Contains(role); + } + + public bool IsList(MemberInfo role) + { + return lists.Contains(role); + } + + public bool IsArray(MemberInfo role) + { + return arrays.Contains(role); + } + + public bool IsDictionary(MemberInfo role) + { + return dictionaries.Contains(role); + } + + public bool IsProperty(MemberInfo member) + { + return properties.Contains(member); + } + + #endregion + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate/Mapping/ByCode/FakeModelExplicitDeclarationsHolder.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/FakeModelExplicitDeclarationsHolder.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/FakeModelExplicitDeclarationsHolder.cs 2011-04-01 17:11:05 UTC (rev 5572) @@ -0,0 +1,182 @@ +using System.Collections.Generic; +using System.Linq; +using System.Reflection; + +namespace NHibernate.Mapping.ByCode +{ + public class FakeModelExplicitDeclarationsHolder : IModelExplicitDeclarationsHolder + { + private readonly IEnumerable<MemberInfo> any = Enumerable.Empty<MemberInfo>(); + private readonly IEnumerable<MemberInfo> arrays = Enumerable.Empty<MemberInfo>(); + private readonly IEnumerable<MemberInfo> bags = Enumerable.Empty<MemberInfo>(); + private readonly IEnumerable<System.Type> components = Enumerable.Empty<System.Type>(); + private readonly IEnumerable<MemberInfo> dictionaries = Enumerable.Empty<MemberInfo>(); + private readonly IEnumerable<MemberInfo> idBags = Enumerable.Empty<MemberInfo>(); + private readonly IEnumerable<MemberInfo> lists = Enumerable.Empty<MemberInfo>(); + private readonly IEnumerable<MemberInfo> manyToManyRelations = Enumerable.Empty<MemberInfo>(); + private readonly IEnumerable<MemberInfo> manyToOneRelations = Enumerable.Empty<MemberInfo>(); + private readonly IEnumerable<MemberInfo> naturalIds = Enumerable.Empty<MemberInfo>(); + private readonly IEnumerable<MemberInfo> oneToManyRelations = Enumerable.Empty<MemberInfo>(); + private readonly IEnumerable<MemberInfo> oneToOneRelations = Enumerable.Empty<MemberInfo>(); + private readonly IEnumerable<MemberInfo> poids = Enumerable.Empty<MemberInfo>(); + private readonly IEnumerable<MemberInfo> properties = Enumerable.Empty<MemberInfo>(); + private readonly IEnumerable<System.Type> rootEntities = Enumerable.Empty<System.Type>(); + private readonly IEnumerable<MemberInfo> sets = Enumerable.Empty<MemberInfo>(); + private readonly IEnumerable<System.Type> tablePerClassEntities = Enumerable.Empty<System.Type>(); + private readonly IEnumerable<System.Type> tablePerClassHierarchyEntities = Enumerable.Empty<System.Type>(); + private readonly IEnumerable<System.Type> tablePerClassHierarchyJoinEntities = Enumerable.Empty<System.Type>(); + private readonly IEnumerable<System.Type> tablePerConcreteClassEntities = Enumerable.Empty<System.Type>(); + private readonly IEnumerable<MemberInfo> versionProperties = Enumerable.Empty<MemberInfo>(); + + #region IModelExplicitDeclarationsHolder Members + + public IEnumerable<System.Type> RootEntities + { + get { return rootEntities; } + } + + public IEnumerable<System.Type> Components + { + get { return components; } + } + + public IEnumerable<System.Type> TablePerClassEntities + { + get { return tablePerClassEntities; } + } + + public IEnumerable<System.Type> TablePerClassHierarchyEntities + { + get { return tablePerClassHierarchyEntities; } + } + + public IEnumerable<System.Type> TablePerClassHierarchyJoinEntities + { + get { return tablePerClassHierarchyJoinEntities; } + } + + public IEnumerable<System.Type> TablePerConcreteClassEntities + { + get { return tablePerConcreteClassEntities; } + } + + public IEnumerable<MemberInfo> OneToOneRelations + { + get { return oneToOneRelations; } + } + + public IEnumerable<MemberInfo> ManyToOneRelations + { + get { return manyToOneRelations; } + } + + public IEnumerable<MemberInfo> ManyToManyRelations + { + get { return manyToManyRelations; } + } + + public IEnumerable<MemberInfo> OneToManyRelations + { + get { return oneToManyRelations; } + } + + public IEnumerable<MemberInfo> Any + { + get { return any; } + } + + public IEnumerable<MemberInfo> Poids + { + get { return poids; } + } + + public IEnumerable<MemberInfo> VersionProperties + { + get { return versionProperties; } + } + + public IEnumerable<MemberInfo> NaturalIds + { + get { return naturalIds; } + } + + public IEnumerable<MemberInfo> Sets + { + get { return sets; } + } + + public IEnumerable<MemberInfo> Bags + { + get { return bags; } + } + + public IEnumerable<MemberInfo> IdBags + { + get { return idBags; } + } + + public IEnumerable<MemberInfo> Lists + { + get { return lists; } + } + + public IEnumerable<MemberInfo> Arrays + { + get { return arrays; } + } + + public IEnumerable<MemberInfo> Dictionaries + { + get { return dictionaries; } + } + + public IEnumerable<MemberInfo> Properties + { + get { return properties; } + } + + public void AddAsRootEntity(System.Type type) {} + + public void AddAsComponent(System.Type type) {} + + public void AddAsTablePerClassEntity(System.Type type) {} + + public void AddAsTablePerClassHierarchyEntity(System.Type type) {} + + public void AddAsTablePerClassHierarchyJoinEntity(System.Type type) {} + + public void AddAsTablePerConcreteClassEntity(System.Type type) {} + + public void AddAsOneToOneRelation(MemberInfo member) {} + + public void AddAsManyToOneRelation(MemberInfo member) {} + + public void AddAsManyToManyRelation(MemberInfo member) {} + + public void AddAsOneToManyRelation(MemberInfo member) {} + + public void AddAsAny(MemberInfo member) {} + + public void AddAsPoid(MemberInfo member) {} + + public void AddAsVersionProperty(MemberInfo member) {} + + public void AddAsNaturalId(MemberInfo member) {} + + public void AddAsSet(MemberInfo member) {} + + public void AddAsBag(MemberInfo member) {} + + public void AddAsIdBag(MemberInfo member) {} + + public void AddAsList(MemberInfo member) {} + + public void AddAsArray(MemberInfo member) {} + + public void AddAsMap(MemberInfo member) {} + + public void AddAsProperty(MemberInfo member) {} + + #endregion + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate/Mapping/ByCode/FetchMode.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/FetchMode.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/FetchMode.cs 2011-04-01 17:11:05 UTC (rev 5572) @@ -0,0 +1,36 @@ +using NHibernate.Cfg.MappingSchema; + +namespace NHibernate.Mapping.ByCode +{ + public abstract class FetchMode + { + public static FetchMode Select = new SelectFetchMode(); + public static FetchMode Join = new JoinFetchMode(); + + public abstract HbmFetchMode ToHbm(); + + #region Nested type: JoinFetchMode + + private class JoinFetchMode : FetchMode + { + public override HbmFetchMode ToHbm() + { + return HbmFetchMode.Join; + } + } + + #endregion + + #region Nested type: SelectFetchMode + + private class SelectFetchMode : FetchMode + { + public override HbmFetchMode ToHbm() + { + return HbmFetchMode.Select; + } + } + + #endregion + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate/Mapping/ByCode/ForClass.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/ForClass.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/ForClass.cs 2011-04-01 17:11:05 UTC (rev 5572) @@ -0,0 +1,30 @@ +using System.Reflection; + +namespace NHibernate.Mapping.ByCode +{ + public static class ForClass<T> + { + private const BindingFlags DefaultFlags = + BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.DeclaredOnly; + + public static FieldInfo Field(string fieldName) + { + if (fieldName == null) + { + return null; + } + + return GetField(typeof(T), fieldName); + } + + private static FieldInfo GetField(System.Type type, string fieldName) + { + if(type == typeof(object) || type == null) + { + return null; + } + FieldInfo member = type.GetField(fieldName, DefaultFlags) ?? GetField(type.BaseType, fieldName); + return member; + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate/Mapping/ByCode/IAccessorPropertyMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/IAccessorPropertyMapper.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/IAccessorPropertyMapper.cs 2011-04-01 17:11:05 UTC (rev 5572) @@ -0,0 +1,17 @@ +namespace NHibernate.Mapping.ByCode +{ + public enum Accessor + { + Property, + Field, + NoSetter, + ReadOnly, + None + } + + public interface IAccessorPropertyMapper + { + void Access(Accessor accessor); + void Access(System.Type accessorType); + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate/Mapping/ByCode/IAnyMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/IAnyMapper.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/IAnyMapper.cs 2011-04-01 17:11:05 UTC (rev 5572) @@ -0,0 +1,32 @@ +using System; +using NHibernate.Type; + +namespace NHibernate.Mapping.ByCode +{ + public interface IAnyMapper : IEntityPropertyMapper + { + void MetaType(IType metaType); + void MetaType<TMetaType>(); + void MetaType(System.Type metaType); + + void IdType(IType idType); + void IdType<TIdType>(); + void IdType(System.Type idType); + + void Columns(Action<IColumnMapper> idColumnMapping, Action<IColumnMapper> classColumnMapping); + + /// <summary> + /// Add or modify a value-class pair. + /// </summary> + /// <param name="value">The value of the DB-field dor a given association instance (should override <see cref="object.ToString"/>)</param> + /// <param name="entityType">The class associated to the specific <paramref name="value"/>. </param> + void MetaValue(object value, System.Type entityType); + + + void Cascade(Cascade cascadeStyle); + void Index(string indexName); + void Lazy(bool isLazy); + void Update(bool consideredInUpdateQuery); + void Insert(bool consideredInInsertQuery); + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate/Mapping/ByCode/IBagPropertiesMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/IBagPropertiesMapper.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/IBagPropertiesMapper.cs 2011-04-01 17:11:05 UTC (rev 5572) @@ -0,0 +1,6 @@ +namespace NHibernate.Mapping.ByCode +{ + public interface IBagPropertiesMapper : ICollectionPropertiesMapper {} + + public interface IBagPropertiesMapper<TEntity, TElement> : ICollectionPropertiesMapper<TEntity, TElement> where TEntity : class {} +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate/Mapping/ByCode/ICacheMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/ICacheMapper.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/ICacheMapper.cs 2011-04-01 17:11:05 UTC (rev 5572) @@ -0,0 +1,15 @@ +namespace NHibernate.Mapping.ByCode +{ + public interface ICacheMapper + { + void Usage(CacheUsage cacheUsage); + void Region(string regionName); + + /// <summary> + /// + /// </summary> + /// <param name="cacheInclude"></param> + /// <remarks>Not supported in NH3.</remarks> + void Include(CacheInclude cacheInclude); + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate/Mapping/ByCode/IClassMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/IClassMapper.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/IClassMapper.cs 2011-04-01 17:11:05 UTC (rev 5572) @@ -0,0 +1,47 @@ +using System; +using System.Linq.Expressions; +using System.Reflection; + +namespace NHibernate.Mapping.ByCode +{ + public interface IClassAttributesMapper : IEntityAttributesMapper, IEntitySqlsMapper + { + void Id(Action<IIdMapper> idMapper); + void Id(MemberInfo idProperty, Action<IIdMapper> idMapper); + void Discriminator(Action<IDiscriminatorMapper> discriminatorMapping); + void DiscriminatorValue(object value); + void Table(string tableName); + void Catalog(string catalogName); + void Schema(string schemaName); + void Mutable(bool isMutable); + void Version(MemberInfo versionProperty, Action<IVersionMapper> versionMapping); + void NaturalId(Action<INaturalIdMapper> naturalIdMapping); + void Cache(Action<ICacheMapper> cacheMapping); + void Filter(string filterName, Action<IFilterMapper> filterMapping); + void Where(string whereClause); + void SchemaAction(SchemaAction action); + } + + public interface IClassMapper : IClassAttributesMapper, IPropertyContainerMapper {} + + public interface IClassAttributesMapper<TEntity> : IEntityAttributesMapper, IEntitySqlsMapper where TEntity : class + { + void Id(Action<IIdMapper> idMapper); + void Id<TProperty>(Expression<Func<TEntity, TProperty>> idProperty, Action<IIdMapper> idMapper); + void Id(FieldInfo idProperty, Action<IIdMapper> idMapper); + void Discriminator(Action<IDiscriminatorMapper> discriminatorMapping); + void DiscriminatorValue(object value); + void Table(string tableName); + void Catalog(string catalogName); + void Schema(string schemaName); + void Mutable(bool isMutable); + void Version<TProperty>(Expression<Func<TEntity, TProperty>> versionProperty, Action<IVersionMapper> versionMapping); + void NaturalId(Action<INaturalIdAttributesMapper> naturalIdMapping); + void Cache(Action<ICacheMapper> cacheMapping); + void Filter(string filterName, Action<IFilterMapper> filterMapping); + void Where(string whereClause); + void SchemaAction(SchemaAction action); + } + + public interface IClassMapper<TEntity> : IClassAttributesMapper<TEntity>, IPropertyContainerMapper<TEntity> where TEntity : class {} +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate/Mapping/ByCode/ICollectionElementRelation.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/ICollectionElementRelation.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/ICollectionElementRelation.cs 2011-04-01 17:11:05 UTC (rev 5572) @@ -0,0 +1,20 @@ +using System; + +namespace NHibernate.Mapping.ByCode +{ + public interface ICollectionElementRelation + { + void Element(Action<IElementMapper> mapping); + void OneToMany(Action<IOneToManyMapper> mapping); + void ManyToMany(Action<IManyToManyMapper> mapping); + void Component(Action<IComponentElementMapper> mapping); + } + + public interface ICollectionElementRelation<TElement> + { + void Element(Action<IElementMapper> mapping); + void OneToMany(Action<IOneToManyMapper> mapping); + void ManyToMany(Action<IManyToManyMapper> mapping); + void Component(Action<IComponentElementMapper<TElement>> mapping); + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate/Mapping/ByCode/ICollectionPropertiesMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/ICollectionPropertiesMapper.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/ICollectionPropertiesMapper.cs 2011-04-01 17:11:05 UTC (rev 5572) @@ -0,0 +1,54 @@ +using System; +using System.Linq.Expressions; +using System.Reflection; +using NHibernate.UserTypes; + +namespace NHibernate.Mapping.ByCode +{ + public interface ICollectionPropertiesMapper : IEntityPropertyMapper, ICollectionSqlsMapper + { + void Inverse(bool value); + void Mutable(bool value); + void Where(string sqlWhereClause); + void BatchSize(int value); + void Lazy(CollectionLazy collectionLazy); + void Key(Action<IKeyMapper> keyMapping); + void OrderBy(MemberInfo property); + void OrderBy(string sqlOrderByClause); + void Sort(); + void Sort<TComparer>(); + void Cascade(Cascade cascadeStyle); + //void Type(string namedCollectionType); // TODO: figure out a way to avoid string for embedded namedCollectionType + void Type<TCollection>() where TCollection : IUserCollectionType; + void Type(System.Type collectionType); + void Table(string tableName); + void Catalog(string catalogName); + void Schema(string schemaName); + void Cache(Action<ICacheMapper> cacheMapping); + void Filter(string filterName, Action<IFilterMapper> filterMapping); + void Fetch(CollectionFetchMode fetchMode); + } + + public interface ICollectionPropertiesMapper<TEntity, TElement> : IEntityPropertyMapper, ICollectionSqlsMapper where TEntity : class + { + void Inverse(bool value); + void Mutable(bool value); + void Where(string sqlWhereClause); + void BatchSize(int value); + void Lazy(CollectionLazy collectionLazy); + void Key(Action<IKeyMapper<TEntity>> keyMapping); + void OrderBy<TProperty>(Expression<Func<TElement, TProperty>> property); + void OrderBy(string sqlOrderByClause); + void Sort(); + void Sort<TComparer>(); + void Cascade(Cascade cascadeStyle); + void Type<TCollection>() where TCollection : IUserCollectionType; + void Type(System.Type collectionType); + void Table(string tableName); + void Catalog(string catalogName); + void Schema(string schemaName); + void Cache(Action<ICacheMapper> cacheMapping); + void Filter(string filterName, Action<IFilterMapper> filterMapping); + void Fetch(CollectionFetchMode fetchMode); + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate/Mapping/ByCode/ICollectionSqlsMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/ICollectionSqlsMapper.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/ICollectionSqlsMapper.cs 2011-04-01 17:11:05 UTC (rev 5572) @@ -0,0 +1,12 @@ +namespace NHibernate.Mapping.ByCode +{ + public interface ICollectionSqlsMapper + { + void Loader(string namedQueryReference); + void SqlInsert(string sql); + void SqlUpdate(string sql); + void SqlDelete(string sql); + void SqlDeleteAll(string sql); + void Subselect(string sql); + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate/Mapping/ByCode/IColumnMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/IColumnMapper.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/IColumnMapper.cs 2011-04-01 17:11:05 UTC (rev 5572) @@ -0,0 +1,17 @@ +namespace NHibernate.Mapping.ByCode +{ + public interface IColumnMapper + { + void Name(string name); + void Length(int length); + void Precision(short precision); + void Scale(short scale); + void NotNullable(bool notnull); + void Unique(bool unique); + void UniqueKey(string uniquekeyName); + void SqlType(string sqltype); + void Index(string indexName); + void Check(string checkConstraint); + void Default(object defaultValue); + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate/Mapping/ByCode/IColumnsMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/IColumnsMapper.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/IColumnsMapper.cs 2011-04-01 17:11:05 UTC (rev 5572) @@ -0,0 +1,11 @@ +using System; + +namespace NHibernate.Mapping.ByCode +{ + public interface IColumnsMapper + { + void Column(Action<IColumnMapper> columnMapper); + void Columns(params Action<IColumnMapper>[] columnMapper); + void Column(string name); + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate/Mapping/ByCode/IComponentElementMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/IComponentElementMapper.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/IComponentElementMapper.cs 2011-04-01 17:11:05 UTC (rev 5572) @@ -0,0 +1,26 @@ +using System; +using System.Linq.Expressions; +using System.Reflection; + +namespace NHibernate.Mapping.ByCode +{ + public interface IComponentElementMapper : IComponentAttributesMapper + { + void Property(MemberInfo property, Action<IPropertyMapper> mapping); + + void Component(MemberInfo property, Action<IComponentElementMapper> mapping); + + void ManyToOne(MemberInfo property, Action<IManyToOneMapper> mapping); + } + + public interface IComponentElementMapper<TComponent> : IComponentAttributesMapper<TComponent> + { + void Property<TProperty>(Expression<Func<TComponent, TProperty>> property, Action<IPropertyMapper> mapping); + + void Component<TNestedComponent>(Expression<Func<TComponent, TNestedComponent>> property, + Action<IComponentElementMapper<TNestedComponent>> mapping) + where TNestedComponent : class; + + void ManyToOne<TProperty>(Expression<Func<TComponent, TProperty>> property, Action<IManyToOneMapper> mapping) where TProperty : class; + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate/Mapping/ByCode/IComponentMapKeyMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/IComponentMapKeyMapper.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/IComponentMapKeyMapper.cs 2011-04-01 17:11:05 UTC (rev 5572) @@ -0,0 +1,20 @@ +using System; +using System.Linq.Expressions; +using System.Reflection; + +namespace NHibernate.Mapping.ByCode +{ + public interface IComponentMapKeyMapper + { + void Property(MemberInfo property, Action<IPropertyMapper> mapping); + + void ManyToOne(MemberInfo property, Action<IManyToOneMapper> mapping); + } + + public interface IComponentMapKeyMapper<TComponent> + { + void Property<TProperty>(Expression<Func<TComponent, TProperty>> property, Action<IPropertyMapper> mapping); + + void ManyToOne<TProperty>(Expression<Func<TComponent, TProperty>> property, Action<IManyToOneMapper> mapping) where TProperty : class; + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate/Mapping/ByCode/IComponentMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/IComponentMapper.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/IComponentMapper.cs 2011-04-01 17:11:05 UTC (rev 5572) @@ -0,0 +1,30 @@ +using System; +using System.Linq.Expressions; +using System.Reflection; + +namespace NHibernate.Mapping.ByCode +{ + public interface IComponentAttributesMapper : IEntityPropertyMapper + { + void Parent(MemberInfo parent); + void Parent(MemberInfo parent, Action<IComponentParentMapper> parentMapping); + void Update(bool consideredInUpdateQuery); + void Insert(bool consideredInInsertQuery); + void Lazy(bool isLazy); + void Class(System.Type componentType); + } + + public interface IComponentMapper : IComponentAttributesMapper, IPropertyContainerMapper {} + + public interface IComponentAttributesMapper<TComponent> : IEntityPropertyMapper + { + void Parent<TProperty>(Expression<Func<TComponent, TProperty>> parent) where TProperty : class; + void Parent<TProperty>(Expression<Func<TComponent, TProperty>> parent, Action<IComponentParentMapper> parentMapping) where TProperty : class; + void Update(bool consideredInUpdateQuery); + void Insert(bool consideredInInsertQuery); + void Lazy(bool isLazy); + void Class<TConcrete>() where TConcrete : TComponent; + } + + public interface IComponentMapper<TComponent> : IComponentAttributesMapper<TComponent>, IPropertyContainerMapper<TComponent> where TComponent : class {} +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate/Mapping/ByCode/IComponentParentMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/IComponentParentMapper.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/IComponentParentMapper.cs 2011-04-01 17:11:05 UTC (rev 5572) @@ -0,0 +1,4 @@ +namespace NHibernate.Mapping.ByCode +{ + public interface IComponentParentMapper : IAccessorPropertyMapper {} +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate/Mapping/ByCode/IDiscriminatorMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/IDiscriminatorMapper.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/IDiscriminatorMapper.cs 2011-04-01 17:11:05 UTC (rev 5572) @@ -0,0 +1,20 @@ +using System; +using NHibernate.Type; + +namespace NHibernate.Mapping.ByCode +{ + public interface IDiscriminatorMapper + { + void Column(string column); + void Column(Action<IColumnMapper> columnMapper); + void Type(IType persistentType); + void Type(IDiscriminatorType persistentType); + void Type<TPersistentType>() where TPersistentType : IDiscriminatorType; + void Type(System.Type persistentType); + void Formula(string formula); + void Force(bool force); + void Insert(bool applyOnApplyOnInsert); + void NotNullable(bool isNotNullable); + void Length(int length); + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate/Mapping/ByCode/IElementMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/IElementMapper.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/IElementMapper.cs 2011-04-01 17:11:05 UTC (rev 5572) @@ -0,0 +1,18 @@ +using NHibernate.Type; + +namespace NHibernate.Mapping.ByCode +{ + public interface IElementMapper : IColumnsMapper + { + void Type(IType persistentType); + void Type<TPersistentType>(); + void Type<TPersistentType>(object parameters); + void Type(System.Type persistentType, object parameters); + void Length(int length); + void Precision(short precision); + void Scale(short scale); + void NotNullable(bool notnull); + void Unique(bool unique); + void Formula(string formula); + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate/Mapping/ByCode/IEntityAttributesMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/IEntityAttributesMapper.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/IEntityAttributesMapper.cs 2011-04-01 17:11:05 UTC (rev 5572) @@ -0,0 +1,16 @@ +using NHibernate.Persister.Entity; + +namespace NHibernate.Mapping.ByCode +{ + public interface IEntityAttributesMapper + { + void EntityName(string value); + void Proxy(System.Type proxy); + void Lazy(bool value); + void DynamicUpdate(bool value); + void DynamicInsert(bool value); + void BatchSize(int value); + void SelectBeforeUpdate(bool value); + void Persister<T>() where T : IEntityPersister; + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate/Mapping/ByCode/IEntityPropertyMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/IEntityPropertyMapper.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/IEntityPropertyMapper.cs 2011-04-01 17:11:05 UTC (rev 5572) @@ -0,0 +1,7 @@ +namespace NHibernate.Mapping.ByCode +{ + public interface IEntityPropertyMapper : IAccessorPropertyMapper + { + void OptimisticLock(bool takeInConsiderationForOptimisticLock); + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate/Mapping/ByCode/IEntitySqlsMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/IEntitySqlsMapper.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/IEntitySqlsMapper.cs 2011-04-01 17:11:05 UTC (rev 5572) @@ -0,0 +1,11 @@ +namespace NHibernate.Mapping.ByCode +{ + public interface IEntitySqlsMapper + { + void Loader(string namedQueryReference); + void SqlInsert(string sql); + void SqlUpdate(string sql); + void SqlDelete(string sql); + void Subselect(string sql); + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate/Mapping/ByCode/IFilterMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/IFilterMapper.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/IFilterMapper.cs 2011-04-01 17:11:05 UTC (rev 5572) @@ -0,0 +1,7 @@ +namespace NHibernate.Mapping.ByCode +{ + public interface IFilterMapper + { + void Condition(string sqlCondition); + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate/Mapping/ByCode/IGenerator.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/IGenerator.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/IGenerator.cs 2011-04-01 17:11:05 UTC (rev 5572) @@ -0,0 +1,4 @@ +namespace NHibernate.Mapping.ByCode +{ + public interface IGenerator {} +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate/Mapping/ByCode/IGeneratorDef.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/IGeneratorDef.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/IGeneratorDef.cs 2011-04-01 17:11:05 UTC (rev 5572) @@ -0,0 +1,8 @@ +namespace NHibernate.Mapping.ByCode +{ + public interface IGeneratorDef + { + string Class { get; } + object Params { get; } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate/Mapping/ByCode/IGeneratorMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/IGeneratorMapper.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/IGeneratorMapper.cs 2011-04-01 17:11:05 UTC (rev 5572) @@ -0,0 +1,7 @@ +namespace NHibernate.Mapping.ByCode +{ + public interface IGeneratorMapper + { + void Params(object generatorParameters); + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate/Mapping/ByCode/IIdMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/IIdMapper.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/IIdMapper.cs 2011-04-01 17:11:05 UTC (rev 5572) @@ -0,0 +1,20 @@ +using System; +using NHibernate.Type; + +namespace NHibernate.Mapping.ByCode +{ + public interface IIdMapper : IAccessorPropertyMapper + { + void Generator(IGeneratorDef generator); + void Generator(IGeneratorDef generator, Action<IGeneratorMapper> generatorMapping); + + void Type(IIdentifierType persistentType); + //void Type<TPersistentType>() where TPersistentType : IIdentifierType; + //void Type<TPersistentType>(object parameters) where TPersistentType : IIdentifierType; + //void Type(System.System.Type persistentType, object parameters); + //void Column(Action<IColumnMapper> columnMapper); + //void Columns(params Action<IColumnMapper>[] columnMapper); + void Column(string name); + void Length(int length); + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate/Mapping/ByCode/IJoinedSubclassMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/IJoinedSubclassMapper.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/IJoinedSubclassMapper.cs 2011-04-01 17:11:05 UTC (rev 5572) @@ -0,0 +1,25 @@ +using System; + +namespace NHibernate.Mapping.ByCode +{ + public interface IJoinedSubclassAttributesMapper : IEntityAttributesMapper, IEntitySqlsMapper + { + void Table(string tableName); + void Catalog(string catalogName); + void Schema(string schemaName); + void Key(Action<IKeyMapper> keyMapping); + void Extends(System.Type baseType); + } + + public int... [truncated message content] |
From: <fab...@us...> - 2011-03-30 22:41:53
|
Revision: 5571 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5571&view=rev Author: fabiomaulo Date: 2011-03-30 22:41:47 +0000 (Wed, 30 Mar 2011) Log Message: ----------- Fix NH-2607 even if cannot be recreated using the obj as mapped entity (the DynProxyTypeValidator already prevent the case exposed). Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Proxy/DynamicProxy/ProxyFactory.cs Modified: trunk/nhibernate/src/NHibernate/Proxy/DynamicProxy/ProxyFactory.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Proxy/DynamicProxy/ProxyFactory.cs 2011-03-30 22:25:25 UTC (rev 5570) +++ trunk/nhibernate/src/NHibernate/Proxy/DynamicProxy/ProxyFactory.cs 2011-03-30 22:41:47 UTC (rev 5571) @@ -179,10 +179,12 @@ private bool IsProxiable(MethodInfo method) { - return (((method.IsPublic || method.IsFamily || method.IsAssembly || method.IsFamilyOrAssembly) - && (method.IsVirtual || method.IsAbstract)) - && (method.DeclaringType != typeof(MarshalByRefObject))) - && (method.DeclaringType != typeof(object) || !"finalize".Equals(method.Name.ToLowerInvariant())); + return ( + ((method.IsPublic || method.IsFamily || method.IsAssembly || method.IsFamilyOrAssembly) && (method.IsVirtual || method.IsAbstract)) + && !method.IsFinal + && (method.DeclaringType != typeof (MarshalByRefObject))) + && (method.DeclaringType != typeof (object) || !"finalize".Equals(method.Name.ToLowerInvariant()) + ); } private static ConstructorBuilder DefineConstructor(TypeBuilder typeBuilder) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2011-03-30 22:25:32
|
Revision: 5570 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5570&view=rev Author: fabiomaulo Date: 2011-03-30 22:25:25 +0000 (Wed, 30 Mar 2011) Log Message: ----------- Fix NH-2610 Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Impl/MultiCriteriaImpl.cs trunk/nhibernate/src/NHibernate/Impl/MultiQueryImpl.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/SqlConverterAndMultiQuery/ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/SqlConverterAndMultiQuery/Fixture.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/SqlConverterAndMultiQuery/Mappings.hbm.xml trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/SqlConverterAndMultiQuery/Model.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/SqlConverterAndMultiQuery/SqlConverter.cs Modified: trunk/nhibernate/src/NHibernate/Impl/MultiCriteriaImpl.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/MultiCriteriaImpl.cs 2011-03-30 01:50:31 UTC (rev 5569) +++ trunk/nhibernate/src/NHibernate/Impl/MultiCriteriaImpl.cs 2011-03-30 22:25:25 UTC (rev 5570) @@ -1,6 +1,7 @@ using System; using System.Collections; using System.Collections.Generic; +using System.Data.Common; using System.Diagnostics; using Iesi.Collections; using Iesi.Collections.Generic; @@ -8,6 +9,7 @@ using NHibernate.Criterion; using NHibernate.Driver; using NHibernate.Engine; +using NHibernate.Exceptions; using NHibernate.Loader.Criteria; using NHibernate.SqlCommand; using NHibernate.Transform; @@ -189,13 +191,13 @@ } int rowCount = 0; - using (var reader = resultSetsCommand.GetReader(parameters.ToArray(), null)) + try { - ArrayList[] hydratedObjects = new ArrayList[loaders.Count]; - List<EntityKey[]>[] subselectResultKeys = new List<EntityKey[]>[loaders.Count]; - bool[] createSubselects = new bool[loaders.Count]; - try + using (var reader = resultSetsCommand.GetReader(parameters.ToArray(), null)) { + ArrayList[] hydratedObjects = new ArrayList[loaders.Count]; + List<EntityKey[]>[] subselectResultKeys = new List<EntityKey[]>[loaders.Count]; + bool[] createSubselects = new bool[loaders.Count]; for (int i = 0; i < loaders.Count; i++) { CriteriaLoader loader = loaders[i]; @@ -217,7 +219,7 @@ createSubselects[i] = loader.IsSubselectLoadingEnabled; subselectResultKeys[i] = createSubselects[i] ? new List<EntityKey[]>() : null; int maxRows = Loader.Loader.HasMaxRows(selection) ? selection.MaxRows : int.MaxValue; - if (!dialect.SupportsLimitOffset || !NHibernate.Loader.Loader.UseLimit(selection, dialect)) + if (!dialect.SupportsLimitOffset || !Loader.Loader.UseLimit(selection, dialect)) { Loader.Loader.Advance(reader, selection); } @@ -228,7 +230,7 @@ object o = loader.GetRowFromResultSet(reader, session, queryParameters, loader.GetLockModes(queryParameters.LockModes), - null, hydratedObjects[i], keys, true); + null, hydratedObjects[i], keys, true); if (createSubselects[i]) { subselectResultKeys[i].Add(keys); @@ -239,24 +241,25 @@ results.Add(tmpResults); reader.NextResult(); } - } - catch (Exception e) - { - var message = string.Format("Failed to execute multi criteria: [{0}]", resultSetsCommand.Sql); - log.Error(message, e); - throw new HibernateException(message, e); - } - for (int i = 0; i < loaders.Count; i++) - { - CriteriaLoader loader = loaders[i]; - loader.InitializeEntitiesAndCollections(hydratedObjects[i], reader, session, false); - if (createSubselects[i]) + for (int i = 0; i < loaders.Count; i++) { - loader.CreateSubselects(subselectResultKeys[i], parameters[i], session); + CriteriaLoader loader = loaders[i]; + loader.InitializeEntitiesAndCollections(hydratedObjects[i], reader, session, false); + + if (createSubselects[i]) + { + loader.CreateSubselects(subselectResultKeys[i], parameters[i], session); + } } } } + catch (Exception sqle) + { + var message = string.Format("Failed to execute multi criteria: [{0}]", resultSetsCommand.Sql); + log.Error(message, sqle); + throw ADOExceptionHelper.Convert(session.Factory.SQLExceptionConverter, sqle, "Failed to execute multi criteria", resultSetsCommand.Sql); + } if (statsEnabled) { stopWatch.Stop(); Modified: trunk/nhibernate/src/NHibernate/Impl/MultiQueryImpl.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/MultiQueryImpl.cs 2011-03-30 01:50:31 UTC (rev 5569) +++ trunk/nhibernate/src/NHibernate/Impl/MultiQueryImpl.cs 2011-03-30 22:25:25 UTC (rev 5570) @@ -1,6 +1,7 @@ using System; using System.Collections; using System.Collections.Generic; +using System.Data.Common; using System.Diagnostics; using System.Linq; using Iesi.Collections; @@ -9,6 +10,7 @@ using NHibernate.Driver; using NHibernate.Engine; using NHibernate.Engine.Query.Sql; +using NHibernate.Exceptions; using NHibernate.Hql; using NHibernate.Loader.Custom; using NHibernate.Loader.Custom.Sql; @@ -508,9 +510,9 @@ List<EntityKey[]>[] subselectResultKeys = new List<EntityKey[]>[Translators.Count]; bool[] createSubselects = new bool[Translators.Count]; - using (var reader = resultSetsCommand.GetReader(Parameters.ToArray(), commandTimeout != RowSelection.NoValue ? commandTimeout : (int?)null)) + try { - try + using (var reader = resultSetsCommand.GetReader(Parameters.ToArray(), commandTimeout != RowSelection.NoValue ? commandTimeout : (int?)null)) { if (log.IsDebugEnabled) { @@ -521,13 +523,13 @@ ITranslator translator = Translators[i]; QueryParameters parameter = Parameters[i]; IList tempResults; - if (resultCollectionGenericType[i] == typeof (object)) + if (resultCollectionGenericType[i] == typeof(object)) { tempResults = new ArrayList(); } else { - tempResults = (IList) Activator.CreateInstance(typeof (List<>).MakeGenericType(resultCollectionGenericType[i])); + tempResults = (IList)Activator.CreateInstance(typeof(List<>).MakeGenericType(resultCollectionGenericType[i])); } int entitySpan = translator.Loader.EntityPersisters.Length; hydratedObjects[i] = entitySpan > 0 ? new ArrayList() : null; @@ -564,13 +566,13 @@ object result = translator.Loader.GetRowFromResultSet(reader, - session, - parameter, - lockModeArray, - optionalObjectKey, - hydratedObjects[i], - keys, - true); + session, + parameter, + lockModeArray, + optionalObjectKey, + hydratedObjects[i], + keys, + true); tempResults.Add(result); @@ -595,27 +597,27 @@ reader.NextResult(); } - } - catch (Exception ex) - { - var message = string.Format("Failed to execute multi query: [{0}]", resultSetsCommand.Sql); - log.Error(message, ex); - throw new HibernateException(message, ex); - } - for (int i = 0; i < translators.Count; i++) - { - ITranslator translator = translators[i]; - QueryParameters parameter = parameters[i]; + for (int i = 0; i < translators.Count; i++) + { + ITranslator translator = translators[i]; + QueryParameters parameter = parameters[i]; - translator.Loader.InitializeEntitiesAndCollections(hydratedObjects[i], reader, session, false); + translator.Loader.InitializeEntitiesAndCollections(hydratedObjects[i], reader, session, false); - if (createSubselects[i]) - { - translator.Loader.CreateSubselects(subselectResultKeys[i], parameter, session); + if (createSubselects[i]) + { + translator.Loader.CreateSubselects(subselectResultKeys[i], parameter, session); + } } } } + catch (Exception sqle) + { + var message = string.Format("Failed to execute multi query: [{0}]", resultSetsCommand.Sql); + log.Error(message, sqle); + throw ADOExceptionHelper.Convert(session.Factory.SQLExceptionConverter, sqle, "Failed to execute multi query", resultSetsCommand.Sql); + } if (statsEnabled) { Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/SqlConverterAndMultiQuery/Fixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/SqlConverterAndMultiQuery/Fixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/SqlConverterAndMultiQuery/Fixture.cs 2011-03-30 22:25:25 UTC (rev 5570) @@ -0,0 +1,77 @@ +using NHibernate.Cfg; +using NHibernate.Cfg.Loquacious; +using NUnit.Framework; + +namespace NHibernate.Test.NHSpecificTest.SqlConverterAndMultiQuery +{ + [TestFixture] + public class Fixture : BugTestCase + { + private const string hqlQuery = "select a.Id from ClassA a"; + + protected override void Configure(Configuration configuration) + { + configuration.DataBaseIntegration(x => x.ExceptionConverter<SqlConverter>()); + } + + [Test] + public void NormalHqlShouldThrowUserException() + { + using(var s = OpenSession()) + { + using(s.BeginTransaction()) + { + s.Connection.Close(); + Assert.Throws<UnitTestException>(() => + s.CreateQuery(hqlQuery).List()); + } + } + } + + [Test] + public void MultiHqlShouldThrowUserException() + { + using (var s = OpenSession()) + { + using (s.BeginTransaction()) + { + var multi = s.CreateMultiQuery(); + multi.Add(hqlQuery); + s.Connection.Close(); + Assert.Throws<UnitTestException>(() => + multi.List()); + } + } + } + + [Test] + public void NormalCriteriaShouldThrowUserException() + { + using (var s = OpenSession()) + { + using (s.BeginTransaction()) + { + s.Connection.Close(); + Assert.Throws<UnitTestException>(() => + s.CreateCriteria(typeof(ClassA)).List()); + } + } + } + + [Test] + public void MultiCriteriaShouldThrowUserException() + { + using (var s = OpenSession()) + { + using (s.BeginTransaction()) + { + var multi = s.CreateMultiCriteria(); + multi.Add(s.CreateCriteria(typeof (ClassA))); + s.Connection.Close(); + Assert.Throws<UnitTestException>(() => + multi.List()); + } + } + } + } +} Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/SqlConverterAndMultiQuery/Mappings.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/SqlConverterAndMultiQuery/Mappings.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/SqlConverterAndMultiQuery/Mappings.hbm.xml 2011-03-30 22:25:25 UTC (rev 5570) @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" + namespace="NHibernate.Test.NHSpecificTest.SqlConverterAndMultiQuery" + assembly="NHibernate.Test"> + + <class name="ClassA"> + <id name="Id"> + <generator class="native"/> + </id> + </class> +</hibernate-mapping> Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/SqlConverterAndMultiQuery/Model.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/SqlConverterAndMultiQuery/Model.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/SqlConverterAndMultiQuery/Model.cs 2011-03-30 22:25:25 UTC (rev 5570) @@ -0,0 +1,7 @@ +namespace NHibernate.Test.NHSpecificTest.SqlConverterAndMultiQuery +{ + public class ClassA + { + public virtual int Id { get; set; } + } +} Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/SqlConverterAndMultiQuery/SqlConverter.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/SqlConverterAndMultiQuery/SqlConverter.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/SqlConverterAndMultiQuery/SqlConverter.cs 2011-03-30 22:25:25 UTC (rev 5570) @@ -0,0 +1,15 @@ +using System; +using NHibernate.Exceptions; + +namespace NHibernate.Test.NHSpecificTest.SqlConverterAndMultiQuery +{ + public class SqlConverter : ISQLExceptionConverter + { + public Exception Convert(AdoExceptionContextInfo adoExceptionContextInfo) + { + return new UnitTestException(); + } + } + + public class UnitTestException : Exception{} +} Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-03-30 01:50:31 UTC (rev 5569) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-03-30 22:25:25 UTC (rev 5570) @@ -677,6 +677,9 @@ <Compile Include="NHSpecificTest\Properties\CompositePropertyRefTest.cs" /> <Compile Include="NHSpecificTest\Properties\DynamicEntityTest.cs" /> <Compile Include="NHSpecificTest\Properties\Model.cs" /> + <Compile Include="NHSpecificTest\SqlConverterAndMultiQuery\Fixture.cs" /> + <Compile Include="NHSpecificTest\SqlConverterAndMultiQuery\Model.cs" /> + <Compile Include="NHSpecificTest\SqlConverterAndMultiQuery\SqlConverter.cs" /> <Compile Include="PolymorphicGetAndLoad\Domain.cs" /> <Compile Include="PolymorphicGetAndLoad\PolymorphicGetAndLoadTest.cs" /> <Compile Include="PropertyTest\FieldCamelCaseMUnderscoreFixture.cs" /> @@ -2500,6 +2503,7 @@ <EmbeddedResource Include="NHSpecificTest\NH1291AnonExample\Mappings.hbm.xml" /> </ItemGroup> <ItemGroup> + <EmbeddedResource Include="NHSpecificTest\SqlConverterAndMultiQuery\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2489\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2603\Mappings.hbm.xml" /> <EmbeddedResource Include="Subselect\Beings.hbm.xml" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jul...@us...> - 2011-03-30 01:50:38
|
Revision: 5569 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5569&view=rev Author: julian-maughan Date: 2011-03-30 01:50:31 +0000 (Wed, 30 Mar 2011) Log Message: ----------- Added PostgreSQL metadata provider (NH-2426) Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Dialect/PostgreSQLDialect.cs trunk/nhibernate/src/NHibernate/NHibernate.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate/Dialect/Schema/PostgreSQLMetadata.cs Modified: trunk/nhibernate/src/NHibernate/Dialect/PostgreSQLDialect.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Dialect/PostgreSQLDialect.cs 2011-03-29 14:23:44 UTC (rev 5568) +++ trunk/nhibernate/src/NHibernate/Dialect/PostgreSQLDialect.cs 2011-03-30 01:50:31 UTC (rev 5569) @@ -1,6 +1,8 @@ using System.Data; +using System.Data.Common; using NHibernate.Cfg; using NHibernate.Dialect.Function; +using NHibernate.Dialect.Schema; using NHibernate.SqlCommand; using NHibernate.SqlTypes; @@ -12,21 +14,22 @@ /// <remarks> /// The PostgreSQLDialect defaults the following configuration properties: /// <list type="table"> - /// <listheader> - /// <term>Property</term> - /// <description>Default Value</description> - /// </listheader> - /// <item> - /// <term>connection.driver_class</term> - /// <description><see cref="NHibernate.Driver.NpgsqlDriver" /></description> - /// </item> + /// <listheader> + /// <term>Property</term> + /// <description>Default Value</description> + /// </listheader> + /// <item> + /// <term>connection.driver_class</term> + /// <description><see cref="NHibernate.Driver.NpgsqlDriver" /></description> + /// </item> /// </list> /// </remarks> public class PostgreSQLDialect : Dialect { - /// <summary></summary> public PostgreSQLDialect() { + DefaultProperties[Environment.ConnectionDriver] = "NHibernate.Driver.NpgsqlDriver"; + RegisterColumnType(DbType.AnsiStringFixedLength, "char(255)"); RegisterColumnType(DbType.AnsiStringFixedLength, 8000, "char($l)"); RegisterColumnType(DbType.AnsiString, "varchar(255)"); @@ -51,7 +54,7 @@ RegisterColumnType(DbType.StringFixedLength, 4000, "char($l)"); RegisterColumnType(DbType.String, "varchar(255)"); RegisterColumnType(DbType.String, 4000, "varchar($l)"); - RegisterColumnType(DbType.String, 1073741823, "text"); // + RegisterColumnType(DbType.String, 1073741823, "text"); RegisterColumnType(DbType.Time, "time"); // Override standard HQL function @@ -59,23 +62,17 @@ RegisterFunction("str", new SQLFunctionTemplate(NHibernateUtil.String, "cast(?1 as varchar)")); RegisterFunction("locate", new PositionSubstringFunction()); RegisterFunction("iif", new SQLFunctionTemplate(null, "case when ?1 then ?2 else ?3 end")); - RegisterFunction("substring", new AnsiSubstringFunction()); RegisterFunction("replace", new StandardSQLFunction("replace", NHibernateUtil.String)); RegisterFunction("left", new SQLFunctionTemplate(NHibernateUtil.String, "substr(?1,1,?2)")); - RegisterFunction("mod", new SQLFunctionTemplate(NHibernateUtil.Int32, "((?1) % (?2))")); - - DefaultProperties[Environment.ConnectionDriver] = "NHibernate.Driver.NpgsqlDriver"; } - /// <summary></summary> public override string AddColumnString { get { return "add column"; } } - /// <summary></summary> public override bool DropConstraints { get { return false; } @@ -111,10 +108,10 @@ return insertString.Append(" returning " + identifierColumnName); } - public override InsertGeneratedIdentifierRetrievalMethod InsertGeneratedIdentifierRetrievalMethod - { - get { return InsertGeneratedIdentifierRetrievalMethod.OutputParameter; } - } + public override InsertGeneratedIdentifierRetrievalMethod InsertGeneratedIdentifierRetrievalMethod + { + get { return InsertGeneratedIdentifierRetrievalMethod.OutputParameter; } + } public override bool SupportsSequences { @@ -192,13 +189,6 @@ get { return true; } } - /*public override bool DropTemporaryTableAfterUse() - { - //we have to, because postgres sets current tx - //to rollback only after a failed create table - return true; - }*/ - public override string CreateTemporaryTableString { get { return "create temporary table"; } @@ -206,10 +196,7 @@ public override string CreateTemporaryTablePostfix { - get - { - return "on commit drop"; - } + get { return "on commit drop"; } } public override string ToBooleanValueString(bool value) @@ -217,9 +204,14 @@ return value ? "TRUE" : "FALSE"; } - public override string SelectGUIDString - { - get { return "select uuid_generate_v4()"; } - } + public override string SelectGUIDString + { + get { return "select uuid_generate_v4()"; } + } + + public override IDataBaseSchema GetDataBaseSchema(DbConnection connection) + { + return new PostgreSQLDataBaseMetadata(connection); + } } } Added: trunk/nhibernate/src/NHibernate/Dialect/Schema/PostgreSQLMetadata.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Dialect/Schema/PostgreSQLMetadata.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Dialect/Schema/PostgreSQLMetadata.cs 2011-03-30 01:50:31 UTC (rev 5569) @@ -0,0 +1,110 @@ +using System; +using System.Data; +using System.Data.Common; +using Iesi.Collections.Generic; + +namespace NHibernate.Dialect.Schema +{ + public class PostgreSQLDataBaseMetadata : AbstractDataBaseSchema + { + public PostgreSQLDataBaseMetadata(DbConnection connection) : base(connection) {} + + public override ITableMetadata GetTableMetadata(DataRow rs, bool extras) + { + return new PostgreSQLTableMetadata(rs, this, extras); + } + + public override ISet<string> GetReservedWords() + { + // NpgsqlDriver does not currently (2011/03/30) support this feature, so the + // base class implementation has to be overriden + return new HashedSet<string>(); + } + } + + public class PostgreSQLTableMetadata : AbstractTableMetadata + { + public PostgreSQLTableMetadata(DataRow rs, IDataBaseSchema meta, bool extras) : base(rs, meta, extras) {} + + protected override IColumnMetadata GetColumnMetadata(DataRow rs) + { + return new PostgreSQLColumnMetadata(rs); + } + + protected override string GetColumnName(DataRow rs) + { + return Convert.ToString(rs["COLUMN_NAME"]); + } + + protected override string GetConstraintName(DataRow rs) + { + throw new NotImplementedException(); + } + + protected override IForeignKeyMetadata GetForeignKeyMetadata(DataRow rs) + { + return new PostgreSQLForeignKeyMetadata(rs); + } + + protected override IIndexMetadata GetIndexMetadata(DataRow rs) + { + return new PostgreSQLIndexMetadata(rs); + } + + protected override string GetIndexName(DataRow rs) + { + return Convert.ToString(rs["INDEX_NAME"]); + } + + protected override void ParseTableInfo(DataRow rs) + { + Catalog = Convert.ToString(rs["TABLE_CATALOG"]); + Schema = Convert.ToString(rs["TABLE_SCHEMA"]); + if (string.IsNullOrEmpty(Catalog)) + { + Catalog = null; + } + if (string.IsNullOrEmpty(Schema)) + { + Schema = null; + } + Name = Convert.ToString(rs["TABLE_NAME"]); + } + } + + public class PostgreSQLColumnMetadata : AbstractColumnMetaData + { + public PostgreSQLColumnMetadata(DataRow rs) : base(rs) + { + Name = Convert.ToString(rs["COLUMN_NAME"]); + object objValue = rs["CHARACTER_MAXIMUM_LENGTH"]; + if (objValue != DBNull.Value) + { + ColumnSize = Convert.ToInt32(objValue); + } + objValue = rs["NUMERIC_PRECISION"]; + if (objValue != DBNull.Value) + { + NumericalPrecision = Convert.ToInt32(objValue); + } + Nullable = Convert.ToString(rs["IS_NULLABLE"]); + TypeName = Convert.ToString(rs["DATA_TYPE"]); + } + } + + public class PostgreSQLIndexMetadata : AbstractIndexMetadata + { + public PostgreSQLIndexMetadata(DataRow rs) : base(rs) + { + Name = Convert.ToString(rs["INDEX_NAME"]); + } + } + + public class PostgreSQLForeignKeyMetadata : AbstractForeignKeyMetadata + { + public PostgreSQLForeignKeyMetadata(DataRow rs) : base(rs) + { + Name = Convert.ToString(rs["CONSTRAINT_NAME"]); + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj =================================================================== --- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2011-03-29 14:23:44 UTC (rev 5568) +++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2011-03-30 01:50:31 UTC (rev 5569) @@ -138,6 +138,7 @@ <Compile Include="Dialect\MsSql7Dialect.cs" /> <Compile Include="Dialect\MySQLDialect.cs" /> <Compile Include="Dialect\PostgreSQLDialect.cs" /> + <Compile Include="Dialect\Schema\PostgreSQLMetadata.cs" /> <Compile Include="Dialect\SQLiteDialect.cs" /> <Compile Include="Dialect\SybaseSQLAnywhere10Dialect.cs" /> <Compile Include="Dialect\SybaseSQLAnywhere11Dialect.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2011-03-29 14:23:51
|
Revision: 5568 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5568&view=rev Author: fabiomaulo Date: 2011-03-29 14:23:44 +0000 (Tue, 29 Mar 2011) Log Message: ----------- Fix NH-2605 Modified Paths: -------------- trunk/nhibernate/releasenotes.txt trunk/nhibernate/src/NHibernate/Driver/DriverBase.cs trunk/nhibernate/src/NHibernate/Driver/IDriver.cs trunk/nhibernate/src/NHibernate/Driver/MySqlDataDriver.cs trunk/nhibernate/src/NHibernate/Driver/NpgsqlDriver.cs trunk/nhibernate/src/NHibernate/Driver/SQLite20Driver.cs trunk/nhibernate/src/NHibernate/Driver/SqlClientDriver.cs trunk/nhibernate/src/NHibernate/Driver/SqlServerCeDriver.cs trunk/nhibernate/src/NHibernate/Impl/MultiCriteriaImpl.cs trunk/nhibernate/src/NHibernate/Impl/MultiQueryImpl.cs trunk/nhibernate/src/NHibernate/NHibernate.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate/Driver/BasicResultSetsCommand.cs trunk/nhibernate/src/NHibernate/Driver/IResultSetsCommand.cs Modified: trunk/nhibernate/releasenotes.txt =================================================================== --- trunk/nhibernate/releasenotes.txt 2011-03-28 19:43:25 UTC (rev 5567) +++ trunk/nhibernate/releasenotes.txt 2011-03-29 14:23:44 UTC (rev 5568) @@ -6,6 +6,7 @@ * [NH-2550] - Allow public access to FieldInterceptor Session (IFieldInterceptor changed) * [NH-2593] - Form Microsoft SQL Server the default batch-size (adonet.batch_size) is set to 20 where not explicit defined in the session-factory configuration * - ICollectionPersister added property to fix [NH-2489] + * [NH-2605] Refactorize MultiQuery/MultiCriteria implementation to delegate responsibility to IDrive (IDrive changed). Build 3.1.0.GA (rev5425) ============================= Added: trunk/nhibernate/src/NHibernate/Driver/BasicResultSetsCommand.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Driver/BasicResultSetsCommand.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Driver/BasicResultSetsCommand.cs 2011-03-29 14:23:44 UTC (rev 5568) @@ -0,0 +1,307 @@ +using System; +using System.Collections.Generic; +using System.Data; +using NHibernate.Engine; +using NHibernate.SqlCommand; +using NHibernate.SqlTypes; + +namespace NHibernate.Driver +{ + public class BasicResultSetsCommand: IResultSetsCommand + { + private static readonly IInternalLogger log = LoggerProvider.LoggerFor(typeof(BasicResultSetsCommand)); + + private readonly ISessionImplementor session; + private readonly Dialect.Dialect dialect; + private readonly IBatcher batcher; + private int resultSetsCount = 0; + private readonly List<SqlType> types = new List<SqlType>(); + private SqlString sqlString = new SqlString(); + + public BasicResultSetsCommand(ISessionImplementor session) + { + this.session = session; + dialect = session.Factory.Dialect; + batcher = session.Batcher; + } + + public virtual void Append(SqlCommandInfo commandInfo) + { + resultSetsCount++; + sqlString = sqlString.Append(commandInfo.Text).Append(";").Append(Environment.NewLine); + types.AddRange(commandInfo.ParameterTypes); + } + + public int ParametersCount + { + get { return types.Count; } + } + + public bool HasQueries + { + get { return resultSetsCount > 0; } + } + + public SqlString Sql + { + get { return sqlString; } + } + + public virtual IDataReader GetReader(QueryParameters[] queryParameters, int? commandTimeout) + { + SqlType[] sqlTypes = types.ToArray(); + var command= batcher.PrepareQueryCommand(CommandType.Text, sqlString, sqlTypes); + if(commandTimeout.HasValue) + { + command.CommandTimeout = commandTimeout.Value; + } + log.Info(command.CommandText); + + BindParameters(command, queryParameters); + return new BatcherDataReaderWrapper(batcher, command); + } + + protected virtual void BindParameters(IDbCommand command, QueryParameters[] queryParameters) + { + int colIndex = 0; + + for (int queryIndex = 0; queryIndex < resultSetsCount; queryIndex++) + { + int limitParameterSpan = BindLimitParametersFirstIfNeccesary(command, queryParameters[queryIndex], colIndex); + colIndex = BindQueryParameters(command, queryParameters[queryIndex], colIndex + limitParameterSpan); + colIndex += BindLimitParametersLastIfNeccesary(command, queryParameters[queryIndex], colIndex); + } + } + + protected virtual int BindLimitParametersLastIfNeccesary(IDbCommand command, QueryParameters parameter, int colIndex) + { + RowSelection selection = parameter.RowSelection; + if (Loader.Loader.UseLimit(selection, dialect) && !dialect.BindLimitParametersFirst) + { + return Loader.Loader.BindLimitParameters(command, colIndex, selection, session); + } + return 0; + } + + protected virtual int BindQueryParameters(IDbCommand command, QueryParameters parameter, int colIndex) + { + colIndex += parameter.BindParameters(command, colIndex, session); + return colIndex; + } + + protected virtual int BindLimitParametersFirstIfNeccesary(IDbCommand command, QueryParameters parameter, int colIndex) + { + int limitParameterSpan = 0; + RowSelection selection = parameter.RowSelection; + if (Loader.Loader.UseLimit(selection, dialect) && dialect.BindLimitParametersFirst) + { + limitParameterSpan += Loader.Loader.BindLimitParameters(command, colIndex, selection, session); + } + return limitParameterSpan; + } + } + + /// <summary> + /// Datareader wrapper with the same life cycle of its command (through the batcher) + /// </summary> + public class BatcherDataReaderWrapper: IDataReader + { + private readonly IBatcher batcher; + private readonly IDbCommand command; + private readonly IDataReader reader; + + public BatcherDataReaderWrapper(IBatcher batcher, IDbCommand command) + { + if (batcher == null) + { + throw new ArgumentNullException("batcher"); + } + if (command == null) + { + throw new ArgumentNullException("command"); + } + this.batcher = batcher; + this.command = command; + reader = batcher.ExecuteReader(command); + } + + public void Dispose() + { + batcher.CloseCommand(command, reader); + } + + #region IDataRecord Members + + public string GetName(int i) + { + return reader.GetName(i); + } + + public string GetDataTypeName(int i) + { + return reader.GetDataTypeName(i); + } + + public System.Type GetFieldType(int i) + { + return reader.GetFieldType(i); + } + + public object GetValue(int i) + { + return reader.GetDecimal(i); + } + + public int GetValues(object[] values) + { + return reader.GetValues(values); + } + + public int GetOrdinal(string name) + { + return reader.GetOrdinal(name); + } + + public bool GetBoolean(int i) + { + return reader.GetBoolean(i); + } + + public byte GetByte(int i) + { + return reader.GetByte(i); + } + + public long GetBytes(int i, long fieldOffset, byte[] buffer, int bufferoffset, int length) + { + return reader.GetBytes(i, fieldOffset, buffer, bufferoffset, length); + } + + public char GetChar(int i) + { + return reader.GetChar(i); + } + + public long GetChars(int i, long fieldoffset, char[] buffer, int bufferoffset, int length) + { + return reader.GetChars(i, fieldoffset, buffer, bufferoffset, length); + } + + public Guid GetGuid(int i) + { + return reader.GetGuid(i); + } + + public short GetInt16(int i) + { + return reader.GetInt16(i); + } + + public int GetInt32(int i) + { + return reader.GetInt32(i); + } + + public long GetInt64(int i) + { + return reader.GetInt64(i); + } + + public float GetFloat(int i) + { + return reader.GetFloat(i); + } + + public double GetDouble(int i) + { + return reader.GetDouble(i); + } + + public string GetString(int i) + { + return reader.GetString(i); + } + + public decimal GetDecimal(int i) + { + return reader.GetDecimal(i); + } + + public DateTime GetDateTime(int i) + { + return reader.GetDateTime(i); + } + + public IDataReader GetData(int i) + { + return reader.GetData(i); + } + + public bool IsDBNull(int i) + { + return reader.IsDBNull(i); + } + + public int FieldCount + { + get { return reader.FieldCount; } + } + + public object this[int i] + { + get { return reader[i]; } + } + + public object this[string name] + { + get { return reader[name]; } + } + + #endregion + + public override bool Equals(object obj) + { + return reader.Equals(obj); + } + + public override int GetHashCode() + { + return reader.GetHashCode(); + } + + public void Close() + { + batcher.CloseCommand(command, reader); + } + + public DataTable GetSchemaTable() + { + return reader.GetSchemaTable(); + } + + public bool NextResult() + { + return reader.NextResult(); + } + + public bool Read() + { + return reader.Read(); + } + + public int Depth + { + get { return reader.Depth; } + } + + public bool IsClosed + { + get { return reader.IsClosed; } + } + + public int RecordsAffected + { + get { return reader.RecordsAffected; } + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Driver/DriverBase.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Driver/DriverBase.cs 2011-03-28 19:43:25 UTC (rev 5567) +++ trunk/nhibernate/src/NHibernate/Driver/DriverBase.cs 2011-03-29 14:23:44 UTC (rev 5568) @@ -1,7 +1,7 @@ using System; using System.Collections.Generic; using System.Data; - +using NHibernate.Engine; using NHibernate.SqlCommand; using NHibernate.SqlTypes; using NHibernate.Util; @@ -166,11 +166,16 @@ private void SetCommandText(IDbCommand cmd, SqlString sqlString) { - SqlStringFormatter formatter = new SqlStringFormatter(this, MultipleQueriesSeparator); + SqlStringFormatter formatter = GetSqlStringFormatter(); formatter.Format(sqlString); cmd.CommandText = formatter.GetFormattedText(); } + protected virtual SqlStringFormatter GetSqlStringFormatter() + { + return new SqlStringFormatter(this, ";"); + } + private void SetCommandParameters(IDbCommand cmd, SqlType[] sqlTypes) { for (int i = 0; i < sqlTypes.Length; i++) @@ -229,6 +234,16 @@ cmd.Parameters.Add(parameter); } + public virtual IResultSetsCommand GetResultSetsCommand(ISessionImplementor session) + { + throw new NotSupportedException(string.Format("The driver {0} does not support multiple queries.", GetType().FullName)); + } + + public virtual bool SupportsMultipleQueries + { + get { return false; } + } + protected virtual IDbDataParameter CloneParameter(IDbCommand cmd, IDbDataParameter originalParameter) { var clone = cmd.CreateParameter(); @@ -263,15 +278,5 @@ param.Direction = ParameterDirection.Output; return param; } - - public virtual bool SupportsMultipleQueries - { - get { return false; } - } - - public virtual string MultipleQueriesSeparator - { - get { return ";"; } - } } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Driver/IDriver.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Driver/IDriver.cs 2011-03-28 19:43:25 UTC (rev 5567) +++ trunk/nhibernate/src/NHibernate/Driver/IDriver.cs 2011-03-29 14:23:44 UTC (rev 5568) @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Data; +using NHibernate.Engine; using NHibernate.SqlCommand; using NHibernate.SqlTypes; @@ -60,17 +61,6 @@ bool SupportsMultipleOpenReaders { get; } /// <summary> - /// Can we issue several select queries in a single query, and get - /// several result sets back? - /// </summary> - bool SupportsMultipleQueries { get; } - - /// <summary> - /// How we separate the queries when we use multiply queries. - /// </summary> - string MultipleQueriesSeparator { get; } - - /// <summary> /// Generates an IDbCommand from the SqlString according to the requirements of the DataProvider. /// </summary> /// <param name="type">The <see cref="CommandType"/> of the command to generate.</param> @@ -106,5 +96,8 @@ /// 'select ... from MyTable t where t.Col1 = ? and t.Col2 = ?' /// </remarks> void ExpandQueryParameters(IDbCommand cmd, SqlString sqlString); + + IResultSetsCommand GetResultSetsCommand(ISessionImplementor session); + bool SupportsMultipleQueries { get; } } } \ No newline at end of file Added: trunk/nhibernate/src/NHibernate/Driver/IResultSetsCommand.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Driver/IResultSetsCommand.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Driver/IResultSetsCommand.cs 2011-03-29 14:23:44 UTC (rev 5568) @@ -0,0 +1,15 @@ +using System.Data; +using NHibernate.Engine; +using NHibernate.SqlCommand; + +namespace NHibernate.Driver +{ + public interface IResultSetsCommand + { + void Append(SqlCommandInfo commandInfo); + int ParametersCount { get; } + bool HasQueries { get; } + SqlString Sql { get; } + IDataReader GetReader(QueryParameters[] queryParameters, int? commandTimeout); + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Driver/MySqlDataDriver.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Driver/MySqlDataDriver.cs 2011-03-28 19:43:25 UTC (rev 5567) +++ trunk/nhibernate/src/NHibernate/Driver/MySqlDataDriver.cs 2011-03-29 14:23:44 UTC (rev 5568) @@ -79,6 +79,11 @@ get { return false; } } + public override IResultSetsCommand GetResultSetsCommand(Engine.ISessionImplementor session) + { + return new BasicResultSetsCommand(session); + } + public override bool SupportsMultipleQueries { get { return true; } Modified: trunk/nhibernate/src/NHibernate/Driver/NpgsqlDriver.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Driver/NpgsqlDriver.cs 2011-03-28 19:43:25 UTC (rev 5567) +++ trunk/nhibernate/src/NHibernate/Driver/NpgsqlDriver.cs 2011-03-29 14:23:44 UTC (rev 5568) @@ -63,6 +63,11 @@ get { return true; } } + public override IResultSetsCommand GetResultSetsCommand(Engine.ISessionImplementor session) + { + return new BasicResultSetsCommand(session); + } + public override bool SupportsMultipleQueries { get { return true; } Modified: trunk/nhibernate/src/NHibernate/Driver/SQLite20Driver.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Driver/SQLite20Driver.cs 2011-03-28 19:43:25 UTC (rev 5567) +++ trunk/nhibernate/src/NHibernate/Driver/SQLite20Driver.cs 2011-03-29 14:23:44 UTC (rev 5568) @@ -76,7 +76,12 @@ { get { return false; } } - + + public override IResultSetsCommand GetResultSetsCommand(Engine.ISessionImplementor session) + { + return new BasicResultSetsCommand(session); + } + public override bool SupportsMultipleQueries { get { return true; } Modified: trunk/nhibernate/src/NHibernate/Driver/SqlClientDriver.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Driver/SqlClientDriver.cs 2011-03-28 19:43:25 UTC (rev 5567) +++ trunk/nhibernate/src/NHibernate/Driver/SqlClientDriver.cs 2011-03-29 14:23:44 UTC (rev 5568) @@ -2,6 +2,7 @@ using System.Data.SqlClient; using NHibernate.AdoNet; using NHibernate.Dialect; +using NHibernate.Engine; using NHibernate.SqlCommand; using NHibernate.SqlTypes; @@ -91,11 +92,6 @@ get { return false; } } - public override bool SupportsMultipleQueries - { - get { return true; } - } - public override IDbCommand GenerateCommand(CommandType type, SqlString sqlString, SqlType[] parameterTypes) { IDbCommand command = base.GenerateCommand(type, sqlString, parameterTypes); @@ -189,5 +185,15 @@ } #endregion + + public override IResultSetsCommand GetResultSetsCommand(ISessionImplementor session) + { + return new BasicResultSetsCommand(session); + } + + public override bool SupportsMultipleQueries + { + get { return true; } + } } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Driver/SqlServerCeDriver.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Driver/SqlServerCeDriver.cs 2011-03-28 19:43:25 UTC (rev 5567) +++ trunk/nhibernate/src/NHibernate/Driver/SqlServerCeDriver.cs 2011-03-29 14:23:44 UTC (rev 5568) @@ -98,6 +98,11 @@ return command; } + public override IResultSetsCommand GetResultSetsCommand(Engine.ISessionImplementor session) + { + return new BasicResultSetsCommand(session); + } + public override bool SupportsMultipleQueries { get { return true; } Modified: trunk/nhibernate/src/NHibernate/Impl/MultiCriteriaImpl.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/MultiCriteriaImpl.cs 2011-03-28 19:43:25 UTC (rev 5567) +++ trunk/nhibernate/src/NHibernate/Impl/MultiCriteriaImpl.cs 2011-03-29 14:23:44 UTC (rev 5568) @@ -1,7 +1,6 @@ using System; using System.Collections; using System.Collections.Generic; -using System.Data; using System.Diagnostics; using Iesi.Collections; using Iesi.Collections.Generic; @@ -11,7 +10,6 @@ using NHibernate.Engine; using NHibernate.Loader.Criteria; using NHibernate.SqlCommand; -using NHibernate.SqlTypes; using NHibernate.Transform; using NHibernate.Type; @@ -27,8 +25,6 @@ private readonly ISessionFactoryImplementor factory; private readonly List<CriteriaQueryTranslator> translators = new List<CriteriaQueryTranslator>(); private readonly List<QueryParameters> parameters = new List<QueryParameters>(); - private readonly List<SqlType> types = new List<SqlType>(); - private SqlString sqlString = new SqlString(); private readonly List<CriteriaLoader> loaders = new List<CriteriaLoader>(); private readonly Dialect.Dialect dialect; private IList criteriaResults; @@ -38,6 +34,7 @@ private string cacheRegion; private IResultTransformer resultTransformer; private readonly Dictionary<CriteriaLoader, int> loaderToResultIndex = new Dictionary<CriteriaLoader, int>(); + private readonly IResultSetsCommand resultSetsCommand; /// <summary> /// Initializes a new instance of the <see cref="MultiCriteriaImpl"/> class. @@ -47,20 +44,18 @@ internal MultiCriteriaImpl(SessionImpl session, ISessionFactoryImplementor factory) { IDriver driver = session.Factory.ConnectionProvider.Driver; - if (!driver.SupportsMultipleQueries) - { - throw new NotSupportedException( - string.Format("The driver {0} does not support multiple queries.", driver.GetType().FullName)); - } dialect = session.Factory.Dialect; + resultSetsCommand = driver.GetResultSetsCommand(session); this.session = session; this.factory = factory; } - public SqlString SqlString { - get { return sqlString; } + get + { + return resultSetsCommand.Sql; + } } public IList List() @@ -179,11 +174,8 @@ translators.Add(translator); QueryParameters queryParameters = translator.GetQueryParameters(); parameters.Add(queryParameters); - SqlCommandInfo commandInfo = loader.GetQueryStringAndTypes(session, queryParameters, types.Count); - sqlString = sqlString.Append(commandInfo.Text) - .Append(session.Factory.ConnectionProvider.Driver.MultipleQueriesSeparator) - .Append(Environment.NewLine); - types.AddRange(commandInfo.ParameterTypes); + SqlCommandInfo commandInfo = loader.GetQueryStringAndTypes(session, queryParameters, resultSetsCommand.ParametersCount); + resultSetsCommand.Append(commandInfo); } } @@ -197,15 +189,11 @@ } int rowCount = 0; - using ( - IDbCommand command = - session.Batcher.PrepareCommand(CommandType.Text, sqlString, types.ToArray())) + using (var reader = resultSetsCommand.GetReader(parameters.ToArray(), null)) { - BindParameters(command); ArrayList[] hydratedObjects = new ArrayList[loaders.Count]; List<EntityKey[]>[] subselectResultKeys = new List<EntityKey[]>[loaders.Count]; bool[] createSubselects = new bool[loaders.Count]; - IDataReader reader = session.Batcher.ExecuteReader(command); try { for (int i = 0; i < loaders.Count; i++) @@ -254,13 +242,10 @@ } catch (Exception e) { - log.Error("Error executing multi criteria : [" + command.CommandText + "]"); - throw new HibernateException("Error executing multi criteria : [" + command.CommandText + "]", e); + var message = string.Format("Failed to execute multi criteria: [{0}]", resultSetsCommand.Sql); + log.Error(message, e); + throw new HibernateException(message, e); } - finally - { - session.Batcher.CloseCommand(command, reader); - } for (int i = 0; i < loaders.Count; i++) { CriteriaLoader loader = loaders[i]; @@ -310,48 +295,6 @@ } } - private void BindParameters(IDbCommand command) - { - int colIndex = 0; - - for (int queryIndex = 0; queryIndex < loaders.Count; queryIndex++) - { - int limitParameterSpan = BindLimitParametersFirstIfNeccesary(command, queryIndex, colIndex); - colIndex = BindQueryParameters(command, queryIndex, colIndex + limitParameterSpan); - colIndex += BindLimitParametersLastIfNeccesary(command, queryIndex, colIndex); - } - } - - private int BindLimitParametersLastIfNeccesary(IDbCommand command, int queryIndex, int colIndex) - { - QueryParameters parameter = parameters[queryIndex]; - RowSelection selection = parameter.RowSelection; - if (Loader.Loader.UseLimit(selection, dialect) && !dialect.BindLimitParametersFirst) - { - return Loader.Loader.BindLimitParameters(command, colIndex, selection, session); - } - return 0; - } - - private int BindQueryParameters(IDbCommand command, int queryIndex, int colIndex) - { - QueryParameters parameter = parameters[queryIndex]; - colIndex += parameter.BindParameters(command, colIndex, session); - return colIndex; - } - - private int BindLimitParametersFirstIfNeccesary(IDbCommand command, int queryIndex, int colIndex) - { - int limitParametersSpan = 0; - QueryParameters parameter = parameters[queryIndex]; - RowSelection selection = parameter.RowSelection; - if (Loader.Loader.UseLimit(selection, dialect) && dialect.BindLimitParametersFirst) - { - limitParametersSpan += Loader.Loader.BindLimitParameters(command, colIndex, selection, session); - } - return limitParametersSpan; - } - public IMultiCriteria Add(System.Type resultGenericListType, ICriteria criteria) { criteriaQueries.Add(criteria); Modified: trunk/nhibernate/src/NHibernate/Impl/MultiQueryImpl.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/MultiQueryImpl.cs 2011-03-28 19:43:25 UTC (rev 5567) +++ trunk/nhibernate/src/NHibernate/Impl/MultiQueryImpl.cs 2011-03-29 14:23:44 UTC (rev 5568) @@ -1,8 +1,8 @@ using System; using System.Collections; using System.Collections.Generic; -using System.Data; using System.Diagnostics; +using System.Linq; using Iesi.Collections; using Iesi.Collections.Generic; using NHibernate.Cache; @@ -13,7 +13,6 @@ using NHibernate.Loader.Custom; using NHibernate.Loader.Custom.Sql; using NHibernate.SqlCommand; -using NHibernate.SqlTypes; using NHibernate.Transform; using NHibernate.Type; @@ -34,23 +33,18 @@ private bool isCacheable; private readonly ISessionImplementor session; private IResultTransformer resultTransformer; - private readonly List<SqlType> types = new List<SqlType>(); - private SqlString sqlString; private readonly Dialect.Dialect dialect; private bool forceCacheRefresh; private QueryParameters combinedParameters; private FlushMode flushMode = FlushMode.Unspecified; private FlushMode sessionFlushMode = FlushMode.Unspecified; + private readonly IResultSetsCommand resultSetsCommand; public MultiQueryImpl(ISessionImplementor session) { IDriver driver = session.Factory.ConnectionProvider.Driver; - if (!driver.SupportsMultipleQueries) - { - throw new NotSupportedException( - string.Format("The driver {0} does not support multiple queries.", driver.GetType().FullName)); - } dialect = session.Factory.Dialect; + resultSetsCommand = driver.GetResultSetsCommand(session); this.session = session; } @@ -508,126 +502,121 @@ } int rowCount = 0; - IDbCommand command = PrepareQueriesCommand(); - - BindParameters(command); - ArrayList results = new ArrayList(); - log.Info(command.CommandText); - if (commandTimeout != RowSelection.NoValue) - command.CommandTimeout = commandTimeout; ArrayList[] hydratedObjects = new ArrayList[Translators.Count]; List<EntityKey[]>[] subselectResultKeys = new List<EntityKey[]>[Translators.Count]; bool[] createSubselects = new bool[Translators.Count]; - IDataReader reader = session.Batcher.ExecuteReader(command); - try + + using (var reader = resultSetsCommand.GetReader(Parameters.ToArray(), commandTimeout != RowSelection.NoValue ? commandTimeout : (int?)null)) { - if (log.IsDebugEnabled) + try { - log.DebugFormat("Executing {0} queries", translators.Count); - } - for (int i = 0; i < translators.Count; i++) - { - ITranslator translator = Translators[i]; - QueryParameters parameter = Parameters[i]; - IList tempResults; - if (resultCollectionGenericType[i] == typeof(object)) + if (log.IsDebugEnabled) { - tempResults = new ArrayList(); + log.DebugFormat("Executing {0} queries", translators.Count); } - else + for (int i = 0; i < translators.Count; i++) { - tempResults = (IList)Activator.CreateInstance(typeof(List<>).MakeGenericType(resultCollectionGenericType[i])); - } - int entitySpan = translator.Loader.EntityPersisters.Length; - hydratedObjects[i] = entitySpan > 0 ? new ArrayList() : null; - RowSelection selection = parameter.RowSelection; - int maxRows = Loader.Loader.HasMaxRows(selection) ? selection.MaxRows : int.MaxValue; - if (!dialect.SupportsLimitOffset || !Loader.Loader.UseLimit(selection, dialect)) - { - Loader.Loader.Advance(reader, selection); - } + ITranslator translator = Translators[i]; + QueryParameters parameter = Parameters[i]; + IList tempResults; + if (resultCollectionGenericType[i] == typeof (object)) + { + tempResults = new ArrayList(); + } + else + { + tempResults = (IList) Activator.CreateInstance(typeof (List<>).MakeGenericType(resultCollectionGenericType[i])); + } + int entitySpan = translator.Loader.EntityPersisters.Length; + hydratedObjects[i] = entitySpan > 0 ? new ArrayList() : null; + RowSelection selection = parameter.RowSelection; + int maxRows = Loader.Loader.HasMaxRows(selection) ? selection.MaxRows : int.MaxValue; + if (!dialect.SupportsLimitOffset || !Loader.Loader.UseLimit(selection, dialect)) + { + Loader.Loader.Advance(reader, selection); + } - LockMode[] lockModeArray = translator.Loader.GetLockModes(parameter.LockModes); - EntityKey optionalObjectKey = Loader.Loader.GetOptionalObjectKey(parameter, session); + LockMode[] lockModeArray = translator.Loader.GetLockModes(parameter.LockModes); + EntityKey optionalObjectKey = Loader.Loader.GetOptionalObjectKey(parameter, session); - createSubselects[i] = translator.Loader.IsSubselectLoadingEnabled; - subselectResultKeys[i] = createSubselects[i] ? new List<EntityKey[]>() : null; + createSubselects[i] = translator.Loader.IsSubselectLoadingEnabled; + subselectResultKeys[i] = createSubselects[i] ? new List<EntityKey[]>() : null; - translator.Loader.HandleEmptyCollections(parameter.CollectionKeys, reader, session); - EntityKey[] keys = new EntityKey[entitySpan]; // we can reuse it each time + translator.Loader.HandleEmptyCollections(parameter.CollectionKeys, reader, session); + EntityKey[] keys = new EntityKey[entitySpan]; // we can reuse it each time - if (log.IsDebugEnabled) - { - log.Debug("processing result set"); - } - - int count; - for (count = 0; count < maxRows && reader.Read(); count++) - { if (log.IsDebugEnabled) { - log.Debug("result set row: " + count); + log.Debug("processing result set"); } - rowCount++; + int count; + for (count = 0; count < maxRows && reader.Read(); count++) + { + if (log.IsDebugEnabled) + { + log.Debug("result set row: " + count); + } - object result = - translator.Loader.GetRowFromResultSet(reader, - session, - parameter, - lockModeArray, - optionalObjectKey, - hydratedObjects[i], - keys, - true); + rowCount++; - tempResults.Add(result); + object result = + translator.Loader.GetRowFromResultSet(reader, + session, + parameter, + lockModeArray, + optionalObjectKey, + hydratedObjects[i], + keys, + true); - if (createSubselects[i]) + tempResults.Add(result); + + if (createSubselects[i]) + { + subselectResultKeys[i].Add(keys); + keys = new EntityKey[entitySpan]; //can't reuse in this case + } + } + + if (log.IsDebugEnabled) { - subselectResultKeys[i].Add(keys); - keys = new EntityKey[entitySpan]; //can't reuse in this case + log.Debug(string.Format("done processing result set ({0} rows)", count)); } - } - if (log.IsDebugEnabled) - { - log.Debug(string.Format("done processing result set ({0} rows)", count)); - } + results.Add(tempResults); - results.Add(tempResults); + if (log.IsDebugEnabled) + { + log.DebugFormat("Query {0} returned {1} results", i, tempResults.Count); + } - if (log.IsDebugEnabled) - { - log.DebugFormat("Query {0} returned {1} results", i, tempResults.Count); + reader.NextResult(); } - - reader.NextResult(); } - } - catch (Exception ex) - { - log.Error("Failed to execute multi query: [" + command.CommandText + "]", ex); - throw new HibernateException("Failed to execute multi query: [" + command.CommandText + "]", ex); - } - finally - { - session.Batcher.CloseCommand(command, reader); - } - for (int i = 0; i < translators.Count; i++) - { - ITranslator translator = translators[i]; - QueryParameters parameter = parameters[i]; + catch (Exception ex) + { + var message = string.Format("Failed to execute multi query: [{0}]", resultSetsCommand.Sql); + log.Error(message, ex); + throw new HibernateException(message, ex); + } - translator.Loader.InitializeEntitiesAndCollections(hydratedObjects[i], reader, session, false); - - if (createSubselects[i]) + for (int i = 0; i < translators.Count; i++) { - translator.Loader.CreateSubselects(subselectResultKeys[i], parameter, session); + ITranslator translator = translators[i]; + QueryParameters parameter = parameters[i]; + + translator.Loader.InitializeEntitiesAndCollections(hydratedObjects[i], reader, session, false); + + if (createSubselects[i]) + { + translator.Loader.CreateSubselects(subselectResultKeys[i], parameter, session); + } } } + if (statsEnabled) { stopWatch.Stop(); @@ -636,25 +625,18 @@ return results; } - private IDbCommand PrepareQueriesCommand() - { - SqlType[] sqlTypes = types.ToArray(); - return session.Batcher.PrepareQueryCommand(CommandType.Text, SqlString, sqlTypes); - } - protected SqlString SqlString { get { - if (sqlString == null) + if (!resultSetsCommand.HasQueries) AggregateQueriesInformation(); - return sqlString; + return resultSetsCommand.Sql; } } private void AggregateQueriesInformation() { - sqlString = new SqlString(); foreach (AbstractQueryImpl query in queries) { QueryParameters queryParameters = query.GetQueryParameters(); @@ -665,9 +647,8 @@ translators.Add(translator); parameters.Add(queryParameters); queryParameters = GetFilteredQueryParameters(queryParameters, translator); - SqlCommandInfo commandInfo = translator.Loader.GetQueryStringAndTypes(session, queryParameters, types.Count); - sqlString = sqlString.Append(commandInfo.Text).Append(session.Factory.ConnectionProvider.Driver.MultipleQueriesSeparator).Append(Environment.NewLine); - types.AddRange(commandInfo.ParameterTypes); + SqlCommandInfo commandInfo = translator.Loader.GetQueryStringAndTypes(session, queryParameters, resultSetsCommand.ParametersCount); + resultSetsCommand.Append(commandInfo); } } } @@ -706,36 +687,6 @@ return filteredQueryParameters; } - private void BindParameters(IDbCommand command) - { - int colIndex = 0; - - for (int queryIndex = 0; queryIndex < queries.Count; queryIndex++) - { - int limitParameterSpan = BindLimitParametersFirstIfNeccesary(command, queryIndex, colIndex); - colIndex = BindQueryParameters(command, queryIndex, colIndex + limitParameterSpan); - colIndex += BindLimitParametersLastIfNeccesary(command, queryIndex, colIndex); - } - } - - private int BindLimitParametersLastIfNeccesary(IDbCommand command, int queryIndex, int colIndex) - { - QueryParameters parameter = parameters[queryIndex]; - RowSelection selection = parameter.RowSelection; - if (Loader.Loader.UseLimit(selection, dialect) && !dialect.BindLimitParametersFirst) - { - return Loader.Loader.BindLimitParameters(command, colIndex, selection, session); - } - return 0; - } - - private int BindQueryParameters(IDbCommand command, int queryIndex, int colIndex) - { - QueryParameters parameter = Parameters[queryIndex]; - colIndex += parameter.BindParameters(command, colIndex, session); - return colIndex; - } - public object GetResult(string key) { if (queryResults == null) @@ -751,18 +702,6 @@ return queryResults[queryResultPositions[key]]; } - private int BindLimitParametersFirstIfNeccesary(IDbCommand command, int queryIndex, int colIndex) - { - int limitParameterSpan = 0; - QueryParameters parameter = Parameters[queryIndex]; - RowSelection selection = parameter.RowSelection; - if (Loader.Loader.UseLimit(selection, dialect) && dialect.BindLimitParametersFirst) - { - limitParameterSpan += Loader.Loader.BindLimitParameters(command, colIndex, selection, session); - } - return limitParameterSpan; - } - public override string ToString() { return "Multi Query: [" + SqlString + "]"; @@ -821,7 +760,7 @@ { get { - if (sqlString == null) + if (!resultSetsCommand.HasQueries) { AggregateQueriesInformation(); } @@ -856,7 +795,7 @@ { get { - if (sqlString == null) + if (!resultSetsCommand.HasQueries) AggregateQueriesInformation(); return parameters; } Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj =================================================================== --- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2011-03-28 19:43:25 UTC (rev 5567) +++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2011-03-29 14:23:44 UTC (rev 5568) @@ -146,6 +146,7 @@ <Compile Include="Driver\DriverBase.cs" /> <Compile Include="Driver\FirebirdDriver.cs" /> <Compile Include="Driver\IDriver.cs" /> + <Compile Include="Driver\IResultSetsCommand.cs" /> <Compile Include="Driver\MySqlDataDriver.cs" /> <Compile Include="Driver\NDataReader.cs" /> <Compile Include="Driver\NHybridDataReader.cs" /> @@ -155,6 +156,7 @@ <Compile Include="Driver\OracleClientDriver.cs" /> <Compile Include="Driver\OracleDataClientDriver.cs" /> <Compile Include="Driver\SqlClientDriver.cs" /> + <Compile Include="Driver\BasicResultSetsCommand.cs" /> <Compile Include="Driver\SQLiteDriver.cs" /> <Compile Include="Engine\Cascade.cs" /> <Compile Include="Engine\IBatcher.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2011-03-28 19:43:31
|
Revision: 5567 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5567&view=rev Author: fabiomaulo Date: 2011-03-28 19:43:25 +0000 (Mon, 28 Mar 2011) Log Message: ----------- Fix NH-2015 (thanks to John Davidson) Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Criterion/Order.cs trunk/nhibernate/src/NHibernate.Test/Criteria/CriteriaQueryTest.cs Modified: trunk/nhibernate/src/NHibernate/Criterion/Order.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Criterion/Order.cs 2011-03-28 18:27:11 UTC (rev 5566) +++ trunk/nhibernate/src/NHibernate/Criterion/Order.cs 2011-03-28 19:43:25 UTC (rev 5567) @@ -20,7 +20,8 @@ protected bool ascending; protected string propertyName; protected IProjection projection; - + private bool ignoreCase; + public Order(IProjection projection, bool ascending) { this.projection = projection; @@ -38,7 +39,7 @@ /// </summary> public virtual SqlString ToSqlString(ICriteria criteria, ICriteriaQuery criteriaQuery) { - if (projection!=null) + if (projection != null) { SqlString sb = new SqlString(); SqlString produced = this.projection.ToSqlString(criteria, 0, criteriaQuery, new Dictionary<string, IFilter>()); @@ -49,14 +50,14 @@ } string[] columns = criteriaQuery.GetColumnAliasesUsingProjection(criteria, propertyName); + Type.IType type = criteriaQuery.GetTypeUsingProjection(criteria, propertyName); StringBuilder fragment = new StringBuilder(); - ISessionFactoryImplementor factory = criteriaQuery.Factory; for (int i = 0; i < columns.Length; i++) { - // TODO H3: bool lower = _ignoreCase && type.SqlTypes( factory )[ i ] == Types.VARCHAR - bool lower = false; + bool lower = ignoreCase && IsStringType(type.SqlTypes(factory)[i]); + if (lower) { fragment.Append(factory.Dialect.LowercaseFunction) @@ -82,7 +83,7 @@ public override string ToString() { - return (projection!=null?projection.ToString():propertyName) + (ascending ? " asc" : " desc"); + return (projection != null ? projection.ToString() : propertyName) + (ascending ? " asc" : " desc"); } /// <summary> @@ -124,13 +125,36 @@ { return new Order(propertyName, false); } - + public TypedValue[] GetTypedValues(ICriteria criteria, ICriteriaQuery criteriaQuery) { if (projection != null) return projection.GetTypedValues(criteria, criteriaQuery); - + return new TypedValue[0]; // not using parameters for ORDER BY columns } + + public Order IgnoreCase() + { + ignoreCase = true; + return this; + } + + private bool IsStringType(SqlTypes.SqlType propertyType) + { + switch (propertyType.DbType) + { + case System.Data.DbType.AnsiString: + return true; + case System.Data.DbType.AnsiStringFixedLength: + return true; + case System.Data.DbType.String: + return true; + case System.Data.DbType.StringFixedLength: + return true; + default: + return false; + } + } } } Modified: trunk/nhibernate/src/NHibernate.Test/Criteria/CriteriaQueryTest.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Criteria/CriteriaQueryTest.cs 2011-03-28 18:27:11 UTC (rev 5566) +++ trunk/nhibernate/src/NHibernate.Test/Criteria/CriteriaQueryTest.cs 2011-03-28 19:43:25 UTC (rev 5567) @@ -2901,5 +2901,60 @@ } } } + + [Test] + public void IgnoreCase() + { + //SqlServer collation set to Latin1_General_BIN + //when database created to validate this test + Course c1 = new Course(); + c1.CourseCode = "course-1"; + c1.Description = "Advanced NHibernate"; + Course c2 = new Course(); + c2.CourseCode = "course-2"; + c2.Description = "advanced csharp"; + Course c3 = new Course(); + c3.CourseCode = "course-3"; + c3.Description = "advanced UnitTesting"; + + using (ISession session = OpenSession()) + using (ITransaction t = session.BeginTransaction()) + { + session.Save(c1); + session.Save(c2); + session.Save(c3); + t.Commit(); + } + + // this particular selection is commented out if collation is not Latin1_General_BIN + //using (ISession session = OpenSession()) + //{ + // // order the courses in binary order - assumes collation Latin1_General_BIN + // IList result = + // session.CreateCriteria(typeof(Course)).AddOrder(Order.Asc("Description")).List(); + // Assert.AreEqual(3, result.Count); + // Course firstResult = (Course)result[0]; + // Assert.IsTrue(firstResult.Description.Contains("Advanced NHibernate"), "Description should have 'Advanced NHibernate', but has " + firstResult.Description); + //} + + using (ISession session = OpenSession()) + { + // order the courses after all descriptions have been converted to lower case + IList result = + session.CreateCriteria(typeof (Course)).AddOrder(Order.Asc("Description").IgnoreCase()).List(); + Assert.AreEqual(3, result.Count); + Course firstResult = (Course) result[0]; + Assert.IsTrue(firstResult.Description.Contains("advanced csharp"), "Description should have 'advanced csharp', but has " + firstResult.Description); + } + + using (ISession session = OpenSession()) + using (ITransaction t = session.BeginTransaction()) + { + session.Delete(c1); + session.Delete(c2); + session.Delete(c3); + t.Commit(); + } + } } } \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2011-03-28 18:27:17
|
Revision: 5566 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5566&view=rev Author: fabiomaulo Date: 2011-03-28 18:27:11 +0000 (Mon, 28 Mar 2011) Log Message: ----------- Fix NH-2418 Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Dialect/Dialect.cs trunk/nhibernate/src/NHibernate.Test/DialectTest/DialectFixture.cs Modified: trunk/nhibernate/src/NHibernate/Dialect/Dialect.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Dialect/Dialect.cs 2011-03-28 16:03:06 UTC (rev 5565) +++ trunk/nhibernate/src/NHibernate/Dialect/Dialect.cs 2011-03-28 18:27:11 UTC (rev 5566) @@ -1764,6 +1764,10 @@ /// </remarks> public virtual bool IsQuoted(string name) { + if (string.IsNullOrEmpty(name)) + { + return false; + } return (name[0] == OpenQuote && name[name.Length - 1] == CloseQuote); } Modified: trunk/nhibernate/src/NHibernate.Test/DialectTest/DialectFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/DialectTest/DialectFixture.cs 2011-03-28 16:03:06 UTC (rev 5565) +++ trunk/nhibernate/src/NHibernate.Test/DialectTest/DialectFixture.cs 2011-03-28 18:27:11 UTC (rev 5566) @@ -7,6 +7,7 @@ using NHibernate.SqlCommand; using NHibernate.SqlTypes; using NUnit.Framework; +using SharpTestsEx; using Environment=NHibernate.Cfg.Environment; namespace NHibernate.Test.DialectTest @@ -62,6 +63,13 @@ } [Test] + public void WhenNullOrEmptyIsQuotedFalse() + { + d.IsQuoted(null).Should().Be.False(); + d.IsQuoted("").Should().Be.False(); + } + + [Test] public void QuoteTableNameNeeded() { Assert.AreEqual( This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2011-03-28 16:03:13
|
Revision: 5565 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5565&view=rev Author: fabiomaulo Date: 2011-03-28 16:03:06 +0000 (Mon, 28 Mar 2011) Log Message: ----------- Fix NH-2489 Modified Paths: -------------- trunk/nhibernate/releasenotes.txt trunk/nhibernate/src/NHibernate/Collection/AbstractPersistentCollection.cs trunk/nhibernate/src/NHibernate/Collection/Generic/PersistentGenericList.cs trunk/nhibernate/src/NHibernate/Collection/Generic/PersistentGenericMap.cs trunk/nhibernate/src/NHibernate/Collection/PersistentList.cs trunk/nhibernate/src/NHibernate/Collection/PersistentMap.cs trunk/nhibernate/src/NHibernate/Persister/Collection/AbstractCollectionPersister.cs trunk/nhibernate/src/NHibernate/Persister/Collection/ICollectionPersister.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/SetFixture.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2489/ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2489/Fixture.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2489/Mappings.hbm.xml trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2489/Model.cs Modified: trunk/nhibernate/releasenotes.txt =================================================================== --- trunk/nhibernate/releasenotes.txt 2011-03-28 15:15:24 UTC (rev 5564) +++ trunk/nhibernate/releasenotes.txt 2011-03-28 16:03:06 UTC (rev 5565) @@ -5,6 +5,7 @@ ##### Possible Breaking Changes ##### * [NH-2550] - Allow public access to FieldInterceptor Session (IFieldInterceptor changed) * [NH-2593] - Form Microsoft SQL Server the default batch-size (adonet.batch_size) is set to 20 where not explicit defined in the session-factory configuration + * - ICollectionPersister added property to fix [NH-2489] Build 3.1.0.GA (rev5425) ============================= Modified: trunk/nhibernate/src/NHibernate/Collection/AbstractPersistentCollection.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Collection/AbstractPersistentCollection.cs 2011-03-28 15:15:24 UTC (rev 5564) +++ trunk/nhibernate/src/NHibernate/Collection/AbstractPersistentCollection.cs 2011-03-28 16:03:06 UTC (rev 5565) @@ -19,6 +19,7 @@ public abstract class AbstractPersistentCollection : IPersistentCollection { protected internal static readonly object Unknown = new object(); //place holder + protected internal static readonly object NotFound = new object(); //place holder protected interface IDelayedOperation { @@ -345,7 +346,8 @@ { session.Flush(); } - return persister.GetElementByIndex(entry.LoadedKey, index, session, owner); + var elementByIndex = persister.GetElementByIndex(entry.LoadedKey, index, session, owner); + return persister.NotFoundObject == elementByIndex ? NotFound : elementByIndex; } } Read(); Modified: trunk/nhibernate/src/NHibernate/Collection/Generic/PersistentGenericList.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Collection/Generic/PersistentGenericList.cs 2011-03-28 15:15:24 UTC (rev 5564) +++ trunk/nhibernate/src/NHibernate/Collection/Generic/PersistentGenericList.cs 2011-03-28 16:03:06 UTC (rev 5565) @@ -88,10 +88,16 @@ { return glist[index]; } - else + if (result == NotFound) { - return (T) result; + // check if the index is valid + if (index >= Count) + { + throw new ArgumentOutOfRangeException("index"); + } + return default(T); } + return (T) result; } set { @@ -107,7 +113,7 @@ } else { - QueueOperation(new SetDelayedOperation(this, index, value, old)); + QueueOperation(new SetDelayedOperation(this, index, value, old == NotFound ? null : old)); } } } Modified: trunk/nhibernate/src/NHibernate/Collection/Generic/PersistentGenericMap.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Collection/Generic/PersistentGenericMap.cs 2011-03-28 15:15:24 UTC (rev 5564) +++ trunk/nhibernate/src/NHibernate/Collection/Generic/PersistentGenericMap.cs 2011-03-28 16:03:06 UTC (rev 5565) @@ -125,7 +125,7 @@ object old = ReadElementByIndex(key); if (old != Unknown) { - QueueOperation(new PutDelayedOperation(this, key, value, old)); + QueueOperation(new PutDelayedOperation(this, key, value, old == NotFound ? null : old)); return; } } @@ -139,7 +139,7 @@ if (PutQueueEnabled) { object old = ReadElementByIndex(key); - QueueOperation(new RemoveDelayedOperation(this, key, old)); + QueueOperation(new RemoveDelayedOperation(this, key, old == NotFound ? null : old)); return true; } else @@ -161,11 +161,13 @@ { return gmap.TryGetValue(key, out value); } - else + if(result == NotFound) { - value = (TValue)result; - return true; + value = default(TValue); + return false; } + value = (TValue)result; + return true; } TValue IDictionary<TKey, TValue>.this[TKey key] @@ -173,7 +175,15 @@ get { object result = ReadElementByIndex(key); - return result == Unknown ? gmap[key] : (TValue)result; + if (result == Unknown) + { + return gmap[key]; + } + if (result == NotFound) + { + throw new KeyNotFoundException(); + } + return (TValue) result; } set { @@ -183,7 +193,7 @@ object old = ReadElementByIndex(key); if (old != Unknown) { - QueueOperation(new PutDelayedOperation(this, key, value, old)); + QueueOperation(new PutDelayedOperation(this, key, value, old == NotFound ? null : old)); return; } } Modified: trunk/nhibernate/src/NHibernate/Collection/PersistentList.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Collection/PersistentList.cs 2011-03-28 15:15:24 UTC (rev 5564) +++ trunk/nhibernate/src/NHibernate/Collection/PersistentList.cs 2011-03-28 16:03:06 UTC (rev 5565) @@ -339,7 +339,7 @@ } else { - QueueOperation(new RemoveDelayedOperation(this, index, old)); + QueueOperation(new RemoveDelayedOperation(this, index, old == NotFound ? null : old)); } } @@ -352,7 +352,20 @@ throw new IndexOutOfRangeException("negative index"); } object result = ReadElementByIndex(index); - return result == Unknown ? list[index] : result; + if (result == Unknown) + { + return list[index]; + } + if(NotFound == result) + { + // check if the index is valid + if(index >= Count) + { + throw new ArgumentOutOfRangeException("index"); + } + return null; + } + return result; } set { @@ -360,7 +373,19 @@ { throw new IndexOutOfRangeException("negative index"); } - object old = PutQueueEnabled ? ReadElementByIndex(index) : Unknown; + object old; + if (PutQueueEnabled) + { + old = ReadElementByIndex(index); + if(old == NotFound) + { + old = null; + } + } + else + { + old = Unknown; + } if (old == Unknown) { Write(); Modified: trunk/nhibernate/src/NHibernate/Collection/PersistentMap.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Collection/PersistentMap.cs 2011-03-28 15:15:24 UTC (rev 5564) +++ trunk/nhibernate/src/NHibernate/Collection/PersistentMap.cs 2011-03-28 16:03:06 UTC (rev 5565) @@ -242,7 +242,7 @@ object old = ReadElementByIndex(key); if (old != Unknown) { - QueueOperation(new PutDelayedOperation(this, key, value, old)); + QueueOperation(new PutDelayedOperation(this, key, value, old == NotFound ? null : old)); return; } } @@ -280,7 +280,10 @@ if (PutQueueEnabled) { object old = ReadElementByIndex(key); - QueueOperation(new RemoveDelayedOperation(this, key, old)); + if (old != NotFound) + { + QueueOperation(new RemoveDelayedOperation(this, key, old)); + } return; } else @@ -302,7 +305,7 @@ get { object result = ReadElementByIndex(key); - return result == Unknown ? map[key] : result; + return result == Unknown ? map[key] : (result == NotFound ? null : result); } set { @@ -310,7 +313,7 @@ if (PutQueueEnabled) { object old = ReadElementByIndex(key); - if (old != Unknown) + if (old != Unknown && old != NotFound) { QueueOperation(new PutDelayedOperation(this, key, value, old)); return; Modified: trunk/nhibernate/src/NHibernate/Persister/Collection/AbstractCollectionPersister.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Persister/Collection/AbstractCollectionPersister.cs 2011-03-28 15:15:24 UTC (rev 5564) +++ trunk/nhibernate/src/NHibernate/Persister/Collection/AbstractCollectionPersister.cs 2011-03-28 16:03:06 UTC (rev 5565) @@ -34,6 +34,7 @@ public abstract class AbstractCollectionPersister : ICollectionMetadata, ISqlLoadableCollection, IPostInsertIdentityPersister { + protected static readonly object NotFoundPlaceHolder = new object(); private readonly string role; #region SQL statements @@ -1617,7 +1618,7 @@ } else { - return null; + return NotFoundObject; } } finally @@ -1638,6 +1639,11 @@ } } + public object NotFoundObject + { + get { return NotFoundPlaceHolder; } + } + public abstract bool ConsumesEntityAlias(); public abstract SqlString FromJoinFragment(string alias, bool innerJoin, bool includeSubclasses); Modified: trunk/nhibernate/src/NHibernate/Persister/Collection/ICollectionPersister.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Persister/Collection/ICollectionPersister.cs 2011-03-28 15:15:24 UTC (rev 5564) +++ trunk/nhibernate/src/NHibernate/Persister/Collection/ICollectionPersister.cs 2011-03-28 16:03:06 UTC (rev 5565) @@ -273,6 +273,20 @@ int GetSize(object key, ISessionImplementor session); bool IndexExists(object key, object index, ISessionImplementor session); bool ElementExists(object key, object element, ISessionImplementor session); + + /// <summary> + /// Try to find an element by a given index. + /// </summary> + /// <param name="key">The key of the collection (collection-owner identifier)</param> + /// <param name="index">The given index.</param> + /// <param name="session">The active <see cref="ISession"/>.</param> + /// <param name="owner">The owner of the collection.</param> + /// <returns>The value of the element where available; otherwise <see cref="NotFoundObject"/>.</returns> object GetElementByIndex(object key, object index, ISessionImplementor session, object owner); + + /// <summary> + /// A place-holder to inform that the data-reader was empty. + /// </summary> + object NotFoundObject { get; } } } Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2489/Fixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2489/Fixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2489/Fixture.cs 2011-03-28 16:03:06 UTC (rev 5565) @@ -0,0 +1,224 @@ +using System; +using System.Collections.Generic; +using NUnit.Framework; +using SharpTestsEx; + +namespace NHibernate.Test.NHSpecificTest.NH2489 +{ + public class Fixture : BugTestCase + { + #region Scenarios + + private class ListScenario : IDisposable + { + private readonly ISessionFactory factory; + + public ListScenario(ISessionFactory factory) + { + this.factory = factory; + using (ISession s = factory.OpenSession()) + { + using (ITransaction t = s.BeginTransaction()) + { + var entity = new Base(); + var child = new Child(); + // null members are partially working for lists, can't have one at the end + // and can't use the Count property. + entity.Children = new List<Child> {null, child}; + s.Save(entity); + t.Commit(); + } + } + } + + public void Dispose() + { + using (ISession s = factory.OpenSession()) + { + using (ITransaction t = s.BeginTransaction()) + { + s.Delete("from Base"); + s.Delete("from Child"); + t.Commit(); + } + } + } + } + + private class MapScenario : IDisposable + { + private readonly ISessionFactory factory; + + public MapScenario(ISessionFactory factory) + { + this.factory = factory; + using (ISession s = factory.OpenSession()) + { + using (ITransaction t = s.BeginTransaction()) + { + var entity = new Base(); + entity.NamedChildren = new Dictionary<string, Child> + { + {"Child1", new Child()}, + {"NullChild", null}, + }; + s.Save(entity); + t.Commit(); + } + } + } + + public void Dispose() + { + using (ISession s = factory.OpenSession()) + { + using (ITransaction t = s.BeginTransaction()) + { + s.Delete("from Base"); + s.Delete("from Child"); + t.Commit(); + } + } + } + } + + #endregion + + [Test] + public void List_InvalidIndex() + { + using (new ListScenario(Sfi)) + { + using (ISession s = OpenSession()) + { + using (ITransaction t = s.BeginTransaction()) + { + // accessing an invalid index should throw an exception + var entity = s.CreateQuery("from Base").UniqueResult<Base>(); + // null collection members don't seem to work, at least for lazy="extra" collections + entity.Children.Count.Should().Be.EqualTo(2); + NHibernateUtil.IsInitialized(entity.Children).Should().Be.False(); + Executing.This(() => { Child ignored = entity.Children[2]; }).Should().Throw<ArgumentOutOfRangeException>(); + } + } + } + } + + [Test] + public void List_NullChild() + { + using (new ListScenario(Sfi)) + { + using (ISession s = OpenSession()) + { + using (ITransaction t = s.BeginTransaction()) + { + // the list should only contain an item at index 0 + // accessing an invalid index should throw an exception + var entity = s.CreateQuery("from Base").UniqueResult<Base>(); + // null collection members don't seem to work, at least for lazy="extra" collections + entity.Children.Count.Should().Not.Be.EqualTo(0); + //entity.Children.Count.Should().Be.EqualTo(2); + NHibernateUtil.IsInitialized(entity.Children).Should().Be.False(); + var sigil = new Child(); + Child child = sigil; + Executing.This(() => { child = entity.Children[0]; }).Should().NotThrow(); + child.Should().Not.Be.EqualTo(sigil); + child.Should().Be.Null(); + } + } + } + } + + [Test] + public void Map_Item() + { + using (new MapScenario(Sfi)) + { + using (ISession s = OpenSession()) + { + using (ITransaction t = s.BeginTransaction()) + { + // accessing an invalid key should fail or throw an exception, depending on method + var entity = s.CreateQuery("from Base").UniqueResult<Base>(); + // null collection members don't seem to work, at least for lazy="extra" collections + entity.NamedChildren.Count.Should().Be.EqualTo(2); + NHibernateUtil.IsInitialized(entity.NamedChildren).Should().Be.False(); + Executing.This(() => { Child ignored = entity.NamedChildren["InvalidKey"]; }).Should().Throw<KeyNotFoundException>(); + } + } + } + } + + [Test] + public void Map_TryGetValue_Invalid() + { + using (new MapScenario(Sfi)) + { + using (ISession s = OpenSession()) + { + using (ITransaction t = s.BeginTransaction()) + { + // accessing an invalid key should fail or throw an exception, depending on method + var entity = s.CreateQuery("from Base").UniqueResult<Base>(); + // null collection members don't seem to work, at least for lazy="extra" collections + entity.NamedChildren.Count.Should().Be.EqualTo(2); + NHibernateUtil.IsInitialized(entity.NamedChildren).Should().Be.False(); + Child child; + entity.NamedChildren.TryGetValue("InvalidKey", out child).Should().Be.False(); + child.Should().Be.Null(); + } + } + } + } + + [Test] + public void Map_NullChild() + { + using (new MapScenario(Sfi)) + { + using (ISession s = OpenSession()) + { + using (ITransaction t = s.BeginTransaction()) + { + var entity = s.CreateQuery("from Base").UniqueResult<Base>(); + // null collection members don't seem to work, at least for lazy="extra" collections + entity.NamedChildren.Count.Should().Not.Be.EqualTo(0); + //entity.NamedChildren.Count.Should().Be.EqualTo(2); + NHibernateUtil.IsInitialized(entity.NamedChildren).Should().Be.False(); + // null valued child shouldn't cause errors + var sigil = new Child(); + Child child = sigil; + Assert.DoesNotThrow(() => { child = entity.NamedChildren["NullChild"]; }); + child.Should().Not.Be.EqualTo(sigil); + child.Should().Be.Null(); + } + } + } + } + + [Test] + public void Map_NullChild_TryGetValue() + { + using (new MapScenario(Sfi)) + { + using (ISession s = OpenSession()) + { + using (ITransaction t = s.BeginTransaction()) + { + var entity = s.CreateQuery("from Base").UniqueResult<Base>(); + // null collection members don't seem to work, at least for lazy="extra" collections + entity.NamedChildren.Count.Should().Not.Be.EqualTo(0); + //entity.NamedChildren.Count.Should().Be.EqualTo(2); + // null valued child shouldn't cause errors + NHibernateUtil.IsInitialized(entity.NamedChildren).Should().Be.False(); + Child child; + entity.NamedChildren.TryGetValue("NullChild", out child) + .Should().Be.True(); + child.Should().Be.Null(); + } + } + } + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2489/Mappings.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2489/Mappings.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2489/Mappings.hbm.xml 2011-03-28 16:03:06 UTC (rev 5565) @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" + namespace="NHibernate.Test.NHSpecificTest.NH2489" + assembly="NHibernate.Test" +> + <class name="Base" > + <id name="Id"> + <generator class="increment"/> + </id> + <list name="Children" lazy="extra" cascade="all"> + <key column="listparentid"/> + <!-- sqlite doesn't like a column named index --> + <index column="childindex"/> + <many-to-many class="Child"/> + </list> + <map name="NamedChildren" lazy="extra" cascade="all" > + <key column="mapparentid" /> + <index column="name" type="string" /> + <many-to-many class="Child"> + <column name="Child" not-null="false" /> + </many-to-many> + </map> + </class> + + <class name="Child"> + <id name="Id"> + <generator class="increment"/> + </id> + </class> + +</hibernate-mapping> Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2489/Model.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2489/Model.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2489/Model.cs 2011-03-28 16:03:06 UTC (rev 5565) @@ -0,0 +1,34 @@ +using System.Collections.Generic; + +namespace NHibernate.Test.NHSpecificTest.NH2489 +{ + public class Base + { + public virtual int Id + { + get; + set; + } + + public virtual IList<Child> Children + { + get; + set; + } + + public virtual IDictionary<string, Child> NamedChildren + { + get; + set; + } + } + + public class Child + { + public virtual int Id + { + get; + set; + } + } +} Modified: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/SetFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/SetFixture.cs 2011-03-28 15:15:24 UTC (rev 5564) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/SetFixture.cs 2011-03-28 16:03:06 UTC (rev 5565) @@ -343,6 +343,11 @@ throw new NotImplementedException(); } + public object NotFoundObject + { + get { throw new NotImplementedException(); } + } + public ISessionFactoryImplementor Factory { get { return null; } Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-03-28 15:15:24 UTC (rev 5564) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-03-28 16:03:06 UTC (rev 5565) @@ -656,6 +656,8 @@ <Compile Include="NHSpecificTest\NH2484\Model.cs" /> <Compile Include="NHSpecificTest\NH2488\Fixture.cs" /> <Compile Include="NHSpecificTest\NH2488\Model.cs" /> + <Compile Include="NHSpecificTest\NH2489\Fixture.cs" /> + <Compile Include="NHSpecificTest\NH2489\Model.cs" /> <Compile Include="NHSpecificTest\NH2490\Fixture.cs" /> <Compile Include="NHSpecificTest\NH2490\Model.cs" /> <Compile Include="NHSpecificTest\NH2491\Fixture.cs" /> @@ -2498,6 +2500,7 @@ <EmbeddedResource Include="NHSpecificTest\NH1291AnonExample\Mappings.hbm.xml" /> </ItemGroup> <ItemGroup> + <EmbeddedResource Include="NHSpecificTest\NH2489\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2603\Mappings.hbm.xml" /> <EmbeddedResource Include="Subselect\Beings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2488\Mappings.hbm.xml" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pa...@us...> - 2011-03-28 15:15:31
|
Revision: 5564 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5564&view=rev Author: patearl Date: 2011-03-28 15:15:24 +0000 (Mon, 28 Mar 2011) Log Message: ----------- Modified Paths: -------------- trunk/nhibernate/src/NHibernate.Test/TestDialect.cs Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/TestDialects/PostgreSQL82TestDialect.cs Modified: trunk/nhibernate/src/NHibernate.Test/TestDialect.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/TestDialect.cs 2011-03-28 05:23:57 UTC (rev 5563) +++ trunk/nhibernate/src/NHibernate.Test/TestDialect.cs 2011-03-28 15:15:24 UTC (rev 5564) @@ -47,6 +47,8 @@ public virtual bool HasBrokenDecimalType { get { return false; } } + public virtual bool SupportsSelectForUpdateOnOuterJoin { get { return true; } } + public bool SupportsSqlType(SqlType sqlType) { try Added: trunk/nhibernate/src/NHibernate.Test/TestDialects/PostgreSQL82TestDialect.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/TestDialects/PostgreSQL82TestDialect.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/TestDialects/PostgreSQL82TestDialect.cs 2011-03-28 15:15:24 UTC (rev 5564) @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace NHibernate.Test.TestDialects +{ + public class PostgreSQL82TestDialect : TestDialect + { + public PostgreSQL82TestDialect(Dialect.Dialect dialect) + : base(dialect) + { + } + + public override bool SupportsSelectForUpdateOnOuterJoin + { + get { return false; } + } + } +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pa...@us...> - 2011-03-28 05:24:03
|
Revision: 5563 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5563&view=rev Author: patearl Date: 2011-03-28 05:23:57 +0000 (Mon, 28 Mar 2011) Log Message: ----------- Tests: Avoid locking when not supported by dialect in MultiTableTests. Modified Paths: -------------- trunk/nhibernate/src/NHibernate.Test/Legacy/MultiTableTest.cs Modified: trunk/nhibernate/src/NHibernate.Test/Legacy/MultiTableTest.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Legacy/MultiTableTest.cs 2011-03-28 04:54:50 UTC (rev 5562) +++ trunk/nhibernate/src/NHibernate.Test/Legacy/MultiTableTest.cs 2011-03-28 05:23:57 UTC (rev 5563) @@ -344,7 +344,8 @@ s = OpenSession(); t = s.BeginTransaction(); - multi = (Multi) s.Load(typeof(Top), mid, LockMode.Upgrade); + if (TestDialect.SupportsSelectForUpdateOnOuterJoin) + multi = (Multi)s.Load(typeof(Top), mid, LockMode.Upgrade); simp = (Top) s.Load(typeof(Top), sid); s.Lock(simp, LockMode.UpgradeNoWait); t.Commit(); @@ -459,7 +460,8 @@ s = OpenSession(); t = s.BeginTransaction(); - multi = (Multi) s.Load(typeof(Top), multiId, LockMode.Upgrade); + if (TestDialect.SupportsSelectForUpdateOnOuterJoin) + multi = (Multi) s.Load(typeof(Top), multiId, LockMode.Upgrade); simp = (Top) s.Load(typeof(Top), simpId); s.Lock(simp, LockMode.UpgradeNoWait); t.Commit(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pa...@us...> - 2011-03-28 04:54:57
|
Revision: 5562 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5562&view=rev Author: patearl Date: 2011-03-28 04:54:50 +0000 (Mon, 28 Mar 2011) Log Message: ----------- Tests: Use a small delta when comparing inexact doubles for equality. Modified Paths: -------------- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1734/Fixture.cs Modified: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1734/Fixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1734/Fixture.cs 2011-03-28 04:39:49 UTC (rev 5561) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1734/Fixture.cs 2011-03-28 04:54:50 UTC (rev 5562) @@ -36,24 +36,26 @@ using (var session = this.OpenSession()) using (var tran = session.BeginTransaction()) { + double delta = 0.0000000000001; + var query=session.CreateQuery("select sum(Amount*Price) from Product"); var result=query.UniqueResult(); Assert.That(result, Is.InstanceOf(typeof (double))); - Assert.That(result, Is.EqualTo(43.2*3*2)); + Assert.AreEqual(43.2 * 3 * 2, (double)result, delta); query = session.CreateQuery("select sum(Price*Amount) from Product"); result = query.UniqueResult(); Assert.That(result, Is.InstanceOf(typeof(double))); - Assert.That(result, Is.EqualTo(43.2 * 3 * 2)); + Assert.AreEqual(43.2 * 3 * 2, (double)result, delta); query = session.CreateQuery("select sum(Price) from Product"); result = query.UniqueResult(); Assert.That(result, Is.InstanceOf(typeof(double))); - Assert.That(result, Is.EqualTo(43.2 * 2)); + Assert.AreEqual(43.2 * 2, (double)result, delta); query = session.CreateQuery("select sum(Amount) from Product"); result = query.UniqueResult(); Assert.That(result, Is.InstanceOf(typeof(Int64))); - Assert.That(result, Is.EqualTo(6.0)); + Assert.That(result, Is.EqualTo(6)); } } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pa...@us...> - 2011-03-28 04:39:55
|
Revision: 5561 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5561&view=rev Author: patearl Date: 2011-03-28 04:39:49 +0000 (Mon, 28 Mar 2011) Log Message: ----------- Revert recent changes to SettingsFactory. There may be external dependencies on the behavior I was changing. The default property handling needs more thought. Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Cfg/SettingsFactory.cs Modified: trunk/nhibernate/src/NHibernate/Cfg/SettingsFactory.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/SettingsFactory.cs 2011-03-28 03:47:26 UTC (rev 5560) +++ trunk/nhibernate/src/NHibernate/Cfg/SettingsFactory.cs 2011-03-28 04:39:49 UTC (rev 5561) @@ -29,15 +29,28 @@ { Settings settings = new Settings(); + Dialect.Dialect dialect; try { - settings.Dialect = Dialect.Dialect.GetDialect(properties); + dialect = Dialect.Dialect.GetDialect(properties); + Dictionary<string, string> temp = new Dictionary<string, string>(); + + foreach (KeyValuePair<string, string> de in dialect.DefaultProperties) + { + temp[de.Key] = de.Value; + } + foreach (KeyValuePair<string, string> de in properties) + { + temp[de.Key] = de.Value; + } + properties = temp; } catch (HibernateException he) { log.Warn("No dialect set - using GenericDialect: " + he.Message); - settings.Dialect = new GenericDialect(); + dialect = new GenericDialect(); } + settings.Dialect = dialect; settings.LinqToHqlGeneratorsRegistry = LinqToHqlGeneratorsRegistryFactory.CreateGeneratorsRegistry(properties); @@ -46,7 +59,7 @@ ISQLExceptionConverter sqlExceptionConverter; try { - sqlExceptionConverter = SQLExceptionConverterFactory.BuildSQLExceptionConverter(settings.Dialect, properties); + sqlExceptionConverter = SQLExceptionConverterFactory.BuildSQLExceptionConverter(dialect, properties); } catch (HibernateException) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pa...@us...> - 2011-03-28 03:47:32
|
Revision: 5560 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5560&view=rev Author: patearl Date: 2011-03-28 03:47:26 +0000 (Mon, 28 Mar 2011) Log Message: ----------- Tests: Use dialect-specific false literals in SqlCommandTests. Modified Paths: -------------- trunk/nhibernate/src/NHibernate.Test/SqlCommandTest/SqlInsertBuilderFixture.cs trunk/nhibernate/src/NHibernate.Test/SqlCommandTest/SqlUpdateBuilderFixture.cs Modified: trunk/nhibernate/src/NHibernate.Test/SqlCommandTest/SqlInsertBuilderFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/SqlCommandTest/SqlInsertBuilderFixture.cs 2011-03-28 03:45:18 UTC (rev 5559) +++ trunk/nhibernate/src/NHibernate.Test/SqlCommandTest/SqlInsertBuilderFixture.cs 2011-03-28 03:47:26 UTC (rev 5560) @@ -32,8 +32,9 @@ SqlCommandInfo sqlCommand = insert.ToSqlCommandInfo(); SqlType[] actualParameterTypes = sqlCommand.ParameterTypes; + string falseString = factoryImpl.Dialect.ToBooleanValueString(false); string expectedSql = - "INSERT INTO test_insert_builder (intColumn, longColumn, literalColumn, stringColumn) VALUES (?, ?, 0, 5)"; + "INSERT INTO test_insert_builder (intColumn, longColumn, literalColumn, stringColumn) VALUES (?, ?, " + falseString + ", 5)"; Assert.AreEqual(expectedSql, sqlCommand.Text.ToString(), "SQL String"); Assert.AreEqual(2, actualParameterTypes.Length); @@ -78,8 +79,9 @@ SqlCommandInfo sqlCommand = insert.ToSqlCommandInfo(); SqlType[] actualParameterTypes = sqlCommand.ParameterTypes; - string expectedSql = - "INSERT INTO test_insert_builder (literalColumn, intColumn, stringColumn, longColumn) VALUES (0, ?, 5, ?)"; + string falseString = factoryImpl.Dialect.ToBooleanValueString(false); + string expectedSql = + "INSERT INTO test_insert_builder (literalColumn, intColumn, stringColumn, longColumn) VALUES (" + falseString + ", ?, 5, ?)"; Assert.AreEqual(expectedSql, sqlCommand.Text.ToString(), "SQL String"); Assert.AreEqual(2, actualParameterTypes.Length); Modified: trunk/nhibernate/src/NHibernate.Test/SqlCommandTest/SqlUpdateBuilderFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/SqlCommandTest/SqlUpdateBuilderFixture.cs 2011-03-28 03:45:18 UTC (rev 5559) +++ trunk/nhibernate/src/NHibernate.Test/SqlCommandTest/SqlUpdateBuilderFixture.cs 2011-03-28 03:47:26 UTC (rev 5560) @@ -38,8 +38,9 @@ SqlCommandInfo sqlCommand = update.ToSqlCommandInfo(); Assert.AreEqual(CommandType.Text, sqlCommand.CommandType); - string expectedSql = - "UPDATE test_update_builder SET intColumn = ?, longColumn = ?, literalColumn = 0, stringColumn = 5 WHERE decimalColumn = ? AND versionColumn = ? AND a=b"; + string falseString = factoryImpl.Dialect.ToBooleanValueString(false); + string expectedSql = + "UPDATE test_update_builder SET intColumn = ?, longColumn = ?, literalColumn = " + falseString + ", stringColumn = 5 WHERE decimalColumn = ? AND versionColumn = ? AND a=b"; Assert.AreEqual(expectedSql, sqlCommand.Text.ToString(), "SQL String"); SqlType[] actualParameterTypes = sqlCommand.ParameterTypes; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pa...@us...> - 2011-03-28 03:45:24
|
Revision: 5559 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5559&view=rev Author: patearl Date: 2011-03-28 03:45:18 +0000 (Mon, 28 Mar 2011) Log Message: ----------- Fixed a compile error. Oops. Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Cfg/SettingsFactory.cs Modified: trunk/nhibernate/src/NHibernate/Cfg/SettingsFactory.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/SettingsFactory.cs 2011-03-28 02:39:49 UTC (rev 5558) +++ trunk/nhibernate/src/NHibernate/Cfg/SettingsFactory.cs 2011-03-28 03:45:18 UTC (rev 5559) @@ -46,7 +46,7 @@ ISQLExceptionConverter sqlExceptionConverter; try { - sqlExceptionConverter = SQLExceptionConverterFactory.BuildSQLExceptionConverter(dialect, properties); + sqlExceptionConverter = SQLExceptionConverterFactory.BuildSQLExceptionConverter(settings.Dialect, properties); } catch (HibernateException) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pa...@us...> - 2011-03-28 02:39:55
|
Revision: 5558 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5558&view=rev Author: patearl Date: 2011-03-28 02:39:49 +0000 (Mon, 28 Mar 2011) Log Message: ----------- Provide a convenience method for getting dialect-derived properties of configuration. Use derived properties for Linq tests. Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Cfg/Configuration.cs trunk/nhibernate/src/NHibernate/Cfg/SettingsFactory.cs trunk/nhibernate/src/NHibernate.Test/Linq/LinqReadonlyTestsContext.cs Modified: trunk/nhibernate/src/NHibernate/Cfg/Configuration.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/Configuration.cs 2011-03-28 02:32:55 UTC (rev 5557) +++ trunk/nhibernate/src/NHibernate/Cfg/Configuration.cs 2011-03-28 02:39:49 UTC (rev 5558) @@ -1276,6 +1276,27 @@ set { properties = value; } } + /// <summary> + /// Returns the set of properties computed from the default properties in the dialect combined with the other properties in the configuration. + /// </summary> + /// <returns></returns> + public IDictionary<string, string> GetDerivedProperties() + { + IDictionary<string, string> derivedProperties = new Dictionary<string, string>(); + + if (Properties.ContainsKey(Environment.Dialect)) + { + Dialect.Dialect dialect = Dialect.Dialect.GetDialect(Properties); + foreach (KeyValuePair<string, string> pair in dialect.DefaultProperties) + derivedProperties[pair.Key] = pair.Value; + } + + foreach (KeyValuePair<string, string> pair in Properties) + derivedProperties[pair.Key] = pair.Value; + + return derivedProperties; + } + /// <summary> /// Set the default assembly to use for the mappings added to the configuration /// afterwards. @@ -1692,7 +1713,7 @@ //protected Settings BuildSettings() private Settings BuildSettings() { - var result = settingsFactory.BuildSettings(properties); + var result = settingsFactory.BuildSettings(GetDerivedProperties()); // NH : Set configuration for IdGenerator SQL logging PersistentIdGeneratorParmsNames.SqlStatementLogger.FormatSql = result.SqlStatementLogger.FormatSql; PersistentIdGeneratorParmsNames.SqlStatementLogger.LogToStdout = result.SqlStatementLogger.LogToStdout; Modified: trunk/nhibernate/src/NHibernate/Cfg/SettingsFactory.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/SettingsFactory.cs 2011-03-28 02:32:55 UTC (rev 5557) +++ trunk/nhibernate/src/NHibernate/Cfg/SettingsFactory.cs 2011-03-28 02:39:49 UTC (rev 5558) @@ -29,28 +29,15 @@ { Settings settings = new Settings(); - Dialect.Dialect dialect; try { - dialect = Dialect.Dialect.GetDialect(properties); - Dictionary<string, string> temp = new Dictionary<string, string>(); - - foreach (KeyValuePair<string, string> de in dialect.DefaultProperties) - { - temp[de.Key] = de.Value; - } - foreach (KeyValuePair<string, string> de in properties) - { - temp[de.Key] = de.Value; - } - properties = temp; + settings.Dialect = Dialect.Dialect.GetDialect(properties); } catch (HibernateException he) { log.Warn("No dialect set - using GenericDialect: " + he.Message); - dialect = new GenericDialect(); + settings.Dialect = new GenericDialect(); } - settings.Dialect = dialect; settings.LinqToHqlGeneratorsRegistry = LinqToHqlGeneratorsRegistryFactory.CreateGeneratorsRegistry(properties); Modified: trunk/nhibernate/src/NHibernate.Test/Linq/LinqReadonlyTestsContext.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Linq/LinqReadonlyTestsContext.cs 2011-03-28 02:32:55 UTC (rev 5557) +++ trunk/nhibernate/src/NHibernate.Test/Linq/LinqReadonlyTestsContext.cs 2011-03-28 02:39:49 UTC (rev 5558) @@ -70,7 +70,7 @@ { var file = new FileInfo(scripFileName); string script = file.OpenText().ReadToEnd().Replace("GO", ""); - var connectionProvider = ConnectionProviderFactory.NewConnectionProvider(configuration.Properties); + var connectionProvider = ConnectionProviderFactory.NewConnectionProvider(configuration.GetDerivedProperties()); using (var conn = connectionProvider.GetConnection()) { if (conn.State == ConnectionState.Closed) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pa...@us...> - 2011-03-28 02:33:01
|
Revision: 5557 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5557&view=rev Author: patearl Date: 2011-03-28 02:32:55 +0000 (Mon, 28 Mar 2011) Log Message: ----------- Linq: Use "concat" method for string addition. Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Linq/Visitors/HqlGeneratorExpressionTreeVisitor.cs Modified: trunk/nhibernate/src/NHibernate/Linq/Visitors/HqlGeneratorExpressionTreeVisitor.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Linq/Visitors/HqlGeneratorExpressionTreeVisitor.cs 2011-03-28 01:28:41 UTC (rev 5556) +++ trunk/nhibernate/src/NHibernate/Linq/Visitors/HqlGeneratorExpressionTreeVisitor.cs 2011-03-28 02:32:55 UTC (rev 5557) @@ -293,7 +293,14 @@ return _hqlTreeBuilder.BooleanOr(lhs.AsBooleanExpression(), rhs.AsBooleanExpression()); case ExpressionType.Add: - return _hqlTreeBuilder.Add(lhs, rhs); + if (expression.Left.Type == typeof(string) && expression.Right.Type == typeof(string)) + { + return _hqlTreeBuilder.MethodCall("concat", lhs, rhs); + } + else + { + return _hqlTreeBuilder.Add(lhs, rhs); + } case ExpressionType.Subtract: return _hqlTreeBuilder.Subtract(lhs, rhs); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pa...@us...> - 2011-03-28 01:28:47
|
Revision: 5556 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5556&view=rev Author: patearl Date: 2011-03-28 01:28:41 +0000 (Mon, 28 Mar 2011) Log Message: ----------- Dialect support for specifying technique to retrieve identifiers generated by insert statements. Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Dialect/Dialect.cs trunk/nhibernate/src/NHibernate/Dialect/PostgreSQLDialect.cs trunk/nhibernate/src/NHibernate/Id/Insert/OutputParamReturningDelegate.cs Modified: trunk/nhibernate/src/NHibernate/Dialect/Dialect.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Dialect/Dialect.cs 2011-03-27 20:44:38 UTC (rev 5555) +++ trunk/nhibernate/src/NHibernate/Dialect/Dialect.cs 2011-03-28 01:28:41 UTC (rev 5556) @@ -2375,6 +2375,11 @@ return insertString; } + public virtual InsertGeneratedIdentifierRetrievalMethod InsertGeneratedIdentifierRetrievalMethod + { + get { return InsertGeneratedIdentifierRetrievalMethod.ReturnValueParameter; } + } + /// <summary> /// The class (which implements <see cref="NHibernate.Id.IIdentifierGenerator"/>) /// which acts as this dialects identity-style generation strategy. @@ -2435,4 +2440,22 @@ get { return null; } } } + + public enum InsertGeneratedIdentifierRetrievalMethod + { + /// <summary> + /// Use a parameter with ParameterDirection.Output + /// </summary> + OutputParameter, + + /// <summary> + /// Use a parameter with ParameterDirection.ReturnValue + /// </summary> + ReturnValueParameter, + + // <summary> + // Get the result from the statment as if it were a query, using ExecuteScalar() or ExecuteDataReader(). + // </summary> + // QueryResult + } } Modified: trunk/nhibernate/src/NHibernate/Dialect/PostgreSQLDialect.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Dialect/PostgreSQLDialect.cs 2011-03-27 20:44:38 UTC (rev 5555) +++ trunk/nhibernate/src/NHibernate/Dialect/PostgreSQLDialect.cs 2011-03-28 01:28:41 UTC (rev 5556) @@ -111,6 +111,11 @@ return insertString.Append(" returning " + identifierColumnName); } + public override InsertGeneratedIdentifierRetrievalMethod InsertGeneratedIdentifierRetrievalMethod + { + get { return InsertGeneratedIdentifierRetrievalMethod.OutputParameter; } + } + public override bool SupportsSequences { get { return true; } Modified: trunk/nhibernate/src/NHibernate/Id/Insert/OutputParamReturningDelegate.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Id/Insert/OutputParamReturningDelegate.cs 2011-03-27 20:44:38 UTC (rev 5555) +++ trunk/nhibernate/src/NHibernate/Id/Insert/OutputParamReturningDelegate.cs 2011-03-28 01:28:41 UTC (rev 5556) @@ -1,4 +1,5 @@ using System.Data; +using NHibernate.Dialect; using NHibernate.Engine; using NHibernate.SqlCommand; using NHibernate.SqlTypes; @@ -45,8 +46,14 @@ IDbDataParameter idParameter = factory.ConnectionProvider.Driver.GenerateParameter(command, ReturnParameterName, paramType); driveGeneratedParamName = idParameter.ParameterName; - idParameter.Direction = ParameterDirection.ReturnValue; + if (factory.Dialect.InsertGeneratedIdentifierRetrievalMethod == InsertGeneratedIdentifierRetrievalMethod.OutputParameter) + idParameter.Direction = ParameterDirection.Output; + else if (factory.Dialect.InsertGeneratedIdentifierRetrievalMethod == InsertGeneratedIdentifierRetrievalMethod.ReturnValueParameter) + idParameter.Direction = ParameterDirection.ReturnValue; + else + throw new System.NotImplementedException("Unsupported InsertGeneratedIdentifierRetrievalMethod: " + factory.Dialect.InsertGeneratedIdentifierRetrievalMethod); + command.Parameters.Add(idParameter); return command; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2011-03-27 20:44:44
|
Revision: 5555 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5555&view=rev Author: fabiomaulo Date: 2011-03-27 20:44:38 +0000 (Sun, 27 Mar 2011) Log Message: ----------- Fix NH-2603 Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Persister/Collection/AbstractCollectionPersister.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2603/ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2603/Fixture.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2603/Mappings.hbm.xml trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2603/Model.cs Modified: trunk/nhibernate/src/NHibernate/Persister/Collection/AbstractCollectionPersister.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Persister/Collection/AbstractCollectionPersister.cs 2011-03-27 19:31:22 UTC (rev 5554) +++ trunk/nhibernate/src/NHibernate/Persister/Collection/AbstractCollectionPersister.cs 2011-03-27 20:44:38 UTC (rev 5555) @@ -844,11 +844,9 @@ private SqlString GenerateSelectSizeString(ISessionImplementor sessionImplementor) { - string selectValue = isCollectionIntegerIndex - ? "max(" + IndexColumnNames[0] + ") + 1" - : "count(" + ElementColumnNames[0] + ")"; //sets, maps, bags + string selectValue = GetCountSqlSelectClause(); - return new SqlSimpleSelectBuilder(dialect, factory) + return new SqlSimpleSelectBuilder(dialect, factory) .SetTableName(TableName) .AddWhereFragment(KeyColumnNames, KeyType, "=") .AddColumn(selectValue) @@ -856,6 +854,20 @@ .Append(FilterFragment(TableName, sessionImplementor.EnabledFilters)); } + protected virtual string GetCountSqlSelectClause() + { + // NH: too many "if" when each collection can have its persister + return isCollectionIntegerIndex + ? (string.Format("max({0}) + 1", IndexColumnNames[0])) + : (HasIndex ? string.Format("count({0})", GetIndexCountExpression()) : string.Format("count({0})", ElementColumnNames[0])); + } + + private string GetIndexCountExpression() + { + // when the index has at least one column then use that column to perform the count, otherwise it will use the formula. + return IndexColumnNames[0] ?? IndexFormulas[0]; + } + private SqlString GenerateDetectRowByIndexString() { if (!hasIndex) Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2603/Fixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2603/Fixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2603/Fixture.cs 2011-03-27 20:44:38 UTC (rev 5555) @@ -0,0 +1,138 @@ +using System; +using System.Collections.Generic; +using NUnit.Framework; +using SharpTestsEx; + +namespace NHibernate.Test.NHSpecificTest.NH2603 +{ + public class Fixture : BugTestCase + { + #region Scenarios + + private class ListScenario : IDisposable + { + private readonly ISessionFactory factory; + + public ListScenario(ISessionFactory factory) + { + this.factory = factory; + using (ISession s = factory.OpenSession()) + { + using (ITransaction t = s.BeginTransaction()) + { + var entity = new Parent(); + var child = new Child(); + entity.ListChildren = new List<Child> {null, child, null}; + s.Save(entity); + t.Commit(); + } + } + } + + public void Dispose() + { + using (ISession s = factory.OpenSession()) + { + using (ITransaction t = s.BeginTransaction()) + { + s.Delete("from Parent"); + s.Delete("from Child"); + t.Commit(); + } + } + } + } + + private class MapScenario : IDisposable + { + private readonly ISessionFactory factory; + + public MapScenario(ISessionFactory factory) + { + this.factory = factory; + using (ISession s = factory.OpenSession()) + { + using (ITransaction t = s.BeginTransaction()) + { + var entity = new Parent(); + entity.MapChildren = new Dictionary<int, Child> + { + {0, null}, + {1, new Child()}, + {2, null}, + }; + s.Save(entity); + t.Commit(); + } + } + } + + public void Dispose() + { + using (ISession s = factory.OpenSession()) + { + using (ITransaction t = s.BeginTransaction()) + { + s.Delete("from Parent"); + s.Delete("from Child"); + t.Commit(); + } + } + } + } + + #endregion + + [Test] + public void List() + { + using (new ListScenario(Sfi)) + { + // by design NH will clean null elements at the end of the List since 'null' and 'no element' mean the same. + // the effective ammount store will be 1(one) because ther is only one valid element but whem we initialize the collection + // it will have 2 elements (the first with null) + using (ISession s = OpenSession()) + { + using (ITransaction t = s.BeginTransaction()) + { + var entity = s.CreateQuery("from Parent").UniqueResult<Parent>(); + IList<object[]> members = s.GetNamedQuery("ListMemberSpy") + .SetParameter("parentid", entity.Id) + .List<object[]>(); + int lazyCount = entity.ListChildren.Count; + NHibernateUtil.IsInitialized(entity.ListChildren).Should().Be.False(); + NHibernateUtil.Initialize(entity.ListChildren); + int initCount = entity.ListChildren.Count; + initCount.Should().Be.EqualTo(lazyCount); + members.Count.Should("because only the valid element should be persisted.").Be(1); + } + } + } + } + + [Test] + public void Map() + { + using (new MapScenario(Sfi)) + { + using (ISession s = OpenSession()) + { + // for the case of <map> what really matter is the key, then NH should count the KEY and not the elements. + using (ITransaction t = s.BeginTransaction()) + { + var entity = s.CreateQuery("from Parent").UniqueResult<Parent>(); + IList<object[]> members = s.GetNamedQuery("MapMemberSpy") + .SetParameter("parentid", entity.Id) + .List<object[]>(); + int lazyCount = entity.MapChildren.Count; + NHibernateUtil.IsInitialized(entity.MapChildren).Should().Be.False(); + NHibernateUtil.Initialize(entity.MapChildren); + int initCount = entity.MapChildren.Count; + initCount.Should().Be.EqualTo(lazyCount); + members.Count.Should("because all elements with a valid key should be persisted.").Be(3); + } + } + } + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2603/Mappings.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2603/Mappings.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2603/Mappings.hbm.xml 2011-03-27 20:44:38 UTC (rev 5555) @@ -0,0 +1,43 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" + namespace="NHibernate.Test.NHSpecificTest.NH2603" + assembly="NHibernate.Test" +> + <class name="Parent" > + <id name="Id"> + <generator class="increment"/> + </id> + <list name="ListChildren" lazy="extra" cascade="all" table="ListChildren"> + <key column="listparentid"/> + <!-- sqlite doesn't like a column named index --> + <index column="childindex"/> + <many-to-many class="Child" column="childid"/> + </list> + <map name="MapChildren" lazy="extra" cascade="all" table="MapChildren"> + <key column="mapparentid" /> + <map-key column="childindex" type="int" /> + <many-to-many class="Child"> + <column name="childid" not-null="false" /> + </many-to-many> + </map> + </class> + + <class name="Child"> + <id name="Id"> + <generator class="increment"/> + </id> + </class> + + <sql-query name="ListMemberSpy"> + select listparentid, childindex, childid + from ListChildren + where listparentid = :parentid + </sql-query> + + <sql-query name="MapMemberSpy"> + select mapparentid, childindex, childid + from MapChildren + where mapparentid = :parentid + </sql-query> + +</hibernate-mapping> Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2603/Model.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2603/Model.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2603/Model.cs 2011-03-27 20:44:38 UTC (rev 5555) @@ -0,0 +1,34 @@ +using System.Collections.Generic; + +namespace NHibernate.Test.NHSpecificTest.NH2603 +{ + public class Parent + { + public virtual int Id + { + get; + set; + } + + public virtual IList<Child> ListChildren + { + get; + set; + } + + public virtual IDictionary<int, Child> MapChildren + { + get; + set; + } + } + + public class Child + { + public virtual int Id + { + get; + set; + } + } +} Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-03-27 19:31:22 UTC (rev 5554) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-03-27 20:44:38 UTC (rev 5555) @@ -670,6 +670,8 @@ <Compile Include="NHSpecificTest\NH2565\Domain.cs" /> <Compile Include="NHSpecificTest\NH2565\Fixture.cs" /> <Compile Include="NHSpecificTest\NH2580\Fixture.cs" /> + <Compile Include="NHSpecificTest\NH2603\Fixture.cs" /> + <Compile Include="NHSpecificTest\NH2603\Model.cs" /> <Compile Include="NHSpecificTest\Properties\CompositePropertyRefTest.cs" /> <Compile Include="NHSpecificTest\Properties\DynamicEntityTest.cs" /> <Compile Include="NHSpecificTest\Properties\Model.cs" /> @@ -2496,6 +2498,7 @@ <EmbeddedResource Include="NHSpecificTest\NH1291AnonExample\Mappings.hbm.xml" /> </ItemGroup> <ItemGroup> + <EmbeddedResource Include="NHSpecificTest\NH2603\Mappings.hbm.xml" /> <EmbeddedResource Include="Subselect\Beings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2488\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2490\Mappings.hbm.xml" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2011-03-27 19:31:29
|
Revision: 5554 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5554&view=rev Author: fabiomaulo Date: 2011-03-27 19:31:22 +0000 (Sun, 27 Mar 2011) Log Message: ----------- Partial fix of NH-1747 and commented the full fix Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/CollectionBinder.cs trunk/nhibernate/src/NHibernate/Loader/Collection/OneToManyJoinWalker.cs trunk/nhibernate/src/NHibernate/Persister/Collection/AbstractCollectionPersister.cs trunk/nhibernate/src/NHibernate/Persister/Collection/OneToManyPersister.cs trunk/nhibernate/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1747/Fixture.cs Modified: trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/CollectionBinder.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/CollectionBinder.cs 2011-03-27 17:34:26 UTC (rev 5553) +++ trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/CollectionBinder.cs 2011-03-27 19:31:22 UTC (rev 5554) @@ -712,6 +712,18 @@ throw new MappingException("Association references unmapped class: " + associatedEntityName); oneToMany.AssociatedClass = persistentClass; model.CollectionTable = persistentClass.Table; + if (model.IsInverse && persistentClass.JoinClosureSpan > 0) + { + // NH: bidirectional one-to-many with a class splitted in more tables; have to find in which table is the inverse side + foreach (var joined in persistentClass.JoinClosureIterator) + { + if (collectionMapping.Key.Columns.Select(x=> x.name).All(x => joined.Table.ColumnIterator.Select(jc=> jc.Name).Contains(x))) + { + model.CollectionTable = joined.Table; + break; + } + } + } if (log.IsInfoEnabled) log.Info("mapping collection: " + model.Role + " -> " + model.CollectionTable.Name); Modified: trunk/nhibernate/src/NHibernate/Loader/Collection/OneToManyJoinWalker.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Loader/Collection/OneToManyJoinWalker.cs 2011-03-27 17:34:26 UTC (rev 5553) +++ trunk/nhibernate/src/NHibernate/Loader/Collection/OneToManyJoinWalker.cs 2011-03-27 19:31:22 UTC (rev 5554) @@ -13,6 +13,7 @@ /// <seealso cref="OneToManyLoader" /> public class OneToManyJoinWalker : CollectionJoinWalker { + private readonly IOuterJoinLoadable elementPersister; private readonly IQueryableCollection oneToManyPersister; protected override bool IsDuplicateAssociation(string foreignKeyTable, string[] foreignKeyColumns) @@ -28,7 +29,7 @@ : base(factory, enabledFilters) { this.oneToManyPersister = oneToManyPersister; - IOuterJoinLoadable elementPersister = (IOuterJoinLoadable) oneToManyPersister.ElementPersister; + elementPersister = (IOuterJoinLoadable)oneToManyPersister.ElementPersister; string alias = GenerateRootAlias(oneToManyPersister.Role); WalkEntityTree(elementPersister, alias); @@ -42,6 +43,12 @@ InitStatementString(elementPersister, alias, batchSize, subquery); } + // NH-1747 FIX + //protected override string GenerateAliasForColumn(string rootAlias, string column) + //{ + // return elementPersister.GenerateTableAliasForColumn(rootAlias, column); + //} + private void InitStatementString(IOuterJoinLoadable elementPersister, string alias, int batchSize, SqlString subquery) { int joins = CountEntityPersisters(associations); Modified: trunk/nhibernate/src/NHibernate/Persister/Collection/AbstractCollectionPersister.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Persister/Collection/AbstractCollectionPersister.cs 2011-03-27 17:34:26 UTC (rev 5553) +++ trunk/nhibernate/src/NHibernate/Persister/Collection/AbstractCollectionPersister.cs 2011-03-27 19:31:22 UTC (rev 5554) @@ -1752,6 +1752,11 @@ get { return keyColumnNames; } } + protected string[] KeyColumnAliases + { + get { return keyColumnAliases; } + } + public bool IsLazy { get { return isLazy; } Modified: trunk/nhibernate/src/NHibernate/Persister/Collection/OneToManyPersister.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Persister/Collection/OneToManyPersister.cs 2011-03-27 17:34:26 UTC (rev 5553) +++ trunk/nhibernate/src/NHibernate/Persister/Collection/OneToManyPersister.cs 2011-03-27 19:31:22 UTC (rev 5554) @@ -321,6 +321,22 @@ .ToString(); } + // NH-1747 FIX + //protected override SelectFragment GenerateSelectFragment(string alias, string columnSuffix) + //{ + // var ojl = (IOuterJoinLoadable)ElementPersister; + // var selectFragment = new SelectFragment(Dialect).SetSuffix(columnSuffix); + // var columnNames = KeyColumnNames; + // var columnAliases = KeyColumnAliases; + // for (int i = 0; i < columnNames.Length; i++) + // { + // var column = columnNames[i]; + // var tableAlias = ojl.GenerateTableAliasForColumn(alias, column); + // selectFragment.AddColumn(tableAlias, column, columnAliases[i]); + // } + // return selectFragment; + //} + /// <summary> /// Create the <see cref="OneToManyLoader" /> /// </summary> Modified: trunk/nhibernate/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs 2011-03-27 17:34:26 UTC (rev 5553) +++ trunk/nhibernate/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs 2011-03-27 19:31:22 UTC (rev 5554) @@ -1817,7 +1817,7 @@ } } - public string GenerateTableAliasForColumn(string rootAlias, string column) + public virtual string GenerateTableAliasForColumn(string rootAlias, string column) { int propertyIndex = Array.IndexOf(SubclassColumnClosure, column); Modified: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1747/Fixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1747/Fixture.cs 2011-03-27 17:34:26 UTC (rev 5553) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1747/Fixture.cs 2011-03-27 19:31:22 UTC (rev 5554) @@ -2,7 +2,7 @@ namespace NHibernate.Test.NHSpecificTest.NH1747 { - [TestFixture,Ignore] + [TestFixture] public class JoinTraversalTest : BugTestCase { [Test] @@ -43,14 +43,13 @@ } } - [Test] + [Test, Ignore("The fix was commented in the code. Look for NH-1747")] public void TraversingBagToJoinChildElementShouldWork() { using (ISession session = OpenSession()) { var paymentBatch = session.Get<PaymentBatch>(3); Assert.AreEqual(1, paymentBatch.Payments.Count); - } } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |