- AllGroupsCollector c3 = new AllGroupsCollector(GROUP_BY_FIELD);
- SecondPassGroupingCollector c2 = new SecondPassGroupingCollector(GROUP_BY_FIELD, topGroups, groupSort, withinGroupSort, limit, getScores, getMaxScores, fillFields);
- getSearcher().search(fullQuery, MultiCollector.wrap(c2, c3));
-
- TopGroups groupsResult = c2.getTopGroups(offset);
- groupsResult = new TopGroups(groupsResult, c3.getGroupCount());
-
- return groupsResult;
-
-
- //TODO when switched to Lucene 3.x which is included in hibernate 4.x
- // use TopDocCollector.topDocs(int start, int howMany);
- // since this method might be more memory save than our own implementation
- //
- // ALSO READ http://dev.e-taxonomy.eu/trac/ticket/3118 !!!
- //
-// TopDocs topDocs = hitCollector.topDocs();
-// ScoreDoc[] scoreDocs = topDocs.scoreDocs;
-
-// int docsAvailableInPage = Math.min(scoreDocs.length - offset, pageSize);
-// logger.debug("docsAvailableInPage:" + docsAvailableInPage);
-//
-// ScoreDoc[] pagedDocs = new ScoreDoc[docsAvailableInPage];
-// for(int i = 0; i < docsAvailableInPage; i++){
-// pagedDocs[i] = scoreDocs[offset + i];
-// }
-// TopDocs pagedTopDocs = new TopDocs(topDocs.totalHits, pagedDocs, topDocs.getMaxScore());
- //
- /////////////////////////////////////////////
-
-// return pagedTopDocs;
+ TermAllGroupsCollector allGroupsCollector = new TermAllGroupsCollector(groupByField);
+ TermSecondPassGroupingCollector secondPassCollector = new TermSecondPassGroupingCollector(
+ groupByField, topGroups, groupSort, withinGroupSort, maxDocsPerGroup , getScores,
+ getMaxScores, fillFields
+ );
+ getSearcher().search(fullQuery, filter, MultiCollector.wrap(secondPassCollector, allGroupsCollector));
+
+ TopGroups<BytesRef> groupsResult = secondPassCollector.getTopGroups(0); // no offset here since we need the first item for the max score
+
+ // get max score from very first result
+ float maxScore = groupsResult.groups[0].maxScore;
+ if(logger.isDebugEnabled()){
+ logger.debug("TopGroups: maxScore=" + maxScore + ", offset=" + offset +
+ ", totalGroupCount=" + allGroupsCollector.getGroupCount() +
+ ", totalGroupedHitCount=" + groupsResult.totalGroupedHitCount);
+ }
+ TopGroupsWithMaxScore topGroupsWithMaxScore = new TopGroupsWithMaxScore(groupsResult,
+ offset, allGroupsCollector.getGroupCount(), maxScore);
+
+ return topGroupsWithMaxScore;