blob: 952e720af3019d825d8c8af2d29489927abadff9 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.solr.handler.component;
import org.apache.lucene.search.SortField;
import org.apache.solr.SolrTestCaseJ4;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.util.NamedList;
import org.apache.solr.response.SolrQueryResponse;
import org.apache.solr.search.SortSpec;
import org.junit.BeforeClass;
import org.junit.Test;
public class QueryComponentPartialResultsTest extends SolrTestCaseJ4 {
private static final String SORT_FIELD_NAME = "category";
private static final int shard1Size = 2;
private static final int shard2Size = 3;
private static int id = 0;
private static ShardRequest shardRequestWithPartialResults;
@BeforeClass
public static void setup() {
assumeWorkingMockito();
shardRequestWithPartialResults = createShardRequestWithPartialResults();
}
@Test
public void includesPartialShardResultWhenUsingImplicitScoreSort() {
SortSpec sortSpec = MockSortSpecBuilder.create()
.withIncludesNonScoreOrDocSortField(false)
.build();
testPartialResultsForSortSpec(sortSpec, true);
}
@Test
public void includesPartialShardResultWhenUsingExplicitScoreSort() {
SortSpec sortSpec = MockSortSpecBuilder.create()
.withSortFields(new SortField[]{SortField.FIELD_SCORE})
.withIncludesNonScoreOrDocSortField(false)
.build();
testPartialResultsForSortSpec(sortSpec, true);
}
@Test
public void includesPartialShardResultWhenUsingExplicitDocSort() {
SortSpec sortSpec = MockSortSpecBuilder.create()
.withSortFields(new SortField[]{SortField.FIELD_DOC})
.withIncludesNonScoreOrDocSortField(false)
.build();
testPartialResultsForSortSpec(sortSpec, true);
}
@Test
public void excludesPartialShardResultWhenUsingNonScoreOrDocSortField() {
SortField sortField = new SortField(SORT_FIELD_NAME, SortField.Type.INT);
SortSpec sortSpec = MockSortSpecBuilder.create()
.withSortFields(new SortField[]{sortField})
.withIncludesNonScoreOrDocSortField(true)
.build();
testPartialResultsForSortSpec(sortSpec, false);
}
private void testPartialResultsForSortSpec(SortSpec sortSpec, boolean shouldIncludePartialShardResult) {
MockResponseBuilder responseBuilder = MockResponseBuilder.create().withSortSpec(sortSpec);
QueryComponent queryComponent = new QueryComponent();
queryComponent.mergeIds(responseBuilder, shardRequestWithPartialResults);
// do we have the expected document count?
// if results are not merged for the partial results shard, then the total doc count will exclude them
if (shouldIncludePartialShardResult) {
assertEquals(shard1Size + shard2Size, responseBuilder.getResponseDocs().size());
} else {
assertEquals(shard2Size, responseBuilder.getResponseDocs().size());
}
}
private static ShardRequest createShardRequestWithPartialResults() {
final NamedList<Object> shard1ResponseHeader = new NamedList<>();
final NamedList<Object> shard2ResponseHeader = new NamedList<>();
// the results from shard1 are marked partial
shard1ResponseHeader.add(SolrQueryResponse.RESPONSE_HEADER_PARTIAL_RESULTS_KEY, Boolean.TRUE);
return MockShardRequest.create()
.withShardResponse(shard1ResponseHeader, createSolrDocumentList(shard1Size))
.withShardResponse(shard2ResponseHeader, createSolrDocumentList(shard2Size));
}
private static SolrDocumentList createSolrDocumentList(int size) {
SolrDocumentList solrDocuments = new SolrDocumentList();
for(int i = 0; i < size; i++) {
SolrDocument solrDocument = new SolrDocument();
solrDocument.addField("id", id++);
solrDocument.addField("score", (float)id);
solrDocument.addField(SORT_FIELD_NAME, id);
solrDocuments.add(solrDocument);
}
return solrDocuments;
}
}