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++;
|