From: <fab...@us...> - 2011-05-10 16:57:31
|
Revision: 5807 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5807&view=rev Author: fabiomaulo Date: 2011-05-10 16:57:24 +0000 (Tue, 10 May 2011) Log Message: ----------- Fix NH-2697 Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Engine/ISessionFactoryImplementor.cs trunk/nhibernate/src/NHibernate/Hql/Ast/ANTLR/PolymorphicQuerySourceDetector.cs trunk/nhibernate/src/NHibernate/Impl/SessionFactoryImpl.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2697/ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2697/ArticleGroupItem.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2697/ArticleItem.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2697/Mappings.hbm.xml trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2697/SampleTest.cs Modified: trunk/nhibernate/src/NHibernate/Engine/ISessionFactoryImplementor.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Engine/ISessionFactoryImplementor.cs 2011-05-09 22:21:23 UTC (rev 5806) +++ trunk/nhibernate/src/NHibernate/Engine/ISessionFactoryImplementor.cs 2011-05-10 16:57:24 UTC (rev 5807) @@ -86,9 +86,9 @@ /// <summary> /// Get the names of all persistent classes that implement/extend the given interface/class /// </summary> - /// <param name="className"></param> - /// <returns></returns> - string[] GetImplementors(string className); + /// <param name="entityOrClassName">The entity-name, the class name or full name, the imported class name.</param> + /// <returns>All implementors class names.</returns> + string[] GetImplementors(string entityOrClassName); /// <summary> /// Get a class name, using query language imports Modified: trunk/nhibernate/src/NHibernate/Hql/Ast/ANTLR/PolymorphicQuerySourceDetector.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Hql/Ast/ANTLR/PolymorphicQuerySourceDetector.cs 2011-05-09 22:21:23 UTC (rev 5806) +++ trunk/nhibernate/src/NHibernate/Hql/Ast/ANTLR/PolymorphicQuerySourceDetector.cs 2011-05-10 16:57:24 UTC (rev 5807) @@ -20,34 +20,31 @@ _sessionFactoryHelper = new SessionFactoryHelper(sfi); } - public Dictionary<IASTNode, IASTNode[]> Process(IASTNode tree) - { - foreach (var querySource in new QuerySourceDetector(tree).LocateQuerySources()) - { - var className = GetClassName(querySource); - var classType = _sessionFactoryHelper.GetImportedClass(className); + public Dictionary<IASTNode, IASTNode[]> Process(IASTNode tree) + { + foreach (var querySource in new QuerySourceDetector(tree).LocateQuerySources()) + { + var className = GetClassName(querySource); + string[] implementors = _sfi.GetImplementors(className); + AddImplementorsToMap(querySource, className, implementors); + } - AddImplementorsToMap(querySource, classType == null ? className : classType.FullName); - } + return _map; + } - return _map; - } + private void AddImplementorsToMap(IASTNode querySource, string className, string[] implementors) + { + if (implementors.Length == 1 && implementors[0] == className) + { + // No need to change things + return; + } - private void AddImplementorsToMap(IASTNode querySource, string className) - { - var implementors = _sfi.GetImplementors(className); + _map.Add(querySource, + implementors.Select(implementor => MakeIdent(querySource, implementor)).ToArray()); + } - if (implementors.Length == 1 && implementors[0] == className) - { - // No need to change things - return; - } - - _map.Add(querySource, - implementors.Select(implementor => MakeIdent(querySource, implementor)).ToArray()); - } - - private static string GetClassName(IASTNode querySource) + private static string GetClassName(IASTNode querySource) { switch (querySource.Type) { Modified: trunk/nhibernate/src/NHibernate/Impl/SessionFactoryImpl.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/SessionFactoryImpl.cs 2011-05-09 22:21:23 UTC (rev 5806) +++ trunk/nhibernate/src/NHibernate/Impl/SessionFactoryImpl.cs 2011-05-10 16:57:24 UTC (rev 5807) @@ -588,22 +588,22 @@ /// given class or interface, accounting for implicit/explicit polymorphism settings /// and excluding mapped subclasses/joined-subclasses of other classes in the result. /// </summary> - public string[] GetImplementors(string className) + public string[] GetImplementors(string entityOrClassName) { System.Type clazz = null; // NH Different implementation for performance: a class without at least a namespace sure can't be found by reflection - if (className.IndexOf('.') > 0) + if (entityOrClassName.IndexOf('.') > 0) { IEntityPersister checkPersister; // NH Different implementation: we have better performance checking, first of all, if we know the class // and take the System.Type directly from the persister (className have high probability to be entityName) - if (entityPersisters.TryGetValue(className, out checkPersister)) + if (entityPersisters.TryGetValue(entityOrClassName, out checkPersister)) { if(!checkPersister.EntityMetamodel.HasPocoRepresentation) { // we found the persister but it is a dynamic entity without class - return new[] { className }; + return new[] { entityOrClassName }; } // NH : take care with this because we are forcing the Poco EntityMode clazz = checkPersister.GetMappedClass(EntityMode.Poco); @@ -613,7 +613,7 @@ { try { - clazz = ReflectHelper.ClassForFullNameOrNull(className); + clazz = ReflectHelper.ClassForFullNameOrNull(entityOrClassName); } catch (Exception) { @@ -624,29 +624,40 @@ if (clazz == null) { - return new[] {className}; //for a dynamic-class + // try to get the class from imported names + string importedName = GetImportedClassName(entityOrClassName); + if (importedName != null) + { + clazz = System.Type.GetType(importedName, false); + } } + if (clazz == null) + { + return new[] {entityOrClassName}; //for a dynamic-class + } + List<string> results = new List<string>(); foreach (IEntityPersister p in entityPersisters.Values) { IQueryable q = p as IQueryable; if (q != null) { - string testClassName = q.EntityName; - bool isMappedClass = className.Equals(testClassName); + string registeredEntityName = q.EntityName; + // NH: as entity-name we are using the FullName but in HQL we allow just the Name, the class is mapped even when its FullName match the entity-name + bool isMappedClass = entityOrClassName.Equals(registeredEntityName) || clazz.FullName.Equals(registeredEntityName); if (q.IsExplicitPolymorphism) { if (isMappedClass) { - return new string[] {testClassName}; // NOTE EARLY EXIT + return new string[] {registeredEntityName}; // NOTE EARLY EXIT } } else { if (isMappedClass) { - results.Add(testClassName); + results.Add(registeredEntityName); } else { @@ -665,7 +676,7 @@ } if (!assignableSuperclass) { - results.Add(testClassName); + results.Add(registeredEntityName); } } } Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2697/ArticleGroupItem.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2697/ArticleGroupItem.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2697/ArticleGroupItem.cs 2011-05-10 16:57:24 UTC (rev 5807) @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace NHibernate.Test.NHSpecificTest.NH2697 +{ + public class ArticleGroupItem + { + public virtual int Articlegroupid { get; set; } + public virtual string Name { get; set; } + } +} Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2697/ArticleItem.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2697/ArticleItem.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2697/ArticleItem.cs 2011-05-10 16:57:24 UTC (rev 5807) @@ -0,0 +1,15 @@ + + +using System; +namespace NHibernate.Test.NHSpecificTest.NH2697 + +{ + public class ArticleItem + { + public virtual int Articleid { get; set; } + public virtual Int16 IsFavorite { get; set; } + public virtual string Name { get; set; } + public virtual ArticleGroupItem Articlegroup { get; set; } + + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2697/Mappings.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2697/Mappings.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2697/Mappings.hbm.xml 2011-05-10 16:57:24 UTC (rev 5807) @@ -0,0 +1,36 @@ +<?xml version="1.0" encoding="utf-8" ?> + +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="NHibernate.Test" namespace="NHibernate.Test.NHSpecificTest.NH2697"> + + <class name="ArticleItem" table="ARTICLES" lazy="true" dynamic-update="true" + entity-name="Article" polymorphism="explicit"> + <id name="Articleid" column="ARTICLEID" type="int" unsaved-value="0"> + <generator class="native" > + <param name="sequence">gen_articles_id</param> + </generator> + </id> + <property name="IsFavorite" column="ISFAVORITE" type="short" not-null="true"/> + <many-to-one name="Articlegroup" column="ARTICLEGROUPID" class="ArticleGroupItem" cascade="none" not-null="false"/> + <property name="Name" column="NAME" type="string" length="200" not-null="false"/> + </class> + + <class name="ArticleItem" table="ACTIVITY_ARTICLES" lazy="true" dynamic-update="true" + entity-name="ActivityArticle" polymorphism="explicit"> + <id name="Articleid" column="ARTICLEID" type="int" unsaved-value="0"> + <generator class="native" > + <param name="sequence">gen_articles_id</param> + </generator> + </id> + <property name="Name" column="NAME" type="string" length="200" not-null="false"/> + </class> + + <class name="ArticleGroupItem" table="ARTICLEGROUPS" lazy="true" dynamic-update="true"> + <id name="Articlegroupid" column="ARTICLEGROUPID" type="int" unsaved-value="0"> + <generator class="native" > + <param name="sequence">gen_pk_ArticleGroups</param> + </generator> + </id> + <property name="Name" column="NAME" type="string" length="200" not-null="false"/> + </class> + +</hibernate-mapping> \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2697/SampleTest.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2697/SampleTest.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2697/SampleTest.cs 2011-05-10 16:57:24 UTC (rev 5807) @@ -0,0 +1,149 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Text; +using NHibernate.Dialect; +using NUnit.Framework; +using SharpTestsEx; + +namespace NHibernate.Test.NHSpecificTest.NH2697 +{ + [TestFixture] + public class SampleTest : BugTestCase + { + protected override void OnSetUp() + { + base.OnSetUp(); + using (ISession session = this.OpenSession()) { + ArticleGroupItem agrp_1 = new ArticleGroupItem(); + agrp_1.Name = "Article group 1"; + session.Save(agrp_1); + ArticleGroupItem agrp_2 = new ArticleGroupItem(); + agrp_2.Name = "Article group 2"; + session.Save(agrp_2); + session.Flush(); + + ArticleItem article_1 = new ArticleItem(); + article_1.Articlegroup = agrp_1; + article_1.Name = "Article 1 grp 1"; + article_1.IsFavorite = 0; + session.Save("Article", article_1); + + ArticleItem article_2 = new ArticleItem(); + article_2.Articlegroup = agrp_1; + article_2.Name = "Article 2 grp 1"; + article_2.IsFavorite = 1; + session.Save("Article", article_2); + + ArticleItem article_3 = new ArticleItem(); + article_3.Articlegroup = agrp_2; + article_3.Name = "Article 1 grp 2"; + article_3.IsFavorite = 0; + session.Save("Article", article_3); + + session.Flush(); + } + } + + protected override void OnTearDown() + { + base.OnTearDown(); + + + using (ISession session = this.OpenSession()) { + IList<ArticleItem> list = session.CreateCriteria("Article").List<ArticleItem>(); + foreach (ArticleItem item in list) + session.Delete("Article", item); + session.Flush(); + } + + //Articles where not removed (!?) + //using (ISession session = this.OpenSession()) { + // string hql = "from Article"; + // session.Delete(hql); + // session.Flush(); + //} + + using (ISession session = this.OpenSession()) { + string hql = "from ArticleGroupItem"; + session.Delete(hql); + session.Flush(); + } + + } + + [Test] + public void Can_GetListOfArticleGroups() + { + string HQL; + IList<ArticleGroupItem> result; + + //add new + using (ISession session = this.OpenSession()) { + ArticleGroupItem item = new ArticleGroupItem(); + item.Name = "Test article group"; + session.Save(item); + session.Flush(); + } + + HQL = "from ArticleGroupItem"; + using (ISession session = this.OpenSession()) { + result = session.CreateQuery(HQL).List<ArticleGroupItem>(); + } + result.Count.Should().Be.GreaterThan(0); + } + + [Test] + public void Can_GetListOfArticles() + { + string HQL; + IList<ArticleItem> result; + + //add new + using (ISession session = this.OpenSession()) { + ArticleItem item = new ArticleItem(); + item.Name = "Test article"; + item.IsFavorite = 0; + session.Save("Article", item); + session.Flush(); + } + + //here first problem, no entities are returned <======== + HQL = "from Article"; + using (ISession session = this.OpenSession()) { + result = session.CreateQuery(HQL).List<ArticleItem>(); + } + result.Count.Should().Be.GreaterThan(0); + } + + + + [Test] + public void Can_SetArticleFavoriteWithHQL_NamedParam() + { + string HQL; + IList<ArticleItem> result; + + Int16 isFavValue = 1; + + //set isFavorite for all articles + HQL = "update Article a set a.IsFavorite= :Fav"; + using (ISession session = this.OpenSession()) { + session.CreateQuery(HQL) + .SetInt16("Fav", isFavValue) //Exception !! + //.SetParameter("Fav", isFavValue) //Exception also !! + .ExecuteUpdate(); + + session.Flush(); + } + + //Check if some articles have isFavorite=1 + HQL = "from Article a where a.IsFavorite=1"; + using (ISession session = this.OpenSession()) { + result = session.CreateQuery(HQL).List<ArticleItem>(); + } + result.Count.Should().Be.GreaterThan(0); + + } + } +} Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-05-09 22:21:23 UTC (rev 5806) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-05-10 16:57:24 UTC (rev 5807) @@ -819,6 +819,9 @@ <Compile Include="NHSpecificTest\NH2660And2661\Test.cs" /> <Compile Include="NHSpecificTest\NH2673\Blog.cs" /> <Compile Include="NHSpecificTest\NH2673\CachingWithTrasformerTests.cs" /> + <Compile Include="NHSpecificTest\NH2697\ArticleGroupItem.cs" /> + <Compile Include="NHSpecificTest\NH2697\ArticleItem.cs" /> + <Compile Include="NHSpecificTest\NH2697\SampleTest.cs" /> <Compile Include="NHSpecificTest\Properties\CompositePropertyRefTest.cs" /> <Compile Include="NHSpecificTest\Properties\DynamicEntityTest.cs" /> <Compile Include="NHSpecificTest\Properties\Model.cs" /> @@ -2661,6 +2664,7 @@ <EmbeddedResource Include="NHSpecificTest\NH1291AnonExample\Mappings.hbm.xml" /> </ItemGroup> <ItemGroup> + <EmbeddedResource Include="NHSpecificTest\NH2697\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1642\Mappings.hbm.xml" /> <EmbeddedResource Include="Stateless\Contact.hbm.xml" /> <EmbeddedResource Include="Stateless\Fetching\Mappings.hbm.xml" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |