Elements query cleanup

This commit is contained in:
James Agnew 2019-02-05 14:16:47 -05:00
parent c7d857df98
commit 4498335ae5
2 changed files with 40 additions and 16 deletions

View File

@ -87,16 +87,17 @@ public class ElementsParameter implements IParameter {
if (theExclude) { if (theExclude) {
paramName = Constants.PARAM_ELEMENTS + Constants.PARAM_ELEMENTS_EXCLUDE_MODIFIER; paramName = Constants.PARAM_ELEMENTS + Constants.PARAM_ELEMENTS_EXCLUDE_MODIFIER;
} }
String[] summary = theRequest.getParameters().get(paramName); String[] elementsValues = theRequest.getParameters().get(paramName);
if (summary != null && summary.length > 0) { if (elementsValues != null && elementsValues.length > 0) {
Set<String> retVal = new HashSet<String>(); Set<String> retVal = new HashSet<>();
for (String next : summary) { for (String next : elementsValues) {
StringTokenizer tok = new StringTokenizer(next, ","); StringTokenizer tok = new StringTokenizer(next, ",");
while (tok.hasMoreTokens()) { while (tok.hasMoreTokens()) {
String token = tok.nextToken(); String token = tok.nextToken();
if (isNotBlank(token)) { if (isNotBlank(token)) {
if (token.contains(".") && standardMode) { if (token.contains("."))
if (standardMode) {
continue; continue;
} }
retVal.add(token); retVal.add(token);
@ -107,11 +108,6 @@ public class ElementsParameter implements IParameter {
return null; return null;
} }
// Always include the meta element even for subsetted values
if (!theExclude) {
retVal.add("meta");
}
return retVal; return retVal;
} }
return null; return null;

View File

@ -62,7 +62,7 @@ public class ElementsParamR4Test {
assertThat(responseContent, not(containsString("<div>THE DIV</div>"))); assertThat(responseContent, not(containsString("<div>THE DIV</div>")));
assertThat(responseContent, (containsString("family"))); assertThat(responseContent, (containsString("family")));
assertThat(responseContent, (containsString("maritalStatus"))); assertThat(responseContent, (containsString("maritalStatus")));
assertThat(ourLastElements, containsInAnyOrder("meta", "name", "maritalStatus")); assertThat(ourLastElements, containsInAnyOrder("name", "maritalStatus"));
} }
); );
} }
@ -77,7 +77,7 @@ public class ElementsParamR4Test {
assertThat(responseContent, not(containsString("<div>THE DIV</div>"))); assertThat(responseContent, not(containsString("<div>THE DIV</div>")));
assertThat(responseContent, (containsString("family"))); assertThat(responseContent, (containsString("family")));
assertThat(responseContent, not(containsString("maritalStatus"))); assertThat(responseContent, not(containsString("maritalStatus")));
assertThat(ourLastElements, containsInAnyOrder("meta", "name")); assertThat(ourLastElements, containsInAnyOrder("name"));
} }
); );
} }
@ -93,7 +93,7 @@ public class ElementsParamR4Test {
assertThat(responseContent, not(containsString("THE DIV"))); assertThat(responseContent, not(containsString("THE DIV")));
assertThat(responseContent, containsString("family")); assertThat(responseContent, containsString("family"));
assertThat(responseContent, containsString("maritalStatus")); assertThat(responseContent, containsString("maritalStatus"));
assertThat(ourLastElements, containsInAnyOrder("meta", "name", "maritalStatus")); assertThat(ourLastElements, containsInAnyOrder("name", "maritalStatus"));
} }
); );
} }
@ -108,7 +108,7 @@ public class ElementsParamR4Test {
assertThat(responseContent, containsString("THE DIV")); assertThat(responseContent, containsString("THE DIV"));
assertThat(responseContent, not(containsString("family"))); assertThat(responseContent, not(containsString("family")));
assertThat(responseContent, not(containsString("maritalStatus"))); assertThat(responseContent, not(containsString("maritalStatus")));
assertThat(ourLastElements, containsInAnyOrder("meta", "text")); assertThat(ourLastElements, containsInAnyOrder( "text"));
} }
); );
} }
@ -184,6 +184,34 @@ public class ElementsParamR4Test {
}); });
} }
/**
* A search on procedure, with only resource specific elements filters that are specifically
* on other resources but Procedure, should not affect the output of the procedure resource.
*/
@Test
public void testMultiResourceElementsFilterDoesntAffectFocalResource() throws IOException {
createProcedureWithLongChain();
verifyXmlAndJson(
"http://localhost:" + ourPort + "/Procedure?_include=*&_elements=Observation.subject",
bundle -> {
Procedure procedure = (Procedure) bundle.getEntry().get(0).getResource();
assertEquals(true, procedure.getMeta().isEmpty());
assertEquals("REASON_CODE", procedure.getReasonCode().get(0).getCoding().get(0).getCode());
assertEquals("USED_CODE", procedure.getUsedCode().get(0).getCoding().get(0).getCode());
DiagnosticReport dr = (DiagnosticReport) bundle.getEntry().get(1).getResource();
assertEquals(true, dr.getMeta().isEmpty());
assertEquals(1, dr.getResult().size());
Observation obs = (Observation ) bundle.getEntry().get(2).getResource();
assertEquals("SUBSETTED", obs.getMeta().getTag().get(0).getCode());
assertEquals(null, obs.getStatus());
assertEquals(0, obs.getCode().getCoding().size());
assertEquals(false, obs.hasValue());
assertEquals("Patient/123", obs.getSubject().getReference());
});
}
@Test @Test
public void testMultiResourceElementsFilterWithMetadataExcludedStandardMode() throws IOException { public void testMultiResourceElementsFilterWithMetadataExcludedStandardMode() throws IOException {
ourServlet.setElementsSupport(ElementsSupportEnum.STANDARD); ourServlet.setElementsSupport(ElementsSupportEnum.STANDARD);