From: <fab...@us...> - 2008-08-18 14:20:58
|
Revision: 3715 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=3715&view=rev Author: fabiomaulo Date: 2008-08-18 14:21:05 +0000 (Mon, 18 Aug 2008) Log Message: ----------- Partial support of lazy="extra" (collections) Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/CollectionBinder.cs trunk/nhibernate/src/NHibernate/Collection/PersistentSet.cs trunk/nhibernate/src/NHibernate/Persister/Collection/AbstractCollectionPersister.cs trunk/nhibernate/src/NHibernate/Persister/Collection/BasicCollectionPersister.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test-2.0.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/Extralazy/ trunk/nhibernate/src/NHibernate.Test/Extralazy/Document.cs trunk/nhibernate/src/NHibernate.Test/Extralazy/ExtraLazyFixture.cs trunk/nhibernate/src/NHibernate.Test/Extralazy/Group.cs trunk/nhibernate/src/NHibernate.Test/Extralazy/SessionAttribute.cs trunk/nhibernate/src/NHibernate.Test/Extralazy/User.cs trunk/nhibernate/src/NHibernate.Test/Extralazy/UserGroup.hbm.xml Modified: trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/CollectionBinder.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/CollectionBinder.cs 2008-08-18 13:38:05 UTC (rev 3714) +++ trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/CollectionBinder.cs 2008-08-18 14:21:05 UTC (rev 3715) @@ -167,7 +167,12 @@ // LAZINESS InitLaziness(node, model, "true", mappings.DefaultLazy); - // TODO: H3.1 - lazy="extra" + XmlAttribute lazyNode = node.Attributes["lazy"]; + if (lazyNode != null && "extra".Equals(lazyNode.Value)) + { + model.IsLazy = true; + model.ExtraLazy = true; + } XmlNode oneToManyNode = node.SelectSingleNode(HbmConstants.nsOneToMany, namespaceManager); if (oneToManyNode != null) @@ -507,7 +512,7 @@ string name = subnode.LocalName; //.Name; - if ("index".Equals(name)) + if ("index".Equals(name) || "map-key".Equals(name)) { SimpleValue value = new SimpleValue(model.CollectionTable); BindSimpleValue(subnode, value, model.IsOneToMany, IndexedCollection.DefaultIndexColumnName); @@ -515,13 +520,13 @@ if (model.Index.Type == null) throw new MappingException("map index element must specify a type: " + model.Role); } - else if ("index-many-to-many".Equals(name)) + else if ("index-many-to-many".Equals(name) || "map-key-many-to-many".Equals(name)) { ManyToOne mto = new ManyToOne(model.CollectionTable); BindManyToOne(subnode, mto, IndexedCollection.DefaultIndexColumnName, model.IsOneToMany); model.Index = mto; } - else if ("composite-index".Equals(name)) + else if ("composite-index".Equals(name) || "composite-map-key".Equals(name)) { Component component = new Component(model); BindComponent(subnode, component, null, model.Role, "index", model.IsOneToMany); Modified: trunk/nhibernate/src/NHibernate/Collection/PersistentSet.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Collection/PersistentSet.cs 2008-08-18 13:38:05 UTC (rev 3714) +++ trunk/nhibernate/src/NHibernate/Collection/PersistentSet.cs 2008-08-18 14:21:05 UTC (rev 3715) @@ -385,8 +385,7 @@ if (!exists.HasValue) { Initialize(true); - bool contained = set.Remove(o); - if (contained) + if (set.Remove(o)) { Dirty(); return true; Modified: trunk/nhibernate/src/NHibernate/Persister/Collection/AbstractCollectionPersister.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Persister/Collection/AbstractCollectionPersister.cs 2008-08-18 13:38:05 UTC (rev 3714) +++ trunk/nhibernate/src/NHibernate/Persister/Collection/AbstractCollectionPersister.cs 2008-08-18 14:21:05 UTC (rev 3715) @@ -1443,7 +1443,7 @@ IDataReader rs = null; try { - KeyType.NullSafeSet(st, key, 1, session); + KeyType.NullSafeSet(st, key, 0, session); rs = session.Batcher.ExecuteReader(st); return rs.Read() ? rs.GetInt32(0) - baseIndex : 0; } @@ -1481,8 +1481,8 @@ IDataReader rs = null; try { - KeyType.NullSafeSet(st, key, 1, session); - indexOrElementType.NullSafeSet(st, indexOrElement, keyColumnNames.Length + 1, session); + KeyType.NullSafeSet(st, key, 0, session); + indexOrElementType.NullSafeSet(st, indexOrElement, keyColumnNames.Length, session); rs = session.Batcher.ExecuteReader(st); try { @@ -1520,8 +1520,8 @@ IDataReader rs = null; try { - KeyType.NullSafeSet(st, key, 1, session); - IndexType.NullSafeSet(st, IncrementIndexByBase(index), keyColumnNames.Length + 1, session); + KeyType.NullSafeSet(st, key, 0, session); + IndexType.NullSafeSet(st, IncrementIndexByBase(index), keyColumnNames.Length, session); rs = session.Batcher.ExecuteReader(st); try { Modified: trunk/nhibernate/src/NHibernate/Persister/Collection/BasicCollectionPersister.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Persister/Collection/BasicCollectionPersister.cs 2008-08-18 13:38:05 UTC (rev 3714) +++ trunk/nhibernate/src/NHibernate/Persister/Collection/BasicCollectionPersister.cs 2008-08-18 14:21:05 UTC (rev 3715) @@ -74,13 +74,13 @@ insert.AddColumns(new string[] {IdentifierColumnName}, null, IdentifierType); if (HasIndex) - insert.AddColumns(IndexColumnNames, null, IndexType); + insert.AddColumns(IndexColumnNames, indexColumnIsSettable, IndexType); - insert.AddColumns(ElementColumnNames, elementColumnIsSettable, ElementType); - if (Factory.Settings.IsCommentsEnabled) insert.SetComment("insert collection row " + Role); + insert.AddColumns(ElementColumnNames, elementColumnIsSettable, ElementType); + return insert.ToSqlCommandInfo(); } Added: trunk/nhibernate/src/NHibernate.Test/Extralazy/Document.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Extralazy/Document.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/Extralazy/Document.cs 2008-08-18 14:21:05 UTC (rev 3715) @@ -0,0 +1,34 @@ +namespace NHibernate.Test.Extralazy +{ + public class Document + { + private string title; + private string content; + private User owner; + protected Document() {} + public Document(string title, string content, User owner) + { + this.title = title; + this.content = content; + this.owner = owner; + } + + public virtual string Title + { + get { return title; } + set { title = value; } + } + + public virtual string Content + { + get { return content; } + set { content = value; } + } + + public virtual User Owner + { + get { return owner; } + set { owner = value; } + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/Extralazy/ExtraLazyFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Extralazy/ExtraLazyFixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/Extralazy/ExtraLazyFixture.cs 2008-08-18 14:21:05 UTC (rev 3715) @@ -0,0 +1,232 @@ +using System.Collections; +using NUnit.Framework; +using NUnit.Framework.SyntaxHelpers; + +namespace NHibernate.Test.Extralazy +{ + [TestFixture] + public class ExtraLazyFixture : TestCase + { + protected override string MappingsAssembly + { + get { return "NHibernate.Test"; } + } + + protected override IList Mappings + { + get { return new string[] {"Extralazy.UserGroup.hbm.xml"}; } + } + + protected override string CacheConcurrencyStrategy + { + get { return null; } + } + + [Test, Ignore("Not supported yet") ] + public void OrphanDelete() + { + ISession s = OpenSession(); + ITransaction t = s.BeginTransaction(); + User gavin = new User("gavin", "secret"); + Document hia = new Document("HiA", "blah blah blah", gavin); + Document hia2 = new Document("HiA2", "blah blah blah blah", gavin); + gavin.Documents.Add(hia); // NH: added ; I don't understand how can work in H3.2.5 without add + gavin.Documents.Add(hia2);// NH: added + s.Persist(gavin); + t.Commit(); + s.Close(); + + s = OpenSession(); + t = s.BeginTransaction(); + gavin = s.Get<User>("gavin"); + Assert.AreEqual(2, gavin.Documents.Count); + gavin.Documents.Remove(hia2); + Assert.IsFalse(gavin.Documents.Contains(hia2)); + Assert.IsTrue(gavin.Documents.Contains(hia)); + Assert.AreEqual(1, gavin.Documents.Count); + Assert.IsFalse(NHibernateUtil.IsInitialized(gavin.Documents)); + t.Commit(); + s.Close(); + + s = OpenSession(); + t = s.BeginTransaction(); + gavin = s.Get<User>("gavin"); + Assert.AreEqual(1, gavin.Documents.Count); + Assert.IsFalse(gavin.Documents.Contains(hia2)); + Assert.IsTrue(gavin.Documents.Contains(hia)); + Assert.IsFalse(NHibernateUtil.IsInitialized(gavin.Documents)); + Assert.That(s.Get<Document>("HiA2"), Is.Null); + gavin.Documents.Clear(); + Assert.IsTrue(NHibernateUtil.IsInitialized(gavin.Documents)); + s.Delete(gavin); + t.Commit(); + s.Close(); + } + + [Test] + public void Get() + { + ISession s = OpenSession(); + ITransaction t = s.BeginTransaction(); + User gavin = new User("gavin", "secret"); + User turin = new User("turin", "tiger"); + Group g = new Group("developers"); + g.Users.Add("gavin", gavin); + g.Users.Add("turin", turin); + s.Persist(g); + gavin.Session.Add("foo", new SessionAttribute("foo", "foo bar baz")); + gavin.Session.Add("bar", new SessionAttribute("bar", "foo bar baz 2")); + t.Commit(); + s.Close(); + + s = OpenSession(); + t = s.BeginTransaction(); + g = s.Get<Group>("developers"); + gavin = (User) g.Users["gavin"]; + turin = (User) g.Users["turin"]; + Assert.That(gavin, Is.Not.Null); + Assert.That(turin, Is.Not.Null); + Assert.That(g.Users["emmanuel"], Is.Null); + Assert.IsFalse(NHibernateUtil.IsInitialized(g.Users)); + Assert.That(gavin.Session["foo"], Is.Not.Null); + Assert.That(turin.Session["foo"], Is.Null); + Assert.IsFalse(NHibernateUtil.IsInitialized(gavin.Session)); + Assert.IsFalse(NHibernateUtil.IsInitialized(turin.Session)); + s.Delete(gavin); + s.Delete(turin); + s.Delete(g); + t.Commit(); + s.Close(); + } + + [Test] + public void RemoveClear() + { + ISession s = OpenSession(); + ITransaction t = s.BeginTransaction(); + User gavin = new User("gavin", "secret"); + User turin = new User("turin", "tiger"); + Group g = new Group("developers"); + g.Users.Add("gavin", gavin); + g.Users.Add("turin", turin); + s.Persist(g); + gavin.Session.Add("foo", new SessionAttribute("foo", "foo bar baz")); + gavin.Session.Add("bar", new SessionAttribute("bar", "foo bar baz 2")); + t.Commit(); + s.Close(); + + s = OpenSession(); + t = s.BeginTransaction(); + g = s.Get<Group>("developers"); + gavin = (User) g.Users["gavin"]; + turin = (User) g.Users["turin"]; + Assert.IsFalse(NHibernateUtil.IsInitialized(g.Users)); + g.Users.Clear(); + gavin.Session.Remove("foo"); + Assert.IsTrue(NHibernateUtil.IsInitialized(g.Users)); + Assert.IsTrue(NHibernateUtil.IsInitialized(gavin.Session)); + t.Commit(); + s.Close(); + + s = OpenSession(); + t = s.BeginTransaction(); + g = s.Get<Group>("developers"); + //Assert.IsTrue( g.Users.IsEmpty() ); + //Assert.IsFalse( NHibernateUtil.IsInitialized( g.getUsers() ) ); + gavin = s.Get<User>("gavin"); + Assert.IsFalse(gavin.Session.Contains("foo")); + Assert.IsFalse(NHibernateUtil.IsInitialized(gavin.Session)); + s.Delete(gavin); + s.Delete(turin); + s.Delete(g); + t.Commit(); + s.Close(); + } + + [Test, Ignore("Not supported yet")] + public void IndexFormulaMap() + { + ISession s = OpenSession(); + ITransaction t = s.BeginTransaction(); + User gavin = new User("gavin", "secret"); + User turin = new User("turin", "tiger"); + Group g = new Group("developers"); + g.Users.Add("gavin", gavin); + g.Users.Add("turin", turin); + s.Persist(g); + gavin.Session.Add("foo", new SessionAttribute("foo", "foo bar baz")); + gavin.Session.Add("bar", new SessionAttribute("bar", "foo bar baz 2")); + t.Commit(); + s.Close(); + + s = OpenSession(); + t = s.BeginTransaction(); + g = s.Get<Group>("developers"); + Assert.AreEqual(2, g.Users.Count); + g.Users.Remove("turin"); + IDictionary smap = ((User) g.Users["gavin"]).Session; + Assert.AreEqual(2, smap.Count); + smap.Remove("bar"); + t.Commit(); + s.Close(); + + s = OpenSession(); + t = s.BeginTransaction(); + g = s.Get<Group>("developers"); + Assert.AreEqual(1, g.Users.Count); + smap = ((User) g.Users["gavin"]).Session; + Assert.AreEqual(1, smap.Count); + g.Users["gavin"]= turin; + gavin = (User) g.Users["gavin"]; + s.Delete(gavin); + Assert.AreEqual(0, s.CreateQuery("select count(*) from SessionAttribute").UniqueResult<long>()); + t.Commit(); + s.Close(); + + s = OpenSession(); + t = s.BeginTransaction(); + g = s.Get<Group>("developers"); + Assert.AreEqual(1, g.Users.Count); + turin = (User) g.Users["turin"]; + smap = turin.Session; + Assert.AreEqual(0, smap.Count); + Assert.AreEqual(1L, s.CreateQuery("select count(*) from User").UniqueResult<long>()); + s.Delete(g); + s.Delete(turin); + Assert.AreEqual(0, s.CreateQuery("select count(*) from User").UniqueResult<long>()); + t.Commit(); + s.Close(); + } + + [Test] + public void SQLQuery() + { + ISession s = OpenSession(); + ITransaction t = s.BeginTransaction(); + User gavin = new User("gavin", "secret"); + User turin = new User("turin", "tiger"); + gavin.Session.Add("foo", new SessionAttribute("foo", "foo bar baz")); + gavin.Session.Add("bar", new SessionAttribute("bar", "foo bar baz 2")); + s.Persist(gavin); + s.Persist(turin); + s.Flush(); + s.Clear(); + + IList results = s.GetNamedQuery("UserSessionData").SetParameter("uname", "%in").List(); + Assert.AreEqual(2, results.Count); + gavin = (User) ((object[]) results[0])[0]; + Assert.AreEqual("gavin", gavin.Name); + Assert.AreEqual(2, gavin.Session.Count); + t.Commit(); + s.Close(); + + using (s = OpenSession()) + using (t= s.BeginTransaction()) + { + s.Delete("from SessionAttribute"); + s.Delete("from User"); + t.Commit(); + } + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/Extralazy/Group.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Extralazy/Group.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/Extralazy/Group.cs 2008-08-18 14:21:05 UTC (rev 3715) @@ -0,0 +1,27 @@ +using System.Collections; + +namespace NHibernate.Test.Extralazy +{ + public class Group + { + private string name; + private IDictionary users = new Hashtable(); + protected Group() {} + public Group(string name) + { + this.name = name; + } + + public virtual string Name + { + get { return name; } + set { name = value; } + } + + public virtual IDictionary Users + { + get { return users; } + set { users = value; } + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/Extralazy/SessionAttribute.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Extralazy/SessionAttribute.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/Extralazy/SessionAttribute.cs 2008-08-18 14:21:05 UTC (rev 3715) @@ -0,0 +1,42 @@ +namespace NHibernate.Test.Extralazy +{ + public class SessionAttribute + { +#pragma warning disable 169 + private long id; +#pragma warning restore 169 + private string name; + private string stringData; + private object objectData; + protected SessionAttribute() {} + public SessionAttribute(string name, string stringData) + { + this.name = name; + this.stringData = stringData; + } + + public SessionAttribute(string name, object objectData) + { + this.name = name; + this.objectData = objectData; + } + + public virtual string Name + { + get { return name; } + set { name = value; } + } + + public virtual string StringData + { + get { return stringData; } + set { stringData = value; } + } + + public virtual object ObjectData + { + get { return objectData; } + set { objectData = value; } + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/Extralazy/User.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Extralazy/User.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/Extralazy/User.cs 2008-08-18 14:21:05 UTC (rev 3715) @@ -0,0 +1,43 @@ +using System.Collections; +using Iesi.Collections; + +namespace NHibernate.Test.Extralazy +{ + public class User + { + private string name; + private string password; + private IDictionary session = new Hashtable(); + private ISet documents = new HashedSet(); + protected User() {} + public User(string name, string password) + { + this.name = name; + this.password = password; + } + + public virtual string Name + { + get { return name; } + set { name = value; } + } + + public virtual string Password + { + get { return password; } + set { password = value; } + } + + public virtual IDictionary Session + { + get { return session; } + set { session = value; } + } + + public virtual ISet Documents + { + get { return documents; } + set { documents = value; } + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/Extralazy/UserGroup.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Extralazy/UserGroup.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/Extralazy/UserGroup.hbm.xml 2008-08-18 14:21:05 UTC (rev 3715) @@ -0,0 +1,62 @@ +<?xml version="1.0"?> + +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" + assembly="NHibernate.Test" + namespace="NHibernate.Test.Extralazy"> + + <class name="Group" table="groups"> + <id name="Name"/> + <map name="Users" cascade="persist" table="group_user" lazy="extra"> + <key column="groupName"/> + <map-key formula="lower(personName)" type="string"/> + <many-to-many class="User" column="personName"/> + </map> + </class> + + <class name="User" table="users"> + <id name="Name"/> + <property name="Password"/> + <map name="Session" lazy="extra" cascade="persist,save-update,delete,delete-orphan"> + <key column="userName"/> <!--Need to investigate not-null="true"--> + <map-key column="name" type="string"/> + <one-to-many class="SessionAttribute"/> + </map> + <set name="Documents" inverse="true" lazy="extra" cascade="all,delete-orphan"> + <key column="owner"/> + <one-to-many class="Document"/> + </set> + </class> + + <class name="Document" table="documents"> + <id name="Title"/> + <property name="Content" type="string" length="10000"/> + <many-to-one name="Owner" not-null="true"/> + </class> + + <class name="SessionAttribute" table="session_attributes"> + <id name="id" access="field"> + <generator class="native"/> + </id> + <property name="Name" update="false"/> <!--Need to investigate not-null="true"--> + <property name="StringData"/> + <property name="ObjectData" type="Serializable"/> + </class> + <!-- + NH the map of SessionAttribute in H3.2.6 have insert="false" for property "Name" but it can't work with not-null="true" + We remove the inconsistence. + --> + + <sql-query name="UserSessionData"> + <return alias="u" class="User"/> + <return-join alias="s" property="u.Session"/> + select + lower(u.name) as {u.Name}, lower(u.password) as {u.Password}, + lower(s.userName) as {s.key}, lower(s.name) as {s.index}, s.id as {s.element}, + {s.element.*} + from users u + join session_attributes s on lower(s.userName) = lower(u.name) + where u.name like :uname + </sql-query> + + +</hibernate-mapping> Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test-2.0.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test-2.0.csproj 2008-08-18 13:38:05 UTC (rev 3714) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test-2.0.csproj 2008-08-18 14:21:05 UTC (rev 3715) @@ -173,6 +173,11 @@ <Compile Include="ExpressionTest\SQLExpressionFixture.cs" /> <Compile Include="ExpressionTest\SubQueries\Classes.cs" /> <Compile Include="ExpressionTest\SubQueries\SubQueriesSqlFixture.cs" /> + <Compile Include="Extralazy\Document.cs" /> + <Compile Include="Extralazy\ExtraLazyFixture.cs" /> + <Compile Include="Extralazy\Group.cs" /> + <Compile Include="Extralazy\SessionAttribute.cs" /> + <Compile Include="Extralazy\User.cs" /> <Compile Include="FilterTest\BinaryFiltered.cs" /> <Compile Include="FilterTest\Category.cs" /> <Compile Include="FilterTest\Department.cs" /> @@ -1410,6 +1415,7 @@ <EmbeddedResource Include="CompositeId\Order.hbm.xml" /> <EmbeddedResource Include="CompositeId\Product.hbm.xml" /> <Content Include="DynamicEntity\package.html" /> + <EmbeddedResource Include="Extralazy\UserGroup.hbm.xml" /> <EmbeddedResource Include="Naturalid\Immutable\User.hbm.xml" /> <EmbeddedResource Include="Naturalid\Mutable\User.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1419\Mappings.hbm.xml" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |