Add path value to _id search parameter and other missing search param… (#6128)
* Add path value to _id search parameter and other missing search parameters to IAnyResource. * Adjust tests and remove now unnecessary addition of meta parameters which are now provided by IAnyResource * Revert unneeded change * _security param is not token but uri * Add tests for new defined resource-level standard parameters * Adjust test --------- Co-authored-by: juan.marchionatto <juan.marchionatto@smilecdr.com>
This commit is contained in:
parent
2c6b3e8305
commit
2275eba1a0
|
@ -20,29 +20,115 @@
|
||||||
package org.hl7.fhir.instance.model.api;
|
package org.hl7.fhir.instance.model.api;
|
||||||
|
|
||||||
import ca.uhn.fhir.model.api.annotation.SearchParamDefinition;
|
import ca.uhn.fhir.model.api.annotation.SearchParamDefinition;
|
||||||
|
import ca.uhn.fhir.rest.gclient.DateClientParam;
|
||||||
import ca.uhn.fhir.rest.gclient.TokenClientParam;
|
import ca.uhn.fhir.rest.gclient.TokenClientParam;
|
||||||
|
import ca.uhn.fhir.rest.gclient.UriClientParam;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An IBaseResource that has a FHIR version of DSTU3 or higher
|
* An IBaseResource that has a FHIR version of DSTU3 or higher
|
||||||
*/
|
*/
|
||||||
public interface IAnyResource extends IBaseResource {
|
public interface IAnyResource extends IBaseResource {
|
||||||
|
|
||||||
|
String SP_RES_ID = "_id";
|
||||||
/**
|
/**
|
||||||
* Search parameter constant for <b>_id</b>
|
* Search parameter constant for <b>_id</b>
|
||||||
*/
|
*/
|
||||||
@SearchParamDefinition(name = "_id", path = "", description = "The ID of the resource", type = "token")
|
@SearchParamDefinition(
|
||||||
String SP_RES_ID = "_id";
|
name = SP_RES_ID,
|
||||||
|
path = "Resource.id",
|
||||||
|
description = "The ID of the resource",
|
||||||
|
type = "token")
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* <b>Fluent Client</b> search parameter constant for <b>_id</b>
|
* <b>Fluent Client</b> search parameter constant for <b>_id</b>
|
||||||
* <p>
|
* <p>
|
||||||
* Description: <b>the _id of a resource</b><br>
|
* Description: <b>the _id of a resource</b><br>
|
||||||
* Type: <b>string</b><br>
|
* Type: <b>string</b><br>
|
||||||
* Path: <b>Resource._id</b><br>
|
* Path: <b>Resource.id</b><br>
|
||||||
* </p>
|
* </p>
|
||||||
*/
|
*/
|
||||||
TokenClientParam RES_ID = new TokenClientParam(IAnyResource.SP_RES_ID);
|
TokenClientParam RES_ID = new TokenClientParam(IAnyResource.SP_RES_ID);
|
||||||
|
|
||||||
|
String SP_RES_LAST_UPDATED = "_lastUpdated";
|
||||||
|
/**
|
||||||
|
* Search parameter constant for <b>_lastUpdated</b>
|
||||||
|
*/
|
||||||
|
@SearchParamDefinition(
|
||||||
|
name = SP_RES_LAST_UPDATED,
|
||||||
|
path = "Resource.meta.lastUpdated",
|
||||||
|
description = "The last updated date of the resource",
|
||||||
|
type = "date")
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <b>Fluent Client</b> search parameter constant for <b>_lastUpdated</b>
|
||||||
|
* <p>
|
||||||
|
* Description: <b>The last updated date of a resource</b><br>
|
||||||
|
* Type: <b>date</b><br>
|
||||||
|
* Path: <b>Resource.meta.lastUpdated</b><br>
|
||||||
|
* </p>
|
||||||
|
*/
|
||||||
|
DateClientParam RES_LAST_UPDATED = new DateClientParam(IAnyResource.SP_RES_LAST_UPDATED);
|
||||||
|
|
||||||
|
String SP_RES_TAG = "_tag";
|
||||||
|
/**
|
||||||
|
* Search parameter constant for <b>_tag</b>
|
||||||
|
*/
|
||||||
|
@SearchParamDefinition(
|
||||||
|
name = SP_RES_TAG,
|
||||||
|
path = "Resource.meta.tag",
|
||||||
|
description = "The tag of the resource",
|
||||||
|
type = "token")
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <b>Fluent Client</b> search parameter constant for <b>_tag</b>
|
||||||
|
* <p>
|
||||||
|
* Description: <b>The tag of a resource</b><br>
|
||||||
|
* Type: <b>token</b><br>
|
||||||
|
* Path: <b>Resource.meta.tag</b><br>
|
||||||
|
* </p>
|
||||||
|
*/
|
||||||
|
TokenClientParam RES_TAG = new TokenClientParam(IAnyResource.SP_RES_TAG);
|
||||||
|
|
||||||
|
String SP_RES_PROFILE = "_profile";
|
||||||
|
/**
|
||||||
|
* Search parameter constant for <b>_profile</b>
|
||||||
|
*/
|
||||||
|
@SearchParamDefinition(
|
||||||
|
name = SP_RES_PROFILE,
|
||||||
|
path = "Resource.meta.profile",
|
||||||
|
description = "The profile of the resource",
|
||||||
|
type = "uri")
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <b>Fluent Client</b> search parameter constant for <b>_profile</b>
|
||||||
|
* <p>
|
||||||
|
* Description: <b>The profile of a resource</b><br>
|
||||||
|
* Type: <b>uri</b><br>
|
||||||
|
* Path: <b>Resource.meta.profile</b><br>
|
||||||
|
* </p>
|
||||||
|
*/
|
||||||
|
UriClientParam RES_PROFILE = new UriClientParam(IAnyResource.SP_RES_PROFILE);
|
||||||
|
|
||||||
|
String SP_RES_SECURITY = "_security";
|
||||||
|
/**
|
||||||
|
* Search parameter constant for <b>_security</b>
|
||||||
|
*/
|
||||||
|
@SearchParamDefinition(
|
||||||
|
name = SP_RES_SECURITY,
|
||||||
|
path = "Resource.meta.security",
|
||||||
|
description = "The security of the resource",
|
||||||
|
type = "token")
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <b>Fluent Client</b> search parameter constant for <b>_security</b>
|
||||||
|
* <p>
|
||||||
|
* Description: <b>The security of a resource</b><br>
|
||||||
|
* Type: <b>token</b><br>
|
||||||
|
* Path: <b>Resource.meta.security</b><br>
|
||||||
|
* </p>
|
||||||
|
*/
|
||||||
|
TokenClientParam RES_SECURITY = new TokenClientParam(IAnyResource.SP_RES_SECURITY);
|
||||||
|
|
||||||
String getId();
|
String getId();
|
||||||
|
|
||||||
IIdType getIdElement();
|
IIdType getIdElement();
|
||||||
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
---
|
||||||
|
type: fix
|
||||||
|
issue: 6123
|
||||||
|
title: "`IAnyResource` `_id` search parameter was missing `path` property value, which resulted in extractor not
|
||||||
|
working when standard search parameters were instantiated from defined context. This has been fixed, and also
|
||||||
|
`_LastUpdated`, `_tag`, `_profile`, and `_security` parameter definitions were added to the class."
|
|
@ -0,0 +1,38 @@
|
||||||
|
package ca.uhn.fhir.jpa.searchparam.registry;
|
||||||
|
|
||||||
|
import ca.uhn.fhir.context.FhirContext;
|
||||||
|
import ca.uhn.fhir.context.RuntimeSearchParam;
|
||||||
|
import ca.uhn.fhir.rest.server.util.FhirContextSearchParamRegistry;
|
||||||
|
import org.junit.jupiter.params.ParameterizedTest;
|
||||||
|
import org.junit.jupiter.params.provider.CsvSource;
|
||||||
|
|
||||||
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
import static org.hl7.fhir.instance.model.api.IAnyResource.SP_RES_ID;
|
||||||
|
import static org.hl7.fhir.instance.model.api.IAnyResource.SP_RES_LAST_UPDATED;
|
||||||
|
import static org.hl7.fhir.instance.model.api.IAnyResource.SP_RES_PROFILE;
|
||||||
|
import static org.hl7.fhir.instance.model.api.IAnyResource.SP_RES_SECURITY;
|
||||||
|
import static org.hl7.fhir.instance.model.api.IAnyResource.SP_RES_TAG;
|
||||||
|
|
||||||
|
class FhirContextSearchParamRegistryTest {
|
||||||
|
|
||||||
|
private static final FhirContext ourFhirContext = FhirContext.forR4();
|
||||||
|
|
||||||
|
FhirContextSearchParamRegistry mySearchParamRegistry = new FhirContextSearchParamRegistry(ourFhirContext);
|
||||||
|
|
||||||
|
@ParameterizedTest
|
||||||
|
@CsvSource({
|
||||||
|
SP_RES_ID + ", Resource.id",
|
||||||
|
SP_RES_LAST_UPDATED + ", Resource.meta.lastUpdated",
|
||||||
|
SP_RES_TAG + ", Resource.meta.tag",
|
||||||
|
SP_RES_PROFILE + ", Resource.meta.profile",
|
||||||
|
SP_RES_SECURITY + ", Resource.meta.security"
|
||||||
|
})
|
||||||
|
void testResourceLevelSearchParamsAreRegistered(String theSearchParamName, String theSearchParamPath) {
|
||||||
|
RuntimeSearchParam sp = mySearchParamRegistry.getActiveSearchParam("Patient", theSearchParamName);
|
||||||
|
|
||||||
|
assertThat(sp)
|
||||||
|
.as("path is null for search parameter: '%s'", theSearchParamName)
|
||||||
|
.isNotNull().extracting("path").isEqualTo(theSearchParamPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -1,5 +1,6 @@
|
||||||
package ca.uhn.fhir.jpa.dao.dstu3;
|
package ca.uhn.fhir.jpa.dao.dstu3;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertFalse;
|
||||||
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||||
import ca.uhn.fhir.i18n.Msg;
|
import ca.uhn.fhir.i18n.Msg;
|
||||||
import ca.uhn.fhir.jpa.api.config.JpaStorageSettings;
|
import ca.uhn.fhir.jpa.api.config.JpaStorageSettings;
|
||||||
|
@ -9,6 +10,7 @@ import ca.uhn.fhir.jpa.searchparam.SearchParameterMap;
|
||||||
import ca.uhn.fhir.jpa.test.BaseJpaDstu3Test;
|
import ca.uhn.fhir.jpa.test.BaseJpaDstu3Test;
|
||||||
import ca.uhn.fhir.model.api.Include;
|
import ca.uhn.fhir.model.api.Include;
|
||||||
import ca.uhn.fhir.rest.api.server.IBundleProvider;
|
import ca.uhn.fhir.rest.api.server.IBundleProvider;
|
||||||
|
import ca.uhn.fhir.rest.api.server.SystemRequestDetails;
|
||||||
import ca.uhn.fhir.rest.param.DateParam;
|
import ca.uhn.fhir.rest.param.DateParam;
|
||||||
import ca.uhn.fhir.rest.param.NumberParam;
|
import ca.uhn.fhir.rest.param.NumberParam;
|
||||||
import ca.uhn.fhir.rest.param.ReferenceParam;
|
import ca.uhn.fhir.rest.param.ReferenceParam;
|
||||||
|
@ -17,6 +19,7 @@ import ca.uhn.fhir.rest.param.TokenParam;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.UnprocessableEntityException;
|
import ca.uhn.fhir.rest.server.exceptions.UnprocessableEntityException;
|
||||||
|
import ca.uhn.fhir.rest.server.servlet.ServletRequestDetails;
|
||||||
import ca.uhn.fhir.util.ClasspathUtil;
|
import ca.uhn.fhir.util.ClasspathUtil;
|
||||||
import org.hl7.fhir.dstu3.model.Appointment;
|
import org.hl7.fhir.dstu3.model.Appointment;
|
||||||
import org.hl7.fhir.dstu3.model.Appointment.AppointmentStatus;
|
import org.hl7.fhir.dstu3.model.Appointment.AppointmentStatus;
|
||||||
|
@ -192,7 +195,7 @@ public class FhirResourceDaoDstu3SearchCustomSearchParamTest extends BaseJpaDstu
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testCustomReferenceParameter() throws Exception {
|
public void testCustomReferenceParameter() {
|
||||||
SearchParameter sp = new SearchParameter();
|
SearchParameter sp = new SearchParameter();
|
||||||
sp.addBase("Patient");
|
sp.addBase("Patient");
|
||||||
sp.setCode("myDoctor");
|
sp.setCode("myDoctor");
|
||||||
|
@ -238,7 +241,7 @@ public class FhirResourceDaoDstu3SearchCustomSearchParamTest extends BaseJpaDstu
|
||||||
Patient p1 = new Patient();
|
Patient p1 = new Patient();
|
||||||
p1.setActive(true);
|
p1.setActive(true);
|
||||||
p1.addExtension().setUrl("http://acme.org/eyecolour").addExtension().setUrl("http://foo").setValue(new StringType("VAL"));
|
p1.addExtension().setUrl("http://acme.org/eyecolour").addExtension().setUrl("http://foo").setValue(new StringType("VAL"));
|
||||||
IIdType p1id = myPatientDao.create(p1).getId().toUnqualifiedVersionless();
|
myPatientDao.create(p1).getId().toUnqualifiedVersionless();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -253,7 +256,7 @@ public class FhirResourceDaoDstu3SearchCustomSearchParamTest extends BaseJpaDstu
|
||||||
attendingSp.setXpathUsage(org.hl7.fhir.dstu3.model.SearchParameter.XPathUsageType.NORMAL);
|
attendingSp.setXpathUsage(org.hl7.fhir.dstu3.model.SearchParameter.XPathUsageType.NORMAL);
|
||||||
attendingSp.setStatus(org.hl7.fhir.dstu3.model.Enumerations.PublicationStatus.ACTIVE);
|
attendingSp.setStatus(org.hl7.fhir.dstu3.model.Enumerations.PublicationStatus.ACTIVE);
|
||||||
attendingSp.getTarget().add(new CodeType("Practitioner"));
|
attendingSp.getTarget().add(new CodeType("Practitioner"));
|
||||||
IIdType spId = mySearchParameterDao.create(attendingSp, mySrd).getId().toUnqualifiedVersionless();
|
mySearchParameterDao.create(attendingSp, mySrd).getId().toUnqualifiedVersionless();
|
||||||
|
|
||||||
mySearchParamRegistry.forceRefresh();
|
mySearchParamRegistry.forceRefresh();
|
||||||
|
|
||||||
|
@ -417,7 +420,7 @@ public class FhirResourceDaoDstu3SearchCustomSearchParamTest extends BaseJpaDstu
|
||||||
Patient p2 = new Patient();
|
Patient p2 = new Patient();
|
||||||
p2.addName().setFamily("P2");
|
p2.addName().setFamily("P2");
|
||||||
p2.addExtension().setUrl("http://acme.org/sibling").setValue(new Reference(p1id));
|
p2.addExtension().setUrl("http://acme.org/sibling").setValue(new Reference(p1id));
|
||||||
IIdType p2id = myPatientDao.create(p2).getId().toUnqualifiedVersionless();
|
myPatientDao.create(p2).getId().toUnqualifiedVersionless();
|
||||||
|
|
||||||
SearchParameterMap map;
|
SearchParameterMap map;
|
||||||
IBundleProvider results;
|
IBundleProvider results;
|
||||||
|
@ -571,7 +574,7 @@ public class FhirResourceDaoDstu3SearchCustomSearchParamTest extends BaseJpaDstu
|
||||||
Patient p2 = new Patient();
|
Patient p2 = new Patient();
|
||||||
p2.setActive(true);
|
p2.setActive(true);
|
||||||
p2.addExtension().setUrl("http://acme.org/eyecolour").setValue(new CodeType("green"));
|
p2.addExtension().setUrl("http://acme.org/eyecolour").setValue(new CodeType("green"));
|
||||||
IIdType p2id = myPatientDao.create(p2).getId().toUnqualifiedVersionless();
|
myPatientDao.create(p2).getId().toUnqualifiedVersionless();
|
||||||
|
|
||||||
// Try with custom gender SP
|
// Try with custom gender SP
|
||||||
SearchParameterMap map = new SearchParameterMap();
|
SearchParameterMap map = new SearchParameterMap();
|
||||||
|
@ -889,7 +892,7 @@ public class FhirResourceDaoDstu3SearchCustomSearchParamTest extends BaseJpaDstu
|
||||||
.setUrl("http://acme.org/bar")
|
.setUrl("http://acme.org/bar")
|
||||||
.setValue(new Reference(aptId.getValue()));
|
.setValue(new Reference(aptId.getValue()));
|
||||||
|
|
||||||
IIdType p2id = myPatientDao.create(patient).getId().toUnqualifiedVersionless();
|
myPatientDao.create(patient).getId().toUnqualifiedVersionless();
|
||||||
|
|
||||||
SearchParameterMap map;
|
SearchParameterMap map;
|
||||||
IBundleProvider results;
|
IBundleProvider results;
|
||||||
|
@ -1035,7 +1038,7 @@ public class FhirResourceDaoDstu3SearchCustomSearchParamTest extends BaseJpaDstu
|
||||||
|
|
||||||
Patient pat2 = new Patient();
|
Patient pat2 = new Patient();
|
||||||
pat.setGender(AdministrativeGender.FEMALE);
|
pat.setGender(AdministrativeGender.FEMALE);
|
||||||
IIdType patId2 = myPatientDao.create(pat2, mySrd).getId().toUnqualifiedVersionless();
|
myPatientDao.create(pat2, mySrd).getId().toUnqualifiedVersionless();
|
||||||
|
|
||||||
SearchParameterMap map;
|
SearchParameterMap map;
|
||||||
IBundleProvider results;
|
IBundleProvider results;
|
||||||
|
@ -1069,7 +1072,7 @@ public class FhirResourceDaoDstu3SearchCustomSearchParamTest extends BaseJpaDstu
|
||||||
myPatientDao.search(map).size();
|
myPatientDao.search(map).size();
|
||||||
fail("");
|
fail("");
|
||||||
} catch (InvalidRequestException e) {
|
} catch (InvalidRequestException e) {
|
||||||
assertEquals(Msg.code(1223) + "Unknown search parameter \"foo\" for resource type \"Patient\". Valid search parameters for this search are: [_id, _lastUpdated, active, address, address-city, address-country, address-postalcode, address-state, address-use, animal-breed, animal-species, birthdate, death-date, deceased, email, family, gender, general-practitioner, given, identifier, language, link, name, organization, phone, phonetic, telecom]", e.getMessage());
|
assertEquals(Msg.code(1223) + "Unknown search parameter \"foo\" for resource type \"Patient\". Valid search parameters for this search are: [_id, _lastUpdated, _profile, _security, _tag, active, address, address-city, address-country, address-postalcode, address-state, address-use, animal-breed, animal-species, birthdate, death-date, deceased, email, family, gender, general-practitioner, given, identifier, language, link, name, organization, phone, phonetic, telecom]", e.getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1094,7 +1097,7 @@ public class FhirResourceDaoDstu3SearchCustomSearchParamTest extends BaseJpaDstu
|
||||||
|
|
||||||
Patient pat2 = new Patient();
|
Patient pat2 = new Patient();
|
||||||
pat.setGender(AdministrativeGender.FEMALE);
|
pat.setGender(AdministrativeGender.FEMALE);
|
||||||
IIdType patId2 = myPatientDao.create(pat2, mySrd).getId().toUnqualifiedVersionless();
|
myPatientDao.create(pat2, mySrd).getId().toUnqualifiedVersionless();
|
||||||
|
|
||||||
SearchParameterMap map;
|
SearchParameterMap map;
|
||||||
IBundleProvider results;
|
IBundleProvider results;
|
||||||
|
@ -1107,7 +1110,7 @@ public class FhirResourceDaoDstu3SearchCustomSearchParamTest extends BaseJpaDstu
|
||||||
myPatientDao.search(map).size();
|
myPatientDao.search(map).size();
|
||||||
fail("");
|
fail("");
|
||||||
} catch (InvalidRequestException e) {
|
} catch (InvalidRequestException e) {
|
||||||
assertEquals(Msg.code(1223) + "Unknown search parameter \"foo\" for resource type \"Patient\". Valid search parameters for this search are: [_id, _lastUpdated, active, address, address-city, address-country, address-postalcode, address-state, address-use, animal-breed, animal-species, birthdate, death-date, deceased, email, family, gender, general-practitioner, given, identifier, language, link, name, organization, phone, phonetic, telecom]", e.getMessage());
|
assertEquals(Msg.code(1223) + "Unknown search parameter \"foo\" for resource type \"Patient\". Valid search parameters for this search are: [_id, _lastUpdated, _profile, _security, _tag, active, address, address-city, address-country, address-postalcode, address-state, address-use, animal-breed, animal-species, birthdate, death-date, deceased, email, family, gender, general-practitioner, given, identifier, language, link, name, organization, phone, phonetic, telecom]", e.getMessage());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Try with normal gender SP
|
// Try with normal gender SP
|
||||||
|
@ -1148,10 +1151,10 @@ public class FhirResourceDaoDstu3SearchCustomSearchParamTest extends BaseJpaDstu
|
||||||
.findAll()
|
.findAll()
|
||||||
.stream()
|
.stream()
|
||||||
.filter(t -> t.getParamName().equals("medicationadministration-ingredient-medication"))
|
.filter(t -> t.getParamName().equals("medicationadministration-ingredient-medication"))
|
||||||
.collect(Collectors.toList());
|
.toList();
|
||||||
ourLog.info("Tokens:\n * {}", tokens.stream().map(t -> t.toString()).collect(Collectors.joining("\n * ")));
|
ourLog.info("Tokens:\n * {}", tokens.stream().map(ResourceIndexedSearchParamToken::toString).collect(Collectors.joining("\n * ")));
|
||||||
assertEquals(1, tokens.size(), tokens.toString());
|
assertEquals(1, tokens.size(), tokens.toString());
|
||||||
assertEquals(false, tokens.get(0).isMissing());
|
assertFalse(tokens.get(0).isMissing());
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,8 @@
|
||||||
package ca.uhn.fhir.jpa.dao.dstu3;
|
package ca.uhn.fhir.jpa.dao.dstu3;
|
||||||
|
|
||||||
|
import static org.hl7.fhir.instance.model.api.IAnyResource.SP_RES_PROFILE;
|
||||||
|
import static org.hl7.fhir.instance.model.api.IAnyResource.SP_RES_SECURITY;
|
||||||
|
import static org.hl7.fhir.instance.model.api.IAnyResource.SP_RES_TAG;
|
||||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||||
import static org.junit.jupiter.api.Assertions.assertNull;
|
import static org.junit.jupiter.api.Assertions.assertNull;
|
||||||
|
@ -33,6 +36,7 @@ import ca.uhn.fhir.rest.api.MethodOutcome;
|
||||||
import ca.uhn.fhir.rest.api.SortOrderEnum;
|
import ca.uhn.fhir.rest.api.SortOrderEnum;
|
||||||
import ca.uhn.fhir.rest.api.SortSpec;
|
import ca.uhn.fhir.rest.api.SortSpec;
|
||||||
import ca.uhn.fhir.rest.api.server.IBundleProvider;
|
import ca.uhn.fhir.rest.api.server.IBundleProvider;
|
||||||
|
import ca.uhn.fhir.rest.api.server.SystemRequestDetails;
|
||||||
import ca.uhn.fhir.rest.api.server.storage.IResourcePersistentId;
|
import ca.uhn.fhir.rest.api.server.storage.IResourcePersistentId;
|
||||||
import ca.uhn.fhir.rest.param.DateParam;
|
import ca.uhn.fhir.rest.param.DateParam;
|
||||||
import ca.uhn.fhir.rest.param.DateRangeParam;
|
import ca.uhn.fhir.rest.param.DateRangeParam;
|
||||||
|
@ -42,6 +46,7 @@ import ca.uhn.fhir.rest.param.ReferenceParam;
|
||||||
import ca.uhn.fhir.rest.param.StringParam;
|
import ca.uhn.fhir.rest.param.StringParam;
|
||||||
import ca.uhn.fhir.rest.param.TokenOrListParam;
|
import ca.uhn.fhir.rest.param.TokenOrListParam;
|
||||||
import ca.uhn.fhir.rest.param.TokenParam;
|
import ca.uhn.fhir.rest.param.TokenParam;
|
||||||
|
import ca.uhn.fhir.rest.param.UriParam;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.ResourceGoneException;
|
import ca.uhn.fhir.rest.server.exceptions.ResourceGoneException;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.ResourceNotFoundException;
|
import ca.uhn.fhir.rest.server.exceptions.ResourceNotFoundException;
|
||||||
|
@ -2082,7 +2087,102 @@ public class FhirResourceDaoDstu3Test extends BaseJpaDstu3Test {
|
||||||
found = toList(myPatientDao.search(new SearchParameterMap(Patient.SP_BIRTHDATE + "AAAA", new DateParam(ParamPrefixEnum.GREATERTHAN, "2000-01-01")).setLoadSynchronous(true)));
|
found = toList(myPatientDao.search(new SearchParameterMap(Patient.SP_BIRTHDATE + "AAAA", new DateParam(ParamPrefixEnum.GREATERTHAN, "2000-01-01")).setLoadSynchronous(true)));
|
||||||
assertThat(found).isEmpty();
|
assertThat(found).isEmpty();
|
||||||
} catch (InvalidRequestException e) {
|
} catch (InvalidRequestException e) {
|
||||||
assertEquals(Msg.code(1223) + "Unknown search parameter \"birthdateAAAA\" for resource type \"Patient\". Valid search parameters for this search are: [_id, _lastUpdated, active, address, address-city, address-country, address-postalcode, address-state, address-use, animal-breed, animal-species, birthdate, death-date, deceased, email, family, gender, general-practitioner, given, identifier, language, link, name, organization, phone, phonetic, telecom]", e.getMessage());
|
assertEquals(Msg.code(1223) + "Unknown search parameter \"birthdateAAAA\" for resource type \"Patient\". Valid search parameters for this search are: [_id, _lastUpdated, _profile, _security, _tag, active, address, address-city, address-country, address-postalcode, address-state, address-use, animal-breed, animal-species, birthdate, death-date, deceased, email, family, gender, general-practitioner, given, identifier, language, link, name, organization, phone, phonetic, telecom]", e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testPersistSearchParamTag() {
|
||||||
|
Coding TEST_PARAM_VALUE_CODING_1 = new Coding("test-system", "test-code-1", null);
|
||||||
|
Coding TEST_PARAM_VALUE_CODING_2 = new Coding("test-system", "test-code-2", null);
|
||||||
|
|
||||||
|
List<Patient> found = toList(myPatientDao.search(new SearchParameterMap(SP_RES_TAG, new TokenParam(TEST_PARAM_VALUE_CODING_1)).setLoadSynchronous(true), new SystemRequestDetails()));
|
||||||
|
int initialSizeCoding1 = found.size();
|
||||||
|
|
||||||
|
found = toList(myPatientDao.search(new SearchParameterMap(SP_RES_TAG, new TokenParam(TEST_PARAM_VALUE_CODING_2)).setLoadSynchronous(true), new SystemRequestDetails()));
|
||||||
|
int initialSizeCoding2 = found.size();
|
||||||
|
|
||||||
|
Patient patient = new Patient();
|
||||||
|
patient.addIdentifier().setSystem("urn:system").setValue("001");
|
||||||
|
patient.getMeta().addTag(TEST_PARAM_VALUE_CODING_1);
|
||||||
|
|
||||||
|
myPatientDao.create(patient, mySrd);
|
||||||
|
|
||||||
|
found = toList(myPatientDao.search(new SearchParameterMap(SP_RES_TAG, new TokenParam(TEST_PARAM_VALUE_CODING_1)).setLoadSynchronous(true), new SystemRequestDetails()));
|
||||||
|
assertThat(found).hasSize(1 + initialSizeCoding1);
|
||||||
|
|
||||||
|
found = toList(myPatientDao.search(new SearchParameterMap(SP_RES_TAG, new TokenParam(TEST_PARAM_VALUE_CODING_2)).setLoadSynchronous(true), new SystemRequestDetails()));
|
||||||
|
assertThat(found).hasSize(initialSizeCoding2);
|
||||||
|
|
||||||
|
// If this throws an exception, that would be an acceptable outcome as well..
|
||||||
|
try {
|
||||||
|
found = toList(myPatientDao.search(new SearchParameterMap(SP_RES_TAG + "AAAA", new TokenParam(TEST_PARAM_VALUE_CODING_1)).setLoadSynchronous(true), new SystemRequestDetails()));
|
||||||
|
assertThat(found).isEmpty();
|
||||||
|
} catch (InvalidRequestException e) {
|
||||||
|
assertEquals(Msg.code(1223) + "Unknown search parameter \"" + SP_RES_TAG+"AAAA" + "\" for resource type \"Patient\". Valid search parameters for this search are: [_id, _lastUpdated, _profile, _security, _tag, active, address, address-city, address-country, address-postalcode, address-state, address-use, animal-breed, animal-species, birthdate, death-date, deceased, email, family, gender, general-practitioner, given, identifier, language, link, name, organization, phone, phonetic, telecom]", e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testPersistSearchParamProfile() {
|
||||||
|
String profileA = "profile-AAA";
|
||||||
|
String profileB = "profile-BBB";
|
||||||
|
List<Patient> found = toList(myPatientDao.search(new SearchParameterMap(SP_RES_PROFILE, new UriParam(profileA)).setLoadSynchronous(true), new SystemRequestDetails()));
|
||||||
|
int initialSizeProfileA = found.size();
|
||||||
|
|
||||||
|
found = toList(myPatientDao.search(new SearchParameterMap(SP_RES_PROFILE, new UriParam(profileB)).setLoadSynchronous(true), new SystemRequestDetails()));
|
||||||
|
int initialSizeProfileB = found.size();
|
||||||
|
|
||||||
|
Patient patient = new Patient();
|
||||||
|
patient.addIdentifier().setSystem("urn:system").setValue("001");
|
||||||
|
patient.getMeta().addProfile(profileA);
|
||||||
|
|
||||||
|
myPatientDao.create(patient, mySrd);
|
||||||
|
|
||||||
|
found = toList(myPatientDao.search(new SearchParameterMap(SP_RES_PROFILE, new UriParam(profileA)).setLoadSynchronous(true), new SystemRequestDetails()));
|
||||||
|
assertThat(found).hasSize(1 + initialSizeProfileA);
|
||||||
|
|
||||||
|
found = toList(myPatientDao.search(new SearchParameterMap(SP_RES_PROFILE, new UriParam(profileB)).setLoadSynchronous(true), new SystemRequestDetails()));
|
||||||
|
assertThat(found).hasSize(initialSizeProfileB);
|
||||||
|
|
||||||
|
// If this throws an exception, that would be an acceptable outcome as well..
|
||||||
|
try {
|
||||||
|
found = toList(myPatientDao.search(new SearchParameterMap(SP_RES_PROFILE + "AAAA", new UriParam(profileA)).setLoadSynchronous(true), new SystemRequestDetails()));
|
||||||
|
assertThat(found).isEmpty();
|
||||||
|
} catch (InvalidRequestException e) {
|
||||||
|
assertEquals(Msg.code(1223) + "Unknown search parameter \"" + SP_RES_PROFILE+"AAAA" + "\" for resource type \"Patient\". Valid search parameters for this search are: [_id, _lastUpdated, _profile, _security, _tag, active, address, address-city, address-country, address-postalcode, address-state, address-use, animal-breed, animal-species, birthdate, death-date, deceased, email, family, gender, general-practitioner, given, identifier, language, link, name, organization, phone, phonetic, telecom]", e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testPersistSearchParamSecurity() {
|
||||||
|
Coding TEST_PARAM_VALUE_CODING_1 = new Coding("test-system", "test-code-1", null);
|
||||||
|
Coding TEST_PARAM_VALUE_CODING_2 = new Coding("test-system", "test-code-2", null);
|
||||||
|
|
||||||
|
List<Patient> found = toList(myPatientDao.search(new SearchParameterMap(SP_RES_SECURITY, new TokenParam(TEST_PARAM_VALUE_CODING_1)).setLoadSynchronous(true), new SystemRequestDetails()));
|
||||||
|
int initialSizeSecurityA = found.size();
|
||||||
|
|
||||||
|
found = toList(myPatientDao.search(new SearchParameterMap(SP_RES_SECURITY, new TokenParam(TEST_PARAM_VALUE_CODING_2)).setLoadSynchronous(true), new SystemRequestDetails()));
|
||||||
|
int initialSizeSecurityB = found.size();
|
||||||
|
|
||||||
|
Patient patient = new Patient();
|
||||||
|
patient.addIdentifier().setSystem("urn:system").setValue("001");
|
||||||
|
patient.getMeta().addSecurity(TEST_PARAM_VALUE_CODING_1);
|
||||||
|
|
||||||
|
myPatientDao.create(patient, mySrd);
|
||||||
|
|
||||||
|
found = toList(myPatientDao.search(new SearchParameterMap(SP_RES_SECURITY, new TokenParam(TEST_PARAM_VALUE_CODING_1)).setLoadSynchronous(true), new SystemRequestDetails()));
|
||||||
|
assertThat(found).hasSize(1 + initialSizeSecurityA);
|
||||||
|
|
||||||
|
found = toList(myPatientDao.search(new SearchParameterMap(SP_RES_SECURITY, new TokenParam(TEST_PARAM_VALUE_CODING_2)).setLoadSynchronous(true), new SystemRequestDetails()));
|
||||||
|
assertThat(found).hasSize(initialSizeSecurityB);
|
||||||
|
|
||||||
|
// If this throws an exception, that would be an acceptable outcome as well..
|
||||||
|
try {
|
||||||
|
found = toList(myPatientDao.search(new SearchParameterMap(SP_RES_SECURITY + "AAAA", new TokenParam(TEST_PARAM_VALUE_CODING_1)).setLoadSynchronous(true), new SystemRequestDetails()));
|
||||||
|
assertThat(found).isEmpty();
|
||||||
|
} catch (InvalidRequestException e) {
|
||||||
|
assertEquals(Msg.code(1223) + "Unknown search parameter \"" + SP_RES_SECURITY+"AAAA" + "\" for resource type \"Patient\". Valid search parameters for this search are: [_id, _lastUpdated, _profile, _security, _tag, active, address, address-city, address-country, address-postalcode, address-state, address-use, animal-breed, animal-species, birthdate, death-date, deceased, email, family, gender, general-practitioner, given, identifier, language, link, name, organization, phone, phonetic, telecom]", e.getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -71,7 +71,7 @@ public class InstanceReindexServiceImplR5Test extends BaseJpaR5Test {
|
||||||
.map(t -> t.getName() + " " + getPartValue("Action", t) + " " + getPartValue("Type", t) + " " + getPartValue("Missing", t))
|
.map(t -> t.getName() + " " + getPartValue("Action", t) + " " + getPartValue("Type", t) + " " + getPartValue("Missing", t))
|
||||||
.sorted()
|
.sorted()
|
||||||
.toList();
|
.toList();
|
||||||
assertThat(indexInstances).as(indexInstances.toString()).containsExactly("_id NO_CHANGE Token true", "active NO_CHANGE Token true", "address NO_CHANGE String true", "address-city NO_CHANGE String true", "address-country NO_CHANGE String true", "address-postalcode NO_CHANGE String true", "address-state NO_CHANGE String true", "address-use NO_CHANGE Token true", "birthdate NO_CHANGE Date true", "death-date NO_CHANGE Date true", "email NO_CHANGE Token true", "gender NO_CHANGE Token true", "general-practitioner NO_CHANGE Reference true", "identifier NO_CHANGE Token true", "language NO_CHANGE Token true", "link NO_CHANGE Reference true", "organization NO_CHANGE Reference true", "part-agree NO_CHANGE Reference true", "phone NO_CHANGE Token true", "telecom NO_CHANGE Token true");
|
assertThat(indexInstances).as(indexInstances.toString()).containsExactly("active NO_CHANGE Token true", "address NO_CHANGE String true", "address-city NO_CHANGE String true", "address-country NO_CHANGE String true", "address-postalcode NO_CHANGE String true", "address-state NO_CHANGE String true", "address-use NO_CHANGE Token true", "birthdate NO_CHANGE Date true", "death-date NO_CHANGE Date true", "email NO_CHANGE Token true", "gender NO_CHANGE Token true", "general-practitioner NO_CHANGE Reference true", "identifier NO_CHANGE Token true", "language NO_CHANGE Token true", "link NO_CHANGE Reference true", "organization NO_CHANGE Reference true", "part-agree NO_CHANGE Reference true", "phone NO_CHANGE Token true", "telecom NO_CHANGE Token true");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue