From: <aye...@us...> - 2010-01-06 22:33:08
|
Revision: 4913 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4913&view=rev Author: ayenderahien Date: 2010-01-06 22:32:59 +0000 (Wed, 06 Jan 2010) Log Message: ----------- NH1978 - NH will now generate proper aliases for legacy tables that starts with numbers NH-1248 - Subqueries.IsNull Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Criterion/Subqueries.cs trunk/nhibernate/src/NHibernate/Criterion/SubqueryExpression.cs trunk/nhibernate/src/NHibernate/NHibernate.csproj trunk/nhibernate/src/NHibernate/Util/StringHelper.cs trunk/nhibernate/src/NHibernate.Test/Criteria/CriteriaQueryTest.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate/Criterion/NullSubqueryExpression.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1978/ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1978/AliasTest.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1978/Employee.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1978/Mappings.hbm.xml trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1978/_401k.cs Added: trunk/nhibernate/src/NHibernate/Criterion/NullSubqueryExpression.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Criterion/NullSubqueryExpression.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Criterion/NullSubqueryExpression.cs 2010-01-06 22:32:59 UTC (rev 4913) @@ -0,0 +1,19 @@ +using System; +using NHibernate.SqlCommand; + +namespace NHibernate.Criterion +{ + [Serializable] + public class NullSubqueryExpression : SubqueryExpression + { + protected override SqlString ToLeftSqlString(ICriteria criteria, ICriteriaQuery outerQuery) + { + return SqlString.Empty; + } + + internal NullSubqueryExpression(String quantifier, DetachedCriteria dc) + : base(null, quantifier, dc, false) + { + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Criterion/Subqueries.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Criterion/Subqueries.cs 2010-01-06 22:11:57 UTC (rev 4912) +++ trunk/nhibernate/src/NHibernate/Criterion/Subqueries.cs 2010-01-06 22:32:59 UTC (rev 4913) @@ -318,5 +318,14 @@ return Subqueries.NotExists(detachedQuery.DetachedCriteria); } + public static AbstractCriterion IsNull(DetachedCriteria dc) + { + return new NullSubqueryExpression("IS NULL", dc); + } + + public static AbstractCriterion IsNotNull(DetachedCriteria dc) + { + return new NullSubqueryExpression("IS NOT NULL", dc); + } } } Modified: trunk/nhibernate/src/NHibernate/Criterion/SubqueryExpression.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Criterion/SubqueryExpression.cs 2010-01-06 22:11:57 UTC (rev 4912) +++ trunk/nhibernate/src/NHibernate/Criterion/SubqueryExpression.cs 2010-01-06 22:32:59 UTC (rev 4913) @@ -14,17 +14,25 @@ { private readonly CriteriaImpl criteriaImpl; private readonly String quantifier; - private readonly String op; + private readonly bool prefixOp; + private readonly String op; private QueryParameters parameters; private IType[] types; [NonSerialized] private CriteriaQueryTranslator innerQuery; - protected SubqueryExpression(String op, String quantifier, DetachedCriteria dc) + protected SubqueryExpression(String op, String quantifier, DetachedCriteria dc) + :this(op, quantifier, dc, true) + { + + } + + protected SubqueryExpression(String op, String quantifier, DetachedCriteria dc, bool prefixOp) { criteriaImpl = dc.GetCriteriaImpl(); this.quantifier = quantifier; - this.op = op; + this.prefixOp = prefixOp; + this.op = op; } public IType[] GetTypes() @@ -68,16 +76,27 @@ buf.Add(" ").Add(op).Add(" "); } - if (quantifier != null) + if (quantifier != null && prefixOp) { buf.Add(quantifier).Add(" "); } - return buf.Add("(").Add(sql).Add(")").ToSqlString(); + + buf.Add("(").Add(sql).Add(")"); + + if(quantifier!=null && prefixOp==false) + { + buf.Add(" ").Add(quantifier); + } + + return buf.ToSqlString(); } public override string ToString() { - return string.Format("{0} {1} ({2})", op, quantifier, criteriaImpl); + if(prefixOp) + return string.Format("{0} {1} ({2})", op, quantifier, criteriaImpl); + return string.Format("{0} ({1}) {2}", op, criteriaImpl, quantifier); + } public override TypedValue[] GetTypedValues(ICriteria criteria, ICriteriaQuery criteriaQuery) Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj =================================================================== --- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2010-01-06 22:11:57 UTC (rev 4912) +++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2010-01-06 22:32:59 UTC (rev 4913) @@ -579,6 +579,7 @@ <Compile Include="Criterion\Lambda\QueryOverRestrictionBuilder.cs" /> <Compile Include="Criterion\Lambda\QueryOverSubqueryBuilder.cs" /> <Compile Include="Criterion\Lambda\QueryOverSubqueryPropertyBuilder.cs" /> + <Compile Include="Criterion\NullSubqueryExpression.cs" /> <Compile Include="Criterion\ProjectionsExtensions.cs" /> <Compile Include="Dialect\MsSql2008Dialect.cs" /> <Compile Include="Dialect\InformixDialect0940.cs" /> Modified: trunk/nhibernate/src/NHibernate/Util/StringHelper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Util/StringHelper.cs 2010-01-06 22:11:57 UTC (rev 4912) +++ trunk/nhibernate/src/NHibernate/Util/StringHelper.cs 2010-01-06 22:32:59 UTC (rev 4913) @@ -620,10 +620,11 @@ { return result + "x"; //ick! } - else + if(char.IsLetter(result[0]) || '_' == result[0]) { return result; } + return "alias_" + result; } public static string MoveAndToBeginning(string filter) Modified: trunk/nhibernate/src/NHibernate.Test/Criteria/CriteriaQueryTest.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Criteria/CriteriaQueryTest.cs 2010-01-06 22:11:57 UTC (rev 4912) +++ trunk/nhibernate/src/NHibernate.Test/Criteria/CriteriaQueryTest.cs 2010-01-06 22:32:59 UTC (rev 4913) @@ -127,6 +127,33 @@ } } + [Test] + public void TestSubcriteriaBeingNull() + { + ISession session = OpenSession(); + ITransaction t = session.BeginTransaction(); + + Course hibernateCourse = new Course(); + hibernateCourse.CourseCode = "HIB"; + hibernateCourse.Description = "Hibernate Training"; + session.Save(hibernateCourse); + + DetachedCriteria subcriteria = DetachedCriteria.For<Enrolment>("e"); + subcriteria.Add(Expression.EqProperty("e.CourseCode", "c.CourseCode")); + subcriteria.SetProjection(Projections.Avg("Semester")); + + DetachedCriteria criteria = DetachedCriteria.For<Course>("c"); + criteria.SetProjection(Projections.Count("id")); + criteria.Add(Expression.Or(Subqueries.Le(5, subcriteria), Subqueries.IsNull(subcriteria))); + + object o = criteria.GetExecutableCriteria(session).UniqueResult(); + Assert.AreEqual(1, o); + + session.Delete(hibernateCourse); + t.Commit(); + session.Close(); + } + [Test] public void Subselect() { Property changes on: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1978 ___________________________________________________________________ Added: bugtraq:url + http://jira.nhibernate.org/browse/%BUGID% Added: bugtraq:logregex + NH-\d+ Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1978/AliasTest.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1978/AliasTest.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1978/AliasTest.cs 2010-01-06 22:32:59 UTC (rev 4913) @@ -0,0 +1,25 @@ +using NHibernate.Cfg; +using NUnit.Framework; + +namespace NHibernate.Test.NHSpecificTest.NH1978 +{ + [TestFixture] + public class AliasTest : BugTestCase + { + [Test] + public void ShouldReturnPlanFromEmployee() + { + using(var s = OpenSession()) + using (var trans = s.BeginTransaction()) + { + var plan = new _401k {PlanName = "test"}; + s.Save(plan); + s.Refresh(plan); + var emp = new Employee {EmpName = "name", PlanParent = plan}; + s.Save(emp); + + trans.Rollback(); + } + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1978/Employee.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1978/Employee.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1978/Employee.cs 2010-01-06 22:32:59 UTC (rev 4913) @@ -0,0 +1,12 @@ +namespace NHibernate.Test.NHSpecificTest.NH1978 +{ + /// <summary> + /// Category object for NHibernate mapped table 'Categories'. + /// </summary> + public class Employee + { + public virtual int ID { get; set; } + public virtual string EmpName { get; set; } + public virtual _401k PlanParent { get; set; } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1978/Mappings.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1978/Mappings.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1978/Mappings.hbm.xml 2010-01-06 22:32:59 UTC (rev 4913) @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping + namespace="NHibernate.Test.NHSpecificTest.NH1978" + assembly="NHibernate.Test" + xmlns="urn:nhibernate-mapping-2.2"> + <class name="Employee" lazy="true" table="Employee"> + <id name="ID" type="Int32" unsaved-value="0"> + <generator class="native" /> + </id> + <property name="EmpName" type="String"> + </property> + <many-to-one name="PlanParent" class="_401k" > + <column name="Plan401kID" sql-type="int" not-null="false" /> + </many-to-one> + </class> + <class name="_401k" lazy="true" table="[401k]"> + <id name="ID" type="Int32" unsaved-value="0"> + <generator class="native" /> + </id> + <property name="PlanName" type="String"> + </property> + <bag name="Employees" inverse="true" lazy="true" cascade="all-delete-orphan" > + <key column="Plan401kID" /> + <one-to-many class="Employee"/> + </bag> + </class> +</hibernate-mapping> Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1978/_401k.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1978/_401k.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1978/_401k.cs 2010-01-06 22:32:59 UTC (rev 4913) @@ -0,0 +1,14 @@ +using System.Collections.Generic; + +namespace NHibernate.Test.NHSpecificTest.NH1978 +{ + /// <summary> + /// Product object for NHibernate mapped table 'Products'. + /// </summary> + public class _401k + { + public virtual int ID { get; set; } + public virtual string PlanName { get; set; } + public virtual IList<Employee> Employees { get; set; } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-01-06 22:11:57 UTC (rev 4912) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-01-06 22:32:59 UTC (rev 4913) @@ -658,6 +658,9 @@ <Compile Include="NHSpecificTest\NH1938\Model.cs" /> <Compile Include="NHSpecificTest\NH1939\AuxType.cs" /> <Compile Include="NHSpecificTest\NH1939\Fixture.cs" /> + <Compile Include="NHSpecificTest\NH1978\AliasTest.cs" /> + <Compile Include="NHSpecificTest\NH1978\Employee.cs" /> + <Compile Include="NHSpecificTest\NH1978\_401k.cs" /> <Compile Include="NHSpecificTest\NH2044\DomainClass.cs" /> <Compile Include="NHSpecificTest\NH2044\SampleTest.cs" /> <Compile Include="NHSpecificTest\NH2055\AuxType.cs" /> @@ -2100,6 +2103,7 @@ <EmbeddedResource Include="CfgTest\Loquacious\EntityToCache.hbm.xml" /> <EmbeddedResource Include="DriverTest\SqlServerCeEntity.hbm.xml" /> <Content Include="DynamicEntity\package.html" /> + <EmbeddedResource Include="NHSpecificTest\NH1978\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2044\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2030\Mappings.hbm.xml" /> <EmbeddedResource Include="Linq\Mappings\Patient.hbm.xml" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |