Fixed Ucum Conversion NullPointerException issue (#2331)
* Fixed Ucum Conversion NullPointerException issue * Revoke:save value to the original table if it can't be normalized
This commit is contained in:
parent
8c5b54bf54
commit
1d835d82d6
|
@ -566,7 +566,7 @@ public class FhirResourceDaoR4CreateTest extends BaseJpaR4Test {
|
|||
|
||||
assertTrue(myObservationDao.create(obs).getCreated());
|
||||
|
||||
// Original value should be in Quantity index, normalized should be in normalized table
|
||||
// The Quantity can't be normalized, it should be stored in the non normalized quantity table only
|
||||
runInTransaction(() -> {
|
||||
List<ResourceIndexedSearchParamQuantity> quantityIndexes = myResourceIndexedSearchParamQuantityDao.findAll().stream().filter(t -> t.getParamName().equals("value-quantity")).collect(Collectors.toList());
|
||||
assertEquals(1, quantityIndexes.size());
|
||||
|
|
|
@ -158,6 +158,7 @@ import ca.uhn.fhir.jpa.entity.Search;
|
|||
import ca.uhn.fhir.jpa.model.entity.ResourceHistoryTable;
|
||||
import ca.uhn.fhir.jpa.model.util.JpaConstants;
|
||||
import ca.uhn.fhir.jpa.search.SearchCoordinatorSvcImpl;
|
||||
import ca.uhn.fhir.jpa.util.SqlQuery;
|
||||
import ca.uhn.fhir.model.api.TemporalPrecisionEnum;
|
||||
import ca.uhn.fhir.model.primitive.InstantDt;
|
||||
import ca.uhn.fhir.model.primitive.UriDt;
|
||||
|
@ -4238,6 +4239,70 @@ public class ResourceProviderR4Test extends BaseResourceProviderR4Test {
|
|||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void testSearchWithNormalizedQuantitySearchSupported_DegreeFahrenheit() throws Exception {
|
||||
|
||||
myDaoConfig.getModelConfig().setNormalizedQuantitySearchLevel(NormalizedQuantitySearchLevel.NORMALIZED_QUANTITY_SEARCH_SUPPORTED);
|
||||
IIdType pid0;
|
||||
{
|
||||
Patient patient = new Patient();
|
||||
patient.addIdentifier().setSystem("urn:system").setValue("001");
|
||||
patient.addName().setFamily("Tester").addGiven("Joe");
|
||||
pid0 = myPatientDao.create(patient, mySrd).getId().toUnqualifiedVersionless();
|
||||
}
|
||||
|
||||
{
|
||||
Observation obs = new Observation();
|
||||
obs.addIdentifier().setSystem("urn:system").setValue("FOO");
|
||||
obs.getSubject().setReferenceElement(pid0);
|
||||
obs.setValue(new Quantity().setValueElement(new DecimalType(99.82)).setUnit("F").setSystem(UcumServiceUtil.UCUM_CODESYSTEM_URL).setCode("[degF]"));
|
||||
|
||||
myObservationDao.create(obs, mySrd);
|
||||
|
||||
ourLog.info("Observation: \n" + myFhirCtx.newJsonParser().setPrettyPrint(true).encodeResourceToString(obs));
|
||||
}
|
||||
|
||||
{
|
||||
Observation obs = new Observation();
|
||||
obs.addIdentifier().setSystem("urn:system").setValue("FOO");
|
||||
obs.getSubject().setReferenceElement(pid0);
|
||||
obs.setValue(new Quantity().setValueElement(new DecimalType(97.6)).setUnit("F").setSystem(UcumServiceUtil.UCUM_CODESYSTEM_URL).setCode("[degF]"));
|
||||
|
||||
myObservationDao.create(obs, mySrd);
|
||||
|
||||
ourLog.info("Observation: \n" + myFhirCtx.newJsonParser().setPrettyPrint(true).encodeResourceToString(obs));
|
||||
}
|
||||
|
||||
{
|
||||
// missing value
|
||||
Observation obs = new Observation();
|
||||
obs.addIdentifier().setSystem("urn:system").setValue("FOO");
|
||||
obs.getSubject().setReferenceElement(pid0);
|
||||
CodeableConcept cc = obs.getCode();
|
||||
obs.setValue(new Quantity().setUnit("CM").setSystem("http://foo").setCode("cm"));
|
||||
|
||||
myObservationDao.create(obs, mySrd);
|
||||
|
||||
ourLog.info("Observation: \n" + myFhirCtx.newJsonParser().setPrettyPrint(true).encodeResourceToString(obs));
|
||||
}
|
||||
|
||||
myCaptureQueriesListener.clear();
|
||||
Bundle returnedBundle = myClient
|
||||
.search()
|
||||
.forResource(Observation.class)
|
||||
.where(Observation.VALUE_QUANTITY.withPrefix(ParamPrefixEnum.EQUAL).number("99.82").andUnits("http://unitsofmeasure.org", "[degF]"))
|
||||
.prettyPrint()
|
||||
.returnBundle(Bundle.class)
|
||||
.execute();
|
||||
|
||||
assertEquals(1, returnedBundle.getEntry().size());
|
||||
|
||||
//-- check only use original quantity table to search
|
||||
String searchSql = myCaptureQueriesListener.getSelectQueries().get(0).getSql(true,true);
|
||||
assertThat(searchSql, containsString("HFJ_SPIDX_QUANTITY t0"));
|
||||
assertThat(searchSql, not(containsString("HFJ_SPIDX_QUANTITY_NRML")));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSearchReusesNoParams() {
|
||||
List<IBaseResource> resources = new ArrayList<>();
|
||||
|
|
|
@ -93,6 +93,9 @@ public class UcumServiceUtil {
|
|||
try {
|
||||
Decimal theDecimal = new Decimal(theValue.toPlainString(), theValue.precision());
|
||||
theCanonicalPair = myUcumEssenceService.getCanonicalForm(new Pair(theDecimal, theCode));
|
||||
// For some reason code [degF], degree Fahrenheit, can't be converted. it returns value null.
|
||||
if (theCanonicalPair.getValue() == null)
|
||||
return null;
|
||||
} catch (UcumException e) {
|
||||
return null;
|
||||
}
|
||||
|
|
|
@ -4,6 +4,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
|
|||
|
||||
import java.math.BigDecimal;
|
||||
|
||||
import org.fhir.ucum.Pair;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
public class UcumServiceUtilTest {
|
||||
|
@ -52,4 +53,11 @@ public class UcumServiceUtilTest {
|
|||
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testUcumDegreeFahrenheit() {
|
||||
|
||||
assertEquals(null, UcumServiceUtil.getCanonicalForm(UcumServiceUtil.UCUM_CODESYSTEM_URL, new BigDecimal(99.82), "[degF]"));
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue