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>
|
||||
*/
|
||||
@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";
|
||||
|
||||
/**
|
||||
|
|
|
@ -257,8 +257,16 @@ public class MdmConsumerConfig {
|
|||
}
|
||||
|
||||
@Bean
|
||||
MdmControllerHelper mdmProviderHelper(FhirContext theFhirContext, IResourceLoader theResourceLoader, IMdmSettings theMdmSettings, MessageHelper messageHelper) {
|
||||
return new MdmControllerHelper(theFhirContext, theResourceLoader, theMdmSettings, messageHelper);
|
||||
MdmControllerHelper mdmProviderHelper(FhirContext theFhirContext,
|
||||
IResourceLoader theResourceLoader,
|
||||
IMdmSettings theMdmSettings,
|
||||
IMdmMatchFinderSvc theMdmMatchFinderSvc,
|
||||
MessageHelper messageHelper) {
|
||||
return new MdmControllerHelper(theFhirContext,
|
||||
theResourceLoader,
|
||||
theMdmMatchFinderSvc,
|
||||
theMdmSettings,
|
||||
messageHelper);
|
||||
}
|
||||
|
||||
@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.IMdmMatchFinderSvc;
|
||||
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.rules.config.MdmSettings;
|
||||
import ca.uhn.fhir.mdm.util.MessageHelper;
|
||||
|
@ -29,8 +30,6 @@ import java.util.List;
|
|||
public abstract class BaseProviderR4Test extends BaseMdmR4Test {
|
||||
MdmProviderDstu3Plus myMdmProvider;
|
||||
@Autowired
|
||||
private IMdmMatchFinderSvc myMdmMatchFinderSvc;
|
||||
@Autowired
|
||||
private IMdmControllerSvc myMdmControllerSvc;
|
||||
@Autowired
|
||||
private IMdmClearJobSubmitter myMdmClearJobSubmitter;
|
||||
|
@ -39,6 +38,8 @@ public abstract class BaseProviderR4Test extends BaseMdmR4Test {
|
|||
@Autowired
|
||||
private MdmSettings myMdmSettings;
|
||||
@Autowired
|
||||
private MdmControllerHelper myMdmHelper;
|
||||
@Autowired
|
||||
BatchJobHelper myBatchJobHelper;
|
||||
@Autowired
|
||||
MessageHelper myMessageHelper;
|
||||
|
@ -55,7 +56,7 @@ public abstract class BaseProviderR4Test extends BaseMdmR4Test {
|
|||
|
||||
@BeforeEach
|
||||
public void before() {
|
||||
myMdmProvider = new MdmProviderDstu3Plus(myFhirContext, myMdmControllerSvc, myMdmMatchFinderSvc, myMdmSubmitSvc, myMdmSettings);
|
||||
myMdmProvider = new MdmProviderDstu3Plus(myFhirContext, myMdmControllerSvc, myMdmHelper, myMdmSubmitSvc, myMdmSettings);
|
||||
defaultScript = myMdmSettings.getScriptText();
|
||||
}
|
||||
|
||||
|
|
|
@ -21,20 +21,36 @@ package ca.uhn.fhir.mdm.provider;
|
|||
*/
|
||||
|
||||
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.MatchedTarget;
|
||||
import ca.uhn.fhir.mdm.api.MdmConstants;
|
||||
import ca.uhn.fhir.mdm.util.MdmResourceUtil;
|
||||
import ca.uhn.fhir.mdm.util.MessageHelper;
|
||||
import ca.uhn.fhir.model.primitive.IdDt;
|
||||
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
||||
import ca.uhn.fhir.rest.server.exceptions.ResourceVersionConflictException;
|
||||
import ca.uhn.fhir.rest.server.provider.ProviderConstants;
|
||||
import ca.uhn.fhir.util.BundleBuilder;
|
||||
import ca.uhn.fhir.validation.IResourceLoader;
|
||||
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.IIdType;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
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
|
||||
public class MdmControllerHelper {
|
||||
|
||||
|
@ -42,12 +58,18 @@ public class MdmControllerHelper {
|
|||
private final IResourceLoader myResourceLoader;
|
||||
private final IMdmSettings myMdmSettings;
|
||||
private final MessageHelper myMessageHelper;
|
||||
private final IMdmMatchFinderSvc myMdmMatchFinderSvc;
|
||||
|
||||
@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;
|
||||
myResourceLoader = theResourceLoader;
|
||||
myMdmSettings = theMdmSettings;
|
||||
myMdmMatchFinderSvc = theMdmMatchFinderSvc;
|
||||
myMessageHelper = theMessageHelper;
|
||||
}
|
||||
|
||||
|
@ -104,4 +126,58 @@ public class MdmControllerHelper {
|
|||
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 final IMdmControllerSvc myMdmControllerSvc;
|
||||
private final IMdmMatchFinderSvc myMdmMatchFinderSvc;
|
||||
private final IMdmSubmitSvc myMdmSubmitSvc;
|
||||
private final IMdmSettings myMdmSettings;
|
||||
private final MdmControllerHelper myMdmControllerHelper;
|
||||
|
||||
public static final int DEFAULT_PAGE_SIZE = 20;
|
||||
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
|
||||
* 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);
|
||||
myMdmControllerSvc = theMdmControllerSvc;
|
||||
myMdmMatchFinderSvc = theMdmMatchFinderSvc;
|
||||
myMdmControllerHelper = theMdmHelper;
|
||||
myMdmSubmitSvc = theMdmSubmitSvc;
|
||||
myMdmSettings = theIMdmSettings;
|
||||
}
|
||||
|
@ -98,7 +102,7 @@ public class MdmProviderDstu3Plus extends BaseMdmProvider {
|
|||
if (thePatient == null) {
|
||||
throw new InvalidRequestException("resource may not be null");
|
||||
}
|
||||
return getMatchesAndPossibleMatchesForResource(thePatient, "Patient");
|
||||
return myMdmControllerHelper.getMatchesAndPossibleMatchesForResource(thePatient, "Patient");
|
||||
}
|
||||
|
||||
@Operation(name = ProviderConstants.MDM_MATCH)
|
||||
|
@ -108,51 +112,7 @@ public class MdmProviderDstu3Plus extends BaseMdmProvider {
|
|||
if (theResource == null) {
|
||||
throw new InvalidRequestException("resource may not be null");
|
||||
}
|
||||
return 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;
|
||||
return myMdmControllerHelper.getMatchesAndPossibleMatchesForResource(theResource, theResourceType.getValueAsString());
|
||||
}
|
||||
|
||||
@Operation(name = ProviderConstants.MDM_MERGE_GOLDEN_RESOURCES)
|
||||
|
@ -353,17 +313,6 @@ public class MdmProviderDstu3Plus extends BaseMdmProvider {
|
|||
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) {
|
||||
if (theResourceId != null) {
|
||||
return getResourceType(theParamName, theResourceId.getValueAsString());
|
||||
|
|
|
@ -39,7 +39,7 @@ public class MdmProviderLoader {
|
|||
@Autowired
|
||||
private ResourceProviderFactory myResourceProviderFactory;
|
||||
@Autowired
|
||||
private IMdmMatchFinderSvc myMdmMatchFinderSvc;
|
||||
private MdmControllerHelper myMdmControllerHelper;
|
||||
@Autowired
|
||||
private IMdmControllerSvc myMdmControllerSvc;
|
||||
@Autowired
|
||||
|
@ -54,7 +54,11 @@ public class MdmProviderLoader {
|
|||
case DSTU3:
|
||||
case R4:
|
||||
myResourceProviderFactory.addSupplier(() -> {
|
||||
myMdmProvider = new MdmProviderDstu3Plus(myFhirContext, myMdmControllerSvc, myMdmMatchFinderSvc, myMdmSubmitSvc, myMdmSettings);
|
||||
myMdmProvider = new MdmProviderDstu3Plus(myFhirContext,
|
||||
myMdmControllerSvc,
|
||||
myMdmControllerHelper,
|
||||
myMdmSubmitSvc,
|
||||
myMdmSettings);
|
||||
return myMdmProvider;
|
||||
});
|
||||
break;
|
||||
|
|
Loading…
Reference in New Issue