3163 refactor some base mdm stuff (#3166)
Co-authored-by: leif stawnyczy <leifstawnyczy@leifs-MacBook-Pro.local>
This commit is contained in:
parent
843517f7ba
commit
7e291bb469
|
@ -31,7 +31,7 @@ public interface IAnyResource extends IBaseResource {
|
||||||
/**
|
/**
|
||||||
* 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(name="_id", path="", description="The ID of the resource", type="token")
|
||||||
String SP_RES_ID = "_id";
|
String SP_RES_ID = "_id";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -257,8 +257,16 @@ public class MdmConsumerConfig {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
MdmControllerHelper mdmProviderHelper(FhirContext theFhirContext, IResourceLoader theResourceLoader, IMdmSettings theMdmSettings, MessageHelper messageHelper) {
|
MdmControllerHelper mdmProviderHelper(FhirContext theFhirContext,
|
||||||
return new MdmControllerHelper(theFhirContext, theResourceLoader, theMdmSettings, messageHelper);
|
IResourceLoader theResourceLoader,
|
||||||
|
IMdmSettings theMdmSettings,
|
||||||
|
IMdmMatchFinderSvc theMdmMatchFinderSvc,
|
||||||
|
MessageHelper messageHelper) {
|
||||||
|
return new MdmControllerHelper(theFhirContext,
|
||||||
|
theResourceLoader,
|
||||||
|
theMdmMatchFinderSvc,
|
||||||
|
theMdmSettings,
|
||||||
|
messageHelper);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
|
|
|
@ -5,6 +5,7 @@ import ca.uhn.fhir.mdm.api.IMdmClearJobSubmitter;
|
||||||
import ca.uhn.fhir.mdm.api.IMdmControllerSvc;
|
import ca.uhn.fhir.mdm.api.IMdmControllerSvc;
|
||||||
import ca.uhn.fhir.mdm.api.IMdmMatchFinderSvc;
|
import ca.uhn.fhir.mdm.api.IMdmMatchFinderSvc;
|
||||||
import ca.uhn.fhir.mdm.api.IMdmSubmitSvc;
|
import ca.uhn.fhir.mdm.api.IMdmSubmitSvc;
|
||||||
|
import ca.uhn.fhir.mdm.provider.MdmControllerHelper;
|
||||||
import ca.uhn.fhir.mdm.provider.MdmProviderDstu3Plus;
|
import ca.uhn.fhir.mdm.provider.MdmProviderDstu3Plus;
|
||||||
import ca.uhn.fhir.mdm.rules.config.MdmSettings;
|
import ca.uhn.fhir.mdm.rules.config.MdmSettings;
|
||||||
import ca.uhn.fhir.mdm.util.MessageHelper;
|
import ca.uhn.fhir.mdm.util.MessageHelper;
|
||||||
|
@ -29,8 +30,6 @@ import java.util.List;
|
||||||
public abstract class BaseProviderR4Test extends BaseMdmR4Test {
|
public abstract class BaseProviderR4Test extends BaseMdmR4Test {
|
||||||
MdmProviderDstu3Plus myMdmProvider;
|
MdmProviderDstu3Plus myMdmProvider;
|
||||||
@Autowired
|
@Autowired
|
||||||
private IMdmMatchFinderSvc myMdmMatchFinderSvc;
|
|
||||||
@Autowired
|
|
||||||
private IMdmControllerSvc myMdmControllerSvc;
|
private IMdmControllerSvc myMdmControllerSvc;
|
||||||
@Autowired
|
@Autowired
|
||||||
private IMdmClearJobSubmitter myMdmClearJobSubmitter;
|
private IMdmClearJobSubmitter myMdmClearJobSubmitter;
|
||||||
|
@ -39,6 +38,8 @@ public abstract class BaseProviderR4Test extends BaseMdmR4Test {
|
||||||
@Autowired
|
@Autowired
|
||||||
private MdmSettings myMdmSettings;
|
private MdmSettings myMdmSettings;
|
||||||
@Autowired
|
@Autowired
|
||||||
|
private MdmControllerHelper myMdmHelper;
|
||||||
|
@Autowired
|
||||||
BatchJobHelper myBatchJobHelper;
|
BatchJobHelper myBatchJobHelper;
|
||||||
@Autowired
|
@Autowired
|
||||||
MessageHelper myMessageHelper;
|
MessageHelper myMessageHelper;
|
||||||
|
@ -55,7 +56,7 @@ public abstract class BaseProviderR4Test extends BaseMdmR4Test {
|
||||||
|
|
||||||
@BeforeEach
|
@BeforeEach
|
||||||
public void before() {
|
public void before() {
|
||||||
myMdmProvider = new MdmProviderDstu3Plus(myFhirContext, myMdmControllerSvc, myMdmMatchFinderSvc, myMdmSubmitSvc, myMdmSettings);
|
myMdmProvider = new MdmProviderDstu3Plus(myFhirContext, myMdmControllerSvc, myMdmHelper, myMdmSubmitSvc, myMdmSettings);
|
||||||
defaultScript = myMdmSettings.getScriptText();
|
defaultScript = myMdmSettings.getScriptText();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -21,20 +21,36 @@ package ca.uhn.fhir.mdm.provider;
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import ca.uhn.fhir.context.FhirContext;
|
import ca.uhn.fhir.context.FhirContext;
|
||||||
|
import ca.uhn.fhir.mdm.api.IMdmMatchFinderSvc;
|
||||||
import ca.uhn.fhir.mdm.api.IMdmSettings;
|
import ca.uhn.fhir.mdm.api.IMdmSettings;
|
||||||
|
import ca.uhn.fhir.mdm.api.MatchedTarget;
|
||||||
|
import ca.uhn.fhir.mdm.api.MdmConstants;
|
||||||
import ca.uhn.fhir.mdm.util.MdmResourceUtil;
|
import ca.uhn.fhir.mdm.util.MdmResourceUtil;
|
||||||
import ca.uhn.fhir.mdm.util.MessageHelper;
|
import ca.uhn.fhir.mdm.util.MessageHelper;
|
||||||
import ca.uhn.fhir.model.primitive.IdDt;
|
import ca.uhn.fhir.model.primitive.IdDt;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.ResourceVersionConflictException;
|
import ca.uhn.fhir.rest.server.exceptions.ResourceVersionConflictException;
|
||||||
import ca.uhn.fhir.rest.server.provider.ProviderConstants;
|
import ca.uhn.fhir.rest.server.provider.ProviderConstants;
|
||||||
|
import ca.uhn.fhir.util.BundleBuilder;
|
||||||
import ca.uhn.fhir.validation.IResourceLoader;
|
import ca.uhn.fhir.validation.IResourceLoader;
|
||||||
import org.hl7.fhir.instance.model.api.IAnyResource;
|
import org.hl7.fhir.instance.model.api.IAnyResource;
|
||||||
|
import org.hl7.fhir.instance.model.api.IBase;
|
||||||
|
import org.hl7.fhir.instance.model.api.IBaseBackboneElement;
|
||||||
|
import org.hl7.fhir.instance.model.api.IBaseBundle;
|
||||||
|
import org.hl7.fhir.instance.model.api.IBaseDatatype;
|
||||||
|
import org.hl7.fhir.instance.model.api.IBaseExtension;
|
||||||
import org.hl7.fhir.instance.model.api.IBaseResource;
|
import org.hl7.fhir.instance.model.api.IBaseResource;
|
||||||
import org.hl7.fhir.instance.model.api.IIdType;
|
import org.hl7.fhir.instance.model.api.IIdType;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import javax.annotation.Nonnull;
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.util.Comparator;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
public class MdmControllerHelper {
|
public class MdmControllerHelper {
|
||||||
|
|
||||||
|
@ -42,12 +58,18 @@ public class MdmControllerHelper {
|
||||||
private final IResourceLoader myResourceLoader;
|
private final IResourceLoader myResourceLoader;
|
||||||
private final IMdmSettings myMdmSettings;
|
private final IMdmSettings myMdmSettings;
|
||||||
private final MessageHelper myMessageHelper;
|
private final MessageHelper myMessageHelper;
|
||||||
|
private final IMdmMatchFinderSvc myMdmMatchFinderSvc;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
public MdmControllerHelper(FhirContext theFhirContext, IResourceLoader theResourceLoader, IMdmSettings theMdmSettings, MessageHelper theMessageHelper) {
|
public MdmControllerHelper(FhirContext theFhirContext,
|
||||||
|
IResourceLoader theResourceLoader,
|
||||||
|
IMdmMatchFinderSvc theMdmMatchFinderSvc,
|
||||||
|
IMdmSettings theMdmSettings,
|
||||||
|
MessageHelper theMessageHelper) {
|
||||||
myFhirContext = theFhirContext;
|
myFhirContext = theFhirContext;
|
||||||
myResourceLoader = theResourceLoader;
|
myResourceLoader = theResourceLoader;
|
||||||
myMdmSettings = theMdmSettings;
|
myMdmSettings = theMdmSettings;
|
||||||
|
myMdmMatchFinderSvc = theMdmMatchFinderSvc;
|
||||||
myMessageHelper = theMessageHelper;
|
myMessageHelper = theMessageHelper;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -104,4 +126,58 @@ public class MdmControllerHelper {
|
||||||
throw new InvalidRequestException(myMessageHelper.getMessageForUnmanagedResource());
|
throw new InvalidRequestException(myMessageHelper.getMessageForUnmanagedResource());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helper method which will return a bundle of all Matches and Possible Matches.
|
||||||
|
*/
|
||||||
|
public IBaseBundle getMatchesAndPossibleMatchesForResource(IAnyResource theResource, String theResourceType) {
|
||||||
|
List<MatchedTarget> matches = myMdmMatchFinderSvc.getMatchedTargets(theResourceType, theResource);
|
||||||
|
matches.sort(Comparator.comparing((MatchedTarget m) -> m.getMatchResult().getNormalizedScore()).reversed());
|
||||||
|
|
||||||
|
BundleBuilder builder = new BundleBuilder(myFhirContext);
|
||||||
|
builder.setBundleField("type", "searchset");
|
||||||
|
builder.setBundleField("id", UUID.randomUUID().toString());
|
||||||
|
builder.setMetaField("lastUpdated", builder.newPrimitive("instant", new Date()));
|
||||||
|
|
||||||
|
IBaseBundle retVal = builder.getBundle();
|
||||||
|
for (MatchedTarget next : matches) {
|
||||||
|
boolean shouldKeepThisEntry = next.isMatch() || next.isPossibleMatch();
|
||||||
|
if (!shouldKeepThisEntry) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
IBase entry = builder.addEntry();
|
||||||
|
builder.addToEntry(entry, "resource", next.getTarget());
|
||||||
|
|
||||||
|
IBaseBackboneElement search = builder.addSearch(entry);
|
||||||
|
toBundleEntrySearchComponent(builder, search, next);
|
||||||
|
}
|
||||||
|
return retVal;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IBaseBackboneElement toBundleEntrySearchComponent(BundleBuilder theBuilder, IBaseBackboneElement theSearch, MatchedTarget theMatchedTarget) {
|
||||||
|
theBuilder.setSearchField(theSearch, "mode", "match");
|
||||||
|
double score = theMatchedTarget.getMatchResult().getNormalizedScore();
|
||||||
|
theBuilder.setSearchField(theSearch, "score",
|
||||||
|
theBuilder.newPrimitive("decimal", BigDecimal.valueOf(score)));
|
||||||
|
|
||||||
|
String matchGrade = getMatchGrade(theMatchedTarget);
|
||||||
|
IBaseDatatype codeType = (IBaseDatatype) myFhirContext.getElementDefinition("code").newInstance(matchGrade);
|
||||||
|
IBaseExtension searchExtension = theSearch.addExtension();
|
||||||
|
searchExtension.setUrl(MdmConstants.FIHR_STRUCTURE_DEF_MATCH_GRADE_URL_NAMESPACE);
|
||||||
|
searchExtension.setValue(codeType);
|
||||||
|
|
||||||
|
return theSearch;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nonnull
|
||||||
|
protected String getMatchGrade(MatchedTarget theTheMatchedTarget) {
|
||||||
|
String retVal = "probable";
|
||||||
|
if (theTheMatchedTarget.isMatch()) {
|
||||||
|
retVal = "certain";
|
||||||
|
} else if (theTheMatchedTarget.isPossibleMatch()) {
|
||||||
|
retVal = "possible";
|
||||||
|
}
|
||||||
|
return retVal;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -72,9 +72,9 @@ public class MdmProviderDstu3Plus extends BaseMdmProvider {
|
||||||
private static final Logger ourLog = getLogger(MdmProviderDstu3Plus.class);
|
private static final Logger ourLog = getLogger(MdmProviderDstu3Plus.class);
|
||||||
|
|
||||||
private final IMdmControllerSvc myMdmControllerSvc;
|
private final IMdmControllerSvc myMdmControllerSvc;
|
||||||
private final IMdmMatchFinderSvc myMdmMatchFinderSvc;
|
|
||||||
private final IMdmSubmitSvc myMdmSubmitSvc;
|
private final IMdmSubmitSvc myMdmSubmitSvc;
|
||||||
private final IMdmSettings myMdmSettings;
|
private final IMdmSettings myMdmSettings;
|
||||||
|
private final MdmControllerHelper myMdmControllerHelper;
|
||||||
|
|
||||||
public static final int DEFAULT_PAGE_SIZE = 20;
|
public static final int DEFAULT_PAGE_SIZE = 20;
|
||||||
public static final int MAX_PAGE_SIZE = 100;
|
public static final int MAX_PAGE_SIZE = 100;
|
||||||
|
@ -85,10 +85,14 @@ public class MdmProviderDstu3Plus extends BaseMdmProvider {
|
||||||
* Note that this is not a spring bean. Any necessary injections should
|
* Note that this is not a spring bean. Any necessary injections should
|
||||||
* happen in the constructor
|
* happen in the constructor
|
||||||
*/
|
*/
|
||||||
public MdmProviderDstu3Plus(FhirContext theFhirContext, IMdmControllerSvc theMdmControllerSvc, IMdmMatchFinderSvc theMdmMatchFinderSvc, IMdmSubmitSvc theMdmSubmitSvc, IMdmSettings theIMdmSettings) {
|
public MdmProviderDstu3Plus(FhirContext theFhirContext,
|
||||||
|
IMdmControllerSvc theMdmControllerSvc,
|
||||||
|
MdmControllerHelper theMdmHelper,
|
||||||
|
IMdmSubmitSvc theMdmSubmitSvc,
|
||||||
|
IMdmSettings theIMdmSettings) {
|
||||||
super(theFhirContext);
|
super(theFhirContext);
|
||||||
myMdmControllerSvc = theMdmControllerSvc;
|
myMdmControllerSvc = theMdmControllerSvc;
|
||||||
myMdmMatchFinderSvc = theMdmMatchFinderSvc;
|
myMdmControllerHelper = theMdmHelper;
|
||||||
myMdmSubmitSvc = theMdmSubmitSvc;
|
myMdmSubmitSvc = theMdmSubmitSvc;
|
||||||
myMdmSettings = theIMdmSettings;
|
myMdmSettings = theIMdmSettings;
|
||||||
}
|
}
|
||||||
|
@ -98,7 +102,7 @@ public class MdmProviderDstu3Plus extends BaseMdmProvider {
|
||||||
if (thePatient == null) {
|
if (thePatient == null) {
|
||||||
throw new InvalidRequestException("resource may not be null");
|
throw new InvalidRequestException("resource may not be null");
|
||||||
}
|
}
|
||||||
return getMatchesAndPossibleMatchesForResource(thePatient, "Patient");
|
return myMdmControllerHelper.getMatchesAndPossibleMatchesForResource(thePatient, "Patient");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Operation(name = ProviderConstants.MDM_MATCH)
|
@Operation(name = ProviderConstants.MDM_MATCH)
|
||||||
|
@ -108,51 +112,7 @@ public class MdmProviderDstu3Plus extends BaseMdmProvider {
|
||||||
if (theResource == null) {
|
if (theResource == null) {
|
||||||
throw new InvalidRequestException("resource may not be null");
|
throw new InvalidRequestException("resource may not be null");
|
||||||
}
|
}
|
||||||
return getMatchesAndPossibleMatchesForResource(theResource, theResourceType.getValueAsString());
|
return myMdmControllerHelper.getMatchesAndPossibleMatchesForResource(theResource, theResourceType.getValueAsString());
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Helper method which will return a bundle of all Matches and Possible Matches.
|
|
||||||
*/
|
|
||||||
private IBaseBundle getMatchesAndPossibleMatchesForResource(IAnyResource theResource, String theResourceType) {
|
|
||||||
List<MatchedTarget> matches = myMdmMatchFinderSvc.getMatchedTargets(theResourceType, theResource);
|
|
||||||
matches.sort(Comparator.comparing((MatchedTarget m) -> m.getMatchResult().getNormalizedScore()).reversed());
|
|
||||||
|
|
||||||
BundleBuilder builder = new BundleBuilder(myFhirContext);
|
|
||||||
builder.setBundleField("type", "searchset");
|
|
||||||
builder.setBundleField("id", UUID.randomUUID().toString());
|
|
||||||
builder.setMetaField("lastUpdated", builder.newPrimitive("instant", new Date()));
|
|
||||||
|
|
||||||
IBaseBundle retVal = builder.getBundle();
|
|
||||||
for (MatchedTarget next : matches) {
|
|
||||||
boolean shouldKeepThisEntry = next.isMatch() || next.isPossibleMatch();
|
|
||||||
if (!shouldKeepThisEntry) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
IBase entry = builder.addEntry();
|
|
||||||
builder.addToEntry(entry, "resource", next.getTarget());
|
|
||||||
|
|
||||||
IBaseBackboneElement search = builder.addSearch(entry);
|
|
||||||
toBundleEntrySearchComponent(builder, search, next);
|
|
||||||
}
|
|
||||||
return retVal;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public IBaseBackboneElement toBundleEntrySearchComponent(BundleBuilder theBuilder, IBaseBackboneElement theSearch, MatchedTarget theMatchedTarget) {
|
|
||||||
theBuilder.setSearchField(theSearch, "mode", "match");
|
|
||||||
double score = theMatchedTarget.getMatchResult().getNormalizedScore();
|
|
||||||
theBuilder.setSearchField(theSearch, "score",
|
|
||||||
theBuilder.newPrimitive("decimal", BigDecimal.valueOf(score)));
|
|
||||||
|
|
||||||
String matchGrade = getMatchGrade(theMatchedTarget);
|
|
||||||
IBaseDatatype codeType = (IBaseDatatype) myFhirContext.getElementDefinition("code").newInstance(matchGrade);
|
|
||||||
IBaseExtension searchExtension = theSearch.addExtension();
|
|
||||||
searchExtension.setUrl(MdmConstants.FIHR_STRUCTURE_DEF_MATCH_GRADE_URL_NAMESPACE);
|
|
||||||
searchExtension.setValue(codeType);
|
|
||||||
|
|
||||||
return theSearch;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Operation(name = ProviderConstants.MDM_MERGE_GOLDEN_RESOURCES)
|
@Operation(name = ProviderConstants.MDM_MERGE_GOLDEN_RESOURCES)
|
||||||
|
@ -353,17 +313,6 @@ public class MdmProviderDstu3Plus extends BaseMdmProvider {
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nonnull
|
|
||||||
protected String getMatchGrade(MatchedTarget theTheMatchedTarget) {
|
|
||||||
String retVal = "probable";
|
|
||||||
if (theTheMatchedTarget.isMatch()) {
|
|
||||||
retVal = "certain";
|
|
||||||
} else if (theTheMatchedTarget.isPossibleMatch()) {
|
|
||||||
retVal = "possible";
|
|
||||||
}
|
|
||||||
return retVal;
|
|
||||||
}
|
|
||||||
|
|
||||||
private String getResourceType(String theParamName, IPrimitiveType<String> theResourceId) {
|
private String getResourceType(String theParamName, IPrimitiveType<String> theResourceId) {
|
||||||
if (theResourceId != null) {
|
if (theResourceId != null) {
|
||||||
return getResourceType(theParamName, theResourceId.getValueAsString());
|
return getResourceType(theParamName, theResourceId.getValueAsString());
|
||||||
|
|
|
@ -39,7 +39,7 @@ public class MdmProviderLoader {
|
||||||
@Autowired
|
@Autowired
|
||||||
private ResourceProviderFactory myResourceProviderFactory;
|
private ResourceProviderFactory myResourceProviderFactory;
|
||||||
@Autowired
|
@Autowired
|
||||||
private IMdmMatchFinderSvc myMdmMatchFinderSvc;
|
private MdmControllerHelper myMdmControllerHelper;
|
||||||
@Autowired
|
@Autowired
|
||||||
private IMdmControllerSvc myMdmControllerSvc;
|
private IMdmControllerSvc myMdmControllerSvc;
|
||||||
@Autowired
|
@Autowired
|
||||||
|
@ -54,7 +54,11 @@ public class MdmProviderLoader {
|
||||||
case DSTU3:
|
case DSTU3:
|
||||||
case R4:
|
case R4:
|
||||||
myResourceProviderFactory.addSupplier(() -> {
|
myResourceProviderFactory.addSupplier(() -> {
|
||||||
myMdmProvider = new MdmProviderDstu3Plus(myFhirContext, myMdmControllerSvc, myMdmMatchFinderSvc, myMdmSubmitSvc, myMdmSettings);
|
myMdmProvider = new MdmProviderDstu3Plus(myFhirContext,
|
||||||
|
myMdmControllerSvc,
|
||||||
|
myMdmControllerHelper,
|
||||||
|
myMdmSubmitSvc,
|
||||||
|
myMdmSettings);
|
||||||
return myMdmProvider;
|
return myMdmProvider;
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in New Issue