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