|
From: <fab...@us...> - 2009-05-11 06:39:59
|
Revision: 4276
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4276&view=rev
Author: fabiomaulo
Date: 2009-05-11 06:39:49 +0000 (Mon, 11 May 2009)
Log Message:
-----------
Fixed NH-1179
Possible breaking change:
now filters are working, as expected, even for many-to-one associations
Modified Paths:
--------------
trunk/nhibernate/releasenotes.txt
trunk/nhibernate/src/NHibernate/Engine/JoinSequence.cs
trunk/nhibernate/src/NHibernate/Loader/JoinWalker.cs
trunk/nhibernate/src/NHibernate/SqlCommand/ANSIJoinFragment.cs
trunk/nhibernate/src/NHibernate/SqlCommand/QueryJoinFragment.cs
trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1179/Fixture.cs
Modified: trunk/nhibernate/releasenotes.txt
===================================================================
--- trunk/nhibernate/releasenotes.txt 2009-05-10 14:55:50 UTC (rev 4275)
+++ trunk/nhibernate/releasenotes.txt 2009-05-11 06:39:49 UTC (rev 4276)
@@ -24,6 +24,7 @@
##### Breaking Changes #####
* see NH-1633 if you are using SQL native queries
* CriteriaUtil is gone. NHibernate.Transform.Transformers now returns predefined IResultTransformer.
+ * Now filters are working even with many-to-one association for Criteria and HQL (NH-1293, NH-1179)
Build 2.1.0.Alpha2 (rev4167)
========================
Modified: trunk/nhibernate/src/NHibernate/Engine/JoinSequence.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Engine/JoinSequence.cs 2009-05-10 14:55:50 UTC (rev 4275)
+++ trunk/nhibernate/src/NHibernate/Engine/JoinSequence.cs 2009-05-11 06:39:49 UTC (rev 4276)
@@ -166,31 +166,33 @@
string on = join.AssociationType.GetOnCondition(join.Alias, factory, enabledFilters);
string condition;
if (last != null &&
- IsManyToManyRoot(last) &&
- ((IQueryableCollection) last).ElementType == join.AssociationType)
+ IsManyToManyRoot(last) &&
+ ((IQueryableCollection)last).ElementType == join.AssociationType)
{
// the current join represents the join between a many-to-many association table
// and its "target" table. Here we need to apply any additional filters
// defined specifically on the many-to-many
- string manyToManyFilter = ((IQueryableCollection) last)
+ string manyToManyFilter = ((IQueryableCollection)last)
.GetManyToManyFilterFragment(join.Alias, enabledFilters);
condition = "".Equals(manyToManyFilter)
- ? on
- : "".Equals(on)
- ? manyToManyFilter
- : on + " and " + manyToManyFilter;
+ ? on
+ : "".Equals(on)
+ ? manyToManyFilter
+ : on + " and " + manyToManyFilter;
}
else
{
- condition = on;
+ // NH Different behavior : NH1179 and NH1293
+ // Apply filters in Many-To-One association
+ if (string.IsNullOrEmpty(on) && enabledFilters.Count > 0)
+ {
+ condition = join.Joinable.FilterFragment(join.Alias, enabledFilters);
+ }
+ else
+ {
+ condition = on;
+ }
}
- //Start NH1179 ************
- //if (string.IsNullOrEmpty(condition))
- //{
- // string filterCondition = join.Joinable.FilterFragment(join.Alias, enabledFilters);
- // joinFragment.HasFilterCondition = joinFragment.AddCondition(filterCondition);
- //}
- //End NH1179 ************
if (withClauseFragment != null)
{
Modified: trunk/nhibernate/src/NHibernate/Loader/JoinWalker.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Loader/JoinWalker.cs 2009-05-10 14:55:50 UTC (rev 4275)
+++ trunk/nhibernate/src/NHibernate/Loader/JoinWalker.cs 2009-05-11 06:39:49 UTC (rev 4276)
@@ -564,10 +564,20 @@
foreach (OuterJoinableAssociation oj in associations)
{
if (last != null && last.IsManyToManyWith(oj))
- oj.AddManyToManyJoin(outerjoin, (IQueryableCollection)last.Joinable);
+ {
+ oj.AddManyToManyJoin(outerjoin, (IQueryableCollection) last.Joinable);
+ }
else
+ {
oj.AddJoins(outerjoin);
-
+ // NH Different behavior : NH1179 and NH1293
+ // Apply filters in Many-To-One association
+ if (enabledFilters.Count > 0)
+ {
+ var manyToOneFilterFragment = oj.Joinable.FilterFragment(oj.RHSAlias, enabledFilters);
+ outerjoin.AddCondition(manyToOneFilterFragment);
+ }
+ }
last = oj;
}
Modified: trunk/nhibernate/src/NHibernate/SqlCommand/ANSIJoinFragment.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/SqlCommand/ANSIJoinFragment.cs 2009-05-10 14:55:50 UTC (rev 4275)
+++ trunk/nhibernate/src/NHibernate/SqlCommand/ANSIJoinFragment.cs 2009-05-11 06:39:49 UTC (rev 4276)
@@ -9,7 +9,7 @@
public class ANSIJoinFragment : JoinFragment
{
private SqlStringBuilder buffer = new SqlStringBuilder();
- private SqlStringBuilder conditions = new SqlStringBuilder();
+ private readonly SqlStringBuilder conditions = new SqlStringBuilder();
public override void AddJoin(string tableName, string alias, string[] fkColumns, string[] pkColumns, JoinType joinType)
{
@@ -86,12 +86,12 @@
public override bool AddCondition(string condition)
{
- throw new NotSupportedException();
+ return AddCondition(conditions, condition);
}
public override bool AddCondition(SqlString condition)
{
- throw new NotSupportedException();
+ return AddCondition(conditions, condition);
}
public override void AddFromFragmentString(SqlString fromFragmentString)
Modified: trunk/nhibernate/src/NHibernate/SqlCommand/QueryJoinFragment.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/SqlCommand/QueryJoinFragment.cs 2009-05-10 14:55:50 UTC (rev 4275)
+++ trunk/nhibernate/src/NHibernate/SqlCommand/QueryJoinFragment.cs 2009-05-11 06:39:49 UTC (rev 4276)
@@ -85,9 +85,10 @@
public override bool AddCondition(string condition)
{
//TODO: this seems hackish
+ var trimCondition = condition.Trim();
if (
- afterFrom.ToSqlString().ToString().IndexOf(condition.Trim()) < 0 &&
- afterWhere.ToSqlString().ToString().IndexOf(condition.Trim()) < 0)
+ afterFrom.ToSqlString().ToString().IndexOf(trimCondition) < 0 &&
+ afterWhere.ToSqlString().ToString().IndexOf(trimCondition) < 0)
{
if (!condition.StartsWith(" and "))
{
@@ -104,9 +105,10 @@
public override bool AddCondition(SqlString condition)
{
//TODO: this seems hackish
+ var trimCondition = condition.Trim().ToString();
if (
- afterFrom.ToString().IndexOf(condition.Trim().ToString()) < 0 &&
- afterWhere.ToString().IndexOf(condition.Trim().ToString()) < 0)
+ afterFrom.ToString().IndexOf(trimCondition) < 0 &&
+ afterWhere.ToString().IndexOf(trimCondition) < 0)
{
if (!condition.StartsWithCaseInsensitive(" and "))
{
Modified: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1179/Fixture.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1179/Fixture.cs 2009-05-10 14:55:50 UTC (rev 4275)
+++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1179/Fixture.cs 2009-05-11 06:39:49 UTC (rev 4276)
@@ -11,11 +11,9 @@
get { return "NH1179"; }
}
- [Test, Ignore("Not supported.")]
+ [Test]
public void ApplyFilterExplicitJoin()
{
- // Note: if we fix this we must fix it for Criteria too (NH-1293)
-
RelatedClass rc1 = new RelatedClass(1);
RelatedClass rc2 = new RelatedClass(2);
RelatedClass rc11 = new RelatedClass(1);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|