Skip to content

Commit 0e63d5d

Browse files
authored
7168 canonicalurls in sps (#7169)
1 parent 27af838 commit 0e63d5d

File tree

19 files changed

+147
-77
lines changed

19 files changed

+147
-77
lines changed
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
type: fix
3+
issue: 7168
4+
title: "Previously, subscription matching on canonical references (ie, full urls)
5+
did not work. This has been fixed.
6+
"

hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/search/ExtendedHSearchIndexExtractor.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import ca.uhn.fhir.jpa.model.search.DateSearchIndexData;
3232
import ca.uhn.fhir.jpa.model.search.ExtendedHSearchIndexData;
3333
import ca.uhn.fhir.jpa.model.search.QuantitySearchIndexData;
34+
import ca.uhn.fhir.jpa.model.util.ResourceLinkUtils;
3435
import ca.uhn.fhir.jpa.searchparam.extractor.ISearchParamExtractor;
3536
import ca.uhn.fhir.jpa.searchparam.extractor.ResourceIndexedSearchParamComposite;
3637
import ca.uhn.fhir.jpa.searchparam.extractor.ResourceIndexedSearchParams;
@@ -181,9 +182,12 @@ public ExtendedHSearchIndexData extract(
181182
// Case 1: Resource Type and Resource ID is known
182183
// Case 2: Resource is unknown and referred by canonical url reference
183184
if (!Strings.isNullOrEmpty(nextLink.getTargetResourceId())) {
185+
// non-canonical
186+
assert !ResourceLinkUtils.UNKNOWN.equals(nextLink.getTargetResourceType());
184187
qualifiedTargetResourceId =
185188
nextLink.getTargetResourceType() + "/" + nextLink.getTargetResourceId();
186189
} else if (!Strings.isNullOrEmpty(nextLink.getTargetResourceUrl())) {
190+
// canonical
187191
qualifiedTargetResourceId = nextLink.getTargetResourceUrl();
188192
}
189193
retVal.addResourceLinkIndexData(nextParamName, qualifiedTargetResourceId);

hapi-fhir-jpaserver-model/src/main/java/ca/uhn/fhir/jpa/model/entity/ResourceLink.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
package ca.uhn.fhir.jpa.model.entity;
2121

2222
import ca.uhn.fhir.jpa.model.dao.JpaPid;
23+
import ca.uhn.fhir.jpa.model.util.ResourceLinkUtils;
2324
import jakarta.persistence.Column;
2425
import jakarta.persistence.ConstraintMode;
2526
import jakarta.persistence.Entity;
@@ -340,7 +341,7 @@ public Long getTargetResourcePid() {
340341
public void setTargetResourceUrlCanonical(String theTargetResourceUrl) {
341342
Validate.notBlank(theTargetResourceUrl);
342343

343-
myTargetResourceType = "(unknown)";
344+
myTargetResourceType = ResourceLinkUtils.UNKNOWN;
344345
myTargetResourceUrl = theTargetResourceUrl;
345346
}
346347

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package ca.uhn.fhir.jpa.model.util;
2+
3+
import ca.uhn.fhir.jpa.model.entity.ResourceLink;
4+
5+
import static org.apache.commons.lang3.StringUtils.isBlank;
6+
7+
public class ResourceLinkUtils {
8+
9+
/**
10+
* UNKNOWN resource type, used for flagging
11+
* canonical urls in ResourceLinks.
12+
*/
13+
public static final String UNKNOWN = "(unknown)";
14+
15+
/**
16+
* Returns true if the target of the resourcelink is a canonical url;
17+
* returns false otherwise.
18+
*/
19+
public static boolean isTargetCanonicalUrl(ResourceLink theLink) {
20+
return isBlank(theLink.getTargetResourceId())
21+
&& theLink.getTargetResourceType().equals(UNKNOWN);
22+
}
23+
}

hapi-fhir-jpaserver-searchparam/src/main/java/ca/uhn/fhir/jpa/searchparam/SearchLimiterSvc.java

Whitespace-only changes.

hapi-fhir-jpaserver-searchparam/src/main/java/ca/uhn/fhir/jpa/searchparam/SearchParamConstants.java

Lines changed: 0 additions & 25 deletions
This file was deleted.

hapi-fhir-jpaserver-searchparam/src/main/java/ca/uhn/fhir/jpa/searchparam/extractor/BaseSearchParamExtractor.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@
4444
import ca.uhn.fhir.jpa.model.entity.ResourceLink;
4545
import ca.uhn.fhir.jpa.model.entity.StorageSettings;
4646
import ca.uhn.fhir.jpa.model.util.UcumServiceUtil;
47-
import ca.uhn.fhir.jpa.searchparam.SearchParamConstants;
4847
import ca.uhn.fhir.jpa.searchparam.util.JpaParamUtil;
4948
import ca.uhn.fhir.jpa.searchparam.util.RuntimeSearchParamHelper;
5049
import ca.uhn.fhir.model.api.IQueryParameterType;
@@ -1704,7 +1703,7 @@ public boolean shouldAttemptToSplitPath(String thePath) {
17041703

17051704
private BigDecimal normalizeQuantityContainingTimeUnitsIntoDaysForNumberParam(
17061705
String theSystem, String theCode, BigDecimal theValue) {
1707-
if (SearchParamConstants.UCUM_NS.equals(theSystem)) {
1706+
if (UcumServiceUtil.UCUM_CODESYSTEM_URL.equals(theSystem)) {
17081707
if (isNotBlank(theCode)) {
17091708
Unit<? extends Quantity> unit = Unit.valueOf(theCode);
17101709
javax.measure.converter.UnitConverter dayConverter = unit.getConverterTo(NonSI.DAY);

hapi-fhir-jpaserver-searchparam/src/main/java/ca/uhn/fhir/jpa/searchparam/extractor/ResourceIndexedSearchParams.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
import ca.uhn.fhir.jpa.model.entity.ResourceTable;
3939
import ca.uhn.fhir.jpa.model.entity.SearchParamPresentEntity;
4040
import ca.uhn.fhir.jpa.model.entity.StorageSettings;
41+
import ca.uhn.fhir.jpa.model.util.ResourceLinkUtils;
4142
import ca.uhn.fhir.jpa.model.util.SearchParamHash;
4243
import ca.uhn.fhir.jpa.model.util.UcumServiceUtil;
4344
import ca.uhn.fhir.jpa.searchparam.util.RuntimeSearchParamHelper;
@@ -364,7 +365,13 @@ public boolean matchResourceLinks(
364365
private boolean resourceIdMatches(
365366
StorageSettings theStorageSettings, ResourceLink theResourceLink, ReferenceParam theReference) {
366367
String baseUrl = theReference.getBaseUrl();
368+
// this suggest that we do not expect ot see baseUrl *unless* it's a "treatbaseaslocal"
367369
if (isNotBlank(baseUrl)) {
370+
// canonical urls are full urls with a base and everything
371+
if (ResourceLinkUtils.isTargetCanonicalUrl(theResourceLink)) {
372+
// the reference to a canonical url should be that url
373+
return theReference.getValue().equals(theResourceLink.getTargetResourceUrl());
374+
}
368375
if (!theStorageSettings.getTreatBaseUrlsAsLocal().contains(baseUrl)) {
369376
return false;
370377
}

hapi-fhir-jpaserver-searchparam/src/main/java/ca/uhn/fhir/jpa/searchparam/matcher/InMemoryResourceMatcher.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,7 @@ public InMemoryMatchResult match(
184184
if (theIndexedSearchParams != null) {
185185
relevantSearchParams = theIndexedSearchParams;
186186
} else if (theResource != null) {
187-
// Don't index search params we don't actully need for the given criteria
187+
// Don't index search params we don't actually need for the given criteria
188188
ISearchParamExtractor.ISearchParamFilter filter = theSearchParams -> theSearchParams.stream()
189189
.filter(t -> searchParameterMap.containsKey(t.getName()))
190190
.collect(Collectors.toList());

hapi-fhir-jpaserver-searchparam/src/test/java/ca/uhn/fhir/jpa/searchparam/extractor/ResourceIndexedSearchParamsTest.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import ca.uhn.fhir.jpa.model.entity.StorageSettings;
77
import ca.uhn.fhir.rest.param.ReferenceParam;
88
import com.google.common.collect.Lists;
9+
import org.hl7.fhir.r4.model.IdType;
910
import org.junit.jupiter.api.BeforeEach;
1011
import org.junit.jupiter.api.Test;
1112
import org.junit.jupiter.params.ParameterizedTest;
@@ -96,6 +97,34 @@ private ReferenceParam getReferenceParam(String theId) {
9697
return retVal;
9798
}
9899

100+
@Test
101+
public void match_withLogicalReference_works() {
102+
ResourceTable table = new ResourceTable();
103+
table.setResourceType("QuestionnaireResponse");
104+
ResourceIndexedSearchParams matcher = ResourceIndexedSearchParams
105+
.withLists(table);
106+
ResourceLink resourceLink = ResourceLink.forLogicalReference(
107+
"QuestionnaireResponse.questionnaire",
108+
table,
109+
"http://localhost:8000/Questionnaire/a1",
110+
new Date()
111+
);
112+
matcher.getResourceLinks()
113+
.add(resourceLink);
114+
115+
// test
116+
boolean match = matcher.matchResourceLinks(
117+
myStorageSettings,
118+
"QuestionnaireResponse",
119+
"questionnaire",
120+
new ReferenceParam("http://localhost:8000/Questionnaire/a1"),
121+
"QuestionnaireResponse.questionnaire"
122+
);
123+
124+
// validate
125+
assertTrue(match);
126+
}
127+
99128
@Test
100129
public void testExtractCompositeStringUniquesValueChains() {
101130
List<List<String>> partsChoices;

0 commit comments

Comments
 (0)