SOLR-14381: Grouping to use long instead of int for matches and ngroups to avoid overflows
diff --git a/solr/core/src/java/org/apache/solr/core/SolrCore.java b/solr/core/src/java/org/apache/solr/core/SolrCore.java
index 5cd3619..30bdba1 100644
--- a/solr/core/src/java/org/apache/solr/core/SolrCore.java
+++ b/solr/core/src/java/org/apache/solr/core/SolrCore.java
@@ -2561,6 +2561,9 @@
preDecorateResponse(req, rsp);
+ if (req.getOriginalParams().get("group") != null) {
+ System.out.println("hello: "+req);
+ }
/*
* Keeping this usage of isDebugEnabled because the extraction of the log data as a string might be slow. TODO:
* Determine how likely it is that something is going to go wrong that will prevent the logging at INFO further
diff --git a/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java b/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java
index 5da1fac..9d4b09a 100644
--- a/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java
+++ b/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java
@@ -63,6 +63,7 @@
import org.apache.solr.common.util.NamedList;
import org.apache.solr.common.util.SimpleOrderedMap;
import org.apache.solr.common.util.StrUtils;
+import org.apache.solr.common.util.Utils;
import org.apache.solr.request.SolrQueryRequest;
import org.apache.solr.response.BasicResultContext;
import org.apache.solr.response.ResultContext;
@@ -1320,7 +1321,7 @@
SearchGroupsResultTransformer serializer = new SearchGroupsResultTransformer(searcher);
rsp.add("firstPhase", commandHandler.processResult(result, serializer));
- rsp.add("totalHitCount", commandHandler.getTotalHitCount());
+ rsp.add("totalHitCount", Utils.intIfNotOverflown(commandHandler.getTotalHitCount()));
rb.setResult(result);
}
diff --git a/solr/core/src/java/org/apache/solr/handler/component/ResponseBuilder.java b/solr/core/src/java/org/apache/solr/handler/component/ResponseBuilder.java
index 40af722..7eb0700 100644
--- a/solr/core/src/java/org/apache/solr/handler/component/ResponseBuilder.java
+++ b/solr/core/src/java/org/apache/solr/handler/component/ResponseBuilder.java
@@ -185,12 +185,12 @@
// Context fields for grouping
public final Map<String, Collection<SearchGroup<BytesRef>>> mergedSearchGroups = new HashMap<>();
- public final Map<String, Integer> mergedGroupCounts = new HashMap<>();
+ public final Map<String, Long> mergedGroupCounts = new HashMap<>();
public final Map<String, Map<SearchGroup<BytesRef>, Set<String>>> searchGroupToShards = new HashMap<>();
public final Map<String, TopGroups<BytesRef>> mergedTopGroups = new HashMap<>();
public final Map<String, QueryCommandResult> mergedQueryCommandResults = new HashMap<>();
public final Map<Object, SolrDocument> retrievedDocuments = new HashMap<>();
- public int totalHitCount; // Hit count used when distributed grouping is performed.
+ public long totalHitCount; // Hit count used when distributed grouping is performed.
// Used for timeAllowed parameter. First phase elapsed time is subtracted from the time allowed for the second phase.
public int firstPhaseElapsedTime;
diff --git a/solr/core/src/java/org/apache/solr/request/SimpleFacets.java b/solr/core/src/java/org/apache/solr/request/SimpleFacets.java
index b1acea0..1e1449d 100644
--- a/solr/core/src/java/org/apache/solr/request/SimpleFacets.java
+++ b/solr/core/src/java/org/apache/solr/request/SimpleFacets.java
@@ -343,7 +343,7 @@
.add(mainQueryFilter, Occur.FILTER)
.build();
searcher.search(filteredFacetQuery, collector);
- return collector.getGroupCount();
+ return (int) collector.getGroupCount();
}
enum FacetMethod {
diff --git a/solr/core/src/java/org/apache/solr/search/Grouping.java b/solr/core/src/java/org/apache/solr/search/Grouping.java
index 55e511c..942bd00 100644
--- a/solr/core/src/java/org/apache/solr/search/Grouping.java
+++ b/solr/core/src/java/org/apache/solr/search/Grouping.java
@@ -61,6 +61,7 @@
import org.apache.solr.common.SolrException.ErrorCode;
import org.apache.solr.common.util.NamedList;
import org.apache.solr.common.util.SimpleOrderedMap;
+import org.apache.solr.common.util.Utils;
import org.apache.solr.request.SolrQueryRequest;
import org.apache.solr.schema.FieldType;
import org.apache.solr.schema.SchemaField;
@@ -105,7 +106,7 @@
private Filter luceneFilter;
private NamedList grouped = new SimpleOrderedMap();
private Set<Integer> idSet = new LinkedHashSet<>(); // used for tracking unique docs when we need a doclist
- private int maxMatches; // max number of matches from any grouping command
+ private long maxMatches; // max number of matches from any grouping command
private float maxScore = Float.NaN; // max score seen in any doclist
private boolean signalCacheWarning = false;
private TimeLimitingCollector timeLimitingCollector;
@@ -573,7 +574,7 @@
*
* @return the number of matches for this <code>Command</code>
*/
- public abstract int getMatches();
+ public abstract long getMatches();
/**
* Returns the number of groups found for this <code>Command</code>.
@@ -581,7 +582,7 @@
*
* @return the number of groups found for this <code>Command</code>
*/
- protected Integer getNumberOfGroups() {
+ protected Long getNumberOfGroups() {
return null;
}
@@ -597,11 +598,11 @@
NamedList groupResult = new SimpleOrderedMap();
grouped.add(key, groupResult); // grouped={ key={
- int matches = getMatches();
- groupResult.add("matches", matches);
+ long matches = getMatches();
+ groupResult.add("matches", Utils.intIfNotOverflown(matches));
if (totalCount == TotalCount.grouped) {
- Integer totalNrOfGroups = getNumberOfGroups();
- groupResult.add("ngroups", totalNrOfGroups == null ? Integer.valueOf(0) : totalNrOfGroups);
+ Long totalNrOfGroups = getNumberOfGroups();
+ groupResult.add("ngroups", Utils.intIfNotOverflown(totalNrOfGroups == null ? Long.valueOf(0) : totalNrOfGroups));
}
maxMatches = Math.max(maxMatches, matches);
return groupResult;
@@ -827,7 +828,7 @@
}
@Override
- public int getMatches() {
+ public long getMatches() {
if (result == null && fallBackCollector == null) {
return 0;
}
@@ -836,8 +837,8 @@
}
@Override
- protected Integer getNumberOfGroups() {
- return allGroupsCollector == null ? null : allGroupsCollector.getGroupCount();
+ protected Long getNumberOfGroups() {
+ return allGroupsCollector == null ? null : (long) allGroupsCollector.getGroupCount();
}
}
@@ -901,7 +902,7 @@
}
@Override
- public int getMatches() {
+ public long getMatches() {
return collector.getMatches();
}
}
@@ -1022,7 +1023,7 @@
}
@Override
- public int getMatches() {
+ public long getMatches() {
if (result == null && fallBackCollector == null) {
return 0;
}
@@ -1031,8 +1032,8 @@
}
@Override
- protected Integer getNumberOfGroups() {
- return allGroupsCollector == null ? null : allGroupsCollector.getGroupCount();
+ protected Long getNumberOfGroups() {
+ return allGroupsCollector == null ? null : (long) allGroupsCollector.getGroupCount();
}
}
diff --git a/solr/core/src/java/org/apache/solr/search/grouping/CommandHandler.java b/solr/core/src/java/org/apache/solr/search/grouping/CommandHandler.java
index 8fe1a6b..c8516a6 100644
--- a/solr/core/src/java/org/apache/solr/search/grouping/CommandHandler.java
+++ b/solr/core/src/java/org/apache/solr/search/grouping/CommandHandler.java
@@ -122,7 +122,7 @@
private final boolean truncateGroups;
private final boolean includeHitCount;
private boolean partialResults = false;
- private int totalHitCount;
+ private long totalHitCount;
private DocSet docSet;
@@ -245,7 +245,7 @@
}
}
- public int getTotalHitCount() {
+ public long getTotalHitCount() {
return totalHitCount;
}
}
diff --git a/solr/core/src/java/org/apache/solr/search/grouping/distributed/command/QueryCommandResult.java b/solr/core/src/java/org/apache/solr/search/grouping/distributed/command/QueryCommandResult.java
index 391ecfa..5cf0d3a 100644
--- a/solr/core/src/java/org/apache/solr/search/grouping/distributed/command/QueryCommandResult.java
+++ b/solr/core/src/java/org/apache/solr/search/grouping/distributed/command/QueryCommandResult.java
@@ -24,10 +24,10 @@
public class QueryCommandResult {
private final TopDocs topDocs;
- private final int matches;
+ private final long matches;
private final float maxScore;
- public QueryCommandResult(TopDocs topDocs, int matches, float maxScore) {
+ public QueryCommandResult(TopDocs topDocs, long matches, float maxScore) {
this.topDocs = topDocs;
this.matches = matches;
this.maxScore = maxScore;
@@ -37,7 +37,7 @@
return topDocs;
}
- public int getMatches() {
+ public long getMatches() {
return matches;
}
diff --git a/solr/core/src/java/org/apache/solr/search/grouping/distributed/command/SearchGroupsFieldCommand.java b/solr/core/src/java/org/apache/solr/search/grouping/distributed/command/SearchGroupsFieldCommand.java
index 425a987..1d2e0c6 100644
--- a/solr/core/src/java/org/apache/solr/search/grouping/distributed/command/SearchGroupsFieldCommand.java
+++ b/solr/core/src/java/org/apache/solr/search/grouping/distributed/command/SearchGroupsFieldCommand.java
@@ -132,9 +132,9 @@
} else {
topGroups = Collections.emptyList();
}
- final Integer groupCount;
+ final Long groupCount;
if (allGroupsCollector != null) {
- groupCount = allGroupsCollector.getGroupCount();
+ groupCount = (long) allGroupsCollector.getGroupCount();
} else {
groupCount = null;
}
diff --git a/solr/core/src/java/org/apache/solr/search/grouping/distributed/command/SearchGroupsFieldCommandResult.java b/solr/core/src/java/org/apache/solr/search/grouping/distributed/command/SearchGroupsFieldCommandResult.java
index 8860383..5aa8676 100644
--- a/solr/core/src/java/org/apache/solr/search/grouping/distributed/command/SearchGroupsFieldCommandResult.java
+++ b/solr/core/src/java/org/apache/solr/search/grouping/distributed/command/SearchGroupsFieldCommandResult.java
@@ -26,15 +26,15 @@
*/
public class SearchGroupsFieldCommandResult {
- private final Integer groupCount;
+ private final Long groupCount;
private final Collection<SearchGroup<BytesRef>> searchGroups;
- public SearchGroupsFieldCommandResult(Integer groupCount, Collection<SearchGroup<BytesRef>> searchGroups) {
+ public SearchGroupsFieldCommandResult(Long groupCount, Collection<SearchGroup<BytesRef>> searchGroups) {
this.groupCount = groupCount;
this.searchGroups = searchGroups;
}
- public Integer getGroupCount() {
+ public Long getGroupCount() {
return groupCount;
}
diff --git a/solr/core/src/java/org/apache/solr/search/grouping/distributed/responseprocessor/SearchGroupShardResponseProcessor.java b/solr/core/src/java/org/apache/solr/search/grouping/distributed/responseprocessor/SearchGroupShardResponseProcessor.java
index 016da1d..42dc662 100644
--- a/solr/core/src/java/org/apache/solr/search/grouping/distributed/responseprocessor/SearchGroupShardResponseProcessor.java
+++ b/solr/core/src/java/org/apache/solr/search/grouping/distributed/responseprocessor/SearchGroupShardResponseProcessor.java
@@ -67,7 +67,7 @@
SearchGroupsResultTransformer serializer = new SearchGroupsResultTransformer(rb.req.getSearcher());
int maxElapsedTime = 0;
- int hitCountDuringFirstPhase = 0;
+ long hitCountDuringFirstPhase = 0;
NamedList<Object> shardInfo = null;
if (rb.req.getParams().getBool(ShardParams.SHARDS_INFO, false)) {
@@ -89,7 +89,7 @@
t.printStackTrace(new PrintWriter(trace));
nl.add("trace", trace.toString());
} else {
- nl.add("numFound", (Integer) srsp.getSolrResponse().getResponse().get("totalHitCount"));
+ nl.add("numFound", ((Number) srsp.getSolrResponse().getResponse().get("totalHitCount")).longValue());
}
if (srsp.getSolrResponse() != null) {
nl.add("time", srsp.getSolrResponse().getElapsedTime());
@@ -111,11 +111,11 @@
String field = entry.getKey();
final SearchGroupsFieldCommandResult firstPhaseCommandResult = result.get(field);
- final Integer groupCount = firstPhaseCommandResult.getGroupCount();
+ final Long groupCount = firstPhaseCommandResult.getGroupCount();
if (groupCount != null) {
- Integer existingGroupCount = rb.mergedGroupCounts.get(field);
+ Long existingGroupCount = rb.mergedGroupCounts.get(field);
// Assuming groups don't cross shard boundary...
- rb.mergedGroupCounts.put(field, existingGroupCount != null ? Integer.valueOf(existingGroupCount + groupCount) : groupCount);
+ rb.mergedGroupCounts.put(field, existingGroupCount != null ? Long.valueOf(existingGroupCount + groupCount) : groupCount);
}
final Collection<SearchGroup<BytesRef>> searchGroups = firstPhaseCommandResult.getSearchGroups();
@@ -134,7 +134,7 @@
shards.add(srsp.getShard());
}
}
- hitCountDuringFirstPhase += (Integer) srsp.getSolrResponse().getResponse().get("totalHitCount");
+ hitCountDuringFirstPhase += ((Number) srsp.getSolrResponse().getResponse().get("totalHitCount")).longValue();
}
rb.totalHitCount = hitCountDuringFirstPhase;
rb.firstPhaseElapsedTime = maxElapsedTime;
diff --git a/solr/core/src/java/org/apache/solr/search/grouping/distributed/shardresultserializer/SearchGroupsResultTransformer.java b/solr/core/src/java/org/apache/solr/search/grouping/distributed/shardresultserializer/SearchGroupsResultTransformer.java
index 425ca5b..6ca58ce 100644
--- a/solr/core/src/java/org/apache/solr/search/grouping/distributed/shardresultserializer/SearchGroupsResultTransformer.java
+++ b/solr/core/src/java/org/apache/solr/search/grouping/distributed/shardresultserializer/SearchGroupsResultTransformer.java
@@ -58,7 +58,7 @@
if (searchGroups != null) {
commandResult.add(TOP_GROUPS, serializeSearchGroup(searchGroups, fieldCommand));
}
- final Integer groupedCount = fieldCommandResult.getGroupCount();
+ final Long groupedCount = fieldCommandResult.getGroupCount();
if (groupedCount != null) {
commandResult.add(GROUP_COUNT, groupedCount);
}
@@ -111,7 +111,7 @@
}
}
- final Integer groupCount = (Integer) topGroupsAndGroupCount.get(GROUP_COUNT);
+ final Long groupCount = (Long) topGroupsAndGroupCount.get(GROUP_COUNT);
result.put(command.getKey(), new SearchGroupsFieldCommandResult(groupCount, searchGroups));
}
return result;
diff --git a/solr/core/src/java/org/apache/solr/search/grouping/distributed/shardresultserializer/TopGroupsResultTransformer.java b/solr/core/src/java/org/apache/solr/search/grouping/distributed/shardresultserializer/TopGroupsResultTransformer.java
index fb5bd32..6e6a693 100644
--- a/solr/core/src/java/org/apache/solr/search/grouping/distributed/shardresultserializer/TopGroupsResultTransformer.java
+++ b/solr/core/src/java/org/apache/solr/search/grouping/distributed/shardresultserializer/TopGroupsResultTransformer.java
@@ -36,6 +36,7 @@
import org.apache.lucene.util.BytesRef;
import org.apache.lucene.util.CharsRefBuilder;
import org.apache.solr.common.util.NamedList;
+import org.apache.solr.common.util.Utils;
import org.apache.solr.handler.component.ResponseBuilder;
import org.apache.solr.handler.component.ShardDoc;
import org.apache.solr.schema.FieldType;
@@ -95,10 +96,10 @@
for (Map.Entry<String, NamedList> entry : shardResponse) {
String key = entry.getKey();
NamedList commandResult = entry.getValue();
- Integer totalGroupedHitCount = (Integer) commandResult.get("totalGroupedHitCount");
+ Long totalGroupedHitCount = commandResult.get("totalGroupedHitCount")==null? null: ((Number) commandResult.get("totalGroupedHitCount")).longValue();
Number totalHits = (Number) commandResult.get("totalHits"); // previously Integer now Long
if (totalHits != null) {
- Integer matches = (Integer) commandResult.get("matches");
+ long matches = ((Number) commandResult.get("matches")).longValue();
Float maxScore = (Float) commandResult.get("maxScore");
if (maxScore == null) {
maxScore = Float.NaN;
@@ -117,7 +118,7 @@
continue;
}
- Integer totalHitCount = (Integer) commandResult.get("totalHitCount");
+ Long totalHitCount = ((Number) commandResult.get("totalHitCount")).longValue();
List<GroupDocs<BytesRef>> groupDocs = new ArrayList<>();
for (int i = 2; i < commandResult.size(); i++) {
@@ -184,10 +185,10 @@
protected NamedList serializeTopGroups(TopGroups<BytesRef> data, SchemaField groupField) throws IOException {
NamedList<Object> result = new NamedList<>();
- result.add("totalGroupedHitCount", data.totalGroupedHitCount);
- result.add("totalHitCount", data.totalHitCount);
+ result.add("totalGroupedHitCount", Utils.intIfNotOverflown(data.totalGroupedHitCount));
+ result.add("totalHitCount", Utils.intIfNotOverflown(data.totalHitCount));
if (data.totalGroupCount != null) {
- result.add("totalGroupCount", data.totalGroupCount);
+ result.add("totalGroupCount", Utils.intIfNotOverflown(data.totalGroupCount));
}
final IndexSchema schema = rb.req.getSearcher().getSchema();
@@ -239,9 +240,10 @@
return result;
}
+
protected NamedList serializeTopDocs(QueryCommandResult result) throws IOException {
NamedList<Object> queryResult = new NamedList<>();
- queryResult.add("matches", result.getMatches());
+ queryResult.add("matches", Utils.intIfNotOverflown(result.getMatches()));
TopDocs topDocs = result.getTopDocs();
assert topDocs.totalHits.relation == TotalHits.Relation.EQUAL_TO;
queryResult.add("totalHits", topDocs.totalHits.value);
diff --git a/solr/core/src/java/org/apache/solr/search/grouping/endresulttransformer/GroupedEndResultTransformer.java b/solr/core/src/java/org/apache/solr/search/grouping/endresulttransformer/GroupedEndResultTransformer.java
index 3ba3470..4fabcc1 100644
--- a/solr/core/src/java/org/apache/solr/search/grouping/endresulttransformer/GroupedEndResultTransformer.java
+++ b/solr/core/src/java/org/apache/solr/search/grouping/endresulttransformer/GroupedEndResultTransformer.java
@@ -34,6 +34,7 @@
import org.apache.solr.common.SolrException.ErrorCode;
import org.apache.solr.common.util.NamedList;
import org.apache.solr.common.util.SimpleOrderedMap;
+import org.apache.solr.common.util.Utils;
import org.apache.solr.handler.component.ResponseBuilder;
import org.apache.solr.schema.FieldType;
import org.apache.solr.schema.SchemaField;
@@ -62,10 +63,10 @@
@SuppressWarnings("unchecked")
TopGroups<BytesRef> topGroups = (TopGroups<BytesRef>) value;
NamedList<Object> command = new SimpleOrderedMap<>();
- command.add("matches", rb.totalHitCount);
- Integer totalGroupCount = rb.mergedGroupCounts.get(entry.getKey());
+ command.add("matches", Utils.intIfNotOverflown(rb.totalHitCount));
+ Long totalGroupCount = rb.mergedGroupCounts.get(entry.getKey());
if (totalGroupCount != null) {
- command.add("ngroups", totalGroupCount);
+ command.add("ngroups", Utils.intIfNotOverflown(totalGroupCount));
}
List<NamedList> groups = new ArrayList<>();
@@ -102,7 +103,7 @@
} else if (QueryCommandResult.class.isInstance(value)) {
QueryCommandResult queryCommandResult = (QueryCommandResult) value;
NamedList<Object> command = new SimpleOrderedMap<>();
- command.add("matches", queryCommandResult.getMatches());
+ command.add("matches", Utils.intIfNotOverflown(queryCommandResult.getMatches()));
SolrDocumentList docList = new SolrDocumentList();
TopDocs topDocs = queryCommandResult.getTopDocs();
assert topDocs.totalHits.relation == TotalHits.Relation.EQUAL_TO;
diff --git a/solr/core/src/java/org/apache/solr/search/grouping/endresulttransformer/SimpleEndResultTransformer.java b/solr/core/src/java/org/apache/solr/search/grouping/endresulttransformer/SimpleEndResultTransformer.java
index 0723136..af2f077 100644
--- a/solr/core/src/java/org/apache/solr/search/grouping/endresulttransformer/SimpleEndResultTransformer.java
+++ b/solr/core/src/java/org/apache/solr/search/grouping/endresulttransformer/SimpleEndResultTransformer.java
@@ -27,6 +27,7 @@
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.util.NamedList;
import org.apache.solr.common.util.SimpleOrderedMap;
+import org.apache.solr.common.util.Utils;
import org.apache.solr.handler.component.ResponseBuilder;
import org.apache.solr.search.grouping.distributed.command.QueryCommandResult;
@@ -44,9 +45,9 @@
@SuppressWarnings("unchecked")
TopGroups<BytesRef> topGroups = (TopGroups<BytesRef>) value;
NamedList<Object> command = new SimpleOrderedMap<>();
- command.add("matches", rb.totalHitCount);
+ command.add("matches", Utils.intIfNotOverflown(rb.totalHitCount));
if (topGroups.totalGroupCount != null) {
- command.add("ngroups", topGroups.totalGroupCount);
+ command.add("ngroups", Utils.intIfNotOverflown(topGroups.totalGroupCount));
}
SolrDocumentList docList = new SolrDocumentList();
docList.setStart(rb.getGroupingSpec().getGroupSortSpec().getOffset());
diff --git a/solr/core/src/test/org/apache/solr/TestDistributedGrouping.java b/solr/core/src/test/org/apache/solr/TestDistributedGrouping.java
index 7b759d0..08f7ac1 100644
--- a/solr/core/src/test/org/apache/solr/TestDistributedGrouping.java
+++ b/solr/core/src/test/org/apache/solr/TestDistributedGrouping.java
@@ -311,8 +311,8 @@
QueryResponse rsp = client.query(params);
NamedList nl = (NamedList<?>) rsp.getResponse().get("grouped");
nl = (NamedList<?>) nl.getVal(0);
- int matches = (Integer) nl.getVal(0);
- int groupCount = (Integer) nl.get("ngroups");
+ long matches = ((Number) nl.getVal(0)).longValue();
+ long groupCount = ((Number) nl.get("ngroups")).longValue();
assertEquals(100 * shardsArr.length, matches);
assertEquals(shardsArr.length, groupCount);
diff --git a/solr/core/src/test/org/apache/solr/TestGroupingSearch.java b/solr/core/src/test/org/apache/solr/TestGroupingSearch.java
index 35ef3c6..8591c7b 100644
--- a/solr/core/src/test/org/apache/solr/TestGroupingSearch.java
+++ b/solr/core/src/test/org/apache/solr/TestGroupingSearch.java
@@ -952,7 +952,7 @@
public static Object buildGroupedResult(IndexSchema schema, List<Grp> sortedGroups, int start, int rows, int group_offset, int group_limit, boolean includeNGroups) {
Map<String,Object> result = new LinkedHashMap<>();
- long matches = 0;
+ int matches = 0;
for (Grp grp : sortedGroups) {
matches += grp.docs.size();
}
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/response/GroupCommand.java b/solr/solrj/src/java/org/apache/solr/client/solrj/response/GroupCommand.java
index fd2bdb7..b80016e 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/response/GroupCommand.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/response/GroupCommand.java
@@ -45,8 +45,8 @@
private final String _name;
private final List<Group> _values = new ArrayList<>();
- private final int _matches;
- private final Integer _ngroups;
+ private final long _matches;
+ private final Long _ngroups;
/**
* Creates a GroupCommand instance
@@ -54,7 +54,7 @@
* @param name The name of this command
* @param matches The total number of documents found for this command
*/
- public GroupCommand(String name, int matches) {
+ public GroupCommand(String name, long matches) {
_name = name;
_matches = matches;
_ngroups = null;
@@ -67,7 +67,7 @@
* @param matches The total number of documents found for this command
* @param nGroups The total number of groups found for this command.
*/
- public GroupCommand(String name, int matches, int nGroups) {
+ public GroupCommand(String name, long matches, long nGroups) {
_name = name;
_matches = matches;
_ngroups = nGroups;
@@ -106,7 +106,7 @@
*
* @return the total number of documents found for this command.
*/
- public int getMatches() {
+ public long getMatches() {
return _matches;
}
@@ -117,8 +117,8 @@
*
* @return the total number of groups found for this command.
*/
- public Integer getNGroups() {
+ public Long getNGroups() {
return _ngroups;
}
-}
\ No newline at end of file
+}
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/response/QueryResponse.java b/solr/solrj/src/java/org/apache/solr/client/solrj/response/QueryResponse.java
index 92db560..e242356 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/response/QueryResponse.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/response/QueryResponse.java
@@ -266,11 +266,11 @@
}
if (oGroups != null) {
- Integer iMatches = (Integer) oMatches;
+ Long iMatches = oMatches==null? null: ((Number) oMatches).longValue();
ArrayList<Object> groupsArr = (ArrayList<Object>) oGroups;
GroupCommand groupedCommand;
if (oNGroups != null) {
- Integer iNGroups = (Integer) oNGroups;
+ Long iNGroups = oNGroups==null? null: ((Number) oNGroups).longValue();
groupedCommand = new GroupCommand(fieldName, iMatches, iNGroups);
} else {
groupedCommand = new GroupCommand(fieldName, iMatches);
@@ -286,10 +286,10 @@
_groupResponse.add(groupedCommand);
} else if (queryCommand != null) {
- Integer iMatches = (Integer) oMatches;
+ Long iMatches = oMatches==null? null: ((Number) oMatches).longValue();
GroupCommand groupCommand;
if (oNGroups != null) {
- Integer iNGroups = (Integer) oNGroups;
+ Long iNGroups = oMatches==null? null: ((Number) oNGroups).longValue();;
groupCommand = new GroupCommand(fieldName, iMatches, iNGroups);
} else {
groupCommand = new GroupCommand(fieldName, iMatches);
diff --git a/solr/solrj/src/java/org/apache/solr/common/util/Utils.java b/solr/solrj/src/java/org/apache/solr/common/util/Utils.java
index cbba1b7..3d1f18f 100644
--- a/solr/solrj/src/java/org/apache/solr/common/util/Utils.java
+++ b/solr/solrj/src/java/org/apache/solr/common/util/Utils.java
@@ -211,6 +211,18 @@
return writer;
}
+ /**
+ * Given long integer, return an integer or a long integer
+ * depending upon whether it overflows the integer range.
+ */
+ static public Number intIfNotOverflown(long n) {
+ if (((int) n) == n){
+ return Integer.valueOf((int)n);
+ } else {
+ return Long.valueOf(n);
+ }
+ }
+
private static class MapWriterJSONWriter extends JSONWriter {
public MapWriterJSONWriter(CharArr out, int indentSize) {