From: <ste...@us...> - 2006-02-16 23:20:50
|
Update of /cvsroot/hibernate/Hibernate3/src/org/hibernate/engine/query In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv30877/src/org/hibernate/engine/query Modified Files: HQLQueryPlan.java Log Message: HHH-1411 & HHH-1412 : in-memory application of DISTINCT and firstRow/maxRows in conjunction with collection fetches Index: HQLQueryPlan.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate3/src/org/hibernate/engine/query/HQLQueryPlan.java,v retrieving revision 1.8 retrieving revision 1.9 diff -u -d -r1.8 -r1.9 --- HQLQueryPlan.java 16 Feb 2006 22:50:59 -0000 1.8 +++ HQLQueryPlan.java 16 Feb 2006 23:20:46 -0000 1.9 @@ -7,6 +7,7 @@ import org.hibernate.util.ArrayHelper; import org.hibernate.util.EmptyIterator; import org.hibernate.util.JoinedIterator; +import org.hibernate.util.IdentitySet; import org.hibernate.HibernateException; import org.hibernate.ScrollableResults; import org.hibernate.QueryException; @@ -149,7 +150,9 @@ log.trace( "find: " + getSourceQuery() ); queryParameters.traceParameters( session.getFactory() ); } - boolean needsLimit = translators.length > 1 && queryParameters.getRowSelection().definesLimits(); + boolean hasLimit = queryParameters.getRowSelection() != null && + queryParameters.getRowSelection().definesLimits(); + boolean needsLimit = hasLimit && translators.length > 1; QueryParameters queryParametersToUse; if ( needsLimit ) { log.warn( "firstResult/maxResults specified on polymorphic query; applying in memory!" ); @@ -163,6 +166,7 @@ } List combinedResults = new ArrayList(); + IdentitySet distinction = new IdentitySet(); int includedCount = -1; translator_loop: for ( int i = 0; i < translators.length; i++ ) { List tmp = translators[i].list( session, queryParametersToUse ); @@ -177,7 +181,7 @@ final int size = tmp.size(); for ( int x = 0; x < size; x++ ) { final Object result = tmp.get( x ); - if ( combinedResults.contains( result ) ) { + if ( distinction.add( result ) ) { continue; } includedCount++; |