Merge branch 'master' into npe_fix
This commit is contained in:
commit
d3d7c6e97e
|
@ -618,6 +618,48 @@ public abstract class BaseHapiFhirDao<T extends IBaseResource> extends BaseStora
|
||||||
skipUpdatingTags |= myConfig.getTagStorageMode() == DaoConfig.TagStorageModeEnum.INLINE;
|
skipUpdatingTags |= myConfig.getTagStorageMode() == DaoConfig.TagStorageModeEnum.INLINE;
|
||||||
|
|
||||||
if (!skipUpdatingTags) {
|
if (!skipUpdatingTags) {
|
||||||
|
changed |= updateTags(theTransactionDetails, theRequest, theResource, theEntity);
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
theEntity.setHashSha256(null);
|
||||||
|
bytes = null;
|
||||||
|
encoding = ResourceEncodingEnum.DEL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (thePerformIndexing && !changed) {
|
||||||
|
if (theEntity.getId() == null) {
|
||||||
|
changed = true;
|
||||||
|
} else if (myConfig.isMassIngestionMode()) {
|
||||||
|
|
||||||
|
// Don't check existing - We'll rely on the SHA256 hash only
|
||||||
|
|
||||||
|
} else if (theEntity.getVersion() == 1L && theEntity.getCurrentVersionEntity() == null) {
|
||||||
|
|
||||||
|
// No previous version if this is the first version
|
||||||
|
|
||||||
|
} else {
|
||||||
|
ResourceHistoryTable currentHistoryVersion = theEntity.getCurrentVersionEntity();
|
||||||
|
if (currentHistoryVersion == null) {
|
||||||
|
currentHistoryVersion = myResourceHistoryTableDao.findForIdAndVersionAndFetchProvenance(theEntity.getId(), theEntity.getVersion());
|
||||||
|
}
|
||||||
|
if (currentHistoryVersion == null || currentHistoryVersion.getResource() == null) {
|
||||||
|
changed = true;
|
||||||
|
} else {
|
||||||
|
changed = !Arrays.equals(currentHistoryVersion.getResource(), bytes);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
EncodedResource retVal = new EncodedResource();
|
||||||
|
retVal.setEncoding(encoding);
|
||||||
|
retVal.setResource(bytes);
|
||||||
|
retVal.setChanged(changed);
|
||||||
|
|
||||||
|
return retVal;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean updateTags(TransactionDetails theTransactionDetails, RequestDetails theRequest, IBaseResource theResource, ResourceTable theEntity) {
|
||||||
Set<ResourceTag> allDefs = new HashSet<>();
|
Set<ResourceTag> allDefs = new HashSet<>();
|
||||||
Set<ResourceTag> allTagsOld = getAllTagDefinitions(theEntity);
|
Set<ResourceTag> allTagsOld = getAllTagDefinitions(theEntity);
|
||||||
|
|
||||||
|
@ -657,48 +699,8 @@ public abstract class BaseHapiFhirDao<T extends IBaseResource> extends BaseStora
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
if (!allTagsOld.equals(allTagsNew)) {
|
|
||||||
changed = true;
|
|
||||||
}
|
|
||||||
theEntity.setHasTags(!allTagsNew.isEmpty());
|
theEntity.setHasTags(!allTagsNew.isEmpty());
|
||||||
}
|
return !allTagsOld.equals(allTagsNew);
|
||||||
|
|
||||||
} else {
|
|
||||||
theEntity.setHashSha256(null);
|
|
||||||
bytes = null;
|
|
||||||
encoding = ResourceEncodingEnum.DEL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (thePerformIndexing && changed == false) {
|
|
||||||
if (theEntity.getId() == null) {
|
|
||||||
changed = true;
|
|
||||||
} else if (myConfig.isMassIngestionMode()) {
|
|
||||||
|
|
||||||
// Don't check existing - We'll rely on the SHA256 hash only
|
|
||||||
|
|
||||||
} else if (theEntity.getVersion() == 1L && theEntity.getCurrentVersionEntity() == null) {
|
|
||||||
|
|
||||||
// No previous version if this is the first version
|
|
||||||
|
|
||||||
} else {
|
|
||||||
ResourceHistoryTable currentHistoryVersion = theEntity.getCurrentVersionEntity();
|
|
||||||
if (currentHistoryVersion == null) {
|
|
||||||
currentHistoryVersion = myResourceHistoryTableDao.findForIdAndVersionAndFetchProvenance(theEntity.getId(), theEntity.getVersion());
|
|
||||||
}
|
|
||||||
if (currentHistoryVersion == null || currentHistoryVersion.getResource() == null) {
|
|
||||||
changed = true;
|
|
||||||
} else {
|
|
||||||
changed = !Arrays.equals(currentHistoryVersion.getResource(), bytes);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
EncodedResource retVal = new EncodedResource();
|
|
||||||
retVal.setEncoding(encoding);
|
|
||||||
retVal.setResource(bytes);
|
|
||||||
retVal.setChanged(changed);
|
|
||||||
|
|
||||||
return retVal;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
|
@ -1288,52 +1290,8 @@ public abstract class BaseHapiFhirDao<T extends IBaseResource> extends BaseStora
|
||||||
postUpdate(entity, (T) theResource);
|
postUpdate(entity, (T) theResource);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Create history entry
|
|
||||||
*/
|
|
||||||
if (theCreateNewHistoryEntry) {
|
if (theCreateNewHistoryEntry) {
|
||||||
boolean versionedTags = getConfig().getTagStorageMode() == DaoConfig.TagStorageModeEnum.VERSIONED;
|
createHistoryEntry(theRequest, theResource, entity, changed);
|
||||||
final ResourceHistoryTable historyEntry = entity.toHistory(versionedTags);
|
|
||||||
historyEntry.setEncoding(changed.getEncoding());
|
|
||||||
historyEntry.setResource(changed.getResource());
|
|
||||||
|
|
||||||
ourLog.debug("Saving history entry {}", historyEntry.getIdDt());
|
|
||||||
myResourceHistoryTableDao.save(historyEntry);
|
|
||||||
|
|
||||||
// Save resource source
|
|
||||||
String source = null;
|
|
||||||
String requestId = theRequest != null ? theRequest.getRequestId() : null;
|
|
||||||
if (theResource != null) {
|
|
||||||
if (myContext.getVersion().getVersion().isEqualOrNewerThan(FhirVersionEnum.R4)) {
|
|
||||||
IBaseMetaType meta = theResource.getMeta();
|
|
||||||
source = MetaUtil.getSource(myContext, meta);
|
|
||||||
}
|
|
||||||
if (myContext.getVersion().getVersion().equals(FhirVersionEnum.DSTU3)) {
|
|
||||||
source = ((IBaseHasExtensions) theResource.getMeta())
|
|
||||||
.getExtension()
|
|
||||||
.stream()
|
|
||||||
.filter(t -> HapiExtensions.EXT_META_SOURCE.equals(t.getUrl()))
|
|
||||||
.filter(t -> t.getValue() instanceof IPrimitiveType)
|
|
||||||
.map(t -> ((IPrimitiveType<?>) t.getValue()).getValueAsString())
|
|
||||||
.findFirst()
|
|
||||||
.orElse(null);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
boolean haveSource = isNotBlank(source) && myConfig.getStoreMetaSourceInformation().isStoreSourceUri();
|
|
||||||
boolean haveRequestId = isNotBlank(requestId) && myConfig.getStoreMetaSourceInformation().isStoreRequestId();
|
|
||||||
if (haveSource || haveRequestId) {
|
|
||||||
ResourceHistoryProvenanceEntity provenance = new ResourceHistoryProvenanceEntity();
|
|
||||||
provenance.setResourceHistoryTable(historyEntry);
|
|
||||||
provenance.setResourceTable(entity);
|
|
||||||
provenance.setPartitionId(entity.getPartitionId());
|
|
||||||
if (haveRequestId) {
|
|
||||||
provenance.setRequestId(left(requestId, Constants.REQUEST_ID_LENGTH));
|
|
||||||
}
|
|
||||||
if (haveSource) {
|
|
||||||
provenance.setSourceUri(source);
|
|
||||||
}
|
|
||||||
myEntityManager.persist(provenance);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1415,6 +1373,51 @@ public abstract class BaseHapiFhirDao<T extends IBaseResource> extends BaseStora
|
||||||
return entity;
|
return entity;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void createHistoryEntry(RequestDetails theRequest, IBaseResource theResource, ResourceTable theEntity, EncodedResource theChanged) {
|
||||||
|
boolean versionedTags = getConfig().getTagStorageMode() == DaoConfig.TagStorageModeEnum.VERSIONED;
|
||||||
|
final ResourceHistoryTable historyEntry = theEntity.toHistory(versionedTags);
|
||||||
|
historyEntry.setEncoding(theChanged.getEncoding());
|
||||||
|
historyEntry.setResource(theChanged.getResource());
|
||||||
|
|
||||||
|
ourLog.debug("Saving history entry {}", historyEntry.getIdDt());
|
||||||
|
myResourceHistoryTableDao.save(historyEntry);
|
||||||
|
|
||||||
|
// Save resource source
|
||||||
|
String source = null;
|
||||||
|
String requestId = theRequest != null ? theRequest.getRequestId() : null;
|
||||||
|
if (theResource != null) {
|
||||||
|
if (myContext.getVersion().getVersion().isEqualOrNewerThan(FhirVersionEnum.R4)) {
|
||||||
|
IBaseMetaType meta = theResource.getMeta();
|
||||||
|
source = MetaUtil.getSource(myContext, meta);
|
||||||
|
}
|
||||||
|
if (myContext.getVersion().getVersion().equals(FhirVersionEnum.DSTU3)) {
|
||||||
|
source = ((IBaseHasExtensions) theResource.getMeta())
|
||||||
|
.getExtension()
|
||||||
|
.stream()
|
||||||
|
.filter(t -> HapiExtensions.EXT_META_SOURCE.equals(t.getUrl()))
|
||||||
|
.filter(t -> t.getValue() instanceof IPrimitiveType)
|
||||||
|
.map(t -> ((IPrimitiveType<?>) t.getValue()).getValueAsString())
|
||||||
|
.findFirst()
|
||||||
|
.orElse(null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
boolean haveSource = isNotBlank(source) && myConfig.getStoreMetaSourceInformation().isStoreSourceUri();
|
||||||
|
boolean haveRequestId = isNotBlank(requestId) && myConfig.getStoreMetaSourceInformation().isStoreRequestId();
|
||||||
|
if (haveSource || haveRequestId) {
|
||||||
|
ResourceHistoryProvenanceEntity provenance = new ResourceHistoryProvenanceEntity();
|
||||||
|
provenance.setResourceHistoryTable(historyEntry);
|
||||||
|
provenance.setResourceTable(theEntity);
|
||||||
|
provenance.setPartitionId(theEntity.getPartitionId());
|
||||||
|
if (haveRequestId) {
|
||||||
|
provenance.setRequestId(left(requestId, Constants.REQUEST_ID_LENGTH));
|
||||||
|
}
|
||||||
|
if (haveSource) {
|
||||||
|
provenance.setSourceUri(source);
|
||||||
|
}
|
||||||
|
myEntityManager.persist(provenance);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void validateIncomingResourceTypeMatchesExisting(IBaseResource theResource, ResourceTable entity) {
|
private void validateIncomingResourceTypeMatchesExisting(IBaseResource theResource, ResourceTable entity) {
|
||||||
String resourceType = myContext.getResourceType(theResource);
|
String resourceType = myContext.getResourceType(theResource);
|
||||||
if (!resourceType.equals(entity.getResourceType())) {
|
if (!resourceType.equals(entity.getResourceType())) {
|
||||||
|
|
|
@ -51,7 +51,6 @@ import ca.uhn.fhir.jpa.partition.SystemRequestDetails;
|
||||||
import ca.uhn.fhir.jpa.patch.FhirPatch;
|
import ca.uhn.fhir.jpa.patch.FhirPatch;
|
||||||
import ca.uhn.fhir.jpa.patch.JsonPatchUtils;
|
import ca.uhn.fhir.jpa.patch.JsonPatchUtils;
|
||||||
import ca.uhn.fhir.jpa.patch.XmlPatchUtils;
|
import ca.uhn.fhir.jpa.patch.XmlPatchUtils;
|
||||||
import ca.uhn.fhir.jpa.search.DatabaseBackedPagingProvider;
|
|
||||||
import ca.uhn.fhir.jpa.search.PersistedJpaBundleProvider;
|
import ca.uhn.fhir.jpa.search.PersistedJpaBundleProvider;
|
||||||
import ca.uhn.fhir.jpa.search.cache.SearchCacheStatusEnum;
|
import ca.uhn.fhir.jpa.search.cache.SearchCacheStatusEnum;
|
||||||
import ca.uhn.fhir.jpa.search.reindex.IResourceReindexingSvc;
|
import ca.uhn.fhir.jpa.search.reindex.IResourceReindexingSvc;
|
||||||
|
@ -1407,7 +1406,7 @@ public abstract class BaseHapiFhirResourceDao<T extends IBaseResource> extends B
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
translateSearchParams(theParams);
|
translateListSearchParams(theParams);
|
||||||
|
|
||||||
notifySearchInterceptors(theParams, theRequest);
|
notifySearchInterceptors(theParams, theRequest);
|
||||||
|
|
||||||
|
@ -1432,7 +1431,7 @@ public abstract class BaseHapiFhirResourceDao<T extends IBaseResource> extends B
|
||||||
return retVal;
|
return retVal;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void translateSearchParams(SearchParameterMap theParams) {
|
private void translateListSearchParams(SearchParameterMap theParams) {
|
||||||
Iterator<String> keyIterator = theParams.keySet().iterator();
|
Iterator<String> keyIterator = theParams.keySet().iterator();
|
||||||
|
|
||||||
// Translate _list=42 to _has=List:item:_id=42
|
// Translate _list=42 to _has=List:item:_id=42
|
||||||
|
|
Loading…
Reference in New Issue