Ks 20210526 accurate total (#2677)

* begin with failing test

* fixed

* changelog
This commit is contained in:
Ken Stevens 2021-05-26 12:20:49 -04:00 committed by GitHub
parent cc734613a8
commit af44b9c7a0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 30 additions and 1 deletions

View File

@ -0,0 +1,5 @@
---
type: fix
issue: 2674
title: "When myDaoConfig.setDefaultTotalMode(SearchTotalModeEnum.ACCURATE) and there are zero search results on an _id search,
An Index Out of Bounds error was thrown. This has been corrected."

View File

@ -1072,7 +1072,7 @@ public class SearchCoordinatorSvcImpl implements ISearchCoordinatorSvc {
ourLog.trace("Performing count"); ourLog.trace("Performing count");
ISearchBuilder sb = newSearchBuilder(); ISearchBuilder sb = newSearchBuilder();
Iterator<Long> countIterator = sb.createCountQuery(myParams, mySearch.getUuid(), myRequest, myRequestPartitionId); Iterator<Long> countIterator = sb.createCountQuery(myParams, mySearch.getUuid(), myRequest, myRequestPartitionId);
Long count = countIterator.next(); Long count = countIterator.hasNext() ? countIterator.next() : 0;
ourLog.trace("Got count {}", count); ourLog.trace("Got count {}", count);
TransactionTemplate txTemplate = new TransactionTemplate(myManagedTxManager); TransactionTemplate txTemplate = new TransactionTemplate(myManagedTxManager);

View File

@ -253,6 +253,9 @@ public class SearchBuilder implements ISearchBuilder {
init(theParams, theSearchUuid, theRequestPartitionId); init(theParams, theSearchUuid, theRequestPartitionId);
ArrayList<SearchQueryExecutor> queries = createQuery(myParams, null, null, null, true, theRequest, null); ArrayList<SearchQueryExecutor> queries = createQuery(myParams, null, null, null, true, theRequest, null);
if (queries.isEmpty()) {
return Collections.emptyIterator();
}
try (SearchQueryExecutor queryExecutor = queries.get(0)) { try (SearchQueryExecutor queryExecutor = queries.get(0)) {
return Lists.newArrayList(queryExecutor.next()).iterator(); return Lists.newArrayList(queryExecutor.next()).iterator();
} }

View File

@ -4,6 +4,9 @@ import ca.uhn.fhir.jpa.api.config.DaoConfig;
import ca.uhn.fhir.jpa.search.SearchCoordinatorSvcImpl; import ca.uhn.fhir.jpa.search.SearchCoordinatorSvcImpl;
import ca.uhn.fhir.rest.api.SearchTotalModeEnum; import ca.uhn.fhir.rest.api.SearchTotalModeEnum;
import ca.uhn.fhir.rest.api.SummaryEnum; import ca.uhn.fhir.rest.api.SummaryEnum;
import ca.uhn.fhir.rest.gclient.ICriterion;
import ca.uhn.fhir.rest.gclient.StringClientParam;
import ca.uhn.fhir.rest.param.StringParam;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import org.hl7.fhir.r4.model.Bundle; import org.hl7.fhir.r4.model.Bundle;
import org.hl7.fhir.r4.model.Narrative; import org.hl7.fhir.r4.model.Narrative;
@ -109,6 +112,24 @@ public class ResourceProviderSummaryModeR4Test extends BaseResourceProviderR4Tes
assertEquals(10, outcome.getEntry().size()); assertEquals(10, outcome.getEntry().size());
} }
/**
* Test zero counts
*/
@Test
public void testSearchNoHitsWithTotalAccurateSpecifiedAsDefault() {
myDaoConfig.setDefaultTotalMode(SearchTotalModeEnum.ACCURATE);
Bundle outcome = myClient
.search()
.forResource(Patient.class)
.where(new StringClientParam(Patient.SP_RES_ID).matches().value("non-existent-id"))
.returnBundle(Bundle.class)
.execute();
assertEquals(new Integer(0), outcome.getTotalElement().getValue());
assertEquals(0, outcome.getEntry().size());
}
/** /**
* No summary mode - Should return the first page of results but not * No summary mode - Should return the first page of results but not
* have the total available yet * have the total available yet