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