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