5353 iterate on revincludes and includes does not return correct resources when used with non iterate revincludes (#5354)
* added failing test * implemented solution * added doc generation * added changelog * fixed the order of includes and revincludes, based on what was implemented before * fixed formatting * fixed wording --------- Co-authored-by: Steven Li <steven@smilecdr.com>
This commit is contained in:
parent
e5f700fc21
commit
12519bde9f
|
@ -0,0 +1,6 @@
|
||||||
|
---
|
||||||
|
type: fix
|
||||||
|
issue: 5353
|
||||||
|
jira: SMILE-7451
|
||||||
|
title: "Previously, when using revincludes and includes with iterate, while also using revincludes without iterate,
|
||||||
|
the result omitted some resources that should have been included. This issue has now been fixed."
|
|
@ -1,3 +1,22 @@
|
||||||
|
/*-
|
||||||
|
* #%L
|
||||||
|
* HAPI FHIR JPA Server
|
||||||
|
* %%
|
||||||
|
* Copyright (C) 2014 - 2023 Smile CDR, Inc.
|
||||||
|
* %%
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
* #L%
|
||||||
|
*/
|
||||||
package ca.uhn.fhir.jpa.dao.data;
|
package ca.uhn.fhir.jpa.dao.data;
|
||||||
|
|
||||||
import ca.uhn.fhir.jpa.entity.MdmLink;
|
import ca.uhn.fhir.jpa.entity.MdmLink;
|
||||||
|
|
|
@ -1,3 +1,22 @@
|
||||||
|
/*-
|
||||||
|
* #%L
|
||||||
|
* HAPI FHIR JPA Server
|
||||||
|
* %%
|
||||||
|
* Copyright (C) 2014 - 2023 Smile CDR, Inc.
|
||||||
|
* %%
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
* #L%
|
||||||
|
*/
|
||||||
package ca.uhn.fhir.jpa.dao.mdm;
|
package ca.uhn.fhir.jpa.dao.mdm;
|
||||||
|
|
||||||
import ca.uhn.fhir.jpa.api.dao.DaoRegistry;
|
import ca.uhn.fhir.jpa.api.dao.DaoRegistry;
|
||||||
|
|
|
@ -408,16 +408,26 @@ public class Search implements ICachedSearchDetails, Serializable {
|
||||||
myLastUpdatedHigh = theUpperBound;
|
myLastUpdatedHigh = theUpperBound;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Set<Include> toIncList(boolean theWantReverse) {
|
private Set<Include> toIncList(boolean theWantReverse, boolean theIncludeAll, boolean theWantIterate) {
|
||||||
HashSet<Include> retVal = new HashSet<>();
|
HashSet<Include> retVal = new HashSet<>();
|
||||||
for (SearchInclude next : getIncludes()) {
|
for (SearchInclude next : getIncludes()) {
|
||||||
if (theWantReverse == next.isReverse()) {
|
if (theWantReverse == next.isReverse()) {
|
||||||
|
if (theIncludeAll) {
|
||||||
|
retVal.add(new Include(next.getInclude(), next.isRecurse()));
|
||||||
|
} else {
|
||||||
|
if (theWantIterate == next.isRecurse()) {
|
||||||
retVal.add(new Include(next.getInclude(), next.isRecurse()));
|
retVal.add(new Include(next.getInclude(), next.isRecurse()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
return Collections.unmodifiableSet(retVal);
|
return Collections.unmodifiableSet(retVal);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Set<Include> toIncList(boolean theWantReverse) {
|
||||||
|
return toIncList(theWantReverse, true, true);
|
||||||
|
}
|
||||||
|
|
||||||
public Set<Include> toIncludesList() {
|
public Set<Include> toIncludesList() {
|
||||||
return toIncList(false);
|
return toIncList(false);
|
||||||
}
|
}
|
||||||
|
@ -426,6 +436,14 @@ public class Search implements ICachedSearchDetails, Serializable {
|
||||||
return toIncList(true);
|
return toIncList(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Set<Include> toIncludesList(boolean iterate) {
|
||||||
|
return toIncList(false, false, iterate);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Set<Include> toRevIncludesList(boolean iterate) {
|
||||||
|
return toIncList(true, false, iterate);
|
||||||
|
}
|
||||||
|
|
||||||
public void addInclude(SearchInclude theInclude) {
|
public void addInclude(SearchInclude theInclude) {
|
||||||
getIncludes().add(theInclude);
|
getIncludes().add(theInclude);
|
||||||
}
|
}
|
||||||
|
|
|
@ -46,7 +46,6 @@ import ca.uhn.fhir.jpa.search.cache.SearchCacheStatusEnum;
|
||||||
import ca.uhn.fhir.jpa.searchparam.SearchParameterMap;
|
import ca.uhn.fhir.jpa.searchparam.SearchParameterMap;
|
||||||
import ca.uhn.fhir.jpa.util.MemoryCacheService;
|
import ca.uhn.fhir.jpa.util.MemoryCacheService;
|
||||||
import ca.uhn.fhir.jpa.util.QueryParameterUtils;
|
import ca.uhn.fhir.jpa.util.QueryParameterUtils;
|
||||||
import ca.uhn.fhir.model.api.Include;
|
|
||||||
import ca.uhn.fhir.model.primitive.InstantDt;
|
import ca.uhn.fhir.model.primitive.InstantDt;
|
||||||
import ca.uhn.fhir.rest.api.server.IBundleProvider;
|
import ca.uhn.fhir.rest.api.server.IBundleProvider;
|
||||||
import ca.uhn.fhir.rest.api.server.IPreResourceAccessDetails;
|
import ca.uhn.fhir.rest.api.server.IPreResourceAccessDetails;
|
||||||
|
@ -463,72 +462,70 @@ public class PersistedJpaBundleProvider implements IBundleProvider {
|
||||||
if (mySearchEntity.getSearchType() == SearchTypeEnum.SEARCH) {
|
if (mySearchEntity.getSearchType() == SearchTypeEnum.SEARCH) {
|
||||||
Integer maxIncludes = myStorageSettings.getMaximumIncludesToLoadPerPage();
|
Integer maxIncludes = myStorageSettings.getMaximumIncludesToLoadPerPage();
|
||||||
|
|
||||||
// Decide whether to perform include or revincludes first based on which one has iterate.
|
// Load non-iterate _revincludes
|
||||||
boolean performIncludesBeforeRevincludes = shouldPerformIncludesBeforeRevincudes();
|
Set<JpaPid> nonIterateRevIncludedPids = theSearchBuilder.loadIncludes(
|
||||||
|
|
||||||
if (performIncludesBeforeRevincludes) {
|
|
||||||
// Load _includes
|
|
||||||
Set<JpaPid> includedPids = theSearchBuilder.loadIncludes(
|
|
||||||
myContext,
|
myContext,
|
||||||
myEntityManager,
|
myEntityManager,
|
||||||
thePids,
|
thePids,
|
||||||
mySearchEntity.toIncludesList(),
|
mySearchEntity.toRevIncludesList(false),
|
||||||
false,
|
|
||||||
mySearchEntity.getLastUpdated(),
|
|
||||||
myUuid,
|
|
||||||
myRequest,
|
|
||||||
maxIncludes);
|
|
||||||
if (maxIncludes != null) {
|
|
||||||
maxIncludes -= includedPids.size();
|
|
||||||
}
|
|
||||||
thePids.addAll(includedPids);
|
|
||||||
includedPidList.addAll(includedPids);
|
|
||||||
|
|
||||||
// Load _revincludes
|
|
||||||
Set<JpaPid> revIncludedPids = theSearchBuilder.loadIncludes(
|
|
||||||
myContext,
|
|
||||||
myEntityManager,
|
|
||||||
thePids,
|
|
||||||
mySearchEntity.toRevIncludesList(),
|
|
||||||
true,
|
|
||||||
mySearchEntity.getLastUpdated(),
|
|
||||||
myUuid,
|
|
||||||
myRequest,
|
|
||||||
maxIncludes);
|
|
||||||
thePids.addAll(revIncludedPids);
|
|
||||||
includedPidList.addAll(revIncludedPids);
|
|
||||||
} else {
|
|
||||||
// Load _revincludes
|
|
||||||
Set<JpaPid> revIncludedPids = theSearchBuilder.loadIncludes(
|
|
||||||
myContext,
|
|
||||||
myEntityManager,
|
|
||||||
thePids,
|
|
||||||
mySearchEntity.toRevIncludesList(),
|
|
||||||
true,
|
true,
|
||||||
mySearchEntity.getLastUpdated(),
|
mySearchEntity.getLastUpdated(),
|
||||||
myUuid,
|
myUuid,
|
||||||
myRequest,
|
myRequest,
|
||||||
maxIncludes);
|
maxIncludes);
|
||||||
if (maxIncludes != null) {
|
if (maxIncludes != null) {
|
||||||
maxIncludes -= revIncludedPids.size();
|
maxIncludes -= nonIterateRevIncludedPids.size();
|
||||||
}
|
}
|
||||||
thePids.addAll(revIncludedPids);
|
thePids.addAll(nonIterateRevIncludedPids);
|
||||||
includedPidList.addAll(revIncludedPids);
|
includedPidList.addAll(nonIterateRevIncludedPids);
|
||||||
|
|
||||||
// Load _includes
|
// Load non-iterate _includes
|
||||||
Set<JpaPid> includedPids = theSearchBuilder.loadIncludes(
|
Set<JpaPid> nonIterateIncludedPids = theSearchBuilder.loadIncludes(
|
||||||
myContext,
|
myContext,
|
||||||
myEntityManager,
|
myEntityManager,
|
||||||
thePids,
|
thePids,
|
||||||
mySearchEntity.toIncludesList(),
|
mySearchEntity.toIncludesList(false),
|
||||||
false,
|
false,
|
||||||
mySearchEntity.getLastUpdated(),
|
mySearchEntity.getLastUpdated(),
|
||||||
myUuid,
|
myUuid,
|
||||||
myRequest,
|
myRequest,
|
||||||
maxIncludes);
|
maxIncludes);
|
||||||
thePids.addAll(includedPids);
|
if (maxIncludes != null) {
|
||||||
includedPidList.addAll(includedPids);
|
maxIncludes -= nonIterateIncludedPids.size();
|
||||||
}
|
}
|
||||||
|
thePids.addAll(nonIterateIncludedPids);
|
||||||
|
includedPidList.addAll(nonIterateIncludedPids);
|
||||||
|
|
||||||
|
// Load iterate _revinclude
|
||||||
|
Set<JpaPid> iterateRevIncludedPids = theSearchBuilder.loadIncludes(
|
||||||
|
myContext,
|
||||||
|
myEntityManager,
|
||||||
|
thePids,
|
||||||
|
mySearchEntity.toRevIncludesList(true),
|
||||||
|
true,
|
||||||
|
mySearchEntity.getLastUpdated(),
|
||||||
|
myUuid,
|
||||||
|
myRequest,
|
||||||
|
maxIncludes);
|
||||||
|
if (maxIncludes != null) {
|
||||||
|
maxIncludes -= iterateRevIncludedPids.size();
|
||||||
|
}
|
||||||
|
thePids.addAll(iterateRevIncludedPids);
|
||||||
|
includedPidList.addAll(iterateRevIncludedPids);
|
||||||
|
|
||||||
|
// Load iterate _includes
|
||||||
|
Set<JpaPid> iterateIncludedPids = theSearchBuilder.loadIncludes(
|
||||||
|
myContext,
|
||||||
|
myEntityManager,
|
||||||
|
thePids,
|
||||||
|
mySearchEntity.toIncludesList(true),
|
||||||
|
false,
|
||||||
|
mySearchEntity.getLastUpdated(),
|
||||||
|
myUuid,
|
||||||
|
myRequest,
|
||||||
|
maxIncludes);
|
||||||
|
thePids.addAll(iterateIncludedPids);
|
||||||
|
includedPidList.addAll(iterateIncludedPids);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Execute the query and make sure we return distinct results
|
// Execute the query and make sure we return distinct results
|
||||||
|
@ -547,20 +544,6 @@ public class PersistedJpaBundleProvider implements IBundleProvider {
|
||||||
return resources;
|
return resources;
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean shouldPerformIncludesBeforeRevincudes() {
|
|
||||||
// When revincludes contain a :iterate, we should perform them last so they can iterate through the includes
|
|
||||||
// found so far
|
|
||||||
boolean retval = false;
|
|
||||||
|
|
||||||
for (Include nextInclude : mySearchEntity.toRevIncludesList()) {
|
|
||||||
if (nextInclude.isRecurse()) {
|
|
||||||
retval = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return retval;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setInterceptorBroadcaster(IInterceptorBroadcaster theInterceptorBroadcaster) {
|
public void setInterceptorBroadcaster(IInterceptorBroadcaster theInterceptorBroadcaster) {
|
||||||
myInterceptorBroadcaster = theInterceptorBroadcaster;
|
myInterceptorBroadcaster = theInterceptorBroadcaster;
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,11 +12,15 @@ import org.hl7.fhir.instance.model.api.IIdType;
|
||||||
import org.hl7.fhir.r4.model.Bundle;
|
import org.hl7.fhir.r4.model.Bundle;
|
||||||
import org.hl7.fhir.r4.model.CareTeam;
|
import org.hl7.fhir.r4.model.CareTeam;
|
||||||
import org.hl7.fhir.r4.model.DetectedIssue;
|
import org.hl7.fhir.r4.model.DetectedIssue;
|
||||||
|
import org.hl7.fhir.r4.model.Encounter;
|
||||||
|
import org.hl7.fhir.r4.model.EpisodeOfCare;
|
||||||
import org.hl7.fhir.r4.model.Group;
|
import org.hl7.fhir.r4.model.Group;
|
||||||
|
import org.hl7.fhir.r4.model.Identifier;
|
||||||
import org.hl7.fhir.r4.model.Patient;
|
import org.hl7.fhir.r4.model.Patient;
|
||||||
import org.hl7.fhir.r4.model.Practitioner;
|
import org.hl7.fhir.r4.model.Practitioner;
|
||||||
import org.hl7.fhir.r4.model.PractitionerRole;
|
import org.hl7.fhir.r4.model.PractitionerRole;
|
||||||
import org.hl7.fhir.r4.model.Reference;
|
import org.hl7.fhir.r4.model.Reference;
|
||||||
|
import org.hl7.fhir.r4.model.Task;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
@ -140,7 +144,7 @@ public class ResourceProviderRevIncludeTest extends BaseResourceProviderR4Test {
|
||||||
|
|
||||||
//Ensure that the revincludes are included in the query list of the sql trace.
|
//Ensure that the revincludes are included in the query list of the sql trace.
|
||||||
//TODO GGG/KHS reduce this to something less than 6 by smarter iterating and getting the resource types earlier when needed.
|
//TODO GGG/KHS reduce this to something less than 6 by smarter iterating and getting the resource types earlier when needed.
|
||||||
assertEquals(6, sqlCapturingInterceptor.getQueryList().size());
|
assertEquals(5, sqlCapturingInterceptor.getQueryList().size());
|
||||||
myInterceptorRegistry.unregisterInterceptor(sqlCapturingInterceptor);
|
myInterceptorRegistry.unregisterInterceptor(sqlCapturingInterceptor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -174,4 +178,42 @@ public class ResourceProviderRevIncludeTest extends BaseResourceProviderR4Test {
|
||||||
assertEquals(practitionerRoleId.getIdPart(), foundResources.get(2).getIdElement().getIdPart());
|
assertEquals(practitionerRoleId.getIdPart(), foundResources.get(2).getIdElement().getIdPart());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void includeRevIncludeIterate() {
|
||||||
|
Patient p = new Patient();
|
||||||
|
String methodName = "includeRevIncludeIterate";
|
||||||
|
p.addName().setFamily(methodName);
|
||||||
|
IIdType pid = myClient.create().resource(p).execute().getId().toUnqualifiedVersionless();
|
||||||
|
|
||||||
|
EpisodeOfCare episodeOfCare = new EpisodeOfCare();
|
||||||
|
episodeOfCare.addIdentifier(new Identifier().setSystem("system1").setValue("value1"));
|
||||||
|
IIdType episodeOfCareId = myClient.create().resource(episodeOfCare).execute().getId().toUnqualifiedVersionless();
|
||||||
|
|
||||||
|
Encounter encounter = new Encounter();
|
||||||
|
encounter.setSubject(new Reference(pid));
|
||||||
|
encounter.addEpisodeOfCare(new Reference(episodeOfCareId));
|
||||||
|
IIdType encounterId = myClient.create().resource(encounter).execute().getId().toUnqualifiedVersionless();
|
||||||
|
|
||||||
|
Task task = new Task();
|
||||||
|
task.setEncounter(new Reference(encounterId));
|
||||||
|
IIdType taskId = myClient.create().resource(task).execute().getId().toUnqualifiedVersionless();
|
||||||
|
|
||||||
|
// EpisodeOfCare?identifier=system1|value1&_revinclude=Encounter:episode-of-care&_include:iterate=Encounter:patient&_revinclude:iterate=Task:encounter
|
||||||
|
Bundle bundle = myClient.search()
|
||||||
|
.forResource(EpisodeOfCare.class)
|
||||||
|
.where(EpisodeOfCare.IDENTIFIER.exactly().systemAndIdentifier("system1", "value1"))
|
||||||
|
.revInclude(new Include("Encounter:episode-of-care"))
|
||||||
|
.include(new Include("Encounter:patient").setRecurse(true))
|
||||||
|
.revInclude(new Include("Task:encounter").setRecurse(true))
|
||||||
|
.returnBundle(Bundle.class)
|
||||||
|
.execute();
|
||||||
|
|
||||||
|
List<IBaseResource> foundResources = BundleUtil.toListOfResources(myFhirContext, bundle);
|
||||||
|
assertEquals(4, foundResources.size());
|
||||||
|
assertEquals(episodeOfCareId.getIdPart(), foundResources.get(0).getIdElement().getIdPart());
|
||||||
|
assertEquals(encounterId.getIdPart(), foundResources.get(1).getIdElement().getIdPart());
|
||||||
|
assertEquals(taskId.getIdPart(), foundResources.get(2).getIdElement().getIdPart());
|
||||||
|
assertEquals(pid.getIdPart(), foundResources.get(3).getIdElement().getIdPart());
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,22 @@
|
||||||
|
/*-
|
||||||
|
* #%L
|
||||||
|
* HAPI FHIR JPA Server Test Utilities
|
||||||
|
* %%
|
||||||
|
* Copyright (C) 2014 - 2023 Smile CDR, Inc.
|
||||||
|
* %%
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
* #L%
|
||||||
|
*/
|
||||||
package ca.uhn.fhir.jpa.mdm;
|
package ca.uhn.fhir.jpa.mdm;
|
||||||
|
|
||||||
import ca.uhn.fhir.jpa.mdm.models.GenerateMetricsTestParameters;
|
import ca.uhn.fhir.jpa.mdm.models.GenerateMetricsTestParameters;
|
||||||
|
|
|
@ -1,3 +1,22 @@
|
||||||
|
/*-
|
||||||
|
* #%L
|
||||||
|
* HAPI FHIR JPA Server Test Utilities
|
||||||
|
* %%
|
||||||
|
* Copyright (C) 2014 - 2023 Smile CDR, Inc.
|
||||||
|
* %%
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
* #L%
|
||||||
|
*/
|
||||||
package ca.uhn.fhir.jpa.mdm.models;
|
package ca.uhn.fhir.jpa.mdm.models;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
|
@ -1,3 +1,22 @@
|
||||||
|
/*-
|
||||||
|
* #%L
|
||||||
|
* HAPI FHIR JPA Server Test Utilities
|
||||||
|
* %%
|
||||||
|
* Copyright (C) 2014 - 2023 Smile CDR, Inc.
|
||||||
|
* %%
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
* #L%
|
||||||
|
*/
|
||||||
package ca.uhn.fhir.jpa.mdm.models;
|
package ca.uhn.fhir.jpa.mdm.models;
|
||||||
|
|
||||||
import ca.uhn.fhir.mdm.api.MdmLinkSourceEnum;
|
import ca.uhn.fhir.mdm.api.MdmLinkSourceEnum;
|
||||||
|
|
|
@ -1,3 +1,22 @@
|
||||||
|
/*-
|
||||||
|
* #%L
|
||||||
|
* HAPI FHIR JPA Server Test Utilities
|
||||||
|
* %%
|
||||||
|
* Copyright (C) 2014 - 2023 Smile CDR, Inc.
|
||||||
|
* %%
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
* #L%
|
||||||
|
*/
|
||||||
package ca.uhn.fhir.jpa.mdm.models;
|
package ca.uhn.fhir.jpa.mdm.models;
|
||||||
|
|
||||||
import ca.uhn.fhir.mdm.api.MdmMatchResultEnum;
|
import ca.uhn.fhir.mdm.api.MdmMatchResultEnum;
|
||||||
|
|
|
@ -1,3 +1,22 @@
|
||||||
|
/*-
|
||||||
|
* #%L
|
||||||
|
* HAPI FHIR JPA Server Test Utilities
|
||||||
|
* %%
|
||||||
|
* Copyright (C) 2014 - 2023 Smile CDR, Inc.
|
||||||
|
* %%
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
* #L%
|
||||||
|
*/
|
||||||
package ca.uhn.fhir.jpa.mdm.models;
|
package ca.uhn.fhir.jpa.mdm.models;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
|
@ -1,3 +1,22 @@
|
||||||
|
/*-
|
||||||
|
* #%L
|
||||||
|
* HAPI FHIR JPA Server Test Utilities
|
||||||
|
* %%
|
||||||
|
* Copyright (C) 2014 - 2023 Smile CDR, Inc.
|
||||||
|
* %%
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
* #L%
|
||||||
|
*/
|
||||||
/**
|
/**
|
||||||
* This package is for persistence-agnostic mdm tests.
|
* This package is for persistence-agnostic mdm tests.
|
||||||
* Even though the package is "jpaserver-test-utils", these
|
* Even though the package is "jpaserver-test-utils", these
|
||||||
|
|
|
@ -1,3 +1,22 @@
|
||||||
|
/*-
|
||||||
|
* #%L
|
||||||
|
* HAPI FHIR JPA Server Test Utilities
|
||||||
|
* %%
|
||||||
|
* Copyright (C) 2014 - 2023 Smile CDR, Inc.
|
||||||
|
* %%
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
* #L%
|
||||||
|
*/
|
||||||
package ca.uhn.fhir.jpa.mdm.util;
|
package ca.uhn.fhir.jpa.mdm.util;
|
||||||
|
|
||||||
import ca.uhn.fhir.jpa.mdm.models.LinkMetricTestParameters;
|
import ca.uhn.fhir.jpa.mdm.models.LinkMetricTestParameters;
|
||||||
|
|
|
@ -1,3 +1,22 @@
|
||||||
|
/*-
|
||||||
|
* #%L
|
||||||
|
* HAPI FHIR - Master Data Management
|
||||||
|
* %%
|
||||||
|
* Copyright (C) 2014 - 2023 Smile CDR, Inc.
|
||||||
|
* %%
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
* #L%
|
||||||
|
*/
|
||||||
package ca.uhn.fhir.mdm.api;
|
package ca.uhn.fhir.mdm.api;
|
||||||
|
|
||||||
import ca.uhn.fhir.jpa.api.dao.DaoRegistry;
|
import ca.uhn.fhir.jpa.api.dao.DaoRegistry;
|
||||||
|
|
|
@ -1,3 +1,22 @@
|
||||||
|
/*-
|
||||||
|
* #%L
|
||||||
|
* HAPI FHIR - Master Data Management
|
||||||
|
* %%
|
||||||
|
* Copyright (C) 2014 - 2023 Smile CDR, Inc.
|
||||||
|
* %%
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
* #L%
|
||||||
|
*/
|
||||||
package ca.uhn.fhir.mdm.api;
|
package ca.uhn.fhir.mdm.api;
|
||||||
|
|
||||||
import ca.uhn.fhir.mdm.api.params.GenerateMdmMetricsParameters;
|
import ca.uhn.fhir.mdm.api.params.GenerateMdmMetricsParameters;
|
||||||
|
|
|
@ -1,3 +1,22 @@
|
||||||
|
/*-
|
||||||
|
* #%L
|
||||||
|
* HAPI FHIR - Master Data Management
|
||||||
|
* %%
|
||||||
|
* Copyright (C) 2014 - 2023 Smile CDR, Inc.
|
||||||
|
* %%
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
* #L%
|
||||||
|
*/
|
||||||
package ca.uhn.fhir.mdm.api;
|
package ca.uhn.fhir.mdm.api;
|
||||||
|
|
||||||
import ca.uhn.fhir.interceptor.model.RequestPartitionId;
|
import ca.uhn.fhir.interceptor.model.RequestPartitionId;
|
||||||
|
|
|
@ -1,3 +1,22 @@
|
||||||
|
/*-
|
||||||
|
* #%L
|
||||||
|
* HAPI FHIR - Master Data Management
|
||||||
|
* %%
|
||||||
|
* Copyright (C) 2014 - 2023 Smile CDR, Inc.
|
||||||
|
* %%
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
* #L%
|
||||||
|
*/
|
||||||
package ca.uhn.fhir.mdm.api.params;
|
package ca.uhn.fhir.mdm.api.params;
|
||||||
|
|
||||||
import ca.uhn.fhir.mdm.api.MdmLinkSourceEnum;
|
import ca.uhn.fhir.mdm.api.MdmLinkSourceEnum;
|
||||||
|
|
|
@ -1,3 +1,22 @@
|
||||||
|
/*-
|
||||||
|
* #%L
|
||||||
|
* HAPI FHIR - Master Data Management
|
||||||
|
* %%
|
||||||
|
* Copyright (C) 2014 - 2023 Smile CDR, Inc.
|
||||||
|
* %%
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
* #L%
|
||||||
|
*/
|
||||||
package ca.uhn.fhir.mdm.api.params;
|
package ca.uhn.fhir.mdm.api.params;
|
||||||
|
|
||||||
import ca.uhn.fhir.mdm.api.MdmLinkSourceEnum;
|
import ca.uhn.fhir.mdm.api.MdmLinkSourceEnum;
|
||||||
|
|
|
@ -1,3 +1,22 @@
|
||||||
|
/*-
|
||||||
|
* #%L
|
||||||
|
* HAPI FHIR - Master Data Management
|
||||||
|
* %%
|
||||||
|
* Copyright (C) 2014 - 2023 Smile CDR, Inc.
|
||||||
|
* %%
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
* #L%
|
||||||
|
*/
|
||||||
package ca.uhn.fhir.mdm.api.params;
|
package ca.uhn.fhir.mdm.api.params;
|
||||||
|
|
||||||
public class GenerateMdmResourceMetricsParameters {
|
public class GenerateMdmResourceMetricsParameters {
|
||||||
|
|
|
@ -1,3 +1,22 @@
|
||||||
|
/*-
|
||||||
|
* #%L
|
||||||
|
* HAPI FHIR - Master Data Management
|
||||||
|
* %%
|
||||||
|
* Copyright (C) 2014 - 2023 Smile CDR, Inc.
|
||||||
|
* %%
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
* #L%
|
||||||
|
*/
|
||||||
package ca.uhn.fhir.mdm.api.params;
|
package ca.uhn.fhir.mdm.api.params;
|
||||||
|
|
||||||
import ca.uhn.fhir.mdm.api.MdmMatchResultEnum;
|
import ca.uhn.fhir.mdm.api.MdmMatchResultEnum;
|
||||||
|
|
|
@ -1,3 +1,22 @@
|
||||||
|
/*-
|
||||||
|
* #%L
|
||||||
|
* HAPI FHIR - Master Data Management
|
||||||
|
* %%
|
||||||
|
* Copyright (C) 2014 - 2023 Smile CDR, Inc.
|
||||||
|
* %%
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
* #L%
|
||||||
|
*/
|
||||||
package ca.uhn.fhir.mdm.model;
|
package ca.uhn.fhir.mdm.model;
|
||||||
|
|
||||||
import ca.uhn.fhir.mdm.api.MdmLinkSourceEnum;
|
import ca.uhn.fhir.mdm.api.MdmLinkSourceEnum;
|
||||||
|
|
|
@ -1,3 +1,22 @@
|
||||||
|
/*-
|
||||||
|
* #%L
|
||||||
|
* HAPI FHIR - Master Data Management
|
||||||
|
* %%
|
||||||
|
* Copyright (C) 2014 - 2023 Smile CDR, Inc.
|
||||||
|
* %%
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
* #L%
|
||||||
|
*/
|
||||||
package ca.uhn.fhir.mdm.model;
|
package ca.uhn.fhir.mdm.model;
|
||||||
|
|
||||||
import java.util.LinkedHashMap;
|
import java.util.LinkedHashMap;
|
||||||
|
|
|
@ -1,3 +1,22 @@
|
||||||
|
/*-
|
||||||
|
* #%L
|
||||||
|
* HAPI FHIR - Master Data Management
|
||||||
|
* %%
|
||||||
|
* Copyright (C) 2014 - 2023 Smile CDR, Inc.
|
||||||
|
* %%
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
* #L%
|
||||||
|
*/
|
||||||
package ca.uhn.fhir.mdm.model;
|
package ca.uhn.fhir.mdm.model;
|
||||||
|
|
||||||
import ca.uhn.fhir.mdm.api.MdmLinkSourceEnum;
|
import ca.uhn.fhir.mdm.api.MdmLinkSourceEnum;
|
||||||
|
|
|
@ -1,3 +1,22 @@
|
||||||
|
/*-
|
||||||
|
* #%L
|
||||||
|
* HAPI FHIR - Master Data Management
|
||||||
|
* %%
|
||||||
|
* Copyright (C) 2014 - 2023 Smile CDR, Inc.
|
||||||
|
* %%
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
* #L%
|
||||||
|
*/
|
||||||
package ca.uhn.fhir.mdm.model;
|
package ca.uhn.fhir.mdm.model;
|
||||||
|
|
||||||
public class MdmResourceMetrics {
|
public class MdmResourceMetrics {
|
||||||
|
|
|
@ -1,3 +1,22 @@
|
||||||
|
/*-
|
||||||
|
* #%L
|
||||||
|
* HAPI FHIR - Master Data Management
|
||||||
|
* %%
|
||||||
|
* Copyright (C) 2014 - 2023 Smile CDR, Inc.
|
||||||
|
* %%
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
* #L%
|
||||||
|
*/
|
||||||
package ca.uhn.fhir.mdm.util;
|
package ca.uhn.fhir.mdm.util;
|
||||||
|
|
||||||
import ca.uhn.fhir.jpa.searchparam.SearchParameterMap;
|
import ca.uhn.fhir.jpa.searchparam.SearchParameterMap;
|
||||||
|
|
|
@ -1,3 +1,22 @@
|
||||||
|
/*-
|
||||||
|
* #%L
|
||||||
|
* HAPI FHIR Test Utilities
|
||||||
|
* %%
|
||||||
|
* Copyright (C) 2014 - 2023 Smile CDR, Inc.
|
||||||
|
* %%
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
* #L%
|
||||||
|
*/
|
||||||
package ca.uhn.fhir.rest.server.provider;
|
package ca.uhn.fhir.rest.server.provider;
|
||||||
|
|
||||||
import ca.uhn.fhir.rest.annotation.IdParam;
|
import ca.uhn.fhir.rest.annotation.IdParam;
|
||||||
|
|
Loading…
Reference in New Issue