From 426315f589b3cbb8530e309dcb4495ea46e13c13 Mon Sep 17 00:00:00 2001 From: "juan.marchionatto" Date: Thu, 26 Aug 2021 10:40:10 -0400 Subject: [PATCH 01/20] Consider last stored ValueSet not necessarily current version anymore. --- ...JpaPersistedResourceValidationSupport.java | 24 ++++++++ .../fhir/jpa/dao/data/ITermValueSetDao.java | 20 ++++++- .../ca/uhn/fhir/jpa/entity/TermValueSet.java | 13 ++++ .../fhir/jpa/term/BaseTermReadSvcImpl.java | 60 ++++++++++++++++--- .../term/TermCodeSystemStorageSvcImpl.java | 2 +- .../jpa/term/TermDeferredStorageSvcImpl.java | 20 ++++--- .../term/api/ITermCodeSystemStorageSvc.java | 11 +++- .../jpa/term/api/ITermDeferredStorageSvc.java | 3 +- .../uhn/fhir/jpa/term/api/ITermReadSvc.java | 15 +++-- .../jpa/term/api/ITermVersionAdapterSvc.java | 2 +- 10 files changed, 144 insertions(+), 26 deletions(-) diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/JpaPersistedResourceValidationSupport.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/JpaPersistedResourceValidationSupport.java index f1819cbbbb7..be05a547e9d 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/JpaPersistedResourceValidationSupport.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/JpaPersistedResourceValidationSupport.java @@ -25,6 +25,7 @@ import ca.uhn.fhir.context.FhirVersionEnum; import ca.uhn.fhir.context.support.IValidationSupport; import ca.uhn.fhir.jpa.api.dao.DaoRegistry; import ca.uhn.fhir.jpa.searchparam.SearchParameterMap; +import ca.uhn.fhir.jpa.term.api.ITermReadSvc; import ca.uhn.fhir.rest.api.SortOrderEnum; import ca.uhn.fhir.rest.api.SortSpec; import ca.uhn.fhir.rest.api.server.IBundleProvider; @@ -41,6 +42,7 @@ import org.hl7.fhir.r4.model.IdType; import org.hl7.fhir.r4.model.ImplementationGuide; import org.hl7.fhir.r4.model.Questionnaire; import org.hl7.fhir.r4.model.StructureDefinition; +import org.hl7.fhir.r4.model.UriType; import org.hl7.fhir.r4.model.ValueSet; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -51,6 +53,7 @@ import javax.annotation.PostConstruct; import javax.transaction.Transactional; import java.util.Arrays; import java.util.List; +import java.util.Optional; import java.util.concurrent.TimeUnit; import java.util.function.Supplier; @@ -71,6 +74,10 @@ public class JpaPersistedResourceValidationSupport implements IValidationSupport @Autowired private DaoRegistry myDaoRegistry; + + @Autowired + private ITermReadSvc myITermReadSvc; + private Class myCodeSystemType; private Class myStructureDefinitionType; private Class myValueSetType; @@ -97,9 +104,23 @@ public class JpaPersistedResourceValidationSupport implements IValidationSupport @Override public IBaseResource fetchValueSet(String theSystem) { + // if no version is present, we need to append the current version, + // if one exists, in case it is not the last loaded + theSystem = appendCurrentVersion(theSystem); return fetchResource(myValueSetType, theSystem); } + + private String appendCurrentVersion(String theSystem) { + // if version is included there is nothing to add here + if (theSystem.contains("|")) return theSystem; + + Optional currentVersionOpt = myITermReadSvc.getValueSetCurrentVersion(new UriType(theSystem)); + + return currentVersionOpt.map(ver -> theSystem + "|" + ver).orElse(theSystem); + } + + @Override public IBaseResource fetchStructureDefinition(String theUrl) { return fetchResource(myStructureDefinitionType, theUrl); @@ -174,6 +195,9 @@ public class JpaPersistedResourceValidationSupport implements IValidationSupport params.add(ValueSet.SP_VERSION, new TokenParam(theUri.substring(versionSeparator + 1))); params.add(ValueSet.SP_URL, new UriParam(theUri.substring(0, versionSeparator))); } else { + // last loaded ValueSet not necessarily is the current version anymore, so code should be executing + // this path only when there is no current version pointed for the ValueSet + ourLog.warn("Fetching ValueSet current version as last loaded"); params.add(ValueSet.SP_URL, new UriParam(theUri)); } params.setSort(new SortSpec("_lastUpdated").setOrder(SortOrderEnum.DESC)); diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/data/ITermValueSetDao.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/data/ITermValueSetDao.java index 2bb11d4f22a..fbdd1d86921 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/data/ITermValueSetDao.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/data/ITermValueSetDao.java @@ -44,14 +44,28 @@ public interface ITermValueSetDao extends JpaRepository { @Query("SELECT vs FROM TermValueSet vs WHERE vs.myExpansionStatus = :expansion_status") Slice findByExpansionStatus(Pageable pageable, @Param("expansion_status") TermValueSetPreExpansionStatusEnum theExpansionStatus); - @Query(value="SELECT vs FROM TermValueSet vs INNER JOIN ResourceTable r ON r.myId = vs.myResourcePid WHERE vs.myUrl = :url ORDER BY r.myUpdated DESC") - List findTermValueSetByUrl(Pageable thePage, @Param("url") String theUrl); - @Query("SELECT vs FROM TermValueSet vs WHERE vs.myUrl = :url AND vs.myVersion IS NULL") Optional findTermValueSetByUrlAndNullVersion(@Param("url") String theUrl); @Query("SELECT vs FROM TermValueSet vs WHERE vs.myUrl = :url AND vs.myVersion = :version") Optional findTermValueSetByUrlAndVersion(@Param("url") String theUrl, @Param("version") String theVersion); + /** + * Obtain the only ValueSet for the url which myIsCurrentVersion is true if one exists + * or the last loaded ValueSet for the url which version is null otherwise + */ + @Query("select vs FROM TermValueSet vs JOIN FETCH vs.myResource r WHERE vs.myUrl = :url AND (vs.myIsCurrentVersion is true or " + + "(vs.myIsCurrentVersion is false AND vs.myVersion is null AND not exists(" + + "FROM TermValueSet WHERE myUrl = :url AND myIsCurrentVersion is true )) ) order by r.myUpdated DESC") + List listTermValueSetsByUrlAndCurrentVersion(@Param("url") String theUrl, Pageable pageable); + /** + * This method uses the previous one to get a possible list of ValueSets and return the first if any + * because the query will obtain no more than one if one with the myCurrentVersion flag exists but + * could obtain more if one with that flag doesn't exist. For that reason the query is Pageable and ordered + */ + default Optional findTermValueSetByUrlAndCurrentVersion(@Param("url") String theUrl) { + List termValueSets = listTermValueSetsByUrlAndCurrentVersion(theUrl, Pageable.ofSize(1)); + return termValueSets.isEmpty()? Optional.empty() : Optional.of(termValueSets.get(0)); + } } diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/entity/TermValueSet.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/entity/TermValueSet.java index e11e041dae5..549388877dd 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/entity/TermValueSet.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/entity/TermValueSet.java @@ -26,6 +26,7 @@ import org.apache.commons.lang3.builder.EqualsBuilder; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; import org.hibernate.annotations.ColumnDefault; +import org.hibernate.annotations.OptimisticLock; import javax.annotation.Nonnull; import javax.persistence.*; @@ -85,6 +86,10 @@ public class TermValueSet implements Serializable { @Column(name = "EXPANSION_STATUS", nullable = false, length = MAX_EXPANSION_STATUS_LENGTH) private TermValueSetPreExpansionStatusEnum myExpansionStatus; + @OptimisticLock(excluded = true) + @Column(name = "CURRENT_VERSION") + private Boolean myIsCurrentVersion = false; + @Transient private transient Integer myHashCode; @@ -198,6 +203,14 @@ public class TermValueSet implements Serializable { return this; } + public Boolean getCurrentVersion() { + return myIsCurrentVersion; + } + + public void setCurrentVersion(Boolean theCurrentVersion) { + myIsCurrentVersion = theCurrentVersion; + } + @Override public boolean equals(Object theO) { if (this == theO) return true; diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/BaseTermReadSvcImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/BaseTermReadSvcImpl.java index 125fbe191c9..84f6eae61d1 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/BaseTermReadSvcImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/BaseTermReadSvcImpl.java @@ -68,6 +68,7 @@ import ca.uhn.fhir.jpa.term.api.ITermReadSvc; import ca.uhn.fhir.jpa.term.ex.ExpansionTooCostlyException; import ca.uhn.fhir.jpa.util.LogicUtil; import ca.uhn.fhir.rest.api.Constants; +import ca.uhn.fhir.rest.api.server.RequestDetails; import ca.uhn.fhir.rest.api.server.storage.ResourcePersistentId; import ca.uhn.fhir.rest.server.exceptions.InternalErrorException; import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException; @@ -117,6 +118,7 @@ import org.hl7.fhir.r4.model.Enumerations; import org.hl7.fhir.r4.model.Extension; import org.hl7.fhir.r4.model.IntegerType; import org.hl7.fhir.r4.model.StringType; +import org.hl7.fhir.r4.model.UriType; import org.hl7.fhir.r4.model.ValueSet; import org.hl7.fhir.r4.model.codesystems.ConceptSubsumptionOutcome; import org.quartz.JobExecutionContext; @@ -231,6 +233,9 @@ public abstract class BaseTermReadSvcImpl implements ITermReadSvc { @Autowired private ITermConceptMappingSvc myTermConceptMappingSvc; + @Autowired + private ITermValueSetDao myTermValueSetDao; + private volatile IValidationSupport myJpaValidationSupport; private volatile IValidationSupport myValidationSupport; @@ -445,12 +450,7 @@ public abstract class BaseTermReadSvcImpl implements ITermReadSvc { if (theValueSetToExpand.hasVersion()) { optionalTermValueSet = myValueSetDao.findTermValueSetByUrlAndVersion(theValueSetToExpand.getUrl(), theValueSetToExpand.getVersion()); } else { - List termValueSets = myValueSetDao.findTermValueSetByUrl(PageRequest.of(0, 1), theValueSetToExpand.getUrl()); - if (termValueSets.size() > 0) { - optionalTermValueSet = Optional.of(termValueSets.get(0)); - } else { - optionalTermValueSet = Optional.empty(); - } + optionalTermValueSet = myValueSetDao.findTermValueSetByUrlAndCurrentVersion(theValueSetToExpand.getUrl()); } } else { optionalTermValueSet = Optional.empty(); @@ -1884,7 +1884,7 @@ public abstract class BaseTermReadSvcImpl implements ITermReadSvc { @Override @Transactional - public void storeTermValueSet(ResourceTable theResourceTable, ValueSet theValueSet) { + public void storeTermValueSet(ResourceTable theResourceTable, ValueSet theValueSet , RequestDetails theRequestDetails) { ValidateUtil.isTrueOrThrowInvalidRequest(theResourceTable != null, "No resource supplied"); if (isPlaceholder(theValueSet)) { @@ -1904,6 +1904,13 @@ public abstract class BaseTermReadSvcImpl implements ITermReadSvc { termValueSet.setVersion(theValueSet.getVersion()); termValueSet.setName(theValueSet.hasName() ? theValueSet.getName() : null); + // value sets must be marked as current only when version is present and flag indicates that + if (theValueSet.getVersion() != null) { + if (ITermCodeSystemStorageSvc.isMakeVersionCurrent(theRequestDetails)) { + makeVersionCurrent(theValueSet); + } + } + // Delete version being replaced deleteValueSetForResource(theResourceTable); @@ -1940,6 +1947,31 @@ public abstract class BaseTermReadSvcImpl implements ITermReadSvc { } } + + private void makeVersionCurrent(ValueSet theValueSet) { + resetCurrentValueSetVersion(theValueSet); + + TermValueSet termValueSet = myTermValueSetDao.findTermValueSetByUrlAndVersion( + theValueSet.getUrl(), theValueSet.getVersion()) + .orElseThrow(() -> + new InternalErrorException("Couldn't retrieve TermValueSet with url: " + + theValueSet.getUrl() + " and version: " + theValueSet.getVersion() ) ); + + termValueSet.setCurrentVersion(true); + myTermValueSetDao.save(termValueSet); + } + + + private void resetCurrentValueSetVersion(ValueSet theValueSet) { + Optional termValueSetOpt = myTermValueSetDao.findTermValueSetByUrlAndCurrentVersion(theValueSet.getUrl()); + if (! termValueSetOpt.isPresent()) return; + + TermValueSet termValueSet = termValueSetOpt.get(); + termValueSet.setCurrentVersion(false); + myTermValueSetDao.save(termValueSet); + } + + @Override @Transactional public IFhirResourceDaoCodeSystem.SubsumesResult subsumes(IPrimitiveType theCodeA, IPrimitiveType theCodeB, @@ -2481,4 +2513,18 @@ public abstract class BaseTermReadSvcImpl implements ITermReadSvc { return termConcept; } + + @Override + @Transactional + public Optional getValueSetCurrentVersion(UriType theUrl) { + Optional termValueSetOpt = + myTermValueSetDao.findTermValueSetByUrlAndCurrentVersion(theUrl.getValueAsString()); + + if (! termValueSetOpt.isPresent() || StringUtils.isBlank(termValueSetOpt.get().getVersion())) { + return Optional.empty(); + } + + return termValueSetOpt.map(TermValueSet::getVersion); + } + } diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermCodeSystemStorageSvcImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermCodeSystemStorageSvcImpl.java index 01a4acb5bd4..e5a86ca0616 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermCodeSystemStorageSvcImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermCodeSystemStorageSvcImpl.java @@ -399,7 +399,7 @@ public class TermCodeSystemStorageSvcImpl implements ITermCodeSystemStorageSvc { theCodeSystemResource.getVersion(), theCodeSystemVersion, resource, theRequest); myDeferredStorageSvc.addConceptMapsToStorageQueue(theConceptMaps); - myDeferredStorageSvc.addValueSetsToStorageQueue(theValueSets); + myDeferredStorageSvc.addValueSetsToStorageQueue(theValueSets, theRequest); return csId; } diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermDeferredStorageSvcImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermDeferredStorageSvcImpl.java index 6e36e2fb331..930122d4f9e 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermDeferredStorageSvcImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermDeferredStorageSvcImpl.java @@ -37,6 +37,7 @@ import ca.uhn.fhir.jpa.model.sched.ScheduledJobDefinition; import ca.uhn.fhir.jpa.term.api.ITermCodeSystemStorageSvc; import ca.uhn.fhir.jpa.term.api.ITermDeferredStorageSvc; import ca.uhn.fhir.jpa.term.api.ITermVersionAdapterSvc; +import ca.uhn.fhir.rest.api.server.RequestDetails; import ca.uhn.fhir.util.StopWatch; import com.google.common.annotations.VisibleForTesting; import org.apache.commons.lang3.Validate; @@ -49,6 +50,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Slice; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.util.Pair; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; @@ -65,6 +67,7 @@ import java.util.UUID; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.TimeUnit; import java.util.function.Supplier; +import java.util.stream.Collectors; public class TermDeferredStorageSvcImpl implements ITermDeferredStorageSvc { @@ -72,7 +75,7 @@ public class TermDeferredStorageSvcImpl implements ITermDeferredStorageSvc { final private List myDeferredCodeSystemsDeletions = Collections.synchronizedList(new ArrayList<>()); final private Queue myDeferredCodeSystemVersionsDeletions = new ConcurrentLinkedQueue<>(); final private List myDeferredConcepts = Collections.synchronizedList(new ArrayList<>()); - final private List myDeferredValueSets = Collections.synchronizedList(new ArrayList<>()); + final private List> myDeferredValueSets = Collections.synchronizedList(new ArrayList<>()); final private List myDeferredConceptMaps = Collections.synchronizedList(new ArrayList<>()); final private List myConceptLinksToSaveLater = Collections.synchronizedList(new ArrayList<>()); @Autowired @@ -116,9 +119,9 @@ public class TermDeferredStorageSvcImpl implements ITermDeferredStorageSvc { } @Override - public void addValueSetsToStorageQueue(List theValueSets) { + public void addValueSetsToStorageQueue(List theValueSets, RequestDetails theRequestDetails) { Validate.notNull(theValueSets); - myDeferredValueSets.addAll(theValueSets); + myDeferredValueSets.addAll(theValueSets.stream().map(vs -> Pair.of(vs, theRequestDetails)).collect(Collectors.toList())); } @Override @@ -214,12 +217,15 @@ public class TermDeferredStorageSvcImpl implements ITermDeferredStorageSvc { } } + private void processDeferredValueSets() { int count = Math.min(myDeferredValueSets.size(), 200); - for (ValueSet nextValueSet : new ArrayList<>(myDeferredValueSets.subList(0, count))) { - ourLog.info("Creating ValueSet: {}", nextValueSet.getId()); - myTerminologyVersionAdapterSvc.createOrUpdateValueSet(nextValueSet); - myDeferredValueSets.remove(nextValueSet); + for (Pair nextPair : new ArrayList<>(myDeferredValueSets.subList(0, count))) { + ValueSet valueSet = nextPair.getFirst(); + RequestDetails requestDetails = nextPair.getSecond(); + ourLog.info("Creating ValueSet: {}", valueSet.getId()); + myTerminologyVersionAdapterSvc.createOrUpdateValueSet(valueSet, requestDetails); + myDeferredValueSets.remove(nextPair); } ourLog.info("Saved {} deferred ValueSet resources, have {} remaining", count, myDeferredValueSets.size()); } diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/api/ITermCodeSystemStorageSvc.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/api/ITermCodeSystemStorageSvc.java index 2c62f3d05b9..1f85e823720 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/api/ITermCodeSystemStorageSvc.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/api/ITermCodeSystemStorageSvc.java @@ -40,7 +40,16 @@ import java.util.List; */ public interface ITermCodeSystemStorageSvc { - static final String MAKE_LOADING_VERSION_CURRENT = "make.loading.version.current"; + String MAKE_LOADING_VERSION_CURRENT = "make.loading.version.current"; + + + /** + * Defaults to true when parameter is null or entry is not present in requestDetails.myUserData + */ + static boolean isMakeVersionCurrent(RequestDetails theRequestDetails) { + return theRequestDetails == null || + (boolean) theRequestDetails.getUserData().getOrDefault(MAKE_LOADING_VERSION_CURRENT, Boolean.TRUE); + } void deleteCodeSystem(TermCodeSystem theCodeSystem); diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/api/ITermDeferredStorageSvc.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/api/ITermDeferredStorageSvc.java index 91cdb11b7f6..5d7424aa19d 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/api/ITermDeferredStorageSvc.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/api/ITermDeferredStorageSvc.java @@ -25,6 +25,7 @@ import ca.uhn.fhir.jpa.entity.TermCodeSystemVersion; import ca.uhn.fhir.jpa.entity.TermConcept; import ca.uhn.fhir.jpa.entity.TermConceptParentChildLink; import ca.uhn.fhir.jpa.model.entity.ResourceTable; +import ca.uhn.fhir.rest.api.server.RequestDetails; import org.hl7.fhir.r4.model.ConceptMap; import org.hl7.fhir.r4.model.ValueSet; @@ -52,7 +53,7 @@ public interface ITermDeferredStorageSvc { void addConceptMapsToStorageQueue(List theConceptMaps); - void addValueSetsToStorageQueue(List theValueSets); + void addValueSetsToStorageQueue(List theValueSets, RequestDetails theRequestDetails); void deleteCodeSystem(TermCodeSystem theCodeSystem); diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/api/ITermReadSvc.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/api/ITermReadSvc.java index 0f04f62bd8e..0aec2dcb7eb 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/api/ITermReadSvc.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/api/ITermReadSvc.java @@ -4,12 +4,10 @@ import ca.uhn.fhir.context.support.ConceptValidationOptions; import ca.uhn.fhir.context.support.IValidationSupport; import ca.uhn.fhir.context.support.ValueSetExpansionOptions; import ca.uhn.fhir.jpa.api.dao.IFhirResourceDaoCodeSystem; -import ca.uhn.fhir.jpa.api.model.TranslationRequest; import ca.uhn.fhir.jpa.entity.TermConcept; -import ca.uhn.fhir.jpa.entity.TermConceptMapGroupElement; -import ca.uhn.fhir.jpa.entity.TermConceptMapGroupElementTarget; import ca.uhn.fhir.jpa.model.entity.ResourceTable; import ca.uhn.fhir.jpa.term.IValueSetConceptAccumulator; +import ca.uhn.fhir.rest.api.server.RequestDetails; import ca.uhn.fhir.util.FhirVersionIndependentConcept; import org.hl7.fhir.instance.model.api.IBaseCoding; import org.hl7.fhir.instance.model.api.IBaseDatatype; @@ -17,7 +15,7 @@ import org.hl7.fhir.instance.model.api.IBaseResource; import org.hl7.fhir.instance.model.api.IIdType; import org.hl7.fhir.instance.model.api.IPrimitiveType; import org.hl7.fhir.r4.model.CodeSystem; -import org.hl7.fhir.r4.model.ConceptMap; +import org.hl7.fhir.r4.model.UriType; import org.hl7.fhir.r4.model.ValueSet; import javax.annotation.Nonnull; @@ -91,7 +89,13 @@ public interface ITermReadSvc extends IValidationSupport { void deleteValueSetAndChildren(ResourceTable theResourceTable); - void storeTermValueSet(ResourceTable theResourceTable, ValueSet theValueSet); + + void storeTermValueSet(ResourceTable theResourceTable, ValueSet theValueSet, RequestDetails theRequestDetails); + + default void storeTermValueSet(ResourceTable theResourceTable, ValueSet theValueSet) { + storeTermValueSet(theResourceTable, theValueSet, null); + } + IFhirResourceDaoCodeSystem.SubsumesResult subsumes(IPrimitiveType theCodeA, IPrimitiveType theCodeB, IPrimitiveType theSystem, IBaseCoding theCodingA, IBaseCoding theCodingB); @@ -119,4 +123,5 @@ public interface ITermReadSvc extends IValidationSupport { */ CodeValidationResult codeSystemValidateCode(IIdType theCodeSystemId, String theValueSetUrl, String theVersion, String theCode, String theDisplay, IBaseDatatype theCoding, IBaseDatatype theCodeableConcept); + Optional getValueSetCurrentVersion(UriType theUrl); } diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/api/ITermVersionAdapterSvc.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/api/ITermVersionAdapterSvc.java index 1f763f5a6b9..e3b703f40b4 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/api/ITermVersionAdapterSvc.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/api/ITermVersionAdapterSvc.java @@ -41,6 +41,6 @@ public interface ITermVersionAdapterSvc { void createOrUpdateConceptMap(ConceptMap theNextConceptMap); - void createOrUpdateValueSet(ValueSet theValueSet); + void createOrUpdateValueSet(ValueSet theValueSet, RequestDetails theRequestDetails); } From f63f12e976814b7393e5f3d1484e58bac72412c9 Mon Sep 17 00:00:00 2001 From: "juan.marchionatto" Date: Fri, 27 Aug 2021 10:57:06 -0400 Subject: [PATCH 02/20] Use boolean parameter as DAO misinterprets RequestDetails --- .../jpa/dao/r4/FhirResourceDaoValueSetR4.java | 1 - .../fhir/jpa/term/BaseTermReadSvcImpl.java | 25 ++++--------------- .../term/TermCodeSystemStorageSvcImpl.java | 9 +++---- .../jpa/term/TermDeferredStorageSvcImpl.java | 15 ++++++----- .../jpa/term/TermVersionAdapterSvcDstu2.java | 2 +- .../jpa/term/TermVersionAdapterSvcDstu3.java | 11 +++++--- .../jpa/term/TermVersionAdapterSvcR4.java | 11 +++++--- .../jpa/term/TermVersionAdapterSvcR5.java | 11 +++++--- .../jpa/term/api/ITermDeferredStorageSvc.java | 3 +-- .../uhn/fhir/jpa/term/api/ITermReadSvc.java | 5 ++-- .../jpa/term/api/ITermVersionAdapterSvc.java | 2 +- 11 files changed, 45 insertions(+), 50 deletions(-) diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/r4/FhirResourceDaoValueSetR4.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/r4/FhirResourceDaoValueSetR4.java index 43226b5f2ff..82d2a97ccd4 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/r4/FhirResourceDaoValueSetR4.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/r4/FhirResourceDaoValueSetR4.java @@ -28,7 +28,6 @@ import ca.uhn.fhir.jpa.model.cross.IBasePersistedResource; import ca.uhn.fhir.jpa.model.entity.ResourceTable; import ca.uhn.fhir.rest.api.server.RequestDetails; import ca.uhn.fhir.rest.api.server.storage.TransactionDetails; -import ca.uhn.fhir.rest.server.exceptions.InternalErrorException; import org.hl7.fhir.instance.model.api.IBaseResource; import org.hl7.fhir.instance.model.api.IIdType; import org.hl7.fhir.instance.model.api.IPrimitiveType; diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/BaseTermReadSvcImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/BaseTermReadSvcImpl.java index b4487a7624d..b9ce7fa3597 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/BaseTermReadSvcImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/BaseTermReadSvcImpl.java @@ -68,7 +68,6 @@ import ca.uhn.fhir.jpa.term.api.ITermReadSvc; import ca.uhn.fhir.jpa.term.ex.ExpansionTooCostlyException; import ca.uhn.fhir.jpa.util.LogicUtil; import ca.uhn.fhir.rest.api.Constants; -import ca.uhn.fhir.rest.api.server.RequestDetails; import ca.uhn.fhir.rest.api.server.storage.ResourcePersistentId; import ca.uhn.fhir.rest.server.exceptions.InternalErrorException; import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException; @@ -1884,7 +1883,7 @@ public abstract class BaseTermReadSvcImpl implements ITermReadSvc { @Override @Transactional - public void storeTermValueSet(ResourceTable theResourceTable, ValueSet theValueSet , RequestDetails theRequestDetails) { + public void storeTermValueSet(ResourceTable theResourceTable, ValueSet theValueSet , boolean theMakeItCurrent) { ValidateUtil.isTrueOrThrowInvalidRequest(theResourceTable != null, "No resource supplied"); if (isPlaceholder(theValueSet)) { @@ -1903,12 +1902,12 @@ public abstract class BaseTermReadSvcImpl implements ITermReadSvc { termValueSet.setUrl(theValueSet.getUrl()); termValueSet.setVersion(theValueSet.getVersion()); termValueSet.setName(theValueSet.hasName() ? theValueSet.getName() : null); + termValueSet.setCurrentVersion(false); // value sets must be marked as current only when version is present and flag indicates that - if (theValueSet.getVersion() != null) { - if (ITermCodeSystemStorageSvc.isMakeVersionCurrent(theRequestDetails)) { - makeVersionCurrent(theValueSet); - } + if (theValueSet.getVersion() != null && theMakeItCurrent) { + resetCurrentValueSetVersion(theValueSet); + termValueSet.setCurrentVersion(true); } // Delete version being replaced @@ -1948,20 +1947,6 @@ public abstract class BaseTermReadSvcImpl implements ITermReadSvc { } - private void makeVersionCurrent(ValueSet theValueSet) { - resetCurrentValueSetVersion(theValueSet); - - TermValueSet termValueSet = myTermValueSetDao.findTermValueSetByUrlAndVersion( - theValueSet.getUrl(), theValueSet.getVersion()) - .orElseThrow(() -> - new InternalErrorException("Couldn't retrieve TermValueSet with url: " + - theValueSet.getUrl() + " and version: " + theValueSet.getVersion() ) ); - - termValueSet.setCurrentVersion(true); - myTermValueSetDao.save(termValueSet); - } - - private void resetCurrentValueSetVersion(ValueSet theValueSet) { Optional termValueSetOpt = myTermValueSetDao.findTermValueSetByUrlAndCurrentVersion(theValueSet.getUrl()); if (! termValueSetOpt.isPresent()) return; diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermCodeSystemStorageSvcImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermCodeSystemStorageSvcImpl.java index e5a86ca0616..a204f2d6080 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermCodeSystemStorageSvcImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermCodeSystemStorageSvcImpl.java @@ -399,7 +399,9 @@ public class TermCodeSystemStorageSvcImpl implements ITermCodeSystemStorageSvc { theCodeSystemResource.getVersion(), theCodeSystemVersion, resource, theRequest); myDeferredStorageSvc.addConceptMapsToStorageQueue(theConceptMaps); - myDeferredStorageSvc.addValueSetsToStorageQueue(theValueSets, theRequest); + + boolean isMakeVersionCurrent = ITermCodeSystemStorageSvc.isMakeVersionCurrent(theRequest); + myDeferredStorageSvc.addValueSetsToStorageQueue(theValueSets, isMakeVersionCurrent); return csId; } @@ -470,10 +472,7 @@ public class TermCodeSystemStorageSvcImpl implements ITermCodeSystemStorageSvc { codeSystemToStore = myCodeSystemVersionDao.saveAndFlush(codeSystemToStore); } - // defaults to true - boolean isMakeVersionCurrent = theRequestDetails == null || - (boolean) theRequestDetails.getUserData().getOrDefault(MAKE_LOADING_VERSION_CURRENT, Boolean.TRUE); - + boolean isMakeVersionCurrent = ITermCodeSystemStorageSvc.isMakeVersionCurrent(theRequestDetails); if (isMakeVersionCurrent) { codeSystem.setCurrentVersion(codeSystemToStore); if (codeSystem.getPid() == null) { diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermDeferredStorageSvcImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermDeferredStorageSvcImpl.java index 930122d4f9e..808138cd649 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermDeferredStorageSvcImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermDeferredStorageSvcImpl.java @@ -37,7 +37,6 @@ import ca.uhn.fhir.jpa.model.sched.ScheduledJobDefinition; import ca.uhn.fhir.jpa.term.api.ITermCodeSystemStorageSvc; import ca.uhn.fhir.jpa.term.api.ITermDeferredStorageSvc; import ca.uhn.fhir.jpa.term.api.ITermVersionAdapterSvc; -import ca.uhn.fhir.rest.api.server.RequestDetails; import ca.uhn.fhir.util.StopWatch; import com.google.common.annotations.VisibleForTesting; import org.apache.commons.lang3.Validate; @@ -75,7 +74,7 @@ public class TermDeferredStorageSvcImpl implements ITermDeferredStorageSvc { final private List myDeferredCodeSystemsDeletions = Collections.synchronizedList(new ArrayList<>()); final private Queue myDeferredCodeSystemVersionsDeletions = new ConcurrentLinkedQueue<>(); final private List myDeferredConcepts = Collections.synchronizedList(new ArrayList<>()); - final private List> myDeferredValueSets = Collections.synchronizedList(new ArrayList<>()); + final private List> myDeferredValueSets = Collections.synchronizedList(new ArrayList<>()); final private List myDeferredConceptMaps = Collections.synchronizedList(new ArrayList<>()); final private List myConceptLinksToSaveLater = Collections.synchronizedList(new ArrayList<>()); @Autowired @@ -119,9 +118,9 @@ public class TermDeferredStorageSvcImpl implements ITermDeferredStorageSvc { } @Override - public void addValueSetsToStorageQueue(List theValueSets, RequestDetails theRequestDetails) { + public void addValueSetsToStorageQueue(List theValueSets, boolean theMakeThemCurrent) { Validate.notNull(theValueSets); - myDeferredValueSets.addAll(theValueSets.stream().map(vs -> Pair.of(vs, theRequestDetails)).collect(Collectors.toList())); + myDeferredValueSets.addAll(theValueSets.stream().map(vs -> Pair.of(vs, theMakeThemCurrent)).collect(Collectors.toList())); } @Override @@ -220,11 +219,11 @@ public class TermDeferredStorageSvcImpl implements ITermDeferredStorageSvc { private void processDeferredValueSets() { int count = Math.min(myDeferredValueSets.size(), 200); - for (Pair nextPair : new ArrayList<>(myDeferredValueSets.subList(0, count))) { + for (Pair nextPair : new ArrayList<>(myDeferredValueSets.subList(0, count))) { ValueSet valueSet = nextPair.getFirst(); - RequestDetails requestDetails = nextPair.getSecond(); - ourLog.info("Creating ValueSet: {}", valueSet.getId()); - myTerminologyVersionAdapterSvc.createOrUpdateValueSet(valueSet, requestDetails); + boolean makeItCurrent = nextPair.getSecond(); + ourLog.info("Creating ValueSet: {} , {}making it current version", valueSet.getId(), (makeItCurrent ? "" : "not ")); + myTerminologyVersionAdapterSvc.createOrUpdateValueSet(valueSet, makeItCurrent); myDeferredValueSets.remove(nextPair); } ourLog.info("Saved {} deferred ValueSet resources, have {} remaining", count, myDeferredValueSets.size()); diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermVersionAdapterSvcDstu2.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermVersionAdapterSvcDstu2.java index 07d134461e2..61947b8460b 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermVersionAdapterSvcDstu2.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermVersionAdapterSvcDstu2.java @@ -40,7 +40,7 @@ public class TermVersionAdapterSvcDstu2 implements ITermVersionAdapterSvc { } @Override - public void createOrUpdateValueSet(ValueSet theValueSet, RequestDetails theRequestDetails) { + public void createOrUpdateValueSet(ValueSet theValueSet, boolean theMakeItCurrent) { throw new UnsupportedOperationException(); } diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermVersionAdapterSvcDstu3.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermVersionAdapterSvcDstu3.java index 891d9019ae5..047f40bee34 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermVersionAdapterSvcDstu3.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermVersionAdapterSvcDstu3.java @@ -23,6 +23,7 @@ package ca.uhn.fhir.jpa.term; import ca.uhn.fhir.jpa.api.dao.IFhirResourceDao; import ca.uhn.fhir.jpa.term.api.ITermVersionAdapterSvc; import ca.uhn.fhir.rest.api.server.RequestDetails; +import ca.uhn.fhir.rest.api.server.storage.TransactionDetails; import ca.uhn.fhir.rest.server.exceptions.InternalErrorException; import ca.uhn.fhir.util.UrlUtil; import org.hl7.fhir.convertors.advisors.impl.BaseAdvisor_30_40; @@ -37,6 +38,7 @@ import org.springframework.context.ApplicationContext; import org.springframework.context.event.ContextRefreshedEvent; import org.springframework.context.event.EventListener; +import static ca.uhn.fhir.jpa.term.api.ITermCodeSystemStorageSvc.MAKE_LOADING_VERSION_CURRENT; import static org.apache.commons.lang3.StringUtils.isBlank; public class TermVersionAdapterSvcDstu3 extends BaseTermVersionAdapterSvcImpl implements ITermVersionAdapterSvc { @@ -103,7 +105,7 @@ public class TermVersionAdapterSvcDstu3 extends BaseTermVersionAdapterSvcImpl im } @Override - public void createOrUpdateValueSet(org.hl7.fhir.r4.model.ValueSet theValueSet, RequestDetails theRequestDetails) { + public void createOrUpdateValueSet(org.hl7.fhir.r4.model.ValueSet theValueSet, boolean theMakeItCurrent) { ValueSet valueSetDstu3; try { valueSetDstu3 = (ValueSet) VersionConvertorFactory_30_40.convertResource(theValueSet, new BaseAdvisor_30_40(false)); @@ -111,11 +113,14 @@ public class TermVersionAdapterSvcDstu3 extends BaseTermVersionAdapterSvcImpl im throw new InternalErrorException(e); } + TransactionDetails txDetails = new TransactionDetails(); + txDetails.putUserData(MAKE_LOADING_VERSION_CURRENT, theMakeItCurrent); + if (isBlank(valueSetDstu3.getIdElement().getIdPart())) { String matchUrl = "ValueSet?url=" + UrlUtil.escapeUrlParam(theValueSet.getUrl()); - myValueSetResourceDao.update(valueSetDstu3, matchUrl, theRequestDetails); + myValueSetResourceDao.update(valueSetDstu3, matchUrl, true, false, null, txDetails); } else { - myValueSetResourceDao.update(valueSetDstu3, theRequestDetails); + myValueSetResourceDao.update(valueSetDstu3, null, true, false, null, txDetails); } } diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermVersionAdapterSvcR4.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermVersionAdapterSvcR4.java index 65162294e38..70ef2efbfbc 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermVersionAdapterSvcR4.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermVersionAdapterSvcR4.java @@ -23,6 +23,7 @@ package ca.uhn.fhir.jpa.term; import ca.uhn.fhir.jpa.api.dao.IFhirResourceDao; import ca.uhn.fhir.jpa.term.api.ITermVersionAdapterSvc; import ca.uhn.fhir.rest.api.server.RequestDetails; +import ca.uhn.fhir.rest.api.server.storage.TransactionDetails; import ca.uhn.fhir.util.UrlUtil; import org.hl7.fhir.instance.model.api.IIdType; import org.hl7.fhir.r4.model.CodeSystem; @@ -33,6 +34,7 @@ import org.springframework.context.ApplicationContext; import org.springframework.context.event.ContextRefreshedEvent; import org.springframework.context.event.EventListener; +import static ca.uhn.fhir.jpa.term.api.ITermCodeSystemStorageSvc.MAKE_LOADING_VERSION_CURRENT; import static org.apache.commons.lang3.StringUtils.isBlank; public class TermVersionAdapterSvcR4 extends BaseTermVersionAdapterSvcImpl implements ITermVersionAdapterSvc { @@ -81,12 +83,15 @@ public class TermVersionAdapterSvcR4 extends BaseTermVersionAdapterSvcImpl imple } @Override - public void createOrUpdateValueSet(org.hl7.fhir.r4.model.ValueSet theValueSet, RequestDetails theRequestDetails) { + public void createOrUpdateValueSet(org.hl7.fhir.r4.model.ValueSet theValueSet, boolean theMakeItCurrent) { + TransactionDetails txDetails = new TransactionDetails(); + txDetails.putUserData(MAKE_LOADING_VERSION_CURRENT, theMakeItCurrent); + if (isBlank(theValueSet.getIdElement().getIdPart())) { String matchUrl = "ValueSet?url=" + UrlUtil.escapeUrlParam(theValueSet.getUrl()); - myValueSetResourceDao.update(theValueSet, matchUrl, theRequestDetails); + myValueSetResourceDao.update(theValueSet, matchUrl, true, false, null, txDetails); } else { - myValueSetResourceDao.update(theValueSet, theRequestDetails); + myValueSetResourceDao.update(theValueSet, null, true, false, null, txDetails); } } diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermVersionAdapterSvcR5.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermVersionAdapterSvcR5.java index ebc5120823b..18ac5987e70 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermVersionAdapterSvcR5.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermVersionAdapterSvcR5.java @@ -23,6 +23,7 @@ package ca.uhn.fhir.jpa.term; import ca.uhn.fhir.jpa.api.dao.IFhirResourceDao; import ca.uhn.fhir.jpa.term.api.ITermVersionAdapterSvc; import ca.uhn.fhir.rest.api.server.RequestDetails; +import ca.uhn.fhir.rest.api.server.storage.TransactionDetails; import ca.uhn.fhir.util.UrlUtil; import org.hl7.fhir.convertors.advisors.impl.BaseAdvisor_40_50; import org.hl7.fhir.convertors.factory.VersionConvertorFactory_40_50; @@ -35,6 +36,7 @@ import org.springframework.context.ApplicationContext; import org.springframework.context.event.ContextRefreshedEvent; import org.springframework.context.event.EventListener; +import static ca.uhn.fhir.jpa.term.api.ITermCodeSystemStorageSvc.MAKE_LOADING_VERSION_CURRENT; import static org.apache.commons.lang3.StringUtils.isBlank; public class TermVersionAdapterSvcR5 extends BaseTermVersionAdapterSvcImpl implements ITermVersionAdapterSvc { @@ -88,15 +90,18 @@ public class TermVersionAdapterSvcR5 extends BaseTermVersionAdapterSvcImpl imple } @Override - public void createOrUpdateValueSet(org.hl7.fhir.r4.model.ValueSet theValueSet, RequestDetails theRequestDetails) { + public void createOrUpdateValueSet(org.hl7.fhir.r4.model.ValueSet theValueSet, boolean theMakeItCurrent) { ValueSet valueSetR4 = (ValueSet) VersionConvertorFactory_40_50.convertResource(theValueSet, new BaseAdvisor_40_50(false)); + TransactionDetails txDetails = new TransactionDetails(); + txDetails.putUserData(MAKE_LOADING_VERSION_CURRENT, theMakeItCurrent); + if (isBlank(theValueSet.getIdElement().getIdPart())) { String matchUrl = "ValueSet?url=" + UrlUtil.escapeUrlParam(theValueSet.getUrl()); - myValueSetResourceDao.update(valueSetR4, matchUrl, theRequestDetails); + myValueSetResourceDao.update(valueSetR4, matchUrl, true, false, null, txDetails); } else { - myValueSetResourceDao.update(valueSetR4, theRequestDetails); + myValueSetResourceDao.update(valueSetR4, null, true, false, null, txDetails); } } diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/api/ITermDeferredStorageSvc.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/api/ITermDeferredStorageSvc.java index 5d7424aa19d..6d13a10249e 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/api/ITermDeferredStorageSvc.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/api/ITermDeferredStorageSvc.java @@ -25,7 +25,6 @@ import ca.uhn.fhir.jpa.entity.TermCodeSystemVersion; import ca.uhn.fhir.jpa.entity.TermConcept; import ca.uhn.fhir.jpa.entity.TermConceptParentChildLink; import ca.uhn.fhir.jpa.model.entity.ResourceTable; -import ca.uhn.fhir.rest.api.server.RequestDetails; import org.hl7.fhir.r4.model.ConceptMap; import org.hl7.fhir.r4.model.ValueSet; @@ -53,7 +52,7 @@ public interface ITermDeferredStorageSvc { void addConceptMapsToStorageQueue(List theConceptMaps); - void addValueSetsToStorageQueue(List theValueSets, RequestDetails theRequestDetails); + void addValueSetsToStorageQueue(List theValueSets, boolean theMakeThemCurrent); void deleteCodeSystem(TermCodeSystem theCodeSystem); diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/api/ITermReadSvc.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/api/ITermReadSvc.java index 0aec2dcb7eb..6dbe1d0e603 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/api/ITermReadSvc.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/api/ITermReadSvc.java @@ -7,7 +7,6 @@ import ca.uhn.fhir.jpa.api.dao.IFhirResourceDaoCodeSystem; import ca.uhn.fhir.jpa.entity.TermConcept; import ca.uhn.fhir.jpa.model.entity.ResourceTable; import ca.uhn.fhir.jpa.term.IValueSetConceptAccumulator; -import ca.uhn.fhir.rest.api.server.RequestDetails; import ca.uhn.fhir.util.FhirVersionIndependentConcept; import org.hl7.fhir.instance.model.api.IBaseCoding; import org.hl7.fhir.instance.model.api.IBaseDatatype; @@ -90,10 +89,10 @@ public interface ITermReadSvc extends IValidationSupport { void deleteValueSetAndChildren(ResourceTable theResourceTable); - void storeTermValueSet(ResourceTable theResourceTable, ValueSet theValueSet, RequestDetails theRequestDetails); + void storeTermValueSet(ResourceTable theResourceTable, ValueSet theValueSet, boolean theMakeItCurrent); default void storeTermValueSet(ResourceTable theResourceTable, ValueSet theValueSet) { - storeTermValueSet(theResourceTable, theValueSet, null); + storeTermValueSet(theResourceTable, theValueSet, true); } diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/api/ITermVersionAdapterSvc.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/api/ITermVersionAdapterSvc.java index e3b703f40b4..1b528a5b9c3 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/api/ITermVersionAdapterSvc.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/api/ITermVersionAdapterSvc.java @@ -41,6 +41,6 @@ public interface ITermVersionAdapterSvc { void createOrUpdateConceptMap(ConceptMap theNextConceptMap); - void createOrUpdateValueSet(ValueSet theValueSet, RequestDetails theRequestDetails); + void createOrUpdateValueSet(ValueSet theValueSet, boolean makeItCurrent); } From 710343a59964d128032c288b69b62d884f8835ed Mon Sep 17 00:00:00 2001 From: "juan.marchionatto" Date: Tue, 31 Aug 2021 13:33:39 -0400 Subject: [PATCH 03/20] Use ForcedId to get current ValueSet version --- ...JpaPersistedResourceValidationSupport.java | 48 ++++++++----- .../fhir/jpa/dao/data/ITermValueSetDao.java | 43 +++++++----- .../ca/uhn/fhir/jpa/entity/TermValueSet.java | 30 ++++---- .../r4/BaseJpaResourceProviderValueSetR4.java | 18 ----- .../fhir/jpa/term/BaseTermReadSvcImpl.java | 68 +++++-------------- .../term/TermCodeSystemStorageSvcImpl.java | 4 +- .../jpa/term/TermDeferredStorageSvcImpl.java | 19 ++---- .../jpa/term/TermVersionAdapterSvcDstu2.java | 2 +- .../jpa/term/TermVersionAdapterSvcDstu3.java | 11 +-- .../jpa/term/TermVersionAdapterSvcR4.java | 11 +-- .../jpa/term/TermVersionAdapterSvcR5.java | 11 +-- .../jpa/term/api/ITermDeferredStorageSvc.java | 2 +- .../uhn/fhir/jpa/term/api/ITermReadSvc.java | 10 +-- .../jpa/term/api/ITermVersionAdapterSvc.java | 2 +- .../ca/uhn/fhir/jpa/dao/r5/BaseJpaR5Test.java | 2 +- .../tasks/HapiFhirJpaMigrationTasks.java | 7 -- 16 files changed, 110 insertions(+), 178 deletions(-) diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/JpaPersistedResourceValidationSupport.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/JpaPersistedResourceValidationSupport.java index be05a547e9d..e46fe36abf9 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/JpaPersistedResourceValidationSupport.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/JpaPersistedResourceValidationSupport.java @@ -25,15 +25,18 @@ import ca.uhn.fhir.context.FhirVersionEnum; import ca.uhn.fhir.context.support.IValidationSupport; import ca.uhn.fhir.jpa.api.dao.DaoRegistry; import ca.uhn.fhir.jpa.searchparam.SearchParameterMap; -import ca.uhn.fhir.jpa.term.api.ITermReadSvc; +import ca.uhn.fhir.model.primitive.IdDt; import ca.uhn.fhir.rest.api.SortOrderEnum; import ca.uhn.fhir.rest.api.SortSpec; import ca.uhn.fhir.rest.api.server.IBundleProvider; import ca.uhn.fhir.rest.param.StringParam; import ca.uhn.fhir.rest.param.TokenParam; import ca.uhn.fhir.rest.param.UriParam; +import ca.uhn.fhir.rest.server.exceptions.InternalErrorException; +import ca.uhn.fhir.rest.server.exceptions.ResourceNotFoundException; import com.github.benmanes.caffeine.cache.Cache; import com.github.benmanes.caffeine.cache.Caffeine; +import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.Validate; import org.hl7.fhir.instance.model.api.IAnyResource; import org.hl7.fhir.instance.model.api.IBaseResource; @@ -69,15 +72,15 @@ public class JpaPersistedResourceValidationSupport implements IValidationSupport private static final Logger ourLog = LoggerFactory.getLogger(JpaPersistedResourceValidationSupport.class); + public static final String LOINC_GENERIC_VALUESET_URL = "http://loinc.org/vs"; + public static final String LOINC_GENERIC_VALUESET_URL_PLUS_SLASH = LOINC_GENERIC_VALUESET_URL + "/"; + private final FhirContext myFhirContext; private final IBaseResource myNoMatch; @Autowired private DaoRegistry myDaoRegistry; - @Autowired - private ITermReadSvc myITermReadSvc; - private Class myCodeSystemType; private Class myStructureDefinitionType; private Class myValueSetType; @@ -104,20 +107,34 @@ public class JpaPersistedResourceValidationSupport implements IValidationSupport @Override public IBaseResource fetchValueSet(String theSystem) { - // if no version is present, we need to append the current version, - // if one exists, in case it is not the last loaded - theSystem = appendCurrentVersion(theSystem); - return fetchResource(myValueSetType, theSystem); + boolean isNotLoincCodeSystem = ! StringUtils.containsIgnoreCase(theSystem, "loinc"); + boolean hasVersion = theSystem.contains("|"); + boolean isForGenericValueSet = theSystem.equals(LOINC_GENERIC_VALUESET_URL); + if (isNotLoincCodeSystem || hasVersion || isForGenericValueSet) { + return fetchResource(myValueSetType, theSystem); + } + + // if no version is present, we need to fetch the resource for the current version if one exists, + // in case it is not the last loaded + Optional currentVSOpt = getValueSetCurrentVersion(new UriType(theSystem)); + return currentVSOpt.orElseThrow(() -> new ResourceNotFoundException( + "Couldn't find current version ValueSet for url: " + theSystem)); } + /** + * Obtains the current version of a ValueSet using the fact that the current + * version is always pointed by the ForcedId for the no-versioned VS + */ + public Optional getValueSetCurrentVersion(UriType theUrl) { + if (! theUrl.getValueAsString().startsWith(LOINC_GENERIC_VALUESET_URL)) return Optional.empty(); - private String appendCurrentVersion(String theSystem) { - // if version is included there is nothing to add here - if (theSystem.contains("|")) return theSystem; + if (!theUrl.getValue().startsWith(LOINC_GENERIC_VALUESET_URL_PLUS_SLASH)) { + throw new InternalErrorException("Don't know how to extract ForcedId from url: " + theUrl.getValueAsString()); + } - Optional currentVersionOpt = myITermReadSvc.getValueSetCurrentVersion(new UriType(theSystem)); - - return currentVersionOpt.map(ver -> theSystem + "|" + ver).orElse(theSystem); + String forcedId = theUrl.getValue().substring(LOINC_GENERIC_VALUESET_URL_PLUS_SLASH.length()); + IBaseResource valueSet = myDaoRegistry.getResourceDao(myValueSetType).read(new IdDt("ValueSet", forcedId)); + return Optional.ofNullable(valueSet); } @@ -195,9 +212,6 @@ public class JpaPersistedResourceValidationSupport implements IValidationSupport params.add(ValueSet.SP_VERSION, new TokenParam(theUri.substring(versionSeparator + 1))); params.add(ValueSet.SP_URL, new UriParam(theUri.substring(0, versionSeparator))); } else { - // last loaded ValueSet not necessarily is the current version anymore, so code should be executing - // this path only when there is no current version pointed for the ValueSet - ourLog.warn("Fetching ValueSet current version as last loaded"); params.add(ValueSet.SP_URL, new UriParam(theUri)); } params.setSort(new SortSpec("_lastUpdated").setOrder(SortOrderEnum.DESC)); diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/data/ITermValueSetDao.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/data/ITermValueSetDao.java index fbdd1d86921..ac37eac7525 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/data/ITermValueSetDao.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/data/ITermValueSetDao.java @@ -22,6 +22,7 @@ package ca.uhn.fhir.jpa.dao.data; import ca.uhn.fhir.jpa.entity.TermValueSet; import ca.uhn.fhir.jpa.entity.TermValueSetPreExpansionStatusEnum; +import org.apache.commons.lang3.StringUtils; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Slice; import org.springframework.data.jpa.repository.JpaRepository; @@ -31,6 +32,8 @@ import org.springframework.data.repository.query.Param; import java.util.List; import java.util.Optional; +import static ca.uhn.fhir.jpa.dao.JpaPersistedResourceValidationSupport.LOINC_GENERIC_VALUESET_URL; + public interface ITermValueSetDao extends JpaRepository { @Query("SELECT vs FROM TermValueSet vs WHERE vs.myResourcePid = :resource_pid") @@ -44,28 +47,32 @@ public interface ITermValueSetDao extends JpaRepository { @Query("SELECT vs FROM TermValueSet vs WHERE vs.myExpansionStatus = :expansion_status") Slice findByExpansionStatus(Pageable pageable, @Param("expansion_status") TermValueSetPreExpansionStatusEnum theExpansionStatus); + @Query(value="SELECT vs FROM TermValueSet vs INNER JOIN ResourceTable r ON r.myId = vs.myResourcePid WHERE vs.myUrl = :url ORDER BY r.myUpdated DESC") + List findTermValueSetByUrl(Pageable thePage, @Param("url") String theUrl); + + /** + * The current TermValueSet is not necessarily the last uploaded anymore, but we know which is the last VS resource + * because it is pointed by a specific ForcedId, so we locate current ValueSet as the one pointing to the current resource + */ + @Query(value="SELECT vs FROM ForcedId f, TermValueSet vs where f.myForcedId = :forcedId and vs.myResource = f.myResource") + Optional findTermValueSetByForcedId(@Param("forcedId") String theForcedId); + + default Optional findTermValueSetByUrl(@Param("url") String theUrl) { + if (theUrl.startsWith(LOINC_GENERIC_VALUESET_URL)) { + String forcedId = theUrl.substring(LOINC_GENERIC_VALUESET_URL.length()); + if (StringUtils.isBlank(forcedId)) return Optional.empty(); + return findTermValueSetByForcedId(forcedId); + } + + List tvsList = findTermValueSetByUrl(Pageable.ofSize(1), theUrl); + + return Optional.ofNullable(tvsList.size() == 1 ? tvsList.get(0) : null); + } + @Query("SELECT vs FROM TermValueSet vs WHERE vs.myUrl = :url AND vs.myVersion IS NULL") Optional findTermValueSetByUrlAndNullVersion(@Param("url") String theUrl); @Query("SELECT vs FROM TermValueSet vs WHERE vs.myUrl = :url AND vs.myVersion = :version") Optional findTermValueSetByUrlAndVersion(@Param("url") String theUrl, @Param("version") String theVersion); - /** - * Obtain the only ValueSet for the url which myIsCurrentVersion is true if one exists - * or the last loaded ValueSet for the url which version is null otherwise - */ - @Query("select vs FROM TermValueSet vs JOIN FETCH vs.myResource r WHERE vs.myUrl = :url AND (vs.myIsCurrentVersion is true or " + - "(vs.myIsCurrentVersion is false AND vs.myVersion is null AND not exists(" + - "FROM TermValueSet WHERE myUrl = :url AND myIsCurrentVersion is true )) ) order by r.myUpdated DESC") - List listTermValueSetsByUrlAndCurrentVersion(@Param("url") String theUrl, Pageable pageable); - - /** - * This method uses the previous one to get a possible list of ValueSets and return the first if any - * because the query will obtain no more than one if one with the myCurrentVersion flag exists but - * could obtain more if one with that flag doesn't exist. For that reason the query is Pageable and ordered - */ - default Optional findTermValueSetByUrlAndCurrentVersion(@Param("url") String theUrl) { - List termValueSets = listTermValueSetsByUrlAndCurrentVersion(theUrl, Pageable.ofSize(1)); - return termValueSets.isEmpty()? Optional.empty() : Optional.of(termValueSets.get(0)); - } } diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/entity/TermValueSet.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/entity/TermValueSet.java index 549388877dd..c42e6ca96e0 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/entity/TermValueSet.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/entity/TermValueSet.java @@ -26,10 +26,24 @@ import org.apache.commons.lang3.builder.EqualsBuilder; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; import org.hibernate.annotations.ColumnDefault; -import org.hibernate.annotations.OptimisticLock; import javax.annotation.Nonnull; -import javax.persistence.*; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.FetchType; +import javax.persistence.ForeignKey; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.OneToMany; +import javax.persistence.OneToOne; +import javax.persistence.SequenceGenerator; +import javax.persistence.Table; +import javax.persistence.Transient; +import javax.persistence.UniqueConstraint; import java.io.Serializable; import java.util.ArrayList; import java.util.List; @@ -86,10 +100,6 @@ public class TermValueSet implements Serializable { @Column(name = "EXPANSION_STATUS", nullable = false, length = MAX_EXPANSION_STATUS_LENGTH) private TermValueSetPreExpansionStatusEnum myExpansionStatus; - @OptimisticLock(excluded = true) - @Column(name = "CURRENT_VERSION") - private Boolean myIsCurrentVersion = false; - @Transient private transient Integer myHashCode; @@ -203,14 +213,6 @@ public class TermValueSet implements Serializable { return this; } - public Boolean getCurrentVersion() { - return myIsCurrentVersion; - } - - public void setCurrentVersion(Boolean theCurrentVersion) { - myIsCurrentVersion = theCurrentVersion; - } - @Override public boolean equals(Object theO) { if (this == theO) return true; diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/provider/r4/BaseJpaResourceProviderValueSetR4.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/provider/r4/BaseJpaResourceProviderValueSetR4.java index 6021db337e1..94cb8a684e2 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/provider/r4/BaseJpaResourceProviderValueSetR4.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/provider/r4/BaseJpaResourceProviderValueSetR4.java @@ -26,7 +26,6 @@ import ca.uhn.fhir.jpa.api.config.DaoConfig; import ca.uhn.fhir.jpa.api.dao.IFhirResourceDaoValueSet; import ca.uhn.fhir.jpa.model.util.JpaConstants; import ca.uhn.fhir.jpa.provider.BaseJpaResourceProviderValueSetDstu2; -import ca.uhn.fhir.jpa.term.api.ITermReadSvc; import ca.uhn.fhir.rest.annotation.IdParam; import ca.uhn.fhir.rest.annotation.Operation; import ca.uhn.fhir.rest.annotation.OperationParam; @@ -43,20 +42,14 @@ import org.hl7.fhir.r4.model.Parameters; import org.hl7.fhir.r4.model.StringType; import org.hl7.fhir.r4.model.UriType; import org.hl7.fhir.r4.model.ValueSet; -import org.springframework.beans.factory.annotation.Autowired; import javax.servlet.http.HttpServletRequest; -import java.util.Optional; - import static org.apache.commons.lang3.StringUtils.isNotBlank; public class BaseJpaResourceProviderValueSetR4 extends JpaResourceProviderR4 { private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(BaseJpaResourceProviderValueSetR4.class); - @Autowired - private ITermReadSvc myITermReadSvc; - @Operation(name = JpaConstants.OPERATION_EXPAND, idempotent = true) public ValueSet expand( HttpServletRequest theServletRequest, @@ -83,16 +76,6 @@ public class BaseJpaResourceProviderValueSetR4 extends JpaResourceProviderR4 currentVersionOpt = myITermReadSvc.getValueSetCurrentVersion(theUrl); - if (currentVersionOpt.isPresent()) { - theValueSetVersion = new StringType(currentVersionOpt.get()); - haveValueSetVersion = true; - } - } - ValueSetExpansionOptions options = createValueSetExpansionOptions(myDaoConfig, theOffset, theCount, theIncludeHierarchy, theFilter); startRequest(theServletRequest); @@ -115,7 +98,6 @@ public class BaseJpaResourceProviderValueSetR4 extends JpaResourceProviderR4 optionalExistingTermValueSetById = myValueSetDao.findByResourcePid(theResourceTable.getId()); + Optional optionalExistingTermValueSetById = myTermValueSetDao.findByResourcePid(theResourceTable.getId()); if (optionalExistingTermValueSetById.isPresent()) { TermValueSet existingTermValueSet = optionalExistingTermValueSetById.get(); @@ -351,7 +347,7 @@ public abstract class BaseTermReadSvcImpl implements ITermReadSvc { ourLog.info("Deleting existing TermValueSet[{}] and its children...", existingTermValueSet.getId()); myValueSetConceptDesignationDao.deleteByTermValueSetId(existingTermValueSet.getId()); myValueSetConceptDao.deleteByTermValueSetId(existingTermValueSet.getId()); - myValueSetDao.deleteById(existingTermValueSet.getId()); + myTermValueSetDao.deleteById(existingTermValueSet.getId()); ourLog.info("Done deleting existing TermValueSet[{}] and its children.", existingTermValueSet.getId()); } } @@ -447,9 +443,9 @@ public abstract class BaseTermReadSvcImpl implements ITermReadSvc { Optional optionalTermValueSet; if (theValueSetToExpand.hasUrl()) { if (theValueSetToExpand.hasVersion()) { - optionalTermValueSet = myValueSetDao.findTermValueSetByUrlAndVersion(theValueSetToExpand.getUrl(), theValueSetToExpand.getVersion()); + optionalTermValueSet = myTermValueSetDao.findTermValueSetByUrlAndVersion(theValueSetToExpand.getUrl(), theValueSetToExpand.getVersion()); } else { - optionalTermValueSet = myValueSetDao.findTermValueSetByUrlAndCurrentVersion(theValueSetToExpand.getUrl()); + optionalTermValueSet = myTermValueSetDao.findTermValueSetByUrl(theValueSetToExpand.getUrl()); } } else { optionalTermValueSet = Optional.empty(); @@ -1454,7 +1450,7 @@ public abstract class BaseTermReadSvcImpl implements ITermReadSvc { @Override public boolean isValueSetPreExpandedForCodeValidation(ValueSet theValueSet) { ResourcePersistentId valueSetResourcePid = myConceptStorageSvc.getValueSetResourcePid(theValueSet.getIdElement()); - Optional optionalTermValueSet = myValueSetDao.findByResourcePid(valueSetResourcePid.getIdAsLong()); + Optional optionalTermValueSet = myTermValueSetDao.findByResourcePid(valueSetResourcePid.getIdAsLong()); if (!optionalTermValueSet.isPresent()) { ourLog.warn("ValueSet is not present in terminology tables. Will perform in-memory code validation. {}", getValueSetInfo(theValueSet)); @@ -1759,7 +1755,7 @@ public abstract class BaseTermReadSvcImpl implements ITermReadSvc { TermValueSet termValueSet = optionalTermValueSet.get(); termValueSet.setExpansionStatus(TermValueSetPreExpansionStatusEnum.EXPANSION_IN_PROGRESS); - return myValueSetDao.saveAndFlush(termValueSet); + return myTermValueSetDao.saveAndFlush(termValueSet); }); if (valueSetToExpand == null) { return; @@ -1768,18 +1764,18 @@ public abstract class BaseTermReadSvcImpl implements ITermReadSvc { // We have a ValueSet to pre-expand. try { ValueSet valueSet = txTemplate.execute(t -> { - TermValueSet refreshedValueSetToExpand = myValueSetDao.findById(valueSetToExpand.getId()).orElseThrow(() -> new IllegalStateException("Unknown VS ID: " + valueSetToExpand.getId())); + TermValueSet refreshedValueSetToExpand = myTermValueSetDao.findById(valueSetToExpand.getId()).orElseThrow(() -> new IllegalStateException("Unknown VS ID: " + valueSetToExpand.getId())); return getValueSetFromResourceTable(refreshedValueSetToExpand.getResource()); }); assert valueSet != null; - ValueSetConceptAccumulator accumulator = new ValueSetConceptAccumulator(valueSetToExpand, myValueSetDao, myValueSetConceptDao, myValueSetConceptDesignationDao); + ValueSetConceptAccumulator accumulator = new ValueSetConceptAccumulator(valueSetToExpand, myTermValueSetDao, myValueSetConceptDao, myValueSetConceptDesignationDao); expandValueSet(null, valueSet, accumulator); // We are done with this ValueSet. txTemplate.execute(t -> { valueSetToExpand.setExpansionStatus(TermValueSetPreExpansionStatusEnum.EXPANDED); - myValueSetDao.saveAndFlush(valueSetToExpand); + myTermValueSetDao.saveAndFlush(valueSetToExpand); return null; }); @@ -1789,7 +1785,7 @@ public abstract class BaseTermReadSvcImpl implements ITermReadSvc { ourLog.error("Failed to pre-expand ValueSet: " + e.getMessage(), e); txTemplate.execute(t -> { valueSetToExpand.setExpansionStatus(TermValueSetPreExpansionStatusEnum.FAILED_TO_EXPAND); - myValueSetDao.saveAndFlush(valueSetToExpand); + myTermValueSetDao.saveAndFlush(valueSetToExpand); return null; }); } @@ -1872,7 +1868,7 @@ public abstract class BaseTermReadSvcImpl implements ITermReadSvc { private Optional getNextTermValueSetNotExpanded() { Optional retVal = Optional.empty(); - Slice page = myValueSetDao.findByExpansionStatus(PageRequest.of(0, 1), TermValueSetPreExpansionStatusEnum.NOT_EXPANDED); + Slice page = myTermValueSetDao.findByExpansionStatus(PageRequest.of(0, 1), TermValueSetPreExpansionStatusEnum.NOT_EXPANDED); if (!page.getContent().isEmpty()) { retVal = Optional.of(page.getContent().get(0)); @@ -1883,7 +1879,7 @@ public abstract class BaseTermReadSvcImpl implements ITermReadSvc { @Override @Transactional - public void storeTermValueSet(ResourceTable theResourceTable, ValueSet theValueSet , boolean theMakeItCurrent) { + public void storeTermValueSet(ResourceTable theResourceTable, ValueSet theValueSet) { ValidateUtil.isTrueOrThrowInvalidRequest(theResourceTable != null, "No resource supplied"); if (isPlaceholder(theValueSet)) { @@ -1902,13 +1898,6 @@ public abstract class BaseTermReadSvcImpl implements ITermReadSvc { termValueSet.setUrl(theValueSet.getUrl()); termValueSet.setVersion(theValueSet.getVersion()); termValueSet.setName(theValueSet.hasName() ? theValueSet.getName() : null); - termValueSet.setCurrentVersion(false); - - // value sets must be marked as current only when version is present and flag indicates that - if (theValueSet.getVersion() != null && theMakeItCurrent) { - resetCurrentValueSetVersion(theValueSet); - termValueSet.setCurrentVersion(true); - } // Delete version being replaced deleteValueSetForResource(theResourceTable); @@ -1920,13 +1909,13 @@ public abstract class BaseTermReadSvcImpl implements ITermReadSvc { String version = termValueSet.getVersion(); Optional optionalExistingTermValueSetByUrl; if (version != null) { - optionalExistingTermValueSetByUrl = myValueSetDao.findTermValueSetByUrlAndVersion(url, version); + optionalExistingTermValueSetByUrl = myTermValueSetDao.findTermValueSetByUrlAndVersion(url, version); } else { - optionalExistingTermValueSetByUrl = myValueSetDao.findTermValueSetByUrlAndNullVersion(url); + optionalExistingTermValueSetByUrl = myTermValueSetDao.findTermValueSetByUrlAndNullVersion(url); } if (!optionalExistingTermValueSetByUrl.isPresent()) { - myValueSetDao.save(termValueSet); + myTermValueSetDao.save(termValueSet); } else { TermValueSet existingTermValueSet = optionalExistingTermValueSetByUrl.get(); @@ -1946,17 +1935,6 @@ public abstract class BaseTermReadSvcImpl implements ITermReadSvc { } } - - private void resetCurrentValueSetVersion(ValueSet theValueSet) { - Optional termValueSetOpt = myTermValueSetDao.findTermValueSetByUrlAndCurrentVersion(theValueSet.getUrl()); - if (! termValueSetOpt.isPresent()) return; - - TermValueSet termValueSet = termValueSetOpt.get(); - termValueSet.setCurrentVersion(false); - myTermValueSetDao.save(termValueSet); - } - - @Override @Transactional public IFhirResourceDaoCodeSystem.SubsumesResult subsumes(IPrimitiveType theCodeA, IPrimitiveType theCodeB, @@ -2509,18 +2487,4 @@ public abstract class BaseTermReadSvcImpl implements ITermReadSvc { return theReqLang.equalsIgnoreCase(theStoredLang); } - - @Override - @Transactional - public Optional getValueSetCurrentVersion(UriType theUrl) { - Optional termValueSetOpt = - myTermValueSetDao.findTermValueSetByUrlAndCurrentVersion(theUrl.getValueAsString()); - - if (! termValueSetOpt.isPresent() || StringUtils.isBlank(termValueSetOpt.get().getVersion())) { - return Optional.empty(); - } - - return termValueSetOpt.map(TermValueSet::getVersion); - } - } diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermCodeSystemStorageSvcImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermCodeSystemStorageSvcImpl.java index a204f2d6080..6a4d72c0337 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermCodeSystemStorageSvcImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermCodeSystemStorageSvcImpl.java @@ -399,9 +399,7 @@ public class TermCodeSystemStorageSvcImpl implements ITermCodeSystemStorageSvc { theCodeSystemResource.getVersion(), theCodeSystemVersion, resource, theRequest); myDeferredStorageSvc.addConceptMapsToStorageQueue(theConceptMaps); - - boolean isMakeVersionCurrent = ITermCodeSystemStorageSvc.isMakeVersionCurrent(theRequest); - myDeferredStorageSvc.addValueSetsToStorageQueue(theValueSets, isMakeVersionCurrent); + myDeferredStorageSvc.addValueSetsToStorageQueue(theValueSets); return csId; } diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermDeferredStorageSvcImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermDeferredStorageSvcImpl.java index 808138cd649..6e36e2fb331 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermDeferredStorageSvcImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermDeferredStorageSvcImpl.java @@ -49,7 +49,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Slice; import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.util.Pair; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; @@ -66,7 +65,6 @@ import java.util.UUID; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.TimeUnit; import java.util.function.Supplier; -import java.util.stream.Collectors; public class TermDeferredStorageSvcImpl implements ITermDeferredStorageSvc { @@ -74,7 +72,7 @@ public class TermDeferredStorageSvcImpl implements ITermDeferredStorageSvc { final private List myDeferredCodeSystemsDeletions = Collections.synchronizedList(new ArrayList<>()); final private Queue myDeferredCodeSystemVersionsDeletions = new ConcurrentLinkedQueue<>(); final private List myDeferredConcepts = Collections.synchronizedList(new ArrayList<>()); - final private List> myDeferredValueSets = Collections.synchronizedList(new ArrayList<>()); + final private List myDeferredValueSets = Collections.synchronizedList(new ArrayList<>()); final private List myDeferredConceptMaps = Collections.synchronizedList(new ArrayList<>()); final private List myConceptLinksToSaveLater = Collections.synchronizedList(new ArrayList<>()); @Autowired @@ -118,9 +116,9 @@ public class TermDeferredStorageSvcImpl implements ITermDeferredStorageSvc { } @Override - public void addValueSetsToStorageQueue(List theValueSets, boolean theMakeThemCurrent) { + public void addValueSetsToStorageQueue(List theValueSets) { Validate.notNull(theValueSets); - myDeferredValueSets.addAll(theValueSets.stream().map(vs -> Pair.of(vs, theMakeThemCurrent)).collect(Collectors.toList())); + myDeferredValueSets.addAll(theValueSets); } @Override @@ -216,15 +214,12 @@ public class TermDeferredStorageSvcImpl implements ITermDeferredStorageSvc { } } - private void processDeferredValueSets() { int count = Math.min(myDeferredValueSets.size(), 200); - for (Pair nextPair : new ArrayList<>(myDeferredValueSets.subList(0, count))) { - ValueSet valueSet = nextPair.getFirst(); - boolean makeItCurrent = nextPair.getSecond(); - ourLog.info("Creating ValueSet: {} , {}making it current version", valueSet.getId(), (makeItCurrent ? "" : "not ")); - myTerminologyVersionAdapterSvc.createOrUpdateValueSet(valueSet, makeItCurrent); - myDeferredValueSets.remove(nextPair); + for (ValueSet nextValueSet : new ArrayList<>(myDeferredValueSets.subList(0, count))) { + ourLog.info("Creating ValueSet: {}", nextValueSet.getId()); + myTerminologyVersionAdapterSvc.createOrUpdateValueSet(nextValueSet); + myDeferredValueSets.remove(nextValueSet); } ourLog.info("Saved {} deferred ValueSet resources, have {} remaining", count, myDeferredValueSets.size()); } diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermVersionAdapterSvcDstu2.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermVersionAdapterSvcDstu2.java index 61947b8460b..6fad466ce7e 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermVersionAdapterSvcDstu2.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermVersionAdapterSvcDstu2.java @@ -40,7 +40,7 @@ public class TermVersionAdapterSvcDstu2 implements ITermVersionAdapterSvc { } @Override - public void createOrUpdateValueSet(ValueSet theValueSet, boolean theMakeItCurrent) { + public void createOrUpdateValueSet(ValueSet theValueSet) { throw new UnsupportedOperationException(); } diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermVersionAdapterSvcDstu3.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermVersionAdapterSvcDstu3.java index 047f40bee34..446a5188cfa 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermVersionAdapterSvcDstu3.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermVersionAdapterSvcDstu3.java @@ -23,7 +23,6 @@ package ca.uhn.fhir.jpa.term; import ca.uhn.fhir.jpa.api.dao.IFhirResourceDao; import ca.uhn.fhir.jpa.term.api.ITermVersionAdapterSvc; import ca.uhn.fhir.rest.api.server.RequestDetails; -import ca.uhn.fhir.rest.api.server.storage.TransactionDetails; import ca.uhn.fhir.rest.server.exceptions.InternalErrorException; import ca.uhn.fhir.util.UrlUtil; import org.hl7.fhir.convertors.advisors.impl.BaseAdvisor_30_40; @@ -38,7 +37,6 @@ import org.springframework.context.ApplicationContext; import org.springframework.context.event.ContextRefreshedEvent; import org.springframework.context.event.EventListener; -import static ca.uhn.fhir.jpa.term.api.ITermCodeSystemStorageSvc.MAKE_LOADING_VERSION_CURRENT; import static org.apache.commons.lang3.StringUtils.isBlank; public class TermVersionAdapterSvcDstu3 extends BaseTermVersionAdapterSvcImpl implements ITermVersionAdapterSvc { @@ -105,7 +103,7 @@ public class TermVersionAdapterSvcDstu3 extends BaseTermVersionAdapterSvcImpl im } @Override - public void createOrUpdateValueSet(org.hl7.fhir.r4.model.ValueSet theValueSet, boolean theMakeItCurrent) { + public void createOrUpdateValueSet(org.hl7.fhir.r4.model.ValueSet theValueSet) { ValueSet valueSetDstu3; try { valueSetDstu3 = (ValueSet) VersionConvertorFactory_30_40.convertResource(theValueSet, new BaseAdvisor_30_40(false)); @@ -113,14 +111,11 @@ public class TermVersionAdapterSvcDstu3 extends BaseTermVersionAdapterSvcImpl im throw new InternalErrorException(e); } - TransactionDetails txDetails = new TransactionDetails(); - txDetails.putUserData(MAKE_LOADING_VERSION_CURRENT, theMakeItCurrent); - if (isBlank(valueSetDstu3.getIdElement().getIdPart())) { String matchUrl = "ValueSet?url=" + UrlUtil.escapeUrlParam(theValueSet.getUrl()); - myValueSetResourceDao.update(valueSetDstu3, matchUrl, true, false, null, txDetails); + myValueSetResourceDao.update(valueSetDstu3, matchUrl); } else { - myValueSetResourceDao.update(valueSetDstu3, null, true, false, null, txDetails); + myValueSetResourceDao.update(valueSetDstu3); } } diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermVersionAdapterSvcR4.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermVersionAdapterSvcR4.java index 70ef2efbfbc..be3cf92be7e 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermVersionAdapterSvcR4.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermVersionAdapterSvcR4.java @@ -23,7 +23,6 @@ package ca.uhn.fhir.jpa.term; import ca.uhn.fhir.jpa.api.dao.IFhirResourceDao; import ca.uhn.fhir.jpa.term.api.ITermVersionAdapterSvc; import ca.uhn.fhir.rest.api.server.RequestDetails; -import ca.uhn.fhir.rest.api.server.storage.TransactionDetails; import ca.uhn.fhir.util.UrlUtil; import org.hl7.fhir.instance.model.api.IIdType; import org.hl7.fhir.r4.model.CodeSystem; @@ -34,7 +33,6 @@ import org.springframework.context.ApplicationContext; import org.springframework.context.event.ContextRefreshedEvent; import org.springframework.context.event.EventListener; -import static ca.uhn.fhir.jpa.term.api.ITermCodeSystemStorageSvc.MAKE_LOADING_VERSION_CURRENT; import static org.apache.commons.lang3.StringUtils.isBlank; public class TermVersionAdapterSvcR4 extends BaseTermVersionAdapterSvcImpl implements ITermVersionAdapterSvc { @@ -83,15 +81,12 @@ public class TermVersionAdapterSvcR4 extends BaseTermVersionAdapterSvcImpl imple } @Override - public void createOrUpdateValueSet(org.hl7.fhir.r4.model.ValueSet theValueSet, boolean theMakeItCurrent) { - TransactionDetails txDetails = new TransactionDetails(); - txDetails.putUserData(MAKE_LOADING_VERSION_CURRENT, theMakeItCurrent); - + public void createOrUpdateValueSet(org.hl7.fhir.r4.model.ValueSet theValueSet) { if (isBlank(theValueSet.getIdElement().getIdPart())) { String matchUrl = "ValueSet?url=" + UrlUtil.escapeUrlParam(theValueSet.getUrl()); - myValueSetResourceDao.update(theValueSet, matchUrl, true, false, null, txDetails); + myValueSetResourceDao.update(theValueSet, matchUrl); } else { - myValueSetResourceDao.update(theValueSet, null, true, false, null, txDetails); + myValueSetResourceDao.update(theValueSet); } } diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermVersionAdapterSvcR5.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermVersionAdapterSvcR5.java index 18ac5987e70..93e96974d27 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermVersionAdapterSvcR5.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermVersionAdapterSvcR5.java @@ -23,7 +23,6 @@ package ca.uhn.fhir.jpa.term; import ca.uhn.fhir.jpa.api.dao.IFhirResourceDao; import ca.uhn.fhir.jpa.term.api.ITermVersionAdapterSvc; import ca.uhn.fhir.rest.api.server.RequestDetails; -import ca.uhn.fhir.rest.api.server.storage.TransactionDetails; import ca.uhn.fhir.util.UrlUtil; import org.hl7.fhir.convertors.advisors.impl.BaseAdvisor_40_50; import org.hl7.fhir.convertors.factory.VersionConvertorFactory_40_50; @@ -36,7 +35,6 @@ import org.springframework.context.ApplicationContext; import org.springframework.context.event.ContextRefreshedEvent; import org.springframework.context.event.EventListener; -import static ca.uhn.fhir.jpa.term.api.ITermCodeSystemStorageSvc.MAKE_LOADING_VERSION_CURRENT; import static org.apache.commons.lang3.StringUtils.isBlank; public class TermVersionAdapterSvcR5 extends BaseTermVersionAdapterSvcImpl implements ITermVersionAdapterSvc { @@ -90,18 +88,15 @@ public class TermVersionAdapterSvcR5 extends BaseTermVersionAdapterSvcImpl imple } @Override - public void createOrUpdateValueSet(org.hl7.fhir.r4.model.ValueSet theValueSet, boolean theMakeItCurrent) { + public void createOrUpdateValueSet(org.hl7.fhir.r4.model.ValueSet theValueSet) { ValueSet valueSetR4 = (ValueSet) VersionConvertorFactory_40_50.convertResource(theValueSet, new BaseAdvisor_40_50(false)); - TransactionDetails txDetails = new TransactionDetails(); - txDetails.putUserData(MAKE_LOADING_VERSION_CURRENT, theMakeItCurrent); - if (isBlank(theValueSet.getIdElement().getIdPart())) { String matchUrl = "ValueSet?url=" + UrlUtil.escapeUrlParam(theValueSet.getUrl()); - myValueSetResourceDao.update(valueSetR4, matchUrl, true, false, null, txDetails); + myValueSetResourceDao.update(valueSetR4, matchUrl); } else { - myValueSetResourceDao.update(valueSetR4, null, true, false, null, txDetails); + myValueSetResourceDao.update(valueSetR4); } } diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/api/ITermDeferredStorageSvc.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/api/ITermDeferredStorageSvc.java index 6d13a10249e..91cdb11b7f6 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/api/ITermDeferredStorageSvc.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/api/ITermDeferredStorageSvc.java @@ -52,7 +52,7 @@ public interface ITermDeferredStorageSvc { void addConceptMapsToStorageQueue(List theConceptMaps); - void addValueSetsToStorageQueue(List theValueSets, boolean theMakeThemCurrent); + void addValueSetsToStorageQueue(List theValueSets); void deleteCodeSystem(TermCodeSystem theCodeSystem); diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/api/ITermReadSvc.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/api/ITermReadSvc.java index 6dbe1d0e603..b8e93b2e97f 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/api/ITermReadSvc.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/api/ITermReadSvc.java @@ -14,7 +14,6 @@ import org.hl7.fhir.instance.model.api.IBaseResource; import org.hl7.fhir.instance.model.api.IIdType; import org.hl7.fhir.instance.model.api.IPrimitiveType; import org.hl7.fhir.r4.model.CodeSystem; -import org.hl7.fhir.r4.model.UriType; import org.hl7.fhir.r4.model.ValueSet; import javax.annotation.Nonnull; @@ -88,13 +87,7 @@ public interface ITermReadSvc extends IValidationSupport { void deleteValueSetAndChildren(ResourceTable theResourceTable); - - void storeTermValueSet(ResourceTable theResourceTable, ValueSet theValueSet, boolean theMakeItCurrent); - - default void storeTermValueSet(ResourceTable theResourceTable, ValueSet theValueSet) { - storeTermValueSet(theResourceTable, theValueSet, true); - } - + void storeTermValueSet(ResourceTable theResourceTable, ValueSet theValueSet); IFhirResourceDaoCodeSystem.SubsumesResult subsumes(IPrimitiveType theCodeA, IPrimitiveType theCodeB, IPrimitiveType theSystem, IBaseCoding theCodingA, IBaseCoding theCodingB); @@ -122,5 +115,4 @@ public interface ITermReadSvc extends IValidationSupport { */ CodeValidationResult codeSystemValidateCode(IIdType theCodeSystemId, String theValueSetUrl, String theVersion, String theCode, String theDisplay, IBaseDatatype theCoding, IBaseDatatype theCodeableConcept); - Optional getValueSetCurrentVersion(UriType theUrl); } diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/api/ITermVersionAdapterSvc.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/api/ITermVersionAdapterSvc.java index 1b528a5b9c3..1f763f5a6b9 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/api/ITermVersionAdapterSvc.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/api/ITermVersionAdapterSvc.java @@ -41,6 +41,6 @@ public interface ITermVersionAdapterSvc { void createOrUpdateConceptMap(ConceptMap theNextConceptMap); - void createOrUpdateValueSet(ValueSet theValueSet, boolean makeItCurrent); + void createOrUpdateValueSet(ValueSet theValueSet); } diff --git a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/r5/BaseJpaR5Test.java b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/r5/BaseJpaR5Test.java index c97c0f682e6..8f00ee5a1d7 100644 --- a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/r5/BaseJpaR5Test.java +++ b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/r5/BaseJpaR5Test.java @@ -571,7 +571,7 @@ public abstract class BaseJpaR5Test extends BaseJpaTest implements ITestDataBuil public List getExpandedConceptsByValueSetUrl(String theValuesetUrl) { return runInTransaction(() -> { - Optional valueSetOpt = myTermValueSetDao.findTermValueSetByUrlAndCurrentVersion(theValuesetUrl); + Optional valueSetOpt = myTermValueSetDao.findTermValueSetByUrl(theValuesetUrl); assertTrue(valueSetOpt.isPresent()); TermValueSet valueSet = valueSetOpt.get(); List concepts = valueSet.getConcepts(); diff --git a/hapi-fhir-jpaserver-migrate/src/main/java/ca/uhn/fhir/jpa/migrate/tasks/HapiFhirJpaMigrationTasks.java b/hapi-fhir-jpaserver-migrate/src/main/java/ca/uhn/fhir/jpa/migrate/tasks/HapiFhirJpaMigrationTasks.java index 1cedc83eabc..dcd04dcad57 100644 --- a/hapi-fhir-jpaserver-migrate/src/main/java/ca/uhn/fhir/jpa/migrate/tasks/HapiFhirJpaMigrationTasks.java +++ b/hapi-fhir-jpaserver-migrate/src/main/java/ca/uhn/fhir/jpa/migrate/tasks/HapiFhirJpaMigrationTasks.java @@ -122,15 +122,8 @@ public class HapiFhirJpaMigrationTasks extends BaseMigrationTasks { cmbTokNuTable.addColumn("20210722.1", "PARTITION_ID").nullable().type(ColumnTypeEnum.INT); cmbTokNuTable.addColumn("20210722.2", "PARTITION_DATE").nullable().type(ColumnTypeEnum.DATE_ONLY); cmbTokNuTable.modifyColumn("20210722.3", "RES_ID").nullable().withType(ColumnTypeEnum.LONG); - - version.onTable("TRM_VALUESET") - .addColumn("20210820.1", "CURRENT_VERSION").nullable().type(ColumnTypeEnum.BOOLEAN); - - //todo JM Add new column initialization and validate boolean in Oracle - } - private void init540() { Builder version = forVersion(VersionEnum.V5_4_0); From d7fde3f984d1298c6ce89af7ad43f327581eb26b Mon Sep 17 00:00:00 2001 From: "juan.marchionatto" Date: Fri, 10 Sep 2021 09:32:47 -0400 Subject: [PATCH 04/20] Simplify implementation. Add tests. --- ...JpaPersistedResourceValidationSupport.java | 7 +- .../fhir/jpa/dao/data/ITermValueSetDao.java | 20 +- .../ca/uhn/fhir/jpa/entity/TermValueSet.java | 17 +- .../fhir/jpa/term/BaseTermReadSvcImpl.java | 30 +- .../uhn/fhir/jpa/term/TermLoaderSvcImpl.java | 5 +- .../uhn/fhir/jpa/term/api/ITermReadSvc.java | 5 + .../term/loinc/LoincUploadPropertiesEnum.java | 1 + .../ca/uhn/fhir/jpa/dao/r5/BaseJpaR5Test.java | 2 +- ...erminologySvcImplCurrentVersionR4Test.java | 701 +++++++++++++++--- .../fhir/jpa/term/ZipCollectionBuilder.java | 36 +- .../loinc-ver/loincupload.properties | 93 +++ .../loincupload_singlepartlink.properties | 82 ++ .../AccessoryFiles/AnswerFile/AnswerList.csv | 12 + .../AnswerFile/LoincAnswerListLink.csv | 11 + .../ConsumerName/ConsumerName.csv | 6 + .../DocumentOntology/DocumentOntology.csv | 10 + .../AccessoryFiles/GroupFile/Group.csv | 2 + .../GroupFile/GroupLoincTerms.csv | 3 + .../AccessoryFiles/GroupFile/ParentGroup.csv | 2 + .../ImagingDocuments/ImagingDocumentCodes.csv | 10 + .../LinguisticVariants/LinguisticVariants.csv | 9 + .../deAT24LinguisticVariant.csv | 4 + .../frCA8LinguisticVariant.csv | 6 + .../zhCN5LinguisticVariant.csv | 9 + ...LoincIeeeMedicalDeviceCodeMappingTable.csv | 10 + .../LoincRsnaRadiologyPlaybook.csv | 10 + .../LoincUniversalLabOrdersValueSet.csv | 10 + .../MultiAxialHierarchy.csv | 10 + .../PanelsAndForms/AnswerList.csv | 12 + .../AccessoryFiles/PanelsAndForms/Loinc.csv | 16 + .../PanelsAndForms/LoincAnswerListLink.csv | 11 + .../AccessoryFiles/PartFile/LoincPartLink.csv | 10 + .../PartFile/LoincPartLink_Primary.csv | 7 + .../PartFile/LoincPartLink_Supplementary.csv | 13 + .../AccessoryFiles/PartFile/Part.csv | 46 ++ .../PartFile/PartRelatedCodeMapping.csv | 12 + .../SI/Top2000CommonLabResultsSi.csv | 10 + .../US/Top2000CommonLabResultsUs.csv | 10 + .../v-no-version/LoincTable/Loinc.csv | 16 + .../loinc-ver/v-no-version}/loinc.xml | 67 +- .../AccessoryFiles/AnswerFile/AnswerList.csv | 12 + .../AnswerFile/LoincAnswerListLink.csv | 11 + .../ConsumerName/ConsumerName.csv | 6 + .../DocumentOntology/DocumentOntology.csv | 10 + .../v267/AccessoryFiles/GroupFile/Group.csv | 2 + .../GroupFile/GroupLoincTerms.csv | 3 + .../AccessoryFiles/GroupFile/ParentGroup.csv | 2 + .../ImagingDocuments/ImagingDocumentCodes.csv | 10 + .../LinguisticVariants/LinguisticVariants.csv | 9 + .../deAT24LinguisticVariant.csv | 4 + .../frCA8LinguisticVariant.csv | 6 + .../zhCN5LinguisticVariant.csv | 9 + ...LoincIeeeMedicalDeviceCodeMappingTable.csv | 10 + .../LoincRsnaRadiologyPlaybook.csv | 10 + .../LoincUniversalLabOrdersValueSet.csv | 10 + .../MultiAxialHierarchy.csv | 10 + .../PanelsAndForms/AnswerList.csv | 12 + .../AccessoryFiles/PanelsAndForms/Loinc.csv | 16 + .../PanelsAndForms/LoincAnswerListLink.csv | 11 + .../AccessoryFiles/PartFile/LoincPartLink.csv | 10 + .../PartFile/LoincPartLink_Primary.csv | 7 + .../PartFile/LoincPartLink_Supplementary.csv | 13 + .../v267/AccessoryFiles/PartFile/Part.csv | 46 ++ .../PartFile/PartRelatedCodeMapping.csv | 12 + .../SI/Top2000CommonLabResultsSi.csv | 10 + .../US/Top2000CommonLabResultsUs.csv | 10 + .../loinc-ver/v267/LoincTable/Loinc.csv | 16 + .../test/resources/loinc-ver/v267/loinc.xml | 543 ++++++++++++++ .../AccessoryFiles/AnswerFile/AnswerList.csv | 12 + .../AnswerFile/LoincAnswerListLink.csv | 11 + .../ConsumerName/ConsumerName.csv | 6 + .../DocumentOntology/DocumentOntology.csv | 10 + .../v268/AccessoryFiles/GroupFile/Group.csv | 2 + .../GroupFile/GroupLoincTerms.csv | 3 + .../AccessoryFiles/GroupFile/ParentGroup.csv | 2 + .../ImagingDocuments/ImagingDocumentCodes.csv | 10 + .../LinguisticVariants/LinguisticVariants.csv | 9 + .../deAT24LinguisticVariant.csv | 4 + .../frCA8LinguisticVariant.csv | 6 + .../zhCN5LinguisticVariant.csv | 9 + ...LoincIeeeMedicalDeviceCodeMappingTable.csv | 10 + .../LoincRsnaRadiologyPlaybook.csv | 10 + .../LoincUniversalLabOrdersValueSet.csv | 10 + .../MultiAxialHierarchy.csv | 10 + .../PanelsAndForms/AnswerList.csv | 12 + .../AccessoryFiles/PanelsAndForms/Loinc.csv | 16 + .../PanelsAndForms/LoincAnswerListLink.csv | 11 + .../AccessoryFiles/PartFile/LoincPartLink.csv | 10 + .../PartFile/LoincPartLink_Primary.csv | 7 + .../PartFile/LoincPartLink_Supplementary.csv | 13 + .../v268/AccessoryFiles/PartFile/Part.csv | 46 ++ .../PartFile/PartRelatedCodeMapping.csv | 12 + .../SI/Top2000CommonLabResultsSi.csv | 10 + .../US/Top2000CommonLabResultsUs.csv | 10 + .../loinc-ver/v268/LoincTable/Loinc.csv | 16 + .../test/resources/loinc-ver/v268/loinc.xml | 543 ++++++++++++++ .../AccessoryFiles/AnswerFile/AnswerList.csv | 12 + .../AnswerFile/LoincAnswerListLink.csv | 11 + .../ConsumerName/ConsumerName.csv | 6 + .../DocumentOntology/DocumentOntology.csv | 10 + .../v269/AccessoryFiles/GroupFile/Group.csv | 2 + .../GroupFile/GroupLoincTerms.csv | 3 + .../AccessoryFiles/GroupFile/ParentGroup.csv | 2 + .../ImagingDocuments/ImagingDocumentCodes.csv | 10 + .../LinguisticVariants/LinguisticVariants.csv | 9 + .../deAT24LinguisticVariant.csv | 4 + .../frCA8LinguisticVariant.csv | 6 + .../zhCN5LinguisticVariant.csv | 9 + ...LoincIeeeMedicalDeviceCodeMappingTable.csv | 10 + .../LoincRsnaRadiologyPlaybook.csv | 10 + .../LoincUniversalLabOrdersValueSet.csv | 10 + .../MultiAxialHierarchy.csv | 10 + .../PanelsAndForms/AnswerList.csv | 12 + .../AccessoryFiles/PanelsAndForms/Loinc.csv | 16 + .../PanelsAndForms/LoincAnswerListLink.csv | 11 + .../AccessoryFiles/PartFile/LoincPartLink.csv | 10 + .../PartFile/LoincPartLink_Primary.csv | 7 + .../PartFile/LoincPartLink_Supplementary.csv | 13 + .../v269/AccessoryFiles/PartFile/Part.csv | 46 ++ .../PartFile/PartRelatedCodeMapping.csv | 12 + .../SI/Top2000CommonLabResultsSi.csv | 10 + .../US/Top2000CommonLabResultsUs.csv | 10 + .../loinc-ver/v269/LoincTable/Loinc.csv | 16 + .../test/resources/loinc-ver/v269/loinc.xml | 543 ++++++++++++++ 124 files changed, 3661 insertions(+), 182 deletions(-) create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/loincupload.properties create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/loincupload_singlepartlink.properties create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/AnswerFile/AnswerList.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/AnswerFile/LoincAnswerListLink.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/ConsumerName/ConsumerName.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/DocumentOntology/DocumentOntology.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/GroupFile/Group.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/GroupFile/GroupLoincTerms.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/GroupFile/ParentGroup.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/ImagingDocuments/ImagingDocumentCodes.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/LinguisticVariants/LinguisticVariants.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/LinguisticVariants/deAT24LinguisticVariant.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/LinguisticVariants/frCA8LinguisticVariant.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/LinguisticVariants/zhCN5LinguisticVariant.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/LoincIeeeMedicalDeviceCodeMappingTable/LoincIeeeMedicalDeviceCodeMappingTable.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/LoincRsnaRadiologyPlaybook/LoincRsnaRadiologyPlaybook.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/LoincUniversalLabOrdersValueSet/LoincUniversalLabOrdersValueSet.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/MultiAxialHierarchy/MultiAxialHierarchy.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/PanelsAndForms/AnswerList.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/PanelsAndForms/Loinc.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/PanelsAndForms/LoincAnswerListLink.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/PartFile/LoincPartLink.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/PartFile/LoincPartLink_Primary.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/PartFile/LoincPartLink_Supplementary.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/PartFile/Part.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/PartFile/PartRelatedCodeMapping.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/Top2000Results/SI/Top2000CommonLabResultsSi.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/Top2000Results/US/Top2000CommonLabResultsUs.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/LoincTable/Loinc.csv rename hapi-fhir-jpaserver-base/src/{main/resources/ca/uhn/fhir/jpa/term/loinc => test/resources/loinc-ver/v-no-version}/loinc.xml (92%) create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/AnswerFile/AnswerList.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/AnswerFile/LoincAnswerListLink.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/ConsumerName/ConsumerName.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/DocumentOntology/DocumentOntology.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/GroupFile/Group.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/GroupFile/GroupLoincTerms.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/GroupFile/ParentGroup.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/ImagingDocuments/ImagingDocumentCodes.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/LinguisticVariants/LinguisticVariants.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/LinguisticVariants/deAT24LinguisticVariant.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/LinguisticVariants/frCA8LinguisticVariant.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/LinguisticVariants/zhCN5LinguisticVariant.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/LoincIeeeMedicalDeviceCodeMappingTable/LoincIeeeMedicalDeviceCodeMappingTable.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/LoincRsnaRadiologyPlaybook/LoincRsnaRadiologyPlaybook.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/LoincUniversalLabOrdersValueSet/LoincUniversalLabOrdersValueSet.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/MultiAxialHierarchy/MultiAxialHierarchy.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/PanelsAndForms/AnswerList.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/PanelsAndForms/Loinc.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/PanelsAndForms/LoincAnswerListLink.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/PartFile/LoincPartLink.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/PartFile/LoincPartLink_Primary.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/PartFile/LoincPartLink_Supplementary.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/PartFile/Part.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/PartFile/PartRelatedCodeMapping.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/Top2000Results/SI/Top2000CommonLabResultsSi.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/Top2000Results/US/Top2000CommonLabResultsUs.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/LoincTable/Loinc.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/loinc.xml create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/AnswerFile/AnswerList.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/AnswerFile/LoincAnswerListLink.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/ConsumerName/ConsumerName.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/DocumentOntology/DocumentOntology.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/GroupFile/Group.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/GroupFile/GroupLoincTerms.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/GroupFile/ParentGroup.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/ImagingDocuments/ImagingDocumentCodes.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/LinguisticVariants/LinguisticVariants.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/LinguisticVariants/deAT24LinguisticVariant.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/LinguisticVariants/frCA8LinguisticVariant.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/LinguisticVariants/zhCN5LinguisticVariant.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/LoincIeeeMedicalDeviceCodeMappingTable/LoincIeeeMedicalDeviceCodeMappingTable.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/LoincRsnaRadiologyPlaybook/LoincRsnaRadiologyPlaybook.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/LoincUniversalLabOrdersValueSet/LoincUniversalLabOrdersValueSet.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/MultiAxialHierarchy/MultiAxialHierarchy.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/PanelsAndForms/AnswerList.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/PanelsAndForms/Loinc.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/PanelsAndForms/LoincAnswerListLink.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/PartFile/LoincPartLink.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/PartFile/LoincPartLink_Primary.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/PartFile/LoincPartLink_Supplementary.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/PartFile/Part.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/PartFile/PartRelatedCodeMapping.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/Top2000Results/SI/Top2000CommonLabResultsSi.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/Top2000Results/US/Top2000CommonLabResultsUs.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/LoincTable/Loinc.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/loinc.xml create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/AnswerFile/AnswerList.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/AnswerFile/LoincAnswerListLink.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/ConsumerName/ConsumerName.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/DocumentOntology/DocumentOntology.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/GroupFile/Group.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/GroupFile/GroupLoincTerms.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/GroupFile/ParentGroup.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/ImagingDocuments/ImagingDocumentCodes.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/LinguisticVariants/LinguisticVariants.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/LinguisticVariants/deAT24LinguisticVariant.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/LinguisticVariants/frCA8LinguisticVariant.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/LinguisticVariants/zhCN5LinguisticVariant.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/LoincIeeeMedicalDeviceCodeMappingTable/LoincIeeeMedicalDeviceCodeMappingTable.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/LoincRsnaRadiologyPlaybook/LoincRsnaRadiologyPlaybook.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/LoincUniversalLabOrdersValueSet/LoincUniversalLabOrdersValueSet.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/MultiAxialHierarchy/MultiAxialHierarchy.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/PanelsAndForms/AnswerList.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/PanelsAndForms/Loinc.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/PanelsAndForms/LoincAnswerListLink.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/PartFile/LoincPartLink.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/PartFile/LoincPartLink_Primary.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/PartFile/LoincPartLink_Supplementary.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/PartFile/Part.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/PartFile/PartRelatedCodeMapping.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/Top2000Results/SI/Top2000CommonLabResultsSi.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/Top2000Results/US/Top2000CommonLabResultsUs.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/LoincTable/Loinc.csv create mode 100644 hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/loinc.xml diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/JpaPersistedResourceValidationSupport.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/JpaPersistedResourceValidationSupport.java index e46fe36abf9..77467bd3431 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/JpaPersistedResourceValidationSupport.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/JpaPersistedResourceValidationSupport.java @@ -24,6 +24,7 @@ import ca.uhn.fhir.context.FhirContext; import ca.uhn.fhir.context.FhirVersionEnum; import ca.uhn.fhir.context.support.IValidationSupport; import ca.uhn.fhir.jpa.api.dao.DaoRegistry; +import ca.uhn.fhir.jpa.api.dao.IFhirResourceDao; import ca.uhn.fhir.jpa.searchparam.SearchParameterMap; import ca.uhn.fhir.model.primitive.IdDt; import ca.uhn.fhir.rest.api.SortOrderEnum; @@ -80,7 +81,6 @@ public class JpaPersistedResourceValidationSupport implements IValidationSupport @Autowired private DaoRegistry myDaoRegistry; - private Class myCodeSystemType; private Class myStructureDefinitionType; private Class myValueSetType; @@ -128,12 +128,13 @@ public class JpaPersistedResourceValidationSupport implements IValidationSupport public Optional getValueSetCurrentVersion(UriType theUrl) { if (! theUrl.getValueAsString().startsWith(LOINC_GENERIC_VALUESET_URL)) return Optional.empty(); - if (!theUrl.getValue().startsWith(LOINC_GENERIC_VALUESET_URL_PLUS_SLASH)) { + if (! theUrl.getValue().startsWith(LOINC_GENERIC_VALUESET_URL_PLUS_SLASH)) { throw new InternalErrorException("Don't know how to extract ForcedId from url: " + theUrl.getValueAsString()); } String forcedId = theUrl.getValue().substring(LOINC_GENERIC_VALUESET_URL_PLUS_SLASH.length()); - IBaseResource valueSet = myDaoRegistry.getResourceDao(myValueSetType).read(new IdDt("ValueSet", forcedId)); + IFhirResourceDao valueSetResourceDao = myDaoRegistry.getResourceDao(myValueSetType); + IBaseResource valueSet = valueSetResourceDao.read(new IdDt("ValueSet", forcedId)); return Optional.ofNullable(valueSet); } diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/data/ITermValueSetDao.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/data/ITermValueSetDao.java index ac37eac7525..fd5a5bc95ce 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/data/ITermValueSetDao.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/data/ITermValueSetDao.java @@ -22,7 +22,6 @@ package ca.uhn.fhir.jpa.dao.data; import ca.uhn.fhir.jpa.entity.TermValueSet; import ca.uhn.fhir.jpa.entity.TermValueSetPreExpansionStatusEnum; -import org.apache.commons.lang3.StringUtils; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Slice; import org.springframework.data.jpa.repository.JpaRepository; @@ -32,8 +31,6 @@ import org.springframework.data.repository.query.Param; import java.util.List; import java.util.Optional; -import static ca.uhn.fhir.jpa.dao.JpaPersistedResourceValidationSupport.LOINC_GENERIC_VALUESET_URL; - public interface ITermValueSetDao extends JpaRepository { @Query("SELECT vs FROM TermValueSet vs WHERE vs.myResourcePid = :resource_pid") @@ -51,28 +48,17 @@ public interface ITermValueSetDao extends JpaRepository { List findTermValueSetByUrl(Pageable thePage, @Param("url") String theUrl); /** - * The current TermValueSet is not necessarily the last uploaded anymore, but we know which is the last VS resource - * because it is pointed by a specific ForcedId, so we locate current ValueSet as the one pointing to the current resource + * The current TermValueSet is not necessarily the last uploaded anymore, but the current VS resource + * is pointed by a specific ForcedId, so we locate current ValueSet as the one pointing to current VS resource */ @Query(value="SELECT vs FROM ForcedId f, TermValueSet vs where f.myForcedId = :forcedId and vs.myResource = f.myResource") Optional findTermValueSetByForcedId(@Param("forcedId") String theForcedId); - default Optional findTermValueSetByUrl(@Param("url") String theUrl) { - if (theUrl.startsWith(LOINC_GENERIC_VALUESET_URL)) { - String forcedId = theUrl.substring(LOINC_GENERIC_VALUESET_URL.length()); - if (StringUtils.isBlank(forcedId)) return Optional.empty(); - return findTermValueSetByForcedId(forcedId); - } - - List tvsList = findTermValueSetByUrl(Pageable.ofSize(1), theUrl); - - return Optional.ofNullable(tvsList.size() == 1 ? tvsList.get(0) : null); - } - @Query("SELECT vs FROM TermValueSet vs WHERE vs.myUrl = :url AND vs.myVersion IS NULL") Optional findTermValueSetByUrlAndNullVersion(@Param("url") String theUrl); @Query("SELECT vs FROM TermValueSet vs WHERE vs.myUrl = :url AND vs.myVersion = :version") Optional findTermValueSetByUrlAndVersion(@Param("url") String theUrl, @Param("version") String theVersion); + } diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/entity/TermValueSet.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/entity/TermValueSet.java index c42e6ca96e0..e11e041dae5 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/entity/TermValueSet.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/entity/TermValueSet.java @@ -28,22 +28,7 @@ import org.apache.commons.lang3.builder.ToStringStyle; import org.hibernate.annotations.ColumnDefault; import javax.annotation.Nonnull; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import javax.persistence.FetchType; -import javax.persistence.ForeignKey; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.OneToMany; -import javax.persistence.OneToOne; -import javax.persistence.SequenceGenerator; -import javax.persistence.Table; -import javax.persistence.Transient; -import javax.persistence.UniqueConstraint; +import javax.persistence.*; import java.io.Serializable; import java.util.ArrayList; import java.util.List; diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/BaseTermReadSvcImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/BaseTermReadSvcImpl.java index 871338e8dfb..b55dab9e7a4 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/BaseTermReadSvcImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/BaseTermReadSvcImpl.java @@ -123,6 +123,7 @@ import org.quartz.JobExecutionContext; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Slice; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.TransactionDefinition; @@ -168,6 +169,8 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Supplier; import java.util.stream.Collectors; +import static ca.uhn.fhir.jpa.dao.JpaPersistedResourceValidationSupport.LOINC_GENERIC_VALUESET_URL; +import static ca.uhn.fhir.jpa.dao.JpaPersistedResourceValidationSupport.LOINC_GENERIC_VALUESET_URL_PLUS_SLASH; import static org.apache.commons.lang3.ObjectUtils.defaultIfNull; import static org.apache.commons.lang3.StringUtils.defaultString; import static org.apache.commons.lang3.StringUtils.isBlank; @@ -445,7 +448,7 @@ public abstract class BaseTermReadSvcImpl implements ITermReadSvc { if (theValueSetToExpand.hasVersion()) { optionalTermValueSet = myTermValueSetDao.findTermValueSetByUrlAndVersion(theValueSetToExpand.getUrl(), theValueSetToExpand.getVersion()); } else { - optionalTermValueSet = myTermValueSetDao.findTermValueSetByUrl(theValueSetToExpand.getUrl()); + optionalTermValueSet = findCurrentTermValueSet(theValueSetToExpand.getUrl()); } } else { optionalTermValueSet = Optional.empty(); @@ -2333,6 +2336,31 @@ public abstract class BaseTermReadSvcImpl implements ITermReadSvc { return codeSystemValidateCode(codeSystemUrl, theVersion, code, display); } + + @Override + public Optional findCurrentTermValueSet(String theUrl) { + boolean isNotLoincCodeSystem = ! StringUtils.containsIgnoreCase(theUrl, "loinc"); + boolean hasVersion = theUrl.contains("|"); + boolean isForGenericValueSet = theUrl.equals(LOINC_GENERIC_VALUESET_URL); + if (isNotLoincCodeSystem || hasVersion || isForGenericValueSet) { + List termValueSetList = myTermValueSetDao.findTermValueSetByUrl(Pageable.ofSize(1), theUrl); + if (termValueSetList.isEmpty()) return Optional.empty(); + return Optional.of(termValueSetList.get(0)); + } + + if (! theUrl.startsWith(LOINC_GENERIC_VALUESET_URL)) return Optional.empty(); + + if (! theUrl.startsWith(LOINC_GENERIC_VALUESET_URL_PLUS_SLASH)) { + throw new InternalErrorException("Don't know how to extract ForcedId from url: " + theUrl); + } + + String forcedId = theUrl.substring(LOINC_GENERIC_VALUESET_URL_PLUS_SLASH.length()); + if (StringUtils.isBlank(forcedId)) return Optional.empty(); + + return myTermValueSetDao.findTermValueSetByForcedId(forcedId); + } + + @SuppressWarnings("unchecked") private CodeValidationResult codeSystemValidateCode(String theCodeSystemUrl, String theCodeSystemVersion, String theCode, String theDisplay) { diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermLoaderSvcImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermLoaderSvcImpl.java index 60f2952754c..e750f1fee3d 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermLoaderSvcImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermLoaderSvcImpl.java @@ -40,7 +40,6 @@ import ca.uhn.fhir.rest.api.EncodingEnum; import ca.uhn.fhir.rest.api.server.RequestDetails; import ca.uhn.fhir.rest.server.exceptions.InternalErrorException; import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException; -import ca.uhn.fhir.util.ClasspathUtil; import ca.uhn.fhir.util.ValidateUtil; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Charsets; @@ -563,9 +562,9 @@ public class TermLoaderSvcImpl implements ITermLoaderSvc { String loincCsString = loincXmlHandler.getContents(); if (isBlank(loincCsString)) { - ourLog.warn("Did not find loinc.xml in the ZIP distribution. Using built-in copy"); - loincCsString = ClasspathUtil.loadResource("/ca/uhn/fhir/jpa/term/loinc/loinc.xml"); + throw new InvalidRequestException("Did not find loinc.xml in the ZIP distribution."); } + CodeSystem loincCs = FhirContext.forR4().newXmlParser().parseResource(CodeSystem.class, loincCsString); String codeSystemVersionId = theUploadProperties.getProperty(LOINC_CODESYSTEM_VERSION.getCode()); if (codeSystemVersionId != null) { diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/api/ITermReadSvc.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/api/ITermReadSvc.java index b8e93b2e97f..b4d0d94e2e7 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/api/ITermReadSvc.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/api/ITermReadSvc.java @@ -5,6 +5,7 @@ import ca.uhn.fhir.context.support.IValidationSupport; import ca.uhn.fhir.context.support.ValueSetExpansionOptions; import ca.uhn.fhir.jpa.api.dao.IFhirResourceDaoCodeSystem; import ca.uhn.fhir.jpa.entity.TermConcept; +import ca.uhn.fhir.jpa.entity.TermValueSet; import ca.uhn.fhir.jpa.model.entity.ResourceTable; import ca.uhn.fhir.jpa.term.IValueSetConceptAccumulator; import ca.uhn.fhir.util.FhirVersionIndependentConcept; @@ -115,4 +116,8 @@ public interface ITermReadSvc extends IValidationSupport { */ CodeValidationResult codeSystemValidateCode(IIdType theCodeSystemId, String theValueSetUrl, String theVersion, String theCode, String theDisplay, IBaseDatatype theCoding, IBaseDatatype theCodeableConcept); + /** + * Version independent + */ + Optional findCurrentTermValueSet(String theUrl); } diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/loinc/LoincUploadPropertiesEnum.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/loinc/LoincUploadPropertiesEnum.java index 8e2f26f5490..20ebb162a05 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/loinc/LoincUploadPropertiesEnum.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/loinc/LoincUploadPropertiesEnum.java @@ -33,6 +33,7 @@ public enum LoincUploadPropertiesEnum { */ LOINC_UPLOAD_PROPERTIES_FILE("loincupload.properties"), + LOINC_XML_FILE("loinc.xml"), /* * MANDATORY diff --git a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/r5/BaseJpaR5Test.java b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/r5/BaseJpaR5Test.java index 8f00ee5a1d7..cafcb1ef39d 100644 --- a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/r5/BaseJpaR5Test.java +++ b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/r5/BaseJpaR5Test.java @@ -571,7 +571,7 @@ public abstract class BaseJpaR5Test extends BaseJpaTest implements ITestDataBuil public List getExpandedConceptsByValueSetUrl(String theValuesetUrl) { return runInTransaction(() -> { - Optional valueSetOpt = myTermValueSetDao.findTermValueSetByUrl(theValuesetUrl); + Optional valueSetOpt = myTermSvc.findCurrentTermValueSet(theValuesetUrl); assertTrue(valueSetOpt.isPresent()); TermValueSet valueSet = valueSetOpt.get(); List concepts = valueSet.getConcepts(); diff --git a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/term/TerminologySvcImplCurrentVersionR4Test.java b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/term/TerminologySvcImplCurrentVersionR4Test.java index ac522bf4768..1358c66cecb 100644 --- a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/term/TerminologySvcImplCurrentVersionR4Test.java +++ b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/term/TerminologySvcImplCurrentVersionR4Test.java @@ -1,61 +1,491 @@ package ca.uhn.fhir.jpa.term; -import ca.uhn.fhir.jpa.entity.TermCodeSystem; +import ca.uhn.fhir.jpa.api.dao.IFhirResourceDao; +import ca.uhn.fhir.jpa.dao.r4.BaseJpaR4Test; import ca.uhn.fhir.jpa.entity.TermCodeSystemVersion; -import ca.uhn.fhir.jpa.entity.TermConcept; +import ca.uhn.fhir.jpa.entity.TermValueSet; +import ca.uhn.fhir.jpa.searchparam.SearchParameterMap; +import ca.uhn.fhir.jpa.term.api.ITermReadSvc; +import ca.uhn.fhir.rest.api.server.IBundleProvider; +import ca.uhn.fhir.rest.param.TokenParam; +import ca.uhn.fhir.rest.param.UriParam; +import ca.uhn.fhir.rest.server.servlet.ServletRequestDetails; +import com.google.common.collect.Sets; +import org.apache.commons.lang3.StringUtils; +import org.hl7.fhir.instance.model.api.IBaseResource; import org.hl7.fhir.instance.model.api.IIdType; import org.hl7.fhir.r4.model.CodeSystem; +import org.hl7.fhir.r4.model.IdType; +import org.hl7.fhir.r4.model.ValueSet; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.mockito.Answers; +import org.mockito.Mock; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.ResourceUtils; +import javax.persistence.EntityManager; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Collection; +import java.util.Collections; import java.util.HashSet; import java.util.List; +import java.util.Optional; +import java.util.Properties; import java.util.Set; +import java.util.stream.Collectors; +import static ca.uhn.fhir.jpa.term.loinc.LoincUploadPropertiesEnum.LOINC_ANSWERLIST_DUPLICATE_FILE_DEFAULT; +import static ca.uhn.fhir.jpa.term.loinc.LoincUploadPropertiesEnum.LOINC_ANSWERLIST_FILE_DEFAULT; +import static ca.uhn.fhir.jpa.term.loinc.LoincUploadPropertiesEnum.LOINC_ANSWERLIST_LINK_DUPLICATE_FILE_DEFAULT; +import static ca.uhn.fhir.jpa.term.loinc.LoincUploadPropertiesEnum.LOINC_ANSWERLIST_LINK_FILE_DEFAULT; +import static ca.uhn.fhir.jpa.term.loinc.LoincUploadPropertiesEnum.LOINC_CODESYSTEM_MAKE_CURRENT; +import static ca.uhn.fhir.jpa.term.loinc.LoincUploadPropertiesEnum.LOINC_CODESYSTEM_VERSION; +import static ca.uhn.fhir.jpa.term.loinc.LoincUploadPropertiesEnum.LOINC_DOCUMENT_ONTOLOGY_FILE_DEFAULT; +import static ca.uhn.fhir.jpa.term.loinc.LoincUploadPropertiesEnum.LOINC_DUPLICATE_FILE_DEFAULT; +import static ca.uhn.fhir.jpa.term.loinc.LoincUploadPropertiesEnum.LOINC_FILE_DEFAULT; +import static ca.uhn.fhir.jpa.term.loinc.LoincUploadPropertiesEnum.LOINC_GROUP_FILE_DEFAULT; +import static ca.uhn.fhir.jpa.term.loinc.LoincUploadPropertiesEnum.LOINC_GROUP_TERMS_FILE_DEFAULT; +import static ca.uhn.fhir.jpa.term.loinc.LoincUploadPropertiesEnum.LOINC_HIERARCHY_FILE_DEFAULT; +import static ca.uhn.fhir.jpa.term.loinc.LoincUploadPropertiesEnum.LOINC_IEEE_MEDICAL_DEVICE_CODE_MAPPING_TABLE_FILE_DEFAULT; +import static ca.uhn.fhir.jpa.term.loinc.LoincUploadPropertiesEnum.LOINC_IMAGING_DOCUMENT_CODES_FILE_DEFAULT; +import static ca.uhn.fhir.jpa.term.loinc.LoincUploadPropertiesEnum.LOINC_PARENT_GROUP_FILE_DEFAULT; +import static ca.uhn.fhir.jpa.term.loinc.LoincUploadPropertiesEnum.LOINC_PART_FILE_DEFAULT; +import static ca.uhn.fhir.jpa.term.loinc.LoincUploadPropertiesEnum.LOINC_PART_LINK_FILE_PRIMARY_DEFAULT; +import static ca.uhn.fhir.jpa.term.loinc.LoincUploadPropertiesEnum.LOINC_PART_LINK_FILE_SUPPLEMENTARY_DEFAULT; +import static ca.uhn.fhir.jpa.term.loinc.LoincUploadPropertiesEnum.LOINC_PART_RELATED_CODE_MAPPING_FILE_DEFAULT; +import static ca.uhn.fhir.jpa.term.loinc.LoincUploadPropertiesEnum.LOINC_RSNA_PLAYBOOK_FILE_DEFAULT; +import static ca.uhn.fhir.jpa.term.loinc.LoincUploadPropertiesEnum.LOINC_TOP2000_COMMON_LAB_RESULTS_SI_FILE_DEFAULT; +import static ca.uhn.fhir.jpa.term.loinc.LoincUploadPropertiesEnum.LOINC_TOP2000_COMMON_LAB_RESULTS_US_FILE_DEFAULT; +import static ca.uhn.fhir.jpa.term.loinc.LoincUploadPropertiesEnum.LOINC_UNIVERSAL_LAB_ORDER_VALUESET_FILE_DEFAULT; +import static ca.uhn.fhir.jpa.term.loinc.LoincUploadPropertiesEnum.LOINC_UPLOAD_PROPERTIES_FILE; +import static ca.uhn.fhir.jpa.term.loinc.LoincUploadPropertiesEnum.LOINC_XML_FILE; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsInAnyOrder; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.fail; +import static org.mockito.Mockito.when; /** * Tests load and validate CodeSystem and ValueSet so test names as uploadFirstCurrent... mean uploadCodeSystemAndValueSetCurrent... */ -public class TerminologySvcImplCurrentVersionR4Test extends BaseTermR4Test { +public class TerminologySvcImplCurrentVersionR4Test extends BaseJpaR4Test { private static final Logger ourLog = LoggerFactory.getLogger(TerminologySvcImplCurrentVersionR4Test.class); - @Test - public void uploadFirstCurrentNoVersion() { + public static final String BASE_VS_URL = "http://loinc.org/vs/"; + + // some ValueSets have a version specified independent of the CS version being uploaded. This is one of them + public static final String VS_VERSIONED_ON_UPLOAD_ID = "LL1000-0"; + public static final String VS_VERSIONED_ON_UPLOAD = BASE_VS_URL + VS_VERSIONED_ON_UPLOAD_ID; + + // some ValueSets have a version specified independent of the CS version being uploaded. This one doesn't + public static final String VS_NO_VERSIONED_ON_UPLOAD_ID = "loinc-rsna-radiology-playbook"; + public static final String VS_NO_VERSIONED_ON_UPLOAD = BASE_VS_URL + VS_NO_VERSIONED_ON_UPLOAD_ID; + + public static final String VS_ANSWER_LIST_VERSION = "Beta.1"; + public static final Set possibleVersions = Sets.newHashSet("2.67", "2.68", "2.69"); + + @Mock + HttpServletResponse mockServletResponse; + + @Mock(answer = Answers.RETURNS_DEEP_STUBS) + ServletRequestDetails mockRequestDetails; + + @Autowired private EntityManager myEntityManager; + @Autowired private TermLoaderSvcImpl myTermLoaderSvc; + @Autowired private ITermReadSvc myITermReadSvc; + + + private ZipCollectionBuilder myFiles; + private ServletRequestDetails myRequestDetails = new ServletRequestDetails(); + + private Properties uploadProperties; + private IFhirResourceDao dao; + + + +// @BeforeAll +// public static void beforeAll() throws Exception { +// // remove DB +// Files.deleteIfExists(Paths.get( +// "/Users/juan.marchionattosmilecdr.com/projects/hapi-fhir/hapi-fhir-jpaserver-base/testdb_r4_2.mv.db")); +// } + + @BeforeEach + public void beforeEach() throws Exception { +// myTermLoaderSvc = TermLoaderSvcImpl.withoutProxyCheck(myTermDeferredStorageSvc, myTermCodeSystemStorageSvc); + + File file = ResourceUtils.getFile("classpath:loinc-ver/" + LOINC_UPLOAD_PROPERTIES_FILE.getCode()); + uploadProperties = new Properties(); + uploadProperties.load(new FileInputStream(file)); + + dao = (IFhirResourceDao) myDaoRegistry.getResourceDao(ValueSet.class); + + when(mockRequestDetails.getServer().getDefaultPageSize()).thenReturn(25); } - @Test - public void uploadFirstCurrentWithVersion() { + /** + * For input version or for current (when input is null) validates following operations: + * _ JpaTerminologyProvider.in() + * _ JpaTerminologyProvider.expand() + * _ JpaTerminologyProvider.lookup() + * + * _ BaseJpaResourceProvider.read() + * _ BaseJpaResourceProvider.validate() + */ + private void validateOperations(Collection theExpectedVersions) { + validateValueSetSearch(theExpectedVersions); + + validateValueExpand(theExpectedVersions); + + validateValueLookup(theExpectedVersions); + + +// // JpaTerminologyProvider.lookup() +// // JpaTerminologyProvider.in() +// BaseJpaResourceProviderCodeSystemR4.lookup() +// BaseJpaResourceProviderCodeSystemR4.subsumes() +// BaseJpaResourceProviderCodeSystemR4.validateCode() +// + } + + private void validateValueLookup(Collection theExpectedVersions) { + } + + + private void validateValueExpand(Collection theExpectedVersions) { + // for CS ver = null, VS ver = null + ValueSet vs = myValueSetDao.expandByIdentifier(VS_NO_VERSIONED_ON_UPLOAD, null); + assertEquals(1, vs.getExpansion().getContains().size()); + + // for CS ver = null, VS ver != null + ValueSet vs1 = myValueSetDao.expandByIdentifier(VS_VERSIONED_ON_UPLOAD + "|" + VS_ANSWER_LIST_VERSION, null); + assertEquals(3, vs1.getExpansion().getContains().size()); + + // now for each uploaded version + theExpectedVersions.forEach(this::validateValueExpandForVersion); + + } + + private void validateValueExpandForVersion(String theVersion) { + // for CS ver != null, VS ver = null + ValueSet vs2 = myValueSetDao.expandByIdentifier( + VS_NO_VERSIONED_ON_UPLOAD + "|" + theVersion, null); + assertEquals(1, vs2.getExpansion().getContains().size()); + + // for CS ver != null, VS ver != null + ValueSet vs3 = myValueSetDao.expandByIdentifier( + VS_VERSIONED_ON_UPLOAD + "|" + VS_ANSWER_LIST_VERSION + "-" + theVersion, null); + assertEquals(3, vs3.getExpansion().getContains().size()); + } + + + private void validateValueSetSearch(Collection theExpectedIdVersions) { + // first validate search for CS ver = null VS ver = null + + SearchParameterMap paramsNoUploadVer = new SearchParameterMap("url", new UriParam(VS_NO_VERSIONED_ON_UPLOAD)); + int expectedResultQty = theExpectedIdVersions.size() + 1; // + 1 because an extra null version (the current) is always present + IBundleProvider noUploadVerResult = dao.search(paramsNoUploadVer, mockRequestDetails, mockServletResponse); + List noUploadVerValueSets = noUploadVerResult.getAllResources(); + assertEquals(expectedResultQty, noUploadVerValueSets.size()); + + matchUnqualifiedIds(noUploadVerValueSets, theExpectedIdVersions); + + // now validate search for CS ver = null VS ver != null + + SearchParameterMap paramsUploadVer = new SearchParameterMap("url", new UriParam(VS_VERSIONED_ON_UPLOAD)); + paramsUploadVer.add("version", new TokenParam(VS_ANSWER_LIST_VERSION)); + IBundleProvider uploadVerResult = dao.search(paramsUploadVer, mockRequestDetails, mockServletResponse); + List uploadVerValueSets = uploadVerResult.getAllResources(); + assertEquals(1, uploadVerValueSets.size()); + + assertEquals(VS_VERSIONED_ON_UPLOAD_ID, uploadVerValueSets.get(0).getIdElement().getIdPart()); + assertEquals( VS_ANSWER_LIST_VERSION, ((ValueSet ) uploadVerValueSets.get(0)).getVersion()); + + // now validate each specific uploaded version + theExpectedIdVersions.forEach(this::validateValueSetSearchForVersion); + } + + + /** + * Some ValueSets (IE: AnswerLists), can have a specific version, different than the version of the + * CodeSystem with which they were uploaded. That version is what we distinguish in both sets of tests here, + * no the CodeSystem version. + */ + private void validateValueSetSearchForVersion(String theVersion) { + // for no versioned VS (VS version, different than CS version) + + SearchParameterMap paramsUploadNoVer = new SearchParameterMap("url", new UriParam(VS_NO_VERSIONED_ON_UPLOAD)); + paramsUploadNoVer.add("version", new TokenParam(theVersion)); + + IBundleProvider uploadNoVerResult = dao.search(paramsUploadNoVer, mockRequestDetails, mockServletResponse); + List uploadNoVerValueSets = uploadNoVerResult.getAllResources(); + assertEquals(1, uploadNoVerValueSets.size()); + + ValueSet loadNoVersionValueSet = (ValueSet) uploadNoVerValueSets.get(0); + String expectedLoadNoVersionUnqualifiedId = VS_NO_VERSIONED_ON_UPLOAD_ID + (theVersion == null ? "" : "-" + theVersion); + assertEquals(expectedLoadNoVersionUnqualifiedId, loadNoVersionValueSet.getIdElement().getIdPart()); + + + // versioned VS (VS version, different than CS version) + + SearchParameterMap paramsUploadVer = new SearchParameterMap("url", new UriParam(VS_VERSIONED_ON_UPLOAD)); + paramsUploadVer.add("version", new TokenParam(VS_ANSWER_LIST_VERSION + "-" + theVersion)); + + IBundleProvider uploadVerResult = dao.search(paramsUploadVer, mockRequestDetails, mockServletResponse); + List uploadVerValueSets = uploadVerResult.getAllResources(); + assertEquals(1, uploadVerValueSets.size()); + + ValueSet loadVersionValueSet = (ValueSet) uploadVerValueSets.get(0); + String expectedLoadVersionUnqualifiedId = VS_VERSIONED_ON_UPLOAD_ID + (theVersion == null ? "" : "-" + theVersion); + assertEquals(expectedLoadVersionUnqualifiedId, loadVersionValueSet.getIdElement().getIdPart()); + } + + + /** + * Validates that the collection of unqualified IDs of each element of theValueSets matches the expected + * unqualifiedIds corresponding to the uploaded versions plus one with no version + * + * @param theValueSets the ValueSet collection + * @param theExpectedIdVersions the collection of expected versions + */ + private void matchUnqualifiedIds(List theValueSets, Collection theExpectedIdVersions) { + // set should contain one entry per expectedVersion + List expectedNoVersionUnqualifiedIds = theExpectedIdVersions.stream() + .map(expVer -> VS_NO_VERSIONED_ON_UPLOAD_ID + "-" + expVer) + .collect(Collectors.toList()); + + // plus one entry for null version + expectedNoVersionUnqualifiedIds.add(VS_NO_VERSIONED_ON_UPLOAD_ID); + + List resultUnqualifiedIds = theValueSets.stream() + .map(r -> r.getIdElement().getIdPart()) + .collect(Collectors.toList()); + + assertThat(resultUnqualifiedIds, containsInAnyOrder(resultUnqualifiedIds.toArray())); + + List resultVersions = theValueSets.stream() + .map(r -> ((ValueSet) r).getVersion()) + .collect(Collectors.toList()); + + Set theExpectedIdVersionsPlusNull = Sets.newHashSet(theExpectedIdVersions); + theExpectedIdVersionsPlusNull.add(null); + assertThat(theExpectedIdVersionsPlusNull, containsInAnyOrder(resultVersions.toArray())); + } + + + /** + * Validates that: + * for CodeSystem: + * _ current CS has no version, obtaining it from DAO + * _ current TCS has no version + * for ValueSet: + * _ current TVSs with upload version have upload-version with no version append + * _ current TVSs with no upload version have null version + * operations: + * _ validate operation for current (no version parameter) + */ + private void runCommonValidations(String theVersion) { + // for CodeSystem: + + // _ current CS is present and has no version + CodeSystem codeSystem = myCodeSystemDao.read(new IdType("loinc")); + String csString = myFhirCtx.newJsonParser().setPrettyPrint(true).encodeResourceToString(codeSystem); + ourLog.info("CodeSystem:\n" + csString); + + HashSet shouldNotBePresentVersions = new HashSet<>(possibleVersions); + shouldNotBePresentVersions.remove(theVersion); + shouldNotBePresentVersions.stream().forEach(vv -> assertFalse(csString.contains(vv))); + + // _ current TermCodeSystem has no version + TermCodeSystemVersion termCSVersion = fetchCurrentCodeSystemVersion(); + assertNotNull(termCSVersion); + assertNull(termCSVersion.getCodeSystemVersionId()); + + // for ValueSet: + + // current TermVSs with no upload version have null version + Optional noUploadCurrentVsOpt = myITermReadSvc.findCurrentTermValueSet(VS_NO_VERSIONED_ON_UPLOAD); + assertTrue(noUploadCurrentVsOpt.isPresent()); + assertNull(noUploadCurrentVsOpt.get().getVersion()); + + // current VSs with upload version have upload-version with no version append + Optional uploadCurrentVsOpt = myITermReadSvc.findCurrentTermValueSet(VS_VERSIONED_ON_UPLOAD); + assertTrue(uploadCurrentVsOpt.isPresent()); + assertEquals(VS_ANSWER_LIST_VERSION, uploadCurrentVsOpt.get().getVersion()); + } + + + @Test() + public void uploadCSCurrentNoVersion() throws Exception { + IIdType csId = uploadLoincCodeSystem(null, true); + + runCommonValidations(null); + + // validate operation for current (no version parameter) + validateOperations(Collections.emptySet()); } - @Test - public void uploadFirstCurrentNoVersionThenNoCurrent() { + @Test() + public void uploadCSCurrentWithVersion() throws Exception { + String ver = "2.67"; + IIdType csId = uploadLoincCodeSystem(ver, true); + + runCommonValidations(ver); + +// myTermSvc.preExpandDeferredValueSetsToTerminologyTables(); + + // validate operation for specific version + validateOperations(Collections.singleton(ver)); + } + + +// @Test + public void uploadCurrentNoVersionThenNoCurrent() throws Exception { + uploadLoincCodeSystem(null, true); + String ver = "2.67"; + uploadLoincCodeSystem(ver, false); + + Optional csIdNoVersionedOpt = myForcedIdDao.findByTypeAndForcedId("CodeSystem", "loinc"); + assertTrue(csIdNoVersionedOpt.isPresent()); + + Optional csIdVersionedOpt = myForcedIdDao.findByTypeAndForcedId("CodeSystem", "loinc" + "-" + ver); + assertTrue(csIdVersionedOpt.isPresent()); + + // current CS data is no-ver + CodeSystem codeSystem = myCodeSystemDao.read(new IdType("loinc")); + String csString = myFhirCtx.newJsonParser().setPrettyPrint(true).encodeResourceToString(codeSystem); + ourLog.info("CodeSystem:\n" + csString); + + // no versions present in CS data + possibleVersions.stream().forEach(vv -> assertFalse(csString.contains(vv))); + + + // ValueSets + + checkVsVersionExists(null); } - @Test - public void uploadFirstCurrentWithVersionThenNoCurrent() { +// @Test + public void uploadFirstCurrentWithVersionThenNoCurrent() throws Exception { + String firstVer = "2.67"; + uploadLoincCodeSystem(firstVer, true); + String secondVer = "2.68"; + uploadLoincCodeSystem(secondVer, false); + + Optional csIdNoVersionedOpt = myForcedIdDao.findByTypeAndForcedId("CodeSystem", "loinc"); + assertTrue(csIdNoVersionedOpt.isPresent()); + + Optional csIdFirstVersionedOpt = myForcedIdDao.findByTypeAndForcedId("CodeSystem", "loinc" + "-" + firstVer); + assertTrue(csIdFirstVersionedOpt.isPresent()); + + Optional csIdSecondVersionedOpt = myForcedIdDao.findByTypeAndForcedId("CodeSystem", "loinc" + "-" + secondVer); + assertTrue(csIdSecondVersionedOpt.isPresent()); + + // current CS data is no-ver + CodeSystem codeSystem = myCodeSystemDao.read(new IdType("loinc")); + String csString = myFhirCtx.newJsonParser().setPrettyPrint(true).encodeResourceToString(codeSystem); + ourLog.info("CodeSystem:\n" + csString); + + // only 2.67 versions present in CS data + Set noVersionsPresent = new HashSet(possibleVersions); + noVersionsPresent.remove(firstVer); + noVersionsPresent.stream().forEach(vv -> assertFalse(csString.contains(vv))); + + // ValueSets + + checkVsVersionExists(firstVer); + checkVsVersionExists(secondVer); + + + + +// Optional csIdVersionedOpt = myForcedIdDao.findByTypeAndForcedId("CodeSystem", "loinc" + "-" + "2.58"); +// assertFalse(csIdVersionedOpt.isPresent()); +// +// Optional csIdNoVersionedOpt = myForcedIdDao.findByTypeAndForcedId("CodeSystem", "loinc"); +// assertTrue(csIdNoVersionedOpt.isPresent()); + + // make sure: + + // curr CS ver is null ver with 2.59 data + + // VS present for V 2.58 (curr = true), 2,59 (curr = false) & null (curr = true) + + // only one VS per url-ver true + } + + private void checkVsVersionExists(String ver) { + String vsNoVersionedVersion = VS_NO_VERSIONED_ON_UPLOAD + (ver == null ? "" : "-" + ver); + Optional noUploadVersionedVsOpt = myITermReadSvc.findCurrentTermValueSet(vsNoVersionedVersion); + assertTrue(noUploadVersionedVsOpt.isPresent()); + assertNull(noUploadVersionedVsOpt.get().getVersion()); + + String vsersionedVersion = VS_VERSIONED_ON_UPLOAD + (ver == null ? "" : "-" + ver); + Optional uploadVersionedVsOpt = myITermReadSvc.findCurrentTermValueSet(vsersionedVersion); + assertTrue(uploadVersionedVsOpt.isPresent()); + assertEquals(VS_ANSWER_LIST_VERSION, uploadVersionedVsOpt.get().getVersion()); } - @Test - public void uploadFirstCurrentNoVersionThenNoCurrentThenCurrent() { + // @Test + public void uploadFirstCurrentNoVersionThenNoCurrentThenCurrent() throws Exception { + uploadLoincCodeSystem(null, true); + uploadLoincCodeSystem("2.58", false); + uploadLoincCodeSystem("2.59", true); +// Optional csIdVersionedOpt = myForcedIdDao.findByTypeAndForcedId("CodeSystem", "loinc" + "-" + "2.58"); +// assertFalse(csIdVersionedOpt.isPresent()); +// +// Optional csIdNoVersionedOpt = myForcedIdDao.findByTypeAndForcedId("CodeSystem", "loinc"); +// assertTrue(csIdNoVersionedOpt.isPresent()); + + // make sure: + + // curr CS ver is null ver with 2.59 data + + // VS present for V 2.58 (curr = false), 2.59 (curr = true) & null (curr = true) + + // only one VS per url-ver true + // both curr = true have same data (2.59) } - @Test - public void uploadFirstCurrentWithVersionThenNoCurrentThenCurrent() { +// @Test + public void uploadFirstCurrentWithVersionThenNoCurrentThenCurrent() throws Exception { + uploadLoincCodeSystem("2.57", true); + uploadLoincCodeSystem("2.58", false); + uploadLoincCodeSystem("2.59", true); +// Optional csIdVersionedOpt = myForcedIdDao.findByTypeAndForcedId("CodeSystem", "loinc" + "-" + "2.58"); +// assertFalse(csIdVersionedOpt.isPresent()); +// +// Optional csIdNoVersionedOpt = myForcedIdDao.findByTypeAndForcedId("CodeSystem", "loinc"); +// assertTrue(csIdNoVersionedOpt.isPresent()); + + // make sure: + + // curr CS ver is null ver with 2.59 data + + // VS present for V 2.57 (curr = false), 2.58 (curr = false), 2,59 (curr = true) & null (curr = true) + + // both curr = true have same data (2.59) } @@ -70,6 +500,116 @@ public class TerminologySvcImplCurrentVersionR4Test extends BaseTermR4Test { // assertFalse(validation.isOk()); // } + + private IIdType uploadLoincCodeSystem(String theVersion, boolean theMakeItCurrent) throws Exception { + myFiles = new ZipCollectionBuilder(); + + if (! theMakeItCurrent) { + myRequestDetails.getUserData().put(LOINC_CODESYSTEM_MAKE_CURRENT, false); + uploadProperties.put(LOINC_CODESYSTEM_MAKE_CURRENT.getCode(), "false"); + } + + assertTrue( + theVersion == null || theVersion.equals("2.67") || theVersion.equals("2.68") || theVersion.equals("2.69"), + "Version supported are: 2.67, 2.68, 2.69 and null" ); + + if (StringUtils.isBlank(theVersion)) { + uploadProperties.remove(LOINC_CODESYSTEM_VERSION.getCode()); + } else { + uploadProperties.put(LOINC_CODESYSTEM_VERSION.getCode(), theVersion); + } + + addLoincMandatoryFilesToZip(myFiles, theVersion); + + UploadStatistics stats = myTermLoaderSvc.loadLoinc(myFiles.getFiles(), mySrd); + myTerminologyDeferredStorageSvc.saveAllDeferred(); + + return stats.getTarget(); + } + + + public void addLoincMandatoryFilesToZip(ZipCollectionBuilder theFiles, String theVersion) throws IOException { + String theClassPathPrefix = getClassPathPrefix(theVersion); + addBaseLoincMandatoryFilesToZip(theFiles, true, theClassPathPrefix); + theFiles.addPropertiesZip(uploadProperties, LOINC_UPLOAD_PROPERTIES_FILE.getCode()); + theFiles.addFileZip(theClassPathPrefix, LOINC_PART_LINK_FILE_PRIMARY_DEFAULT.getCode()); + theFiles.addFileZip(theClassPathPrefix, LOINC_PART_LINK_FILE_SUPPLEMENTARY_DEFAULT.getCode()); + } + + + private String getClassPathPrefix(String theVersion) { + String theClassPathPrefix = "/loinc-ver/v-no-version/"; + + if (StringUtils.isBlank(theVersion)) return theClassPathPrefix; + + switch(theVersion) { + case "2.67": return "/loinc-ver/v267/"; + case "2.68": return "/loinc-ver/v268/"; + case "2.69": return "/loinc-ver/v269/"; + }; + + fail("Setup failed. Unexpected version: " + theVersion); + return null; + } + + + private static void addBaseLoincMandatoryFilesToZip( + ZipCollectionBuilder theFiles, Boolean theIncludeTop2000, String theClassPathPrefix) throws IOException { + theFiles.addFileZip(theClassPathPrefix, LOINC_XML_FILE.getCode()); + theFiles.addFileZip(theClassPathPrefix, LOINC_GROUP_FILE_DEFAULT.getCode()); + theFiles.addFileZip(theClassPathPrefix, LOINC_GROUP_TERMS_FILE_DEFAULT.getCode()); + theFiles.addFileZip(theClassPathPrefix, LOINC_PARENT_GROUP_FILE_DEFAULT.getCode()); + theFiles.addFileZip(theClassPathPrefix, LOINC_FILE_DEFAULT.getCode()); + theFiles.addFileZip(theClassPathPrefix, LOINC_DUPLICATE_FILE_DEFAULT.getCode()); + theFiles.addFileZip(theClassPathPrefix, LOINC_HIERARCHY_FILE_DEFAULT.getCode()); + theFiles.addFileZip(theClassPathPrefix, LOINC_ANSWERLIST_FILE_DEFAULT.getCode()); + theFiles.addFileZip(theClassPathPrefix, LOINC_ANSWERLIST_DUPLICATE_FILE_DEFAULT.getCode()); + theFiles.addFileZip(theClassPathPrefix, LOINC_ANSWERLIST_LINK_FILE_DEFAULT.getCode()); + theFiles.addFileZip(theClassPathPrefix, LOINC_ANSWERLIST_LINK_DUPLICATE_FILE_DEFAULT.getCode()); + theFiles.addFileZip(theClassPathPrefix, LOINC_PART_FILE_DEFAULT.getCode()); + theFiles.addFileZip(theClassPathPrefix, LOINC_PART_RELATED_CODE_MAPPING_FILE_DEFAULT.getCode()); + theFiles.addFileZip(theClassPathPrefix, LOINC_DOCUMENT_ONTOLOGY_FILE_DEFAULT.getCode()); + theFiles.addFileZip(theClassPathPrefix, LOINC_RSNA_PLAYBOOK_FILE_DEFAULT.getCode()); + theFiles.addFileZip(theClassPathPrefix, LOINC_UNIVERSAL_LAB_ORDER_VALUESET_FILE_DEFAULT.getCode()); + theFiles.addFileZip(theClassPathPrefix, LOINC_IEEE_MEDICAL_DEVICE_CODE_MAPPING_TABLE_FILE_DEFAULT.getCode()); + theFiles.addFileZip(theClassPathPrefix, LOINC_IMAGING_DOCUMENT_CODES_FILE_DEFAULT.getCode()); + if (theIncludeTop2000) { + theFiles.addFileZip(theClassPathPrefix, LOINC_TOP2000_COMMON_LAB_RESULTS_SI_FILE_DEFAULT.getCode()); + theFiles.addFileZip(theClassPathPrefix, LOINC_TOP2000_COMMON_LAB_RESULTS_US_FILE_DEFAULT.getCode()); + } + } + + private void logAllTermValueSets() { + List vsList = myTermValueSetDao.findAll(); + + vsList.forEach(vs -> { + ourLog.info("ValueSet:\n" + vs); + }); + + } + + + private TermCodeSystemVersion fetchCurrentCodeSystemVersion() { + return (TermCodeSystemVersion) myEntityManager.createQuery( + "select tcsv from TermCodeSystemVersion tcsv join fetch tcsv.myCodeSystem tcs " + + "where tcs.myCurrentVersion = tcsv" ).getSingleResult(); + } + + private List fetchTermValueSets(String url) { + return myEntityManager.createQuery("from TermValueSet where url = '" + url + "'").getResultList(); + } + + private List fetchValueSets(Collection ids) { +// ResourcePersistentId rscIds = myIdHelperService.resolveResourcePersistentIds( +// RequestPartitionId.allPartitions(), "ValueSet", url); +// + return myEntityManager.createQuery("from ResourceTable where myResourceType = 'ValueSet'").getResultList(); + } + + + + + // @Test // public void testValidateCodeIsInPreExpandedValueSet() throws Exception { // myDaoConfig.setPreExpandValueSets(true); @@ -118,109 +658,62 @@ public class TerminologySvcImplCurrentVersionR4Test extends BaseTermR4Test { // assertEquals("Systolic blood pressure at First encounter", result.getDisplay()); // } + + // @Test -// public void testValidateCodeIsInPreExpandedValueSetWithClientAssignedId() throws Exception { -// myDaoConfig.setPreExpandValueSets(true); +// public void testCreateCodeSystemTwoVersions() { +// CodeSystem codeSystem = new CodeSystem(); +// codeSystem.setUrl(CS_URL); +// codeSystem.setContent(CodeSystem.CodeSystemContentMode.COMPLETE); +// codeSystem +// .addConcept().setCode("A").setDisplay("Code A"); +// codeSystem +// .addConcept().setCode("B").setDisplay("Code A"); // -// loadAndPersistCodeSystemAndValueSetWithDesignations(HttpVerb.PUT); +// codeSystem.setVersion("1"); // -// CodeSystem codeSystem = myCodeSystemDao.read(myExtensionalCsId); -// ourLog.info("CodeSystem:\n" + myFhirCtx.newJsonParser().setPrettyPrint(true).encodeResourceToString(codeSystem)); +// IIdType id = myCodeSystemDao.create(codeSystem, mySrd).getId().toUnqualified(); // -// ValueSet valueSet = myValueSetDao.read(myExtensionalVsId); -// ourLog.info("ValueSet:\n" + myFhirCtx.newJsonParser().setPrettyPrint(true).encodeResourceToString(valueSet)); +// Set codes = myTermSvc.findCodesBelow(id.getIdPartAsLong(), id.getVersionIdPartAsLong(), "A"); +// assertThat(toCodes(codes), containsInAnyOrder("A")); // -// myTermSvc.preExpandDeferredValueSetsToTerminologyTables(); +// codes = myTermSvc.findCodesBelow(id.getIdPartAsLong(), id.getVersionIdPartAsLong(), "B"); +// assertThat(toCodes(codes), containsInAnyOrder("B")); // -// IValidationSupport.CodeValidationResult result = myTermSvc.validateCodeIsInPreExpandedValueSet(optsNoGuess, valueSet, null, null, null, null, null); -// assertNull(result); +// runInTransaction(() -> { +// List termCodeSystemVersions = myTermCodeSystemVersionDao.findAll(); +// assertEquals(termCodeSystemVersions.size(), 1); +// TermCodeSystemVersion termCodeSystemVersion_1 = termCodeSystemVersions.get(0); +// assertEquals(termCodeSystemVersion_1.getConcepts().size(), 2); +// Set termConcepts = new HashSet<>(termCodeSystemVersion_1.getConcepts()); +// assertThat(toCodes(termConcepts), containsInAnyOrder("A", "B")); // +// TermCodeSystem termCodeSystem = myTermCodeSystemDao.findByResourcePid(id.getIdPartAsLong()); +// assertEquals("1", termCodeSystem.getCurrentVersion().getCodeSystemVersionId()); // -// result = myTermSvc.validateCodeIsInPreExpandedValueSet(optsNoGuess, valueSet, null, "BOGUS", null, null, null); -// assertFalse(result.isOk()); +// }); // -// result = myTermSvc.validateCodeIsInPreExpandedValueSet(optsNoGuess, valueSet, null, "11378-7", null, null, null); -// assertFalse(result.isOk()); +// codeSystem.setVersion("2"); +// codeSystem +// .addConcept().setCode("C").setDisplay("Code C"); // -// result = myTermSvc.validateCodeIsInPreExpandedValueSet(optsGuess, valueSet, null, "11378-7", null, null, null); -// assertTrue(result.isOk()); -// assertEquals("Systolic blood pressure at First encounter", result.getDisplay()); +// IIdType id_v2 = myCodeSystemDao.create(codeSystem, mySrd).getId().toUnqualified(); +// codes = myTermSvc.findCodesBelow(id_v2.getIdPartAsLong(), id_v2.getVersionIdPartAsLong(), "C"); +// assertThat(toCodes(codes), containsInAnyOrder("C")); // -// result = myTermSvc.validateCodeIsInPreExpandedValueSet(optsGuess, valueSet, null, "11378-7", "Systolic blood pressure at First encounter", null, null); -// assertTrue(result.isOk()); -// assertEquals("Systolic blood pressure at First encounter", result.getDisplay()); +// runInTransaction(() -> { +// List termCodeSystemVersions_updated = myTermCodeSystemVersionDao.findAll(); +// assertEquals(termCodeSystemVersions_updated.size(), 2); +// TermCodeSystemVersion termCodeSystemVersion_2 = termCodeSystemVersions_updated.get(1); +// assertEquals(termCodeSystemVersion_2.getConcepts().size(), 3); +// Set termConcepts_updated = new HashSet<>(termCodeSystemVersion_2.getConcepts()); +// assertThat(toCodes(termConcepts_updated), containsInAnyOrder("A", "B", "C")); // -// result = myTermSvc.validateCodeIsInPreExpandedValueSet(optsNoGuess, valueSet, "http://acme.org", "11378-7", null, null, null); -// assertTrue(result.isOk()); -// assertEquals("Systolic blood pressure at First encounter", result.getDisplay()); -// -// Coding coding = new Coding("http://acme.org", "11378-7", "Systolic blood pressure at First encounter"); -// result = myTermSvc.validateCodeIsInPreExpandedValueSet(optsNoGuess, valueSet, null, null, null, coding, null); -// assertTrue(result.isOk()); -// assertEquals("Systolic blood pressure at First encounter", result.getDisplay()); -// -// CodeableConcept codeableConcept = new CodeableConcept(); -// codeableConcept.addCoding(new Coding("BOGUS", "BOGUS", "BOGUS")); -// codeableConcept.addCoding(coding); -// result = myTermSvc.validateCodeIsInPreExpandedValueSet(optsNoGuess, valueSet, null, null, null, null, codeableConcept); -// assertTrue(result.isOk()); -// assertEquals("Systolic blood pressure at First encounter", result.getDisplay()); +// TermCodeSystem termCodeSystem = myTermCodeSystemDao.findByResourcePid(id_v2.getIdPartAsLong()); +// assertEquals("2", termCodeSystem.getCurrentVersion().getCodeSystemVersionId()); +// }); // } - @Test - public void testCreateCodeSystemTwoVersions() { - CodeSystem codeSystem = new CodeSystem(); - codeSystem.setUrl(CS_URL); - codeSystem.setContent(CodeSystem.CodeSystemContentMode.COMPLETE); - codeSystem - .addConcept().setCode("A").setDisplay("Code A"); - codeSystem - .addConcept().setCode("B").setDisplay("Code A"); - - codeSystem.setVersion("1"); - - IIdType id = myCodeSystemDao.create(codeSystem, mySrd).getId().toUnqualified(); - - Set codes = myTermSvc.findCodesBelow(id.getIdPartAsLong(), id.getVersionIdPartAsLong(), "A"); - assertThat(toCodes(codes), containsInAnyOrder("A")); - - codes = myTermSvc.findCodesBelow(id.getIdPartAsLong(), id.getVersionIdPartAsLong(), "B"); - assertThat(toCodes(codes), containsInAnyOrder("B")); - - runInTransaction(() -> { - List termCodeSystemVersions = myTermCodeSystemVersionDao.findAll(); - assertEquals(termCodeSystemVersions.size(), 1); - TermCodeSystemVersion termCodeSystemVersion_1 = termCodeSystemVersions.get(0); - assertEquals(termCodeSystemVersion_1.getConcepts().size(), 2); - Set termConcepts = new HashSet<>(termCodeSystemVersion_1.getConcepts()); - assertThat(toCodes(termConcepts), containsInAnyOrder("A", "B")); - - TermCodeSystem termCodeSystem = myTermCodeSystemDao.findByResourcePid(id.getIdPartAsLong()); - assertEquals("1", termCodeSystem.getCurrentVersion().getCodeSystemVersionId()); - - }); - - codeSystem.setVersion("2"); - codeSystem - .addConcept().setCode("C").setDisplay("Code C"); - - IIdType id_v2 = myCodeSystemDao.create(codeSystem, mySrd).getId().toUnqualified(); - codes = myTermSvc.findCodesBelow(id_v2.getIdPartAsLong(), id_v2.getVersionIdPartAsLong(), "C"); - assertThat(toCodes(codes), containsInAnyOrder("C")); - - runInTransaction(() -> { - List termCodeSystemVersions_updated = myTermCodeSystemVersionDao.findAll(); - assertEquals(termCodeSystemVersions_updated.size(), 2); - TermCodeSystemVersion termCodeSystemVersion_2 = termCodeSystemVersions_updated.get(1); - assertEquals(termCodeSystemVersion_2.getConcepts().size(), 3); - Set termConcepts_updated = new HashSet<>(termCodeSystemVersion_2.getConcepts()); - assertThat(toCodes(termConcepts_updated), containsInAnyOrder("A", "B", "C")); - - TermCodeSystem termCodeSystem = myTermCodeSystemDao.findByResourcePid(id_v2.getIdPartAsLong()); - assertEquals("2", termCodeSystem.getCurrentVersion().getCodeSystemVersionId()); - }); - } - diff --git a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/term/ZipCollectionBuilder.java b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/term/ZipCollectionBuilder.java index 026bd396e7d..1b887b37234 100644 --- a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/term/ZipCollectionBuilder.java +++ b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/term/ZipCollectionBuilder.java @@ -13,11 +13,15 @@ import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.List; +import java.util.Properties; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; public class ZipCollectionBuilder { + public static final String ZIP_ENTRY_PREFIX = "SnomedCT_Release_INT_20160131_Full/Terminology/"; + + private static final Logger ourLog = LoggerFactory.getLogger(ZipCollectionBuilder.class); private final ArrayList myFiles; @@ -58,7 +62,7 @@ public class ZipCollectionBuilder { bos = new ByteArrayOutputStream(); ZipOutputStream zos = new ZipOutputStream(bos); ourLog.info("Adding {} to test zip", theClasspathFileName); - zos.putNextEntry(new ZipEntry("SnomedCT_Release_INT_20160131_Full/Terminology/" + theOutputFilename)); + zos.putNextEntry(new ZipEntry(ZIP_ENTRY_PREFIX + theOutputFilename)); zos.write(readFile(theClasspathPrefix, theClasspathFileName)); zos.closeEntry(); zos.close(); @@ -76,6 +80,36 @@ public class ZipCollectionBuilder { }); } + public void addPropertiesZip(Properties properties, String theOutputFilename) throws IOException { + + ByteArrayOutputStream bos; + bos = new ByteArrayOutputStream(); + ZipOutputStream zos = new ZipOutputStream(bos); + ourLog.info("Adding properties to test zip"); + zos.putNextEntry(new ZipEntry(ZIP_ENTRY_PREFIX + theOutputFilename)); + zos.write(getPropertiesBytes(properties)); + zos.closeEntry(); + zos.close(); + ourLog.info("ZIP file has {} bytes", bos.toByteArray().length); + myFiles.add(new ITermLoaderSvc.FileDescriptor() { + @Override + public String getFilename() { + return "AAA.zip"; + } + + @Override + public InputStream getInputStream() { + return new ByteArrayInputStream(bos.toByteArray()); + } + }); + } + + private byte[] getPropertiesBytes(Properties theProperties) throws IOException { + ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + theProperties.store(byteArrayOutputStream, ""); + return byteArrayOutputStream.toByteArray(); + } + private byte[] readFile(String theClasspathPrefix, String theClasspathFileName) throws IOException { String classpathName = theClasspathPrefix + theClasspathFileName; InputStream stream = getClass().getResourceAsStream(classpathName); diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/loincupload.properties b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/loincupload.properties new file mode 100644 index 00000000000..3d36353cec0 --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/loincupload.properties @@ -0,0 +1,93 @@ +################# +### MANDATORY ### +################# + +# Answer lists (ValueSets of potential answers/values for LOINC "questions") +## File must be present +loinc.answerlist.file=AccessoryFiles/AnswerFile/AnswerList.csv +# Answer list links (connects LOINC observation codes to answer list codes) +## File must be present +loinc.answerlist.link.file=AccessoryFiles/AnswerFile/LoincAnswerListLink.csv + +# Document ontology +## File must be present +loinc.document.ontology.file=AccessoryFiles/DocumentOntology/DocumentOntology.csv + +# LOINC codes +## File must be present +loinc.file=LoincTable/Loinc.csv + +# LOINC hierarchy +## File must be present +loinc.hierarchy.file=AccessoryFiles/MultiAxialHierarchy/MultiAxialHierarchy.csv + +# IEEE medical device codes +## File must be present +loinc.ieee.medical.device.code.mapping.table.file=AccessoryFiles/LoincIeeeMedicalDeviceCodeMappingTable/LoincIeeeMedicalDeviceCodeMappingTable.csv + +# Imaging document codes +## File must be present +loinc.imaging.document.codes.file=AccessoryFiles/ImagingDocuments/ImagingDocumentCodes.csv + +# Part +## File must be present +loinc.part.file=AccessoryFiles/PartFile/Part.csv + +# Part link +## File must be present +loinc.part.link.primary.file=AccessoryFiles/PartFile/LoincPartLink_Primary.csv +loinc.part.link.supplementary.file=AccessoryFiles/PartFile/LoincPartLink_Supplementary.csv + +# Part related code mapping +## File must be present +loinc.part.related.code.mapping.file=AccessoryFiles/PartFile/PartRelatedCodeMapping.csv + +# RSNA playbook +## File must be present +loinc.rsna.playbook.file=AccessoryFiles/LoincRsnaRadiologyPlaybook/LoincRsnaRadiologyPlaybook.csv + +# Top 2000 codes - SI +## File must be present +loinc.top2000.common.lab.results.si.file=AccessoryFiles/Top2000Results/SI/Top2000CommonLabResultsSi.csv +# Top 2000 codes - US +## File must be present +loinc.top2000.common.lab.results.us.file=AccessoryFiles/Top2000Results/US/Top2000CommonLabResultsUs.csv + +# Universal lab order ValueSet +## File must be present +loinc.universal.lab.order.valueset.file=AccessoryFiles/LoincUniversalLabOrdersValueSet/LoincUniversalLabOrdersValueSet.csv + +################ +### OPTIONAL ### +################ + +# This is the version identifier for the answer list file +## Key may be omitted +loinc.answerlist.version=Beta.1 + +# This is the version identifier for uploaded ConceptMap resources +## Key may be omitted +loinc.conceptmap.version=Beta.1 + +# Group +## Default value if key not provided: AccessoryFiles/GroupFile/Group.csv +## File may be omitted +loinc.group.file=AccessoryFiles/GroupFile/Group.csv +# Group terms +## Default value if key not provided: AccessoryFiles/GroupFile/GroupLoincTerms.csv +## File may be omitted +loinc.group.terms.file=AccessoryFiles/GroupFile/GroupLoincTerms.csv +# Parent group +## Default value if key not provided: AccessoryFiles/GroupFile/ParentGroup.csv +## File may be omitted +loinc.parent.group.file=AccessoryFiles/GroupFile/ParentGroup.csv + +# Consumer Names +## Default value if key not provided: AccessoryFiles/ConsumerName/ConsumerName.csv +## File may be omitted +loinc.consumer.name.file=AccessoryFiles/ConsumerName/ConsumerName.csv + +# Linguistic Variants +## Default value if key not provided: AccessoryFiles/LinguisticVariants/LinguisticVariants.csv +## File may be omitted +loinc.linguistic.variants.file=AccessoryFiles/LinguisticVariants/LinguisticVariants.csv \ No newline at end of file diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/loincupload_singlepartlink.properties b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/loincupload_singlepartlink.properties new file mode 100644 index 00000000000..3164f533888 --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/loincupload_singlepartlink.properties @@ -0,0 +1,82 @@ +################# +### MANDATORY ### +################# + +# Answer lists (ValueSets of potential answers/values for LOINC "questions") +## File must be present +loinc.answerlist.file=AccessoryFiles/AnswerFile/AnswerList.csv +# Answer list links (connects LOINC observation codes to answer list codes) +## File must be present +loinc.answerlist.link.file=AccessoryFiles/AnswerFile/LoincAnswerListLink.csv + +# Document ontology +## File must be present +loinc.document.ontology.file=AccessoryFiles/DocumentOntology/DocumentOntology.csv + +# LOINC codes +## File must be present +loinc.file=LoincTable/Loinc.csv + +# LOINC hierarchy +## File must be present +loinc.hierarchy.file=AccessoryFiles/MultiAxialHierarchy/MultiAxialHierarchy.csv + +# IEEE medical device codes +## File must be present +loinc.ieee.medical.device.code.mapping.table.file=AccessoryFiles/LoincIeeeMedicalDeviceCodeMappingTable/LoincIeeeMedicalDeviceCodeMappingTable.csv + +# Imaging document codes +## File must be present +loinc.imaging.document.codes.file=AccessoryFiles/ImagingDocuments/ImagingDocumentCodes.csv + +# Part +## File must be present +loinc.part.file=AccessoryFiles/PartFile/Part.csv + +# Part link +## File must be present +loinc.part.link.file=AccessoryFiles/PartFile/LoincPartLink.csv + +# Part related code mapping +## File must be present +loinc.part.related.code.mapping.file=AccessoryFiles/PartFile/PartRelatedCodeMapping.csv + +# RSNA playbook +## File must be present +loinc.rsna.playbook.file=AccessoryFiles/LoincRsnaRadiologyPlaybook/LoincRsnaRadiologyPlaybook.csv + +# Top 2000 codes - SI +## File must be present +loinc.top2000.common.lab.results.si.file=AccessoryFiles/Top2000Results/SI/Top2000CommonLabResultsSi.csv +# Top 2000 codes - US +## File must be present +loinc.top2000.common.lab.results.us.file=AccessoryFiles/Top2000Results/US/Top2000CommonLabResultsUs.csv + +# Universal lab order ValueSet +## File must be present +loinc.universal.lab.order.valueset.file=AccessoryFiles/LoincUniversalLabOrdersValueSet/LoincUniversalLabOrdersValueSet.csv + +################ +### OPTIONAL ### +################ + +# This is the version identifier for the answer list file +## Key may be omitted +loinc.answerlist.version=Beta.1 + +# This is the version identifier for uploaded ConceptMap resources +## Key may be omitted +loinc.conceptmap.version=Beta.1 + +# Group +## Default value if key not provided: AccessoryFiles/GroupFile/Group.csv +## File may be omitted +loinc.group.file=AccessoryFiles/GroupFile/Group.csv +# Group terms +## Default value if key not provided: AccessoryFiles/GroupFile/GroupLoincTerms.csv +## File may be omitted +loinc.group.terms.file=AccessoryFiles/GroupFile/GroupLoincTerms.csv +# Parent group +## Default value if key not provided: AccessoryFiles/GroupFile/ParentGroup.csv +## File may be omitted +loinc.parent.group.file=AccessoryFiles/GroupFile/ParentGroup.csv diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/AnswerFile/AnswerList.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/AnswerFile/AnswerList.csv new file mode 100644 index 00000000000..a448cf80f2d --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/AnswerFile/AnswerList.csv @@ -0,0 +1,12 @@ +"AnswerListId","AnswerListName" ,"AnswerListOID" ,"ExtDefinedYN","ExtDefinedAnswerListCodeSystem","ExtDefinedAnswerListLink" ,"AnswerStringId","LocalAnswerCode","LocalAnswerCodeSystem","SequenceNumber","DisplayText" ,"ExtCodeId","ExtCodeDisplayName" ,"ExtCodeSystem" ,"ExtCodeSystemVersion" ,"ExtCodeSystemCopyrightNotice" ,"SubsequentTextPrompt","Description","Score" +"LL1000-0" ,"PhenX05_13_30D bread amt","1.3.6.1.4.1.12009.10.1.165" ,"N" , , ,"LA13825-7" ,"1" , ,1 ,"1 slice or 1 dinner roll" , , , , , , , , +"LL1000-0" ,"PhenX05_13_30D bread amt","1.3.6.1.4.1.12009.10.1.165" ,"N" , , ,"LA13838-0" ,"2" , ,2 ,"2 slices or 2 dinner rolls" , , , , , , , , +"LL1000-0" ,"PhenX05_13_30D bread amt","1.3.6.1.4.1.12009.10.1.165" ,"N" , , ,"LA13892-7" ,"3" , ,3 ,"More than 2 slices or 2 dinner rolls", , , , , , , , +"LL1001-8" ,"PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA6270-8" ,"00" , ,1 ,"Never" , , , , , , , , +"LL1001-8" ,"PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13836-4" ,"01" , ,2 ,"1-3 times per month" , , , , , , , , +"LL1001-8" ,"PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13834-9" ,"02" , ,3 ,"1-2 times per week" , , , , , , , , +"LL1001-8" ,"PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13853-9" ,"03" , ,4 ,"3-4 times per week" , , , , , , , , +"LL1001-8" ,"PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13860-4" ,"04" , ,5 ,"5-6 times per week" , , , , , , , , +"LL1001-8" ,"PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13827-3" ,"05" , ,6 ,"1 time per day" , , , , , , , , +"LL1001-8" ,"PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA4389-8" ,"97" , ,11 ,"Refused" ,"443390004","Refused (qualifier value)","http://snomed.info/sct","http://snomed.info/sct/900000000000207008/version/20170731","This material includes SNOMED Clinical Terms® (SNOMED CT®) which is used by permission of the International Health Terminology Standards Development Organisation (IHTSDO) under license. All rights reserved. SNOMED CT® was originally created by The College", , , +"LL1892-0" ,"ICD-9_ICD-10" ,"1.3.6.1.4.1.12009.10.1.1069","Y" , ,"http://www.cdc.gov/nchs/icd.htm", , , , , , , , , , , , , diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/AnswerFile/LoincAnswerListLink.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/AnswerFile/LoincAnswerListLink.csv new file mode 100644 index 00000000000..820602c77ad --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/AnswerFile/LoincAnswerListLink.csv @@ -0,0 +1,11 @@ +"LoincNumber","LongCommonName" ,"AnswerListId","AnswerListName" ,"AnswerListLinkType","ApplicableContext" +"61438-8" ,"Each time you ate bread, toast or dinner rolls, how much did you usually eat in the past 30 days [PhenX]","LL1000-0" ,"PhenX05_13_30D bread amt","NORMATIVE" , +"10061-0" ,"S' wave amplitude in lead I" ,"LL1311-1" ,"PhenX12_44" ,"EXAMPLE" , +"10331-7" ,"Rh [Type] in Blood" ,"LL360-9" ,"Pos|Neg" ,"EXAMPLE" , +"10389-5" ,"Blood product.other [Type]" ,"LL2413-4" ,"Othr bld prod" ,"EXAMPLE" , +"10390-3" ,"Blood product special preparation [Type]" ,"LL2422-5" ,"Blood prod treatment" ,"EXAMPLE" , +"10393-7" ,"Factor IX given [Type]" ,"LL2420-9" ,"Human/Recomb" ,"EXAMPLE" , +"10395-2" ,"Factor VIII given [Type]" ,"LL2420-9" ,"Human/Recomb" ,"EXAMPLE" , +"10401-8" ,"Immune serum globulin given [Type]" ,"LL2421-7" ,"IM/IV" ,"EXAMPLE" , +"10410-9" ,"Plasma given [Type]" ,"LL2417-5" ,"Plasma type" ,"EXAMPLE" , +"10568-4" ,"Clarity of Semen" ,"LL2427-4" ,"Clear/Opales/Milky" ,"EXAMPLE" , diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/ConsumerName/ConsumerName.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/ConsumerName/ConsumerName.csv new file mode 100644 index 00000000000..b4ec2907985 --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/ConsumerName/ConsumerName.csv @@ -0,0 +1,6 @@ +"LoincNumber","ConsumerName" +"61438-8","Consumer Name 61438-8" +,"Consumer Name X" +47239-9","" +"17787-3","Consumer Name 17787-3" +"38699-5","1,1-Dichloroethane, Air" diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/DocumentOntology/DocumentOntology.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/DocumentOntology/DocumentOntology.csv new file mode 100644 index 00000000000..f857d7f297b --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/DocumentOntology/DocumentOntology.csv @@ -0,0 +1,10 @@ +"LoincNumber","PartNumber","PartTypeName","PartSequenceOrder","PartName" +"11488-4","LP173418-7","Document.Kind","1","Note" +"11488-4","LP173110-0","Document.TypeOfService","1","Consultation" +"11488-4","LP173061-5","Document.Setting","1","{Setting}" +"11488-4","LP187187-2","Document.Role","1","{Role}" +"11490-0","LP173418-7","Document.Kind","1","Note" +"11490-0","LP173221-5","Document.TypeOfService","1","Discharge summary" +"11490-0","LP173061-5","Document.Setting","1","{Setting}" +"11490-0","LP173084-7","Document.Role","1","Physician" +"11492-6","LP173418-7","Document.Kind","1","Note" diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/GroupFile/Group.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/GroupFile/Group.csv new file mode 100644 index 00000000000..66f5561ea1c --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/GroupFile/Group.csv @@ -0,0 +1,2 @@ +"ParentGroupId","GroupId","Group","Archetype","Status","VersionFirstReleased" +"LG100-4","LG1695-8","1,4-Dichlorobenzene|MCnc|Pt|ANYBldSerPl","","Active","" diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/GroupFile/GroupLoincTerms.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/GroupFile/GroupLoincTerms.csv new file mode 100644 index 00000000000..04c19759cfb --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/GroupFile/GroupLoincTerms.csv @@ -0,0 +1,3 @@ +"Category","GroupId","Archetype","LoincNumber","LongCommonName" +"Flowsheet","LG1695-8","","17424-3","1,4-Dichlorobenzene [Mass/volume] in Blood" +"Flowsheet","LG1695-8","","13006-2","1,4-Dichlorobenzene [Mass/volume] in Serum or Plasma" diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/GroupFile/ParentGroup.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/GroupFile/ParentGroup.csv new file mode 100644 index 00000000000..734a86c43dd --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/GroupFile/ParentGroup.csv @@ -0,0 +1,2 @@ +"ParentGroupId","ParentGroup","Status" +"LG100-4","Chem_DrugTox_Chal_Sero_Allergy","ACTIVE" diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/ImagingDocuments/ImagingDocumentCodes.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/ImagingDocuments/ImagingDocumentCodes.csv new file mode 100644 index 00000000000..a26397639ff --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/ImagingDocuments/ImagingDocumentCodes.csv @@ -0,0 +1,10 @@ +"LOINC_NUM","LONG_COMMON_NAME" +"11525-3","US Pelvis Fetus for pregnancy" +"17787-3","NM Thyroid gland Study report" +"18744-3","Bronchoscopy study" +"18746-8","Colonoscopy study" +"18748-4","Diagnostic imaging study" +"18751-8","Endoscopy study" +"18753-4","Flexible sigmoidoscopy study" +"24531-6","US Retroperitoneum" +"24532-4","US Abdomen RUQ" diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/LinguisticVariants/LinguisticVariants.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/LinguisticVariants/LinguisticVariants.csv new file mode 100644 index 00000000000..c79b3197490 --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/LinguisticVariants/LinguisticVariants.csv @@ -0,0 +1,9 @@ +"ID","ISO_LANGUAGE","ISO_COUNTRY","LANGUAGE_NAME","PRODUCER" +"5","zh","CN","Chinese (CHINA)","Lin Zhang, A LOINC volunteer from China" +"7","es","AR","Spanish (ARGENTINA)","Conceptum Medical Terminology Center" +"8","fr","CA","French (CANADA)","Canada Health Infoway Inc." +,"de","AT","German (AUSTRIA)","ELGA, Austria" +"88",,"AT","German (AUSTRIA)","ELGA, Austria" +"89","de",,"German (AUSTRIA)","ELGA, Austria" +"90","de","AT",,"ELGA, Austria" +"24","de","AT","German (AUSTRIA)","ELGA, Austria" \ No newline at end of file diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/LinguisticVariants/deAT24LinguisticVariant.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/LinguisticVariants/deAT24LinguisticVariant.csv new file mode 100644 index 00000000000..c6882d47504 --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/LinguisticVariants/deAT24LinguisticVariant.csv @@ -0,0 +1,4 @@ +"LOINC_NUM","COMPONENT","PROPERTY","TIME_ASPCT","SYSTEM","SCALE_TYP","METHOD_TYP","CLASS","SHORTNAME","LONG_COMMON_NAME","RELATEDNAMES2","LinguisticVariantDisplayName" +"61438-8","Entlassungsbrief Ärztlich","Ergebnis","Zeitpunkt","{Setting}","Dokument","Dermatologie","DOC.ONTOLOGY","de shortname","de long common name","de related names 2","de linguistic variant display name" +"43730-1","","","","","","","","","","EBV-DNA qn. PCR","EBV-DNA quantitativ PCR" +"17787-3","","","","","","","","","","CoV OC43 RNA ql/SM P","Coronavirus OC43 RNA ql. /Sondermaterial PCR" diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/LinguisticVariants/frCA8LinguisticVariant.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/LinguisticVariants/frCA8LinguisticVariant.csv new file mode 100644 index 00000000000..fa09e0cb242 --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/LinguisticVariants/frCA8LinguisticVariant.csv @@ -0,0 +1,6 @@ +"LOINC_NUM","COMPONENT","PROPERTY","TIME_ASPCT","SYSTEM","SCALE_TYP","METHOD_TYP","CLASS","SHORTNAME","LONG_COMMON_NAME","RELATEDNAMES2","LinguisticVariantDisplayName" +"61438-8","Cellules de Purkinje cytoplasmique type 2 , IgG","Titre","Temps ponctuel","Sérum","Quantitatif","Immunofluorescence","Sérologie","","","","" +"11704-4","Gliale nucléaire de type 1 , IgG","Titre","Temps ponctuel","LCR","Quantitatif","Immunofluorescence","Sérologie","","","","" +,"Cellules de Purkinje cytoplasmique type 2 , IgG","Titre","Temps ponctuel","Sérum","Quantitatif",,,"","","","" +"17787-3","Virus respiratoire syncytial bovin","Présence-Seuil","Temps ponctuel","XXX","Ordinal","Culture spécifique à un microorganisme","Microbiologie","","","","" +"17788-1","Cellules de Purkinje cytoplasmique type 2 , IgG","Titre","Temps ponctuel","Sérum","Quantitatif",,,"","","","" diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/LinguisticVariants/zhCN5LinguisticVariant.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/LinguisticVariants/zhCN5LinguisticVariant.csv new file mode 100644 index 00000000000..48d07d9fdc3 --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/LinguisticVariants/zhCN5LinguisticVariant.csv @@ -0,0 +1,9 @@ +"LOINC_NUM","COMPONENT","PROPERTY","TIME_ASPCT","SYSTEM","SCALE_TYP","METHOD_TYP","CLASS","SHORTNAME","LONG_COMMON_NAME","RELATEDNAMES2","LinguisticVariantDisplayName" +"61438-8","血流速度.收缩期.最大值","速度","时间点","大脑中动脉","定量型","超声.多普勒","产科学检查与测量指标.超声","","","Cereb 动态 可用数量表示的;定量性;数值型;数量型;连续数值型标尺 大脑(Cerebral) 时刻;随机;随意;瞬间 术语""cerebral""指的是主要由中枢半球(大脑皮质和基底神经节)组成的那部分脑结构 流 流量;流速;流体 血;全血 血流量;血液流量 速度(距离/时间);速率;速率(距离/时间)","" +"11704-4","血流速度.收缩期.最大值","速度","时间点","动脉导管","定量型","超声.多普勒","产科学检查与测量指标.超声","","","动态 动脉管 可用数量表示的;定量性;数值型;数量型;连续数值型标尺 时刻;随机;随意;瞬间 流 流量;流速;流体 血;全血 血流量;血液流量 速度(距离/时间);速率;速率(距离/时间)","" +"17787-3","血流速度.收缩期.最大值","速度","时间点","二尖瓣^胎儿","定量型","超声.多普勒","产科学检查与测量指标.超声","","","僧帽瓣 动态 可用数量表示的;定量性;数值型;数量型;连续数值型标尺 时刻;随机;随意;瞬间 流 流量;流速;流体 胎;超系统 - 胎儿 血;全血 血流量;血液流量 速度(距离/时间);速率;速率(距离/时间)","" +"61438-6",,"速度","时间点","二尖瓣^胎儿","定量型","超声.多普勒","产科学检查与测量指标.超声","","","僧帽瓣 动态 可用数量表示的;定量性;数值型;数量型;连续数值型标尺 时刻;随机;随意;瞬间 流 流量;流速;流体 胎;超系统 - 胎儿 血;全血 血流量;血液流量 速度(距离/时间);速率;速率(距离/时间)","" +"10000-8","血流速度.收缩期.最大值",,"时间点","二尖瓣^胎儿","定量型","超声.多普勒","产科学检查与测量指标.超声","","","僧帽瓣 动态 可用数量表示的;定量性;数值型;数量型;连续数值型标尺 时刻;随机;随意;瞬间 流 流量;流速;流体 胎;超系统 - 胎儿 血;全血 血流量;血液流量 速度(距离/时间);速率;速率(距离/时间)","" +"17788-1","血流速度.收缩期.最大值","速度",,"大脑中动脉","定量型","超声.多普勒","产科学检查与测量指标.超声","","","Cereb 动态 可用数量表示的;定量性;数值型;数量型;连续数值型标尺 大脑(Cerebral) 时刻;随机;随意;瞬间 术语""cerebral""指的是主要由中枢半球(大脑皮质和基底神经节)组成的那部分脑结构 流 流量;流速;流体 血;全血 血流量;血液流量 速度(距离/时间);速率;速率(距离/时间)","" +"11488-4","血流速度.收缩期.最大值","速度","时间点",,"定量型","超声.多普勒","产科学检查与测量指标.超声","","","Cereb 动态 可用数量表示的;定量性;数值型;数量型;连续数值型标尺 大脑(Cerebral) 时刻;随机;随意;瞬间 术语""cerebral""指的是主要由中枢半球(大脑皮质和基底神经节)组成的那部分脑结构 流 流量;流速;流体 血;全血 血流量;血液流量 速度(距离/时间);速率;速率(距离/时间)","" +"47239-9","血流速度.收缩期.最大值","速度","时间点","大脑中动脉",,"超声.多普勒","产科学检查与测量指标.超声","","","Cereb 动态 可用数量表示的;定量性;数值型;数量型;连续数值型标尺 大脑(Cerebral) 时刻;随机;随意;瞬间 术语""cerebral""指的是主要由中枢半球(大脑皮质和基底神经节)组成的那部分脑结构 流 流量;流速;流体 血;全血 血流量;血液流量 速度(距离/时间);速率;速率(距离/时间)","" diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/LoincIeeeMedicalDeviceCodeMappingTable/LoincIeeeMedicalDeviceCodeMappingTable.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/LoincIeeeMedicalDeviceCodeMappingTable/LoincIeeeMedicalDeviceCodeMappingTable.csv new file mode 100644 index 00000000000..d8cf83cd09e --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/LoincIeeeMedicalDeviceCodeMappingTable/LoincIeeeMedicalDeviceCodeMappingTable.csv @@ -0,0 +1,10 @@ +LOINC_NUM,LOINC_LONG_COMMON_NAME,IEEE_CF_CODE10,IEEE_REFID,IEEE_DESCRIPTION,IEEE_DIM,IEEE_UOM_UCUM +11556-8,Oxygen [Partial pressure] in Blood,160116,MDC_CONC_PO2_GEN,,LMT-2L-2 LMT-2L-2,kPa mm[Hg] +11557-6,Carbon dioxide [Partial pressure] in Blood,160064,MDC_CONC_PCO2_GEN,,LMT-2L-2 LMT-2L-2,kPa mm[Hg] +11558-4,pH of Blood,160004,MDC_CONC_PH_GEN,,[pH],[pH] +12961-9,Urea nitrogen [Mass/volume] in Arterial blood,160080,MDC_CONC_UREA_ART,,ML-3 NL-3,mg/dL mmol/L +14749-6,Glucose [Moles/volume] in Serum or Plasma,160196,MDC_CONC_GLU_VENOUS_PLASMA,Plasma glucose concentration taken from venous,NL-3 ,mmol/L +14749-6,Glucose [Moles/volume] in Serum or Plasma,160368,MDC_CONC_GLU_UNDETERMINED_PLASMA,Plasma glucose concentration taken from undetermined sample source,NL-3 ,mmol/L +15074-8,Glucose [Moles/volume] in Blood,160020,MDC_CONC_GLU_GEN,,NL-3,mmol/L +15074-8,Glucose [Moles/volume] in Blood,160364,MDC_CONC_GLU_UNDETERMINED_WHOLEBLOOD,Whole blood glucose concentration taken from undetermined sample source,NL-3 ,mmol/L +17861-6,Calcium [Mass/volume] in Serum or Plasma,160024,MDC_CONC_CA_GEN,,ML-3,mg/dL diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/LoincRsnaRadiologyPlaybook/LoincRsnaRadiologyPlaybook.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/LoincRsnaRadiologyPlaybook/LoincRsnaRadiologyPlaybook.csv new file mode 100644 index 00000000000..1acba586623 --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/LoincRsnaRadiologyPlaybook/LoincRsnaRadiologyPlaybook.csv @@ -0,0 +1,10 @@ +"LoincNumber","LongCommonName" ,"PartNumber","PartTypeName" ,"PartName" ,"PartSequenceOrder","RID" ,"PreferredName" ,"RPID" ,"LongName" +"17787-3" ,"NM Thyroid gland Study report","LP199995-4","Rad.Anatomic Location.Region Imaged","Neck" ,"A" ,"RID7488" ,"neck" ,"" ,"" +"17787-3" ,"NM Thyroid gland Study report","LP206648-0","Rad.Anatomic Location.Imaging Focus","Thyroid gland" ,"A" ,"RID7578" ,"thyroid gland" ,"" ,"" +"17787-3" ,"NM Thyroid gland Study report","LP208891-4","Rad.Modality.Modality type" ,"NM" ,"A" ,"RID10330","nuclear medicine imaging","" ,"" +"24531-6" ,"US Retroperitoneum" ,"LP207608-3","Rad.Modality.Modality type" ,"US" ,"A" ,"RID10326","Ultrasound" ,"RPID2142","US Retroperitoneum" +"24531-6" ,"US Retroperitoneum" ,"LP199943-4","Rad.Anatomic Location.Imaging Focus","Retroperitoneum" ,"A" ,"RID431" ,"RETROPERITONEUM" ,"RPID2142","US Retroperitoneum" +"24531-6" ,"US Retroperitoneum" ,"LP199956-6","Rad.Anatomic Location.Region Imaged","Abdomen" ,"A" ,"RID56" ,"Abdomen" ,"RPID2142","US Retroperitoneum" +"24532-4" ,"US Abdomen RUQ" ,"LP199956-6","Rad.Anatomic Location.Region Imaged","Abdomen" ,"A" ,"RID56" ,"Abdomen" ,"" ,"" +"24532-4" ,"US Abdomen RUQ" ,"LP207608-3","Rad.Modality.Modality type" ,"US" ,"A" ,"RID10326","Ultrasound" ,"" ,"" +"24532-4" ,"US Abdomen RUQ" ,"LP208105-9","Rad.Anatomic Location.Imaging Focus","Right upper quadrant","A" ,"RID29994","Right upper quadrant" ,"" ,"" diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/LoincUniversalLabOrdersValueSet/LoincUniversalLabOrdersValueSet.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/LoincUniversalLabOrdersValueSet/LoincUniversalLabOrdersValueSet.csv new file mode 100644 index 00000000000..72d95485a58 --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/LoincUniversalLabOrdersValueSet/LoincUniversalLabOrdersValueSet.csv @@ -0,0 +1,10 @@ +"LOINC_NUM","LONG_COMMON_NAME","ORDER_OBS" +"42176-8","1,3 beta glucan [Mass/volume] in Serum","Both" +"53835-5","1,5-Anhydroglucitol [Mass/volume] in Serum or Plasma","Both" +"31019-3","10-Hydroxycarbazepine [Mass/volume] in Serum or Plasma","Both" +"6765-2","17-Hydroxypregnenolone [Mass/volume] in Serum or Plasma","Both" +"1668-3","17-Hydroxyprogesterone [Mass/volume] in Serum or Plasma","Both" +"32854-2","17-Hydroxyprogesterone [Presence] in DBS","Both" +"49054-0","25-Hydroxycalciferol [Mass/volume] in Serum or Plasma","Both" +"62292-8","25-Hydroxyvitamin D2+25-Hydroxyvitamin D3 [Mass/volume] in Serum or Plasma","Both" +"44907-4","5-Hydroxyindoleacetate panel - 24 hour Urine","Order" diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/MultiAxialHierarchy/MultiAxialHierarchy.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/MultiAxialHierarchy/MultiAxialHierarchy.csv new file mode 100644 index 00000000000..527b8fd5cae --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/MultiAxialHierarchy/MultiAxialHierarchy.csv @@ -0,0 +1,10 @@ +PATH_TO_ROOT,SEQUENCE,IMMEDIATE_PARENT,CODE,CODE_TEXT +,1,,LP31755-9,Microbiology +LP31755-9,1,LP31755-9,LP14559-6,Microorganism +LP31755-9.LP14559-6,1,LP14559-6,LP98185-9,Bacteria +LP31755-9.LP14559-6.LP98185-9,1,LP98185-9,LP14082-9,Bacteria +LP31755-9.LP14559-6.LP98185-9.LP14082-9,1,LP14082-9,LP52258-8,Bacteria | Body Fluid +LP31755-9.LP14559-6.LP98185-9.LP14082-9.LP52258-8,1,LP52258-8,41599-2,Bacteria Fld Ql Micro +LP31755-9.LP14559-6.LP98185-9.LP14082-9,2,LP14082-9,LP52260-4,Bacteria | Cerebral spinal fluid +LP31755-9.LP14559-6.LP98185-9.LP14082-9.LP52260-4,1,LP52260-4,41602-4,Bacteria CSF Ql Micro +LP31755-9.LP14559-6.LP98185-9.LP14082-9,3,LP14082-9,LP52960-9,Bacteria | Cervix diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/PanelsAndForms/AnswerList.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/PanelsAndForms/AnswerList.csv new file mode 100644 index 00000000000..a448cf80f2d --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/PanelsAndForms/AnswerList.csv @@ -0,0 +1,12 @@ +"AnswerListId","AnswerListName" ,"AnswerListOID" ,"ExtDefinedYN","ExtDefinedAnswerListCodeSystem","ExtDefinedAnswerListLink" ,"AnswerStringId","LocalAnswerCode","LocalAnswerCodeSystem","SequenceNumber","DisplayText" ,"ExtCodeId","ExtCodeDisplayName" ,"ExtCodeSystem" ,"ExtCodeSystemVersion" ,"ExtCodeSystemCopyrightNotice" ,"SubsequentTextPrompt","Description","Score" +"LL1000-0" ,"PhenX05_13_30D bread amt","1.3.6.1.4.1.12009.10.1.165" ,"N" , , ,"LA13825-7" ,"1" , ,1 ,"1 slice or 1 dinner roll" , , , , , , , , +"LL1000-0" ,"PhenX05_13_30D bread amt","1.3.6.1.4.1.12009.10.1.165" ,"N" , , ,"LA13838-0" ,"2" , ,2 ,"2 slices or 2 dinner rolls" , , , , , , , , +"LL1000-0" ,"PhenX05_13_30D bread amt","1.3.6.1.4.1.12009.10.1.165" ,"N" , , ,"LA13892-7" ,"3" , ,3 ,"More than 2 slices or 2 dinner rolls", , , , , , , , +"LL1001-8" ,"PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA6270-8" ,"00" , ,1 ,"Never" , , , , , , , , +"LL1001-8" ,"PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13836-4" ,"01" , ,2 ,"1-3 times per month" , , , , , , , , +"LL1001-8" ,"PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13834-9" ,"02" , ,3 ,"1-2 times per week" , , , , , , , , +"LL1001-8" ,"PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13853-9" ,"03" , ,4 ,"3-4 times per week" , , , , , , , , +"LL1001-8" ,"PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13860-4" ,"04" , ,5 ,"5-6 times per week" , , , , , , , , +"LL1001-8" ,"PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13827-3" ,"05" , ,6 ,"1 time per day" , , , , , , , , +"LL1001-8" ,"PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA4389-8" ,"97" , ,11 ,"Refused" ,"443390004","Refused (qualifier value)","http://snomed.info/sct","http://snomed.info/sct/900000000000207008/version/20170731","This material includes SNOMED Clinical Terms® (SNOMED CT®) which is used by permission of the International Health Terminology Standards Development Organisation (IHTSDO) under license. All rights reserved. SNOMED CT® was originally created by The College", , , +"LL1892-0" ,"ICD-9_ICD-10" ,"1.3.6.1.4.1.12009.10.1.1069","Y" , ,"http://www.cdc.gov/nchs/icd.htm", , , , , , , , , , , , , diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/PanelsAndForms/Loinc.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/PanelsAndForms/Loinc.csv new file mode 100644 index 00000000000..20379cb7f1d --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/PanelsAndForms/Loinc.csv @@ -0,0 +1,16 @@ +"LOINC_NUM","COMPONENT" ,"PROPERTY","TIME_ASPCT","SYSTEM" ,"SCALE_TYP","METHOD_TYP" ,"CLASS" ,"VersionLastChanged","CHNG_TYPE","DefinitionDescription" ,"STATUS","CONSUMER_NAME","CLASSTYPE","FORMULA","SPECIES","EXMPL_ANSWERS","SURVEY_QUEST_TEXT" ,"SURVEY_QUEST_SRC" ,"UNITSREQUIRED","SUBMITTED_UNITS","RELATEDNAMES2" ,"SHORTNAME" ,"ORDER_OBS" ,"CDISC_COMMON_TESTS","HL7_FIELD_SUBFIELD_ID","EXTERNAL_COPYRIGHT_NOTICE" ,"EXAMPLE_UNITS","LONG_COMMON_NAME" ,"UnitsAndRange","DOCUMENT_SECTION","EXAMPLE_UCUM_UNITS","EXAMPLE_SI_UCUM_UNITS","STATUS_REASON","STATUS_TEXT","CHANGE_REASON_PUBLIC" ,"COMMON_TEST_RANK","COMMON_ORDER_RANK","COMMON_SI_TEST_RANK","HL7_ATTACHMENT_STRUCTURE","EXTERNAL_COPYRIGHT_LINK","PanelType","AskAtOrderEntry","AssociatedObservations" ,"VersionFirstReleased","ValidHL7AttachmentRequest" +"10013-1" ,"R' wave amplitude.lead I" ,"Elpot" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"Cardiac; ECG; EKG.MEASUREMENTS; Electrical potential; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave Amp L-I; R wave Amp L-I; Random; Right; Voltage" ,"R' wave Amp L-I" ,"Observation", , , ,"mV" ,"R' wave amplitude in lead I" , , ,"mV" , , , , ,0 ,0 ,0 , , , , , , , +"10014-9" ,"R' wave amplitude.lead II" ,"Elpot" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"2; Cardiac; ECG; EKG.MEASUREMENTS; Electrical potential; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave Amp L-II; R wave Amp L-II; Random; Right; Voltage" ,"R' wave Amp L-II" ,"Observation", , , ,"mV" ,"R' wave amplitude in lead II" , , ,"mV" , , , , ,0 ,0 ,0 , , , , , , , +"10015-6" ,"R' wave amplitude.lead III" ,"Elpot" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"3; Cardiac; ECG; EKG.MEASUREMENTS; Electrical potential; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave Amp L-III; R wave Amp L-III; Random; Right; Voltage" ,"R' wave Amp L-III" ,"Observation", , , ,"mV" ,"R' wave amplitude in lead III" , , ,"mV" , , , , ,0 ,0 ,0 , , , , , , , +"10016-4" ,"R' wave amplitude.lead V1" ,"Elpot" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"Cardiac; ECG; EKG.MEASUREMENTS; Electrical potential; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave Amp L-V1; R wave Amp L-V1; Random; Right; Voltage" ,"R' wave Amp L-V1" ,"Observation", , , ,"mV" ,"R' wave amplitude in lead V1" , , ,"mV" , , , , ,0 ,0 ,0 , , , , , , , +"1001-7" ,"DBG Ab" ,"Pr" ,"Pt" ,"Ser/Plas^donor" ,"Ord" , ,"BLDBK" ,"2.44" ,"MIN" , ,"ACTIVE", ,1 , , , , , , , ,"ABS; Aby; Antby; Anti; Antibodies; Antibody; Autoantibodies; Autoantibody; BLOOD BANK; Donna Bennett-Goodspeed; Donr; Ordinal; Pl; Plasma; Plsm; Point in time; QL; Qual; Qualitative; Random; Screen; SerP; SerPl; SerPl^donor; SerPlas; Serum; Serum or plasma; SR" ,"DBG Ab SerPl Donr Ql" ,"Observation", , , , ,"DBG Ab [Presence] in Serum or Plasma from donor" , , , , , , ,"The Property has been changed from ACnc to Pr (Presence) to reflect the new model for ordinal terms where results are based on presence or absence." ,0 ,0 ,0 , , , , , , , +"10017-2" ,"R' wave amplitude.lead V2" ,"Elpot" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"Cardiac; ECG; EKG.MEASUREMENTS; Electrical potential; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave Amp L-V2; R wave Amp L-V2; Random; Right; Voltage" ,"R' wave Amp L-V2" ,"Observation", , , ,"mV" ,"R' wave amplitude in lead V2" , , ,"mV" , , , , ,0 ,0 ,0 , , , , , , , +"10018-0" ,"R' wave amplitude.lead V3" ,"Elpot" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"Cardiac; ECG; EKG.MEASUREMENTS; Electrical potential; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave Amp L-V3; R wave Amp L-V3; Random; Right; Voltage" ,"R' wave Amp L-V3" ,"Observation", , , ,"mV" ,"R' wave amplitude in lead V3" , , ,"mV" , , , , ,0 ,0 ,0 , , , , , , , +"10019-8" ,"R' wave amplitude.lead V4" ,"Elpot" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"Cardiac; ECG; EKG.MEASUREMENTS; Electrical potential; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave Amp L-V4; R wave Amp L-V4; Random; Right; Voltage" ,"R' wave Amp L-V4" ,"Observation", , , ,"mV" ,"R' wave amplitude in lead V4" , , ,"mV" , , , , ,0 ,0 ,0 , , , , , , , +"10020-6" ,"R' wave amplitude.lead V5" ,"Elpot" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"Cardiac; ECG; EKG.MEASUREMENTS; Electrical potential; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave Amp L-V5; R wave Amp L-V5; Random; Right; Voltage" ,"R' wave Amp L-V5" ,"Observation", , , ,"mV" ,"R' wave amplitude in lead V5" , , ,"mV" , , , , ,0 ,0 ,0 , , , , , , , +"61438-8" ,"Each time you ate bread, toast or dinner rolls, how much did you usually eat in the past 30D","Find" ,"Pt" ,"^Patient" ,"Ord" ,"PhenX" ,"PHENX" ,"2.44" ,"MIN" , ,"TRIAL" , ,2 , , , ,"Each time you eat bread, toast or dinner rolls, how much do you usually eat?","PhenX.050201100100","N" , ,"Finding; Findings; How much bread in 30D; Last; Ordinal; Point in time; QL; Qual; Qualitative; Random; Screen" ,"How much bread in 30D PhenX", , , , , ,"Each time you ate bread, toast or dinner rolls, how much did you usually eat in the past 30 days [PhenX]", , , , , , , ,0 ,0 ,0 , , , , , , , +"10000-8" ,"R wave duration.lead AVR" ,"Time" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"Cardiac; Durat; ECG; EKG.MEASUREMENTS; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave dur L-AVR; R wave dur L-AVR; Random; Right" ,"R wave dur L-AVR" ,"Observation", , , ,"s" ,"R wave duration in lead AVR" , , ,"s" , , , , ,0 ,0 ,0 , , , , , , , +"17787-3" ,"Study report" ,"Find" ,"Pt" ,"Neck>Thyroid gland","Doc" ,"NM" ,"RAD" ,"2.61" ,"MIN" , ,"ACTIVE", ,2 , , , , , , , ,"Document; Finding; Findings; Imaging; Point in time; Radiology; Random; Study report; Thy" ,"NM Thyroid Study report" ,"Both" , , , , ,"NM Thyroid gland Study report" , , , , , , ,"Changed System from ""Thyroid"" for conformance with the LOINC/RadLex unified model.; Method of ""Radnuc"" was changed to ""NM"". The LOINC/RadLex Committee agreed to use a subset of the two-letter DICOM modality codes as the primary modality identifier." ,0 ,0 ,0 ,"IG exists" , , , ,"81220-6;72230-6" ,"1.0l" , +"17788-1" ,"Large unstained cells/100 leukocytes" ,"NFr" ,"Pt" ,"Bld" ,"Qn" ,"Automated count","HEM/BC" ,"2.50" ,"MIN" ,"Part of auto diff output of Bayer H*3S; peroxidase negative cells too large to be classified as lymph or basophil" ,"ACTIVE", ,1 , , , , , ,"Y" ,"%" ,"100WBC; Auto; Automated detection; Blood; Cell; Cellularity; Elec; Elect; Electr; HEMATOLOGY/CELL COUNTS; Leuc; Leuk; Leukocyte; Lkcs; LUC; Number Fraction; Percent; Point in time; QNT; Quan; Quant; Quantitative; Random; WB; WBC; WBCs; White blood cell; White blood cells; Whole blood" ,"LUC/leuk NFr Bld Auto" ,"Observation", , , ,"%" ,"Large unstained cells/100 leukocytes in Blood by Automated count" , , ,"%" , , , , ,1894 ,0 ,1894 , , , , , ,"1.0l" , +"11488-4" ,"Consultation note" ,"Find" ,"Pt" ,"{Setting}" ,"Doc" ,"{Role}" ,"DOC.ONTOLOGY","2.63" ,"MIN" , ,"ACTIVE", ,2 , , , , , , , ,"Consult note; DOC.ONT; Document; Encounter; Evaluation and management; Evaluation and management note; Finding; Findings; notes; Point in time; Random; Visit note" ,"Consult note" ,"Both" , , , , ,"Consult note" , , , , , , ,"Edit made because this term is conformant to the Document Ontology axis values and therefore are being placed in this class.; Based on Clinical LOINC Committee decision during the September 2014 meeting, {Provider} was changed to {Author Type} to emphasize a greater breadth of potential document authors. At the September 2015 Clinical LOINC Committee meeting, the Committee decided to change {Author Type} to {Role} to align with the 'Role' axis name in the LOINC Document Ontology.; Because it is too difficult to maintain and because the distinction between documents and sections is not clear-cut nor necessary in most cases, the DOCUMENT_SECTION field has been deemed to have little value. The field has been set to null in the December 2017 release in preparation for removal in the December 2018 release. These changes were approved by the Clinical LOINC Committee.",0 ,0 ,0 ,"IG exists" , , , ,"81222-2;72231-4;81243-8","1.0j-a" ,"Y" +"47239-9" ,"Reason for stopping HIV Rx" ,"Type" ,"Pt" ,"^Patient" ,"Nom" ,"Reported" ,"ART" ,"2.50" ,"MIN" ,"Reason for stopping antiretroviral therapy" ,"ACTIVE", ,2 , , , , , ,"N" , ,"AIDS; Anti-retroviral therapy; ART; Human immunodeficiency virus; Nominal; Point in time; Random; Treatment; Typ" ,"Reason for stopping HIV Rx" ,"Observation", , ,"Copyright © 2006 World Health Organization. Used with permission. Publications of the World Health Organization can be obtained from WHO Press, World Health Organization, 20 Avenue Appia, 1211 Geneva 27, Switzerland (tel: +41 22 791 2476; fax: +41 22 791 4857; email: bookorders@who.int). Requests for permission to reproduce or translate WHO publications – whether for sale or for noncommercial distribution – should be addressed to WHO Press, at the above address (fax: +41 22 791 4806; email: permissions@who.int). The designations employed and the presentation of the material in this publication do not imply the expression of any opinion whatsoever on the part of the World Health Organization concerning the legal status of any country, territory, city or area or of its authorities, or concerning the delimitation of its frontiers or boundaries. Dotted lines on maps represent approximate border lines for which there may not yet be full agreement. The mention of specific companies or of certain manufacturers’ products does not imply that they are endorsed or recommended by the World Health Organization in preference to others of a similar nature that are not mentioned. Errors and omissions excepted, the names of proprietary products are distinguished by initial capital letters. All reasonable precautions have been taken by WHO to verify the information contained in this publication. However, the published material is being distributed without warranty of any kind, either express or implied. The responsibility for the interpretation and use of the material lies with the reader. In no event shall the World Health Organization be liable for damages arising from its use.", ,"Reason for stopping HIV treatment" , , , , , , , ,0 ,0 ,0 , ,"WHO_HIV" , , , ,"2.22" , diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/PanelsAndForms/LoincAnswerListLink.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/PanelsAndForms/LoincAnswerListLink.csv new file mode 100644 index 00000000000..820602c77ad --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/PanelsAndForms/LoincAnswerListLink.csv @@ -0,0 +1,11 @@ +"LoincNumber","LongCommonName" ,"AnswerListId","AnswerListName" ,"AnswerListLinkType","ApplicableContext" +"61438-8" ,"Each time you ate bread, toast or dinner rolls, how much did you usually eat in the past 30 days [PhenX]","LL1000-0" ,"PhenX05_13_30D bread amt","NORMATIVE" , +"10061-0" ,"S' wave amplitude in lead I" ,"LL1311-1" ,"PhenX12_44" ,"EXAMPLE" , +"10331-7" ,"Rh [Type] in Blood" ,"LL360-9" ,"Pos|Neg" ,"EXAMPLE" , +"10389-5" ,"Blood product.other [Type]" ,"LL2413-4" ,"Othr bld prod" ,"EXAMPLE" , +"10390-3" ,"Blood product special preparation [Type]" ,"LL2422-5" ,"Blood prod treatment" ,"EXAMPLE" , +"10393-7" ,"Factor IX given [Type]" ,"LL2420-9" ,"Human/Recomb" ,"EXAMPLE" , +"10395-2" ,"Factor VIII given [Type]" ,"LL2420-9" ,"Human/Recomb" ,"EXAMPLE" , +"10401-8" ,"Immune serum globulin given [Type]" ,"LL2421-7" ,"IM/IV" ,"EXAMPLE" , +"10410-9" ,"Plasma given [Type]" ,"LL2417-5" ,"Plasma type" ,"EXAMPLE" , +"10568-4" ,"Clarity of Semen" ,"LL2427-4" ,"Clear/Opales/Milky" ,"EXAMPLE" , diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/PartFile/LoincPartLink.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/PartFile/LoincPartLink.csv new file mode 100644 index 00000000000..36c84f3fe95 --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/PartFile/LoincPartLink.csv @@ -0,0 +1,10 @@ +"LoincNumber","LongCommonName","PartNumber","PartName","PartCodeSystem","PartTypeName","LinkTypeName","Property" +"10013-1","R' wave amplitude in lead I","LP31101-6","R' wave amplitude.lead I","http://loinc.org","COMPONENT","Primary","http://loinc.org/property/COMPONENT" +"10013-1","R' wave amplitude in lead I","LP6802-5","Elpot","http://loinc.org","PROPERTY","Primary","http://loinc.org/property/PROPERTY" +"10013-1","R' wave amplitude in lead I","LP6960-1","Pt","http://loinc.org","TIME","Primary","http://loinc.org/property/TIME_ASPCT" +"10013-1","R' wave amplitude in lead I","LP7289-4","Heart","http://loinc.org","SYSTEM","Primary","http://loinc.org/property/SYSTEM" +"10013-1","R' wave amplitude in lead I","LP7753-9","Qn","http://loinc.org","SCALE","Primary","http://loinc.org/property/SCALE_TYP" +"10013-1","R' wave amplitude in lead I","LP6244-0","EKG","http://loinc.org","METHOD","Primary","http://loinc.org/property/METHOD_TYP" +"10013-1","R' wave amplitude in lead I","LP31101-6","R' wave amplitude.lead I","http://loinc.org","COMPONENT","DetailedModel","http://loinc.org/property/analyte" +"10013-1","R' wave amplitude in lead I","LP6802-5","Elpot","http://loinc.org","PROPERTY","DetailedModel","http://loinc.org/property/PROPERTY" +"10013-1","R' wave amplitude in lead I","LP6960-1","Pt","http://loinc.org","TIME","DetailedModel","http://loinc.org/property/time-core" diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/PartFile/LoincPartLink_Primary.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/PartFile/LoincPartLink_Primary.csv new file mode 100644 index 00000000000..8dbe575ffd2 --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/PartFile/LoincPartLink_Primary.csv @@ -0,0 +1,7 @@ +"LoincNumber","LongCommonName" ,"PartNumber","PartName" ,"PartCodeSystem" ,"PartTypeName","LinkTypeName","Property" +"10013-1" ,"R' wave amplitude in lead I","LP31101-6" ,"R' wave amplitude.lead I","http://loinc.org","COMPONENT" ,"Primary" ,"http://loinc.org/property/COMPONENT" +"10013-1" ,"R' wave amplitude in lead I","LP6802-5" ,"Elpot" ,"http://loinc.org","PROPERTY" ,"Primary" ,"http://loinc.org/property/PROPERTY" +"10013-1" ,"R' wave amplitude in lead I","LP6960-1" ,"Pt" ,"http://loinc.org","TIME" ,"Primary" ,"http://loinc.org/property/TIME_ASPCT" +"10013-1" ,"R' wave amplitude in lead I","LP7289-4" ,"Heart" ,"http://loinc.org","SYSTEM" ,"Primary" ,"http://loinc.org/property/SYSTEM" +"10013-1" ,"R' wave amplitude in lead I","LP7753-9" ,"Qn" ,"http://loinc.org","SCALE" ,"Primary" ,"http://loinc.org/property/SCALE_TYP" +"10013-1" ,"R' wave amplitude in lead I","LP6244-0" ,"EKG" ,"http://loinc.org","METHOD" ,"Primary" ,"http://loinc.org/property/METHOD_TYP" diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/PartFile/LoincPartLink_Supplementary.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/PartFile/LoincPartLink_Supplementary.csv new file mode 100644 index 00000000000..869c2c1651d --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/PartFile/LoincPartLink_Supplementary.csv @@ -0,0 +1,13 @@ +"LoincNumber","LongCommonName" ,"PartNumber","PartName" ,"PartCodeSystem" ,"PartTypeName","LinkTypeName" ,"Property" +"10013-1" ,"R' wave amplitude in lead I","LP31101-6" ,"R' wave amplitude.lead I","http://loinc.org","COMPONENT" ,"DetailedModel" ,"http://loinc.org/property/analyte" +"10013-1" ,"R' wave amplitude in lead I","LP6802-5" ,"Elpot" ,"http://loinc.org","PROPERTY" ,"DetailedModel" ,"http://loinc.org/property/PROPERTY" +"10013-1" ,"R' wave amplitude in lead I","LP6960-1" ,"Pt" ,"http://loinc.org","TIME" ,"DetailedModel" ,"http://loinc.org/property/time-core" +"10013-1" ,"R' wave amplitude in lead I","LP7289-4" ,"Heart" ,"http://loinc.org","SYSTEM" ,"DetailedModel" ,"http://loinc.org/property/system-core" +"10013-1" ,"R' wave amplitude in lead I","LP7753-9" ,"Qn" ,"http://loinc.org","SCALE" ,"DetailedModel" ,"http://loinc.org/property/SCALE_TYP" +"10013-1" ,"R' wave amplitude in lead I","LP6244-0" ,"EKG" ,"http://loinc.org","METHOD" ,"DetailedModel" ,"http://loinc.org/property/METHOD_TYP" +"10013-1" ,"R' wave amplitude in lead I","LP31101-6" ,"R' wave amplitude.lead I","http://loinc.org","COMPONENT" ,"SyntaxEnhancement","http://loinc.org/property/analyte-core" +"10013-1" ,"R' wave amplitude in lead I","LP190563-9","Cardiology" ,"http://loinc.org","CLASS" ,"Metadata" ,"http://loinc.org/property/category" +"10013-1" ,"R' wave amplitude in lead I","LP29708-2" ,"Cardiology" ,"http://loinc.org","CLASS" ,"Metadata" ,"http://loinc.org/property/category" +"10013-1" ,"R' wave amplitude in lead I","LP7787-7" ,"Clinical" ,"http://loinc.org","CLASS" ,"Metadata" ,"http://loinc.org/property/category" +"10013-1" ,"R' wave amplitude in lead I","LP7795-0" ,"EKG measurements" ,"http://loinc.org","CLASS" ,"Metadata" ,"http://loinc.org/property/category" +"10013-1" ,"R' wave amplitude in lead I","LP7795-0" ,"EKG.MEAS" ,"http://loinc.org","CLASS" ,"Metadata" ,"http://loinc.org/property/CLASS" diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/PartFile/Part.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/PartFile/Part.csv new file mode 100644 index 00000000000..d5816ead286 --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/PartFile/Part.csv @@ -0,0 +1,46 @@ +"PartNumber","PartTypeName","PartName","PartDisplayName","Status" +"LP101394-7","ADJUSTMENT","adjusted for maternal weight","adjusted for maternal weight","ACTIVE" +"LP101907-6","ADJUSTMENT","corrected for age","corrected for age","ACTIVE" +"LP115711-6","ADJUSTMENT","corrected for background","corrected for background","ACTIVE" +"LP147359-6","ADJUSTMENT","adjusted for body weight","adjusted for body weight","ACTIVE" +"LP173482-3","ADJUSTMENT","1st specimen","1st specimen","DEPRECATED" +"LP173483-1","ADJUSTMENT","post cyanocobalamin",,"ACTIVE" +"LP173484-9","ADJUSTMENT","W hyperextension)",,"ACTIVE" +"LP6244-0","METHOD","EKG","Electrocardiogram (EKG)","ACTIVE" +"LP18172-4","COMPONENT","Interferon.beta","Interferon beta","ACTIVE" +"LP7289-4","SYSTEM","Heart","Heart","ACTIVE" +"LP6960-1","TIME","Pt","Point in time (spot)","ACTIVE" +"LP6802-5","PROPERTY","Elpot","Electrical Potential (Voltage)","ACTIVE" +"LP7753-9","SCALE","Qn","Qn","ACTIVE" +"LP31101-6","COMPONENT","R' wave amplitude.lead I","R' wave amplitude.lead I","ACTIVE" +"LP31102-4","COMPONENT","R' wave amplitude.lead II","R' wave amplitude.lead II","ACTIVE" +"LP31103-2","COMPONENT","R' wave amplitude.lead III","R' wave amplitude.lead III","ACTIVE" +"LP31104-0","COMPONENT","R' wave amplitude.lead V1","R' wave amplitude.lead V1","ACTIVE" +"LP31105-7","COMPONENT","R' wave amplitude.lead V2","R' wave amplitude.lead V2","ACTIVE" +"LP31106-5","COMPONENT","R' wave amplitude.lead V3","R' wave amplitude.lead V3","ACTIVE" +"LP31107-3","COMPONENT","R' wave amplitude.lead V4","R' wave amplitude.lead V4","ACTIVE" +"LP31108-1","COMPONENT","R' wave amplitude.lead V5","R' wave amplitude.lead V5","ACTIVE" +"LP31109-9","COMPONENT","R' wave amplitude.lead V6","R' wave amplitude.lead V6","ACTIVE" +"LP31110-7","COMPONENT","R' wave duration.lead AVF","R' wave duration.lead AVF","ACTIVE" +"LP30269-2","SYSTEM","Ser/Plas^donor",,"ACTIVE" +"LP149220-8","PROPERTY","Pr","Presence","ACTIVE" +"LP7751-3","SCALE","Ord","Ord","ACTIVE" +"LP37904-7","COMPONENT","DBG Ab","DBG Ab","ACTIVE" +"LP6813-2","PROPERTY","Find","Finding","ACTIVE" +"LP95333-8","METHOD","PhenX","PhenX","ACTIVE" +"LP102627-9","COMPONENT","Each time you ate bread, toast or dinner rolls, how much did you usually eat in the past 30D","Each time you ate bread, toast or dinner rolls, how much did you usually eat in the past 30 days","ACTIVE" +"LP6879-3","PROPERTY","Time","Time (e.g. seconds)","ACTIVE" +"LP31088-5","COMPONENT","R wave duration.lead AVR","R wave duration.lead AVR","ACTIVE" +"LP206647-2","SYSTEM","Neck>Thyroid gland","Thyroid gland","ACTIVE" +"LP208655-3","METHOD","NM","NM","ACTIVE" +"LP32888-7","SCALE","Doc","Doc","ACTIVE" +"LP31534-8","COMPONENT","Study report","Study report","ACTIVE" +"LP7057-5","SYSTEM","Bld","Blood","ACTIVE" +"LP6838-9","PROPERTY","NFr","Number Fraction","ACTIVE" +"LP6141-8","METHOD","Automated count","Automated count","ACTIVE" +"LP15842-5","COMPONENT","Pyridoxine","Pyridoxine","ACTIVE" +"LP19258-0","COMPONENT","Large unstained cells","Large unstained cells","ACTIVE" +"LP32887-9","SYSTEM","{Setting}","{Setting}","ACTIVE" +"LP187178-1","METHOD","{Role}","Role-unspecified","ACTIVE" +"LP72311-1","COMPONENT","Consultation note","Consultation note","ACTIVE" + diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/PartFile/PartRelatedCodeMapping.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/PartFile/PartRelatedCodeMapping.csv new file mode 100644 index 00000000000..495416894ce --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/PartFile/PartRelatedCodeMapping.csv @@ -0,0 +1,12 @@ +"PartNumber","PartName" ,"PartTypeName","ExtCodeId" ,"ExtCodeDisplayName" ,"ExtCodeSystem" ,"Equivalence","ContentOrigin","ExtCodeSystemVersion" ,"ExtCodeSystemCopyrightNotice" +"LP18172-4" ,"Interferon.beta" ,"COMPONENT" ," 420710006","Interferon beta (substance)" ,"http://snomed.info/sct" ,"equivalent" ,"Both" ,"http://snomed.info/sct/900000000000207008/version/20170731","This material includes SNOMED Clinical Terms® (SNOMED CT®) which is used by permission of the International Health Terminology Standards Development Organisation (IHTSDO) under license. All rights reserved. SNOMED CT® was originally created by The College of American Pathologists. “SNOMED” and “SNOMED CT” are registered trademarks of the IHTSDO.This material includes content from the US Edition to SNOMED CT, which is developed and maintained by the U.S. National Library of Medicine and is available to authorized UMLS Metathesaurus Licensees from the UTS Downloads site at https://uts.nlm.nih.gov.Use of SNOMED CT content is subject to the terms and conditions set forth in the SNOMED CT Affiliate License Agreement. It is the responsibility of those implementing this product to ensure they are appropriately licensed and for more information on the license, including how to register as an Affiliate Licensee, please refer to http://www.snomed.org/snomed-ct/get-snomed-ct or info@snomed.org. This may incur a fee in SNOMED International non-Member countries." +"LP31706-2" ,"Nornicotine" ,"COMPONENT" ,"1018001" ,"Nornicotine (substance)" ,"http://snomed.info/sct" ,"equivalent" ,"Both" ,"http://snomed.info/sct/900000000000207008/version/20170731","This material includes SNOMED Clinical Terms® (SNOMED CT®) which is used by permission of the International Health Terminology Standards Development Organisation (IHTSDO) under license. All rights reserved. SNOMED CT® was originally created by The College of American Pathologists. “SNOMED” and “SNOMED CT” are registered trademarks of the IHTSDO.This material includes content from the US Edition to SNOMED CT, which is developed and maintained by the U.S. National Library of Medicine and is available to authorized UMLS Metathesaurus Licensees from the UTS Downloads site at https://uts.nlm.nih.gov.Use of SNOMED CT content is subject to the terms and conditions set forth in the SNOMED CT Affiliate License Agreement. It is the responsibility of those implementing this product to ensure they are appropriately licensed and for more information on the license, including how to register as an Affiliate Licensee, please refer to http://www.snomed.org/snomed-ct/get-snomed-ct or info@snomed.org. This may incur a fee in SNOMED International non-Member countries." +"LP15826-8" ,"Prostaglandin F2","COMPONENT" ,"10192006" ,"Prostaglandin PGF2 (substance)" ,"http://snomed.info/sct" ,"equivalent" ,"Both" ,"http://snomed.info/sct/900000000000207008/version/20170731","This material includes SNOMED Clinical Terms® (SNOMED CT®) which is used by permission of the International Health Terminology Standards Development Organisation (IHTSDO) under license. All rights reserved. SNOMED CT® was originally created by The College of American Pathologists. “SNOMED” and “SNOMED CT” are registered trademarks of the IHTSDO.This material includes content from the US Edition to SNOMED CT, which is developed and maintained by the U.S. National Library of Medicine and is available to authorized UMLS Metathesaurus Licensees from the UTS Downloads site at https://uts.nlm.nih.gov.Use of SNOMED CT content is subject to the terms and conditions set forth in the SNOMED CT Affiliate License Agreement. It is the responsibility of those implementing this product to ensure they are appropriately licensed and for more information on the license, including how to register as an Affiliate Licensee, please refer to http://www.snomed.org/snomed-ct/get-snomed-ct or info@snomed.org. This may incur a fee in SNOMED International non-Member countries." +"LP7400-7" ,"Liver" ,"SYSTEM" ,"10200004" ,"Liver structure (body structure)","http://snomed.info/sct" ,"wider" ,"Both" ,"http://snomed.info/sct/900000000000207008/version/20170731","This material includes SNOMED Clinical Terms® (SNOMED CT®) which is used by permission of the International Health Terminology Standards Development Organisation (IHTSDO) under license. All rights reserved. SNOMED CT® was originally created by The College of American Pathologists. “SNOMED” and “SNOMED CT” are registered trademarks of the IHTSDO.This material includes content from the US Edition to SNOMED CT, which is developed and maintained by the U.S. National Library of Medicine and is available to authorized UMLS Metathesaurus Licensees from the UTS Downloads site at https://uts.nlm.nih.gov.Use of SNOMED CT content is subject to the terms and conditions set forth in the SNOMED CT Affiliate License Agreement. It is the responsibility of those implementing this product to ensure they are appropriately licensed and for more information on the license, including how to register as an Affiliate Licensee, please refer to http://www.snomed.org/snomed-ct/get-snomed-ct or info@snomed.org. This may incur a fee in SNOMED International non-Member countries." +"LP29165-5" ,"Liver.FNA" ,"SYSTEM" ,"10200004" ,"Liver structure (body structure)","http://snomed.info/sct" ,"narrower" ,"Both" ,"http://snomed.info/sct/900000000000207008/version/20170731","This material includes SNOMED Clinical Terms® (SNOMED CT®) which is used by permission of the International Health Terminology Standards Development Organisation (IHTSDO) under license. All rights reserved. SNOMED CT® was originally created by The College of American Pathologists. “SNOMED” and “SNOMED CT” are registered trademarks of the IHTSDO.This material includes content from the US Edition to SNOMED CT, which is developed and maintained by the U.S. National Library of Medicine and is available to authorized UMLS Metathesaurus Licensees from the UTS Downloads site at https://uts.nlm.nih.gov.Use of SNOMED CT content is subject to the terms and conditions set forth in the SNOMED CT Affiliate License Agreement. It is the responsibility of those implementing this product to ensure they are appropriately licensed and for more information on the license, including how to register as an Affiliate Licensee, please refer to http://www.snomed.org/snomed-ct/get-snomed-ct or info@snomed.org. This may incur a fee in SNOMED International non-Member countries." +"LP15666-8" ,"Inosine" ,"COMPONENT" ,"102640000" ,"Inosine (substance)" ,"http://snomed.info/sct" ,"equivalent" ,"Both" ,"http://snomed.info/sct/900000000000207008/version/20170731","This material includes SNOMED Clinical Terms® (SNOMED CT®) which is used by permission of the International Health Terminology Standards Development Organisation (IHTSDO) under license. All rights reserved. SNOMED CT® was originally created by The College of American Pathologists. “SNOMED” and “SNOMED CT” are registered trademarks of the IHTSDO.This material includes content from the US Edition to SNOMED CT, which is developed and maintained by the U.S. National Library of Medicine and is available to authorized UMLS Metathesaurus Licensees from the UTS Downloads site at https://uts.nlm.nih.gov.Use of SNOMED CT content is subject to the terms and conditions set forth in the SNOMED CT Affiliate License Agreement. It is the responsibility of those implementing this product to ensure they are appropriately licensed and for more information on the license, including how to register as an Affiliate Licensee, please refer to http://www.snomed.org/snomed-ct/get-snomed-ct or info@snomed.org. This may incur a fee in SNOMED International non-Member countries." +"LP15943-1" ,"Uronate" ,"COMPONENT" ,"102641001" ,"Uronic acid (substance)" ,"http://snomed.info/sct" ,"equivalent" ,"Both" ,"http://snomed.info/sct/900000000000207008/version/20170731","This material includes SNOMED Clinical Terms® (SNOMED CT®) which is used by permission of the International Health Terminology Standards Development Organisation (IHTSDO) under license. All rights reserved. SNOMED CT® was originally created by The College of American Pathologists. “SNOMED” and “SNOMED CT” are registered trademarks of the IHTSDO.This material includes content from the US Edition to SNOMED CT, which is developed and maintained by the U.S. National Library of Medicine and is available to authorized UMLS Metathesaurus Licensees from the UTS Downloads site at https://uts.nlm.nih.gov.Use of SNOMED CT content is subject to the terms and conditions set forth in the SNOMED CT Affiliate License Agreement. It is the responsibility of those implementing this product to ensure they are appropriately licensed and for more information on the license, including how to register as an Affiliate Licensee, please refer to http://www.snomed.org/snomed-ct/get-snomed-ct or info@snomed.org. This may incur a fee in SNOMED International non-Member countries." +"LP15791-4" ,"Phenylketones" ,"COMPONENT" ,"102642008" ,"Phenylketones (substance)" ,"http://snomed.info/sct" ,"equivalent" ,"Both" ,"http://snomed.info/sct/900000000000207008/version/20170731","This material includes SNOMED Clinical Terms® (SNOMED CT®) which is used by permission of the International Health Terminology Standards Development Organisation (IHTSDO) under license. All rights reserved. SNOMED CT® was originally created by The College of American Pathologists. “SNOMED” and “SNOMED CT” are registered trademarks of the IHTSDO.This material includes content from the US Edition to SNOMED CT, which is developed and maintained by the U.S. National Library of Medicine and is available to authorized UMLS Metathesaurus Licensees from the UTS Downloads site at https://uts.nlm.nih.gov.Use of SNOMED CT content is subject to the terms and conditions set forth in the SNOMED CT Affiliate License Agreement. It is the responsibility of those implementing this product to ensure they are appropriately licensed and for more information on the license, including how to register as an Affiliate Licensee, please refer to http://www.snomed.org/snomed-ct/get-snomed-ct or info@snomed.org. This may incur a fee in SNOMED International non-Member countries." +"LP15721-1" ,"Malonate" ,"COMPONENT" ,"102648007" ,"Malonic acid (substance)" ,"http://snomed.info/sct" ,"equivalent" ,"Both" ,"http://snomed.info/sct/900000000000207008/version/20170731","This material includes SNOMED Clinical Terms® (SNOMED CT®) which is used by permission of the International Health Terminology Standards Development Organisation (IHTSDO) under license. All rights reserved. SNOMED CT® was originally created by The College of American Pathologists. “SNOMED” and “SNOMED CT” are registered trademarks of the IHTSDO.This material includes content from the US Edition to SNOMED CT, which is developed and maintained by the U.S. National Library of Medicine and is available to authorized UMLS Metathesaurus Licensees from the UTS Downloads site at https://uts.nlm.nih.gov.Use of SNOMED CT content is subject to the terms and conditions set forth in the SNOMED CT Affiliate License Agreement. It is the responsibility of those implementing this product to ensure they are appropriately licensed and for more information on the license, including how to register as an Affiliate Licensee, please refer to http://www.snomed.org/snomed-ct/get-snomed-ct or info@snomed.org. This may incur a fee in SNOMED International non-Member countries." +"LP15842-5" ,"Pyridoxine" ,"COMPONENT" ,"1054" ,"Pyridoxine" ,"http://pubchem.ncbi.nlm.nih.gov","equivalent" , , , +"LP15842-5" ,"Pyridoxine" ,"COMPONENT" ,"1054" ,"Pyridoxine" ,"http://foo/bar" ,"equivalent" , , , diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/Top2000Results/SI/Top2000CommonLabResultsSi.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/Top2000Results/SI/Top2000CommonLabResultsSi.csv new file mode 100644 index 00000000000..1e9b3872892 --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/Top2000Results/SI/Top2000CommonLabResultsSi.csv @@ -0,0 +1,10 @@ +LOINC #,Long Common Name,Short Name,CLASS,Rank +14682-9,Creatinine [Moles/volume] in Serum or Plasma,Creat SerPl-mCnc,Chem,1 +718-7,Hemoglobin [Mass/volume] in Blood,Hgb Bld-mCnc,HEM/BC,2 +2823-3,Potassium [Moles/volume] in Serum or Plasma,Potassium SerPl-sCnc,Chem,3 +14749-6,Glucose [Moles/volume] in Serum or Plasma,Glucose SerPl-mCnc,Chem,4 +2951-2,Sodium [Moles/volume] in Serum or Plasma,Sodium SerPl-sCnc,Chem,5 +3094-0,Urea nitrogen [Mass/volume] in Serum or Plasma,BUN SerPl-mCnc,Chem,6 +2028-9,"Carbon dioxide, total [Moles/volume] in Serum or Plasma",CO2 SerPl-sCnc,Chem,7 +2075-0,Chloride [Moles/volume] in Serum or Plasma,Chloride SerPl-sCnc,Chem,8 +789-8,Erythrocytes [#/volume] in Blood by Automated count,RBC # Bld Auto,HEM/BC,9 diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/Top2000Results/US/Top2000CommonLabResultsUs.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/Top2000Results/US/Top2000CommonLabResultsUs.csv new file mode 100644 index 00000000000..c80db052dd3 --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/AccessoryFiles/Top2000Results/US/Top2000CommonLabResultsUs.csv @@ -0,0 +1,10 @@ +LOINC #,Long Common Name,Short Name,CLASS,Rank +2160-0,Creatinine [Mass/volume] in Serum or Plasma,Creat SerPl-mCnc,Chem,1 +718-7,Hemoglobin [Mass/volume] in Blood,Hgb Bld-mCnc,HEM/BC,2 +2823-3,Potassium [Moles/volume] in Serum or Plasma,Potassium SerPl-sCnc,Chem,3 +2345-7,Glucose [Mass/volume] in Serum or Plasma,Glucose SerPl-mCnc,Chem,4 +2951-2,Sodium [Moles/volume] in Serum or Plasma,Sodium SerPl-sCnc,Chem,5 +3094-0,Urea nitrogen [Mass/volume] in Serum or Plasma,BUN SerPl-mCnc,Chem,6 +2028-9,"Carbon dioxide, total [Moles/volume] in Serum or Plasma",CO2 SerPl-sCnc,Chem,7 +2075-0,Chloride [Moles/volume] in Serum or Plasma,Chloride SerPl-sCnc,Chem,8 +789-8,Erythrocytes [#/volume] in Blood by Automated count,RBC # Bld Auto,HEM/BC,9 diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/LoincTable/Loinc.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/LoincTable/Loinc.csv new file mode 100644 index 00000000000..20379cb7f1d --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/LoincTable/Loinc.csv @@ -0,0 +1,16 @@ +"LOINC_NUM","COMPONENT" ,"PROPERTY","TIME_ASPCT","SYSTEM" ,"SCALE_TYP","METHOD_TYP" ,"CLASS" ,"VersionLastChanged","CHNG_TYPE","DefinitionDescription" ,"STATUS","CONSUMER_NAME","CLASSTYPE","FORMULA","SPECIES","EXMPL_ANSWERS","SURVEY_QUEST_TEXT" ,"SURVEY_QUEST_SRC" ,"UNITSREQUIRED","SUBMITTED_UNITS","RELATEDNAMES2" ,"SHORTNAME" ,"ORDER_OBS" ,"CDISC_COMMON_TESTS","HL7_FIELD_SUBFIELD_ID","EXTERNAL_COPYRIGHT_NOTICE" ,"EXAMPLE_UNITS","LONG_COMMON_NAME" ,"UnitsAndRange","DOCUMENT_SECTION","EXAMPLE_UCUM_UNITS","EXAMPLE_SI_UCUM_UNITS","STATUS_REASON","STATUS_TEXT","CHANGE_REASON_PUBLIC" ,"COMMON_TEST_RANK","COMMON_ORDER_RANK","COMMON_SI_TEST_RANK","HL7_ATTACHMENT_STRUCTURE","EXTERNAL_COPYRIGHT_LINK","PanelType","AskAtOrderEntry","AssociatedObservations" ,"VersionFirstReleased","ValidHL7AttachmentRequest" +"10013-1" ,"R' wave amplitude.lead I" ,"Elpot" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"Cardiac; ECG; EKG.MEASUREMENTS; Electrical potential; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave Amp L-I; R wave Amp L-I; Random; Right; Voltage" ,"R' wave Amp L-I" ,"Observation", , , ,"mV" ,"R' wave amplitude in lead I" , , ,"mV" , , , , ,0 ,0 ,0 , , , , , , , +"10014-9" ,"R' wave amplitude.lead II" ,"Elpot" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"2; Cardiac; ECG; EKG.MEASUREMENTS; Electrical potential; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave Amp L-II; R wave Amp L-II; Random; Right; Voltage" ,"R' wave Amp L-II" ,"Observation", , , ,"mV" ,"R' wave amplitude in lead II" , , ,"mV" , , , , ,0 ,0 ,0 , , , , , , , +"10015-6" ,"R' wave amplitude.lead III" ,"Elpot" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"3; Cardiac; ECG; EKG.MEASUREMENTS; Electrical potential; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave Amp L-III; R wave Amp L-III; Random; Right; Voltage" ,"R' wave Amp L-III" ,"Observation", , , ,"mV" ,"R' wave amplitude in lead III" , , ,"mV" , , , , ,0 ,0 ,0 , , , , , , , +"10016-4" ,"R' wave amplitude.lead V1" ,"Elpot" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"Cardiac; ECG; EKG.MEASUREMENTS; Electrical potential; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave Amp L-V1; R wave Amp L-V1; Random; Right; Voltage" ,"R' wave Amp L-V1" ,"Observation", , , ,"mV" ,"R' wave amplitude in lead V1" , , ,"mV" , , , , ,0 ,0 ,0 , , , , , , , +"1001-7" ,"DBG Ab" ,"Pr" ,"Pt" ,"Ser/Plas^donor" ,"Ord" , ,"BLDBK" ,"2.44" ,"MIN" , ,"ACTIVE", ,1 , , , , , , , ,"ABS; Aby; Antby; Anti; Antibodies; Antibody; Autoantibodies; Autoantibody; BLOOD BANK; Donna Bennett-Goodspeed; Donr; Ordinal; Pl; Plasma; Plsm; Point in time; QL; Qual; Qualitative; Random; Screen; SerP; SerPl; SerPl^donor; SerPlas; Serum; Serum or plasma; SR" ,"DBG Ab SerPl Donr Ql" ,"Observation", , , , ,"DBG Ab [Presence] in Serum or Plasma from donor" , , , , , , ,"The Property has been changed from ACnc to Pr (Presence) to reflect the new model for ordinal terms where results are based on presence or absence." ,0 ,0 ,0 , , , , , , , +"10017-2" ,"R' wave amplitude.lead V2" ,"Elpot" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"Cardiac; ECG; EKG.MEASUREMENTS; Electrical potential; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave Amp L-V2; R wave Amp L-V2; Random; Right; Voltage" ,"R' wave Amp L-V2" ,"Observation", , , ,"mV" ,"R' wave amplitude in lead V2" , , ,"mV" , , , , ,0 ,0 ,0 , , , , , , , +"10018-0" ,"R' wave amplitude.lead V3" ,"Elpot" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"Cardiac; ECG; EKG.MEASUREMENTS; Electrical potential; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave Amp L-V3; R wave Amp L-V3; Random; Right; Voltage" ,"R' wave Amp L-V3" ,"Observation", , , ,"mV" ,"R' wave amplitude in lead V3" , , ,"mV" , , , , ,0 ,0 ,0 , , , , , , , +"10019-8" ,"R' wave amplitude.lead V4" ,"Elpot" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"Cardiac; ECG; EKG.MEASUREMENTS; Electrical potential; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave Amp L-V4; R wave Amp L-V4; Random; Right; Voltage" ,"R' wave Amp L-V4" ,"Observation", , , ,"mV" ,"R' wave amplitude in lead V4" , , ,"mV" , , , , ,0 ,0 ,0 , , , , , , , +"10020-6" ,"R' wave amplitude.lead V5" ,"Elpot" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"Cardiac; ECG; EKG.MEASUREMENTS; Electrical potential; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave Amp L-V5; R wave Amp L-V5; Random; Right; Voltage" ,"R' wave Amp L-V5" ,"Observation", , , ,"mV" ,"R' wave amplitude in lead V5" , , ,"mV" , , , , ,0 ,0 ,0 , , , , , , , +"61438-8" ,"Each time you ate bread, toast or dinner rolls, how much did you usually eat in the past 30D","Find" ,"Pt" ,"^Patient" ,"Ord" ,"PhenX" ,"PHENX" ,"2.44" ,"MIN" , ,"TRIAL" , ,2 , , , ,"Each time you eat bread, toast or dinner rolls, how much do you usually eat?","PhenX.050201100100","N" , ,"Finding; Findings; How much bread in 30D; Last; Ordinal; Point in time; QL; Qual; Qualitative; Random; Screen" ,"How much bread in 30D PhenX", , , , , ,"Each time you ate bread, toast or dinner rolls, how much did you usually eat in the past 30 days [PhenX]", , , , , , , ,0 ,0 ,0 , , , , , , , +"10000-8" ,"R wave duration.lead AVR" ,"Time" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"Cardiac; Durat; ECG; EKG.MEASUREMENTS; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave dur L-AVR; R wave dur L-AVR; Random; Right" ,"R wave dur L-AVR" ,"Observation", , , ,"s" ,"R wave duration in lead AVR" , , ,"s" , , , , ,0 ,0 ,0 , , , , , , , +"17787-3" ,"Study report" ,"Find" ,"Pt" ,"Neck>Thyroid gland","Doc" ,"NM" ,"RAD" ,"2.61" ,"MIN" , ,"ACTIVE", ,2 , , , , , , , ,"Document; Finding; Findings; Imaging; Point in time; Radiology; Random; Study report; Thy" ,"NM Thyroid Study report" ,"Both" , , , , ,"NM Thyroid gland Study report" , , , , , , ,"Changed System from ""Thyroid"" for conformance with the LOINC/RadLex unified model.; Method of ""Radnuc"" was changed to ""NM"". The LOINC/RadLex Committee agreed to use a subset of the two-letter DICOM modality codes as the primary modality identifier." ,0 ,0 ,0 ,"IG exists" , , , ,"81220-6;72230-6" ,"1.0l" , +"17788-1" ,"Large unstained cells/100 leukocytes" ,"NFr" ,"Pt" ,"Bld" ,"Qn" ,"Automated count","HEM/BC" ,"2.50" ,"MIN" ,"Part of auto diff output of Bayer H*3S; peroxidase negative cells too large to be classified as lymph or basophil" ,"ACTIVE", ,1 , , , , , ,"Y" ,"%" ,"100WBC; Auto; Automated detection; Blood; Cell; Cellularity; Elec; Elect; Electr; HEMATOLOGY/CELL COUNTS; Leuc; Leuk; Leukocyte; Lkcs; LUC; Number Fraction; Percent; Point in time; QNT; Quan; Quant; Quantitative; Random; WB; WBC; WBCs; White blood cell; White blood cells; Whole blood" ,"LUC/leuk NFr Bld Auto" ,"Observation", , , ,"%" ,"Large unstained cells/100 leukocytes in Blood by Automated count" , , ,"%" , , , , ,1894 ,0 ,1894 , , , , , ,"1.0l" , +"11488-4" ,"Consultation note" ,"Find" ,"Pt" ,"{Setting}" ,"Doc" ,"{Role}" ,"DOC.ONTOLOGY","2.63" ,"MIN" , ,"ACTIVE", ,2 , , , , , , , ,"Consult note; DOC.ONT; Document; Encounter; Evaluation and management; Evaluation and management note; Finding; Findings; notes; Point in time; Random; Visit note" ,"Consult note" ,"Both" , , , , ,"Consult note" , , , , , , ,"Edit made because this term is conformant to the Document Ontology axis values and therefore are being placed in this class.; Based on Clinical LOINC Committee decision during the September 2014 meeting, {Provider} was changed to {Author Type} to emphasize a greater breadth of potential document authors. At the September 2015 Clinical LOINC Committee meeting, the Committee decided to change {Author Type} to {Role} to align with the 'Role' axis name in the LOINC Document Ontology.; Because it is too difficult to maintain and because the distinction between documents and sections is not clear-cut nor necessary in most cases, the DOCUMENT_SECTION field has been deemed to have little value. The field has been set to null in the December 2017 release in preparation for removal in the December 2018 release. These changes were approved by the Clinical LOINC Committee.",0 ,0 ,0 ,"IG exists" , , , ,"81222-2;72231-4;81243-8","1.0j-a" ,"Y" +"47239-9" ,"Reason for stopping HIV Rx" ,"Type" ,"Pt" ,"^Patient" ,"Nom" ,"Reported" ,"ART" ,"2.50" ,"MIN" ,"Reason for stopping antiretroviral therapy" ,"ACTIVE", ,2 , , , , , ,"N" , ,"AIDS; Anti-retroviral therapy; ART; Human immunodeficiency virus; Nominal; Point in time; Random; Treatment; Typ" ,"Reason for stopping HIV Rx" ,"Observation", , ,"Copyright © 2006 World Health Organization. Used with permission. Publications of the World Health Organization can be obtained from WHO Press, World Health Organization, 20 Avenue Appia, 1211 Geneva 27, Switzerland (tel: +41 22 791 2476; fax: +41 22 791 4857; email: bookorders@who.int). Requests for permission to reproduce or translate WHO publications – whether for sale or for noncommercial distribution – should be addressed to WHO Press, at the above address (fax: +41 22 791 4806; email: permissions@who.int). The designations employed and the presentation of the material in this publication do not imply the expression of any opinion whatsoever on the part of the World Health Organization concerning the legal status of any country, territory, city or area or of its authorities, or concerning the delimitation of its frontiers or boundaries. Dotted lines on maps represent approximate border lines for which there may not yet be full agreement. The mention of specific companies or of certain manufacturers’ products does not imply that they are endorsed or recommended by the World Health Organization in preference to others of a similar nature that are not mentioned. Errors and omissions excepted, the names of proprietary products are distinguished by initial capital letters. All reasonable precautions have been taken by WHO to verify the information contained in this publication. However, the published material is being distributed without warranty of any kind, either express or implied. The responsibility for the interpretation and use of the material lies with the reader. In no event shall the World Health Organization be liable for damages arising from its use.", ,"Reason for stopping HIV treatment" , , , , , , , ,0 ,0 ,0 , ,"WHO_HIV" , , , ,"2.22" , diff --git a/hapi-fhir-jpaserver-base/src/main/resources/ca/uhn/fhir/jpa/term/loinc/loinc.xml b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/loinc.xml similarity index 92% rename from hapi-fhir-jpaserver-base/src/main/resources/ca/uhn/fhir/jpa/term/loinc/loinc.xml rename to hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/loinc.xml index efe4184e99b..ed461aab3e5 100644 --- a/hapi-fhir-jpaserver-base/src/main/resources/ca/uhn/fhir/jpa/term/loinc/loinc.xml +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v-no-version/loinc.xml @@ -7,24 +7,23 @@ This CodeSystem resource describes 'LOINC' independent of any particular version Note that the following set of codes are defined by the LOINC code systems: - the main LOINC codes - - the LOINC Answer codes (LA-) and the LOINC Answer list codes (LL-) - - the LOINC Part codes (LP-) in the Multiaxial Hierarchy - - the LOINC Part codes (LP-) for the properties + - the LOINC Answer codes (LA) and the LOINC Answer list codes (LL) + - the LOINC Part codes (LP) in the Multiaxial Hierarchy + - the LOINC Part codes (LP) for the properties Note: there are license restrictions on the use of LOINC Part codes - - the LOINC Group codes (LG-) + - the LOINC Group codes (LG) Note: presently the LOINC Group codes are used to identify these roll-up groups as ValueSets, but are not yet loaded as codes in the CodeSystem Servers may generate variants of this for the LOINC version(s) and features they support. -File Version: 0.6 --> + This url is unchanged for all versions of LOINC. There can only be one correct Code System resource for each value of the version attribute (at least, only one per server). + --> @@ -33,38 +32,32 @@ File Version: 0.6 - + + If a specific version is specified, the name should carry this information (e.g. LOINC_270). + --> - + <title value="LOINC Code System (Testing Copy)"/> <status value="active"/> <experimental value="false"/> <publisher value="Regenstrief Institute, Inc."/> <contact> <telecom> + <system value="url" /> <value value="http://loinc.org"/> </telecom> </contact> <!-- - <date value=2020-06/> + <date value=2021-06/> --> <description value="LOINC is a freely available international standard for tests, measurements, and observations"/> - <copyright value="This material contains content from LOINC (http://loinc.org). LOINC is copyright ©1995-2020, Regenstrief Institute, Inc. and the Logical Observation Identifiers Names and Codes (LOINC) Committee and is available at no cost under the license at http://loinc.org/license. LOINC® is a registered United States trademark of Regenstrief Institute, Inc."/> + <copyright value="This material contains content from LOINC (http://loinc.org). LOINC is copyright ©1995-2021, Regenstrief Institute, Inc. and the Logical Observation Identifiers Names and Codes (LOINC) Committee and is available at no cost under the license at http://loinc.org/license. LOINC® is a registered United States trademark of Regenstrief Institute, Inc."/> <caseSensitive value="false"/> - <valueSet value=" http://loinc.org/vs"/> - <!-- - For a version specific reference: - <valueSet value="http://loinc.org/2.68/vs"/> - --> + <valueSet value="http://loinc.org/vs"/> <!-- It's at the discretion of servers whether to present fragments of LOINC hierarchically or not, when using the code system resource. But, if they are hierarchical, the Hierarchy SHALL be based on the is-a relationship that is derived from the LOINC Multiaxial Hierarchy. @@ -93,13 +86,15 @@ File Version: 0.6 For illustration purposes, consider this slice of the LOINC Multiaxial Hierarchy when reading the descriptions below: - Microbiology [LP7819-8] - Microorganism [LP14559-6] - Virus [LP14855-8] - Zika virus [LP200137-0] - Zika virus RNA | XXX [LP203271-4] - Zika virus RNA | XXX | Microbiology [LP379670-5] - Zika virus RNA [Presence] in Unspecified specimen by Probe and target amplification method [79190-5] + Laboratory [LP29693-6] + Microbiology and Antimicrobial susceptibility [LP343406-7] + Microbiology [LP7819-8] + Microorganism [LP14559-6] + Virus [LP14855-8] + Zika virus [LP200137-0] + Zika virus RNA | XXX [LP203271-4] + Zika virus RNA | XXX | Microbiology [LP379670-5] + Zika virus RNA [Presence] in Unspecified specimen by Probe and target amplification method [79190-5] Language Note: The filters defined here are specified using the default LOINC language - English (US). Requests are meant to be specified and interpreted on the English version. The return can be in a specified language (if supported by the server). But note that not all filters/properties have language translations available. --> @@ -141,13 +136,13 @@ File Version: 0.6 <code value="parent"/> <uri value="http://hl7.org/fhir/concept-properties#parent"/> <description value="A parent code in the Multiaxial Hierarchy"/> - <type value=""/> + <type value="code"/> </property> <property> <code value="child"/> <uri value="http://hl7.org/fhir/concept-properties#child"/> <description value="A child code in the Multiaxial Hierarchy"/> - <type value=""/> + <type value="code"/> </property> <!-- @@ -155,8 +150,8 @@ File Version: 0.6 These apply to the main LOINC codes, but not the Multiaxial Hierarchy, Answer lists, or the Part codes. Notes: In the LOINC code system resource, the display element = LONG_COMMON_NAME - Many properties are specified as type "coding", which allows use of LOINC Part codes (LP-) and the display text. LOINC Parts and their associations to LOINC terms are published in the LOINC Part File. - The properties defined here follow the guidance of the LOINC Users' Manual, which states that they should be expressed with the LOINC attributes contained in the LOINC Table. Properties that are not defined in the LOINC Table use FHIR-styled names. + Many properties are specified as type "Coding", which allows use of LOINC Part codes (LP-) and the display text. LOINC Parts and their associations to LOINC terms are published in the LOINC Part File. + The properties defined here follow the guidance of the LOINC Users' Guide, which states that they should be expressed with the LOINC attributes contained in the LOINC Table. Properties that are not defined in the LOINC Table use FHIR-styled names. --> <property> @@ -204,7 +199,7 @@ File Version: 0.6 <property> <code value="CLASS"/> <uri value="http://loinc.org/property/CLASS"/> - <description value="An arbitrary classification of the terms for grouping related observations together"/> + <description value="An arbitrary classification of terms for grouping related observations together"/> <type value="Coding"/> </property> <property> @@ -228,7 +223,7 @@ File Version: 0.6 <property> <code value="HL7_ATTACHMENT_STRUCTURE"/> <uri value="http://loinc.org/property/HL7_ATTACHMENT_STRUCTURE"/> - <description value="This property is populated in collaboration with the HL7 Attachments Work Group as described in the HL7 Attachment Specification: Supplement to Consolidated CDA Templated Guide."/> + <description value="This property is populated in collaboration with the HL7 Payer-Provider Exchange (PIE) Work Group (previously called Attachments Work Group) as described in the HL7 Attachment Specification: Supplement to Consolidated CDA Templated Guide."/> <type value="string"/> </property> <property> @@ -369,7 +364,7 @@ File Version: 0.6 <!-- LOINC/RSNA Radiology Playbook properties. These apply only to terms in the LOINC/RSNA Radiology Playbook File. Notes: - Properties are specified as type "coding", which are represented by LOINC Part codes (LP-) and their display names. + Properties are specified as type "Coding", which are represented by LOINC Part codes (LP-) and their display names. The attribute names here use FHIR styled names rather than their original LOINC style names because the original names contain periods. --> @@ -486,7 +481,7 @@ File Version: 0.6 Document Ontology properties. These apply only to terms in the LOINC Document Ontology File Notes - Properties are specified as type "coding", which are represented by LOINC Part codes (LP-) and their display names. + Properties are specified as type "Coding", which are represented by LOINC Part codes (LP-) and their display names. The attribute names here use FHIR styled names rather than their original LOINC style names because those contain periods. --> diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/AnswerFile/AnswerList.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/AnswerFile/AnswerList.csv new file mode 100644 index 00000000000..fae22daef78 --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/AnswerFile/AnswerList.csv @@ -0,0 +1,12 @@ +"AnswerListId","AnswerListName" ,"AnswerListOID" ,"ExtDefinedYN","ExtDefinedAnswerListCodeSystem","ExtDefinedAnswerListLink" ,"AnswerStringId","LocalAnswerCode","LocalAnswerCodeSystem","SequenceNumber","DisplayText" ,"ExtCodeId","ExtCodeDisplayName" ,"ExtCodeSystem" ,"ExtCodeSystemVersion" ,"ExtCodeSystemCopyrightNotice" ,"SubsequentTextPrompt","Description","Score" +"LL1000-0" ,"v2.67 PhenX05_13_30D bread amt","1.3.6.1.4.1.12009.10.1.165" ,"N" , , ,"LA13825-7" ,"1" , ,1 ,"1 slice or 1 dinner roll" , , , , , , , , +"LL1000-0" ,"v2.67 PhenX05_13_30D bread amt","1.3.6.1.4.1.12009.10.1.165" ,"N" , , ,"LA13838-0" ,"2" , ,2 ,"2 slices or 2 dinner rolls" , , , , , , , , +"LL1000-0" ,"v2.67 PhenX05_13_30D bread amt","1.3.6.1.4.1.12009.10.1.165" ,"N" , , ,"LA13892-7" ,"3" , ,3 ,"More than 2 slices or 2 dinner rolls", , , , , , , , +"LL1001-8" ,"v2.67 PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA6270-8" ,"00" , ,1 ,"Never" , , , , , , , , +"LL1001-8" ,"v2.67 PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13836-4" ,"01" , ,2 ,"1-3 times per month" , , , , , , , , +"LL1001-8" ,"v2.67 PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13834-9" ,"02" , ,3 ,"1-2 times per week" , , , , , , , , +"LL1001-8" ,"v2.67 PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13853-9" ,"03" , ,4 ,"3-4 times per week" , , , , , , , , +"LL1001-8" ,"v2.67 PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13860-4" ,"04" , ,5 ,"5-6 times per week" , , , , , , , , +"LL1001-8" ,"v2.67 PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13827-3" ,"05" , ,6 ,"1 time per day" , , , , , , , , +"LL1001-8" ,"v2.67 PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA4389-8" ,"97" , ,11 ,"Refused" ,"443390004","Refused (qualifier value)","http://snomed.info/sct","http://snomed.info/sct/900000000000207008/version/20170731","This material includes SNOMED Clinical Terms® (SNOMED CT®) which is used by permission of the International Health Terminology Standards Development Organisation (IHTSDO) under license. All rights reserved. SNOMED CT® was originally created by The College", , , +"LL1892-0" ,"v2.67 ICD-9_ICD-10" ,"1.3.6.1.4.1.12009.10.1.1069","Y" , ,"http://www.cdc.gov/nchs/icd.htm", , , , , , , , , , , , , diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/AnswerFile/LoincAnswerListLink.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/AnswerFile/LoincAnswerListLink.csv new file mode 100644 index 00000000000..820602c77ad --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/AnswerFile/LoincAnswerListLink.csv @@ -0,0 +1,11 @@ +"LoincNumber","LongCommonName" ,"AnswerListId","AnswerListName" ,"AnswerListLinkType","ApplicableContext" +"61438-8" ,"Each time you ate bread, toast or dinner rolls, how much did you usually eat in the past 30 days [PhenX]","LL1000-0" ,"PhenX05_13_30D bread amt","NORMATIVE" , +"10061-0" ,"S' wave amplitude in lead I" ,"LL1311-1" ,"PhenX12_44" ,"EXAMPLE" , +"10331-7" ,"Rh [Type] in Blood" ,"LL360-9" ,"Pos|Neg" ,"EXAMPLE" , +"10389-5" ,"Blood product.other [Type]" ,"LL2413-4" ,"Othr bld prod" ,"EXAMPLE" , +"10390-3" ,"Blood product special preparation [Type]" ,"LL2422-5" ,"Blood prod treatment" ,"EXAMPLE" , +"10393-7" ,"Factor IX given [Type]" ,"LL2420-9" ,"Human/Recomb" ,"EXAMPLE" , +"10395-2" ,"Factor VIII given [Type]" ,"LL2420-9" ,"Human/Recomb" ,"EXAMPLE" , +"10401-8" ,"Immune serum globulin given [Type]" ,"LL2421-7" ,"IM/IV" ,"EXAMPLE" , +"10410-9" ,"Plasma given [Type]" ,"LL2417-5" ,"Plasma type" ,"EXAMPLE" , +"10568-4" ,"Clarity of Semen" ,"LL2427-4" ,"Clear/Opales/Milky" ,"EXAMPLE" , diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/ConsumerName/ConsumerName.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/ConsumerName/ConsumerName.csv new file mode 100644 index 00000000000..b4ec2907985 --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/ConsumerName/ConsumerName.csv @@ -0,0 +1,6 @@ +"LoincNumber","ConsumerName" +"61438-8","Consumer Name 61438-8" +,"Consumer Name X" +47239-9","" +"17787-3","Consumer Name 17787-3" +"38699-5","1,1-Dichloroethane, Air" diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/DocumentOntology/DocumentOntology.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/DocumentOntology/DocumentOntology.csv new file mode 100644 index 00000000000..f857d7f297b --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/DocumentOntology/DocumentOntology.csv @@ -0,0 +1,10 @@ +"LoincNumber","PartNumber","PartTypeName","PartSequenceOrder","PartName" +"11488-4","LP173418-7","Document.Kind","1","Note" +"11488-4","LP173110-0","Document.TypeOfService","1","Consultation" +"11488-4","LP173061-5","Document.Setting","1","{Setting}" +"11488-4","LP187187-2","Document.Role","1","{Role}" +"11490-0","LP173418-7","Document.Kind","1","Note" +"11490-0","LP173221-5","Document.TypeOfService","1","Discharge summary" +"11490-0","LP173061-5","Document.Setting","1","{Setting}" +"11490-0","LP173084-7","Document.Role","1","Physician" +"11492-6","LP173418-7","Document.Kind","1","Note" diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/GroupFile/Group.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/GroupFile/Group.csv new file mode 100644 index 00000000000..66f5561ea1c --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/GroupFile/Group.csv @@ -0,0 +1,2 @@ +"ParentGroupId","GroupId","Group","Archetype","Status","VersionFirstReleased" +"LG100-4","LG1695-8","1,4-Dichlorobenzene|MCnc|Pt|ANYBldSerPl","","Active","" diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/GroupFile/GroupLoincTerms.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/GroupFile/GroupLoincTerms.csv new file mode 100644 index 00000000000..04c19759cfb --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/GroupFile/GroupLoincTerms.csv @@ -0,0 +1,3 @@ +"Category","GroupId","Archetype","LoincNumber","LongCommonName" +"Flowsheet","LG1695-8","","17424-3","1,4-Dichlorobenzene [Mass/volume] in Blood" +"Flowsheet","LG1695-8","","13006-2","1,4-Dichlorobenzene [Mass/volume] in Serum or Plasma" diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/GroupFile/ParentGroup.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/GroupFile/ParentGroup.csv new file mode 100644 index 00000000000..734a86c43dd --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/GroupFile/ParentGroup.csv @@ -0,0 +1,2 @@ +"ParentGroupId","ParentGroup","Status" +"LG100-4","Chem_DrugTox_Chal_Sero_Allergy<SAME:Comp|Prop|Tm|Syst (except intravascular and urine)><ANYBldSerPlas,ANYUrineUrineSed><ROLLUP:Method>","ACTIVE" diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/ImagingDocuments/ImagingDocumentCodes.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/ImagingDocuments/ImagingDocumentCodes.csv new file mode 100644 index 00000000000..a26397639ff --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/ImagingDocuments/ImagingDocumentCodes.csv @@ -0,0 +1,10 @@ +"LOINC_NUM","LONG_COMMON_NAME" +"11525-3","US Pelvis Fetus for pregnancy" +"17787-3","NM Thyroid gland Study report" +"18744-3","Bronchoscopy study" +"18746-8","Colonoscopy study" +"18748-4","Diagnostic imaging study" +"18751-8","Endoscopy study" +"18753-4","Flexible sigmoidoscopy study" +"24531-6","US Retroperitoneum" +"24532-4","US Abdomen RUQ" diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/LinguisticVariants/LinguisticVariants.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/LinguisticVariants/LinguisticVariants.csv new file mode 100644 index 00000000000..c79b3197490 --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/LinguisticVariants/LinguisticVariants.csv @@ -0,0 +1,9 @@ +"ID","ISO_LANGUAGE","ISO_COUNTRY","LANGUAGE_NAME","PRODUCER" +"5","zh","CN","Chinese (CHINA)","Lin Zhang, A LOINC volunteer from China" +"7","es","AR","Spanish (ARGENTINA)","Conceptum Medical Terminology Center" +"8","fr","CA","French (CANADA)","Canada Health Infoway Inc." +,"de","AT","German (AUSTRIA)","ELGA, Austria" +"88",,"AT","German (AUSTRIA)","ELGA, Austria" +"89","de",,"German (AUSTRIA)","ELGA, Austria" +"90","de","AT",,"ELGA, Austria" +"24","de","AT","German (AUSTRIA)","ELGA, Austria" \ No newline at end of file diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/LinguisticVariants/deAT24LinguisticVariant.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/LinguisticVariants/deAT24LinguisticVariant.csv new file mode 100644 index 00000000000..c6882d47504 --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/LinguisticVariants/deAT24LinguisticVariant.csv @@ -0,0 +1,4 @@ +"LOINC_NUM","COMPONENT","PROPERTY","TIME_ASPCT","SYSTEM","SCALE_TYP","METHOD_TYP","CLASS","SHORTNAME","LONG_COMMON_NAME","RELATEDNAMES2","LinguisticVariantDisplayName" +"61438-8","Entlassungsbrief Ärztlich","Ergebnis","Zeitpunkt","{Setting}","Dokument","Dermatologie","DOC.ONTOLOGY","de shortname","de long common name","de related names 2","de linguistic variant display name" +"43730-1","","","","","","","","","","EBV-DNA qn. PCR","EBV-DNA quantitativ PCR" +"17787-3","","","","","","","","","","CoV OC43 RNA ql/SM P","Coronavirus OC43 RNA ql. /Sondermaterial PCR" diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/LinguisticVariants/frCA8LinguisticVariant.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/LinguisticVariants/frCA8LinguisticVariant.csv new file mode 100644 index 00000000000..fa09e0cb242 --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/LinguisticVariants/frCA8LinguisticVariant.csv @@ -0,0 +1,6 @@ +"LOINC_NUM","COMPONENT","PROPERTY","TIME_ASPCT","SYSTEM","SCALE_TYP","METHOD_TYP","CLASS","SHORTNAME","LONG_COMMON_NAME","RELATEDNAMES2","LinguisticVariantDisplayName" +"61438-8","Cellules de Purkinje cytoplasmique type 2 , IgG","Titre","Temps ponctuel","Sérum","Quantitatif","Immunofluorescence","Sérologie","","","","" +"11704-4","Gliale nucléaire de type 1 , IgG","Titre","Temps ponctuel","LCR","Quantitatif","Immunofluorescence","Sérologie","","","","" +,"Cellules de Purkinje cytoplasmique type 2 , IgG","Titre","Temps ponctuel","Sérum","Quantitatif",,,"","","","" +"17787-3","Virus respiratoire syncytial bovin","Présence-Seuil","Temps ponctuel","XXX","Ordinal","Culture spécifique à un microorganisme","Microbiologie","","","","" +"17788-1","Cellules de Purkinje cytoplasmique type 2 , IgG","Titre","Temps ponctuel","Sérum","Quantitatif",,,"","","","" diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/LinguisticVariants/zhCN5LinguisticVariant.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/LinguisticVariants/zhCN5LinguisticVariant.csv new file mode 100644 index 00000000000..48d07d9fdc3 --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/LinguisticVariants/zhCN5LinguisticVariant.csv @@ -0,0 +1,9 @@ +"LOINC_NUM","COMPONENT","PROPERTY","TIME_ASPCT","SYSTEM","SCALE_TYP","METHOD_TYP","CLASS","SHORTNAME","LONG_COMMON_NAME","RELATEDNAMES2","LinguisticVariantDisplayName" +"61438-8","血流速度.收缩期.最大值","速度","时间点","大脑中动脉","定量型","超声.多普勒","产科学检查与测量指标.超声","","","Cereb 动态 可用数量表示的;定量性;数值型;数量型;连续数值型标尺 大脑(Cerebral) 时刻;随机;随意;瞬间 术语""cerebral""指的是主要由中枢半球(大脑皮质和基底神经节)组成的那部分脑结构 流 流量;流速;流体 血;全血 血流量;血液流量 速度(距离/时间);速率;速率(距离/时间)","" +"11704-4","血流速度.收缩期.最大值","速度","时间点","动脉导管","定量型","超声.多普勒","产科学检查与测量指标.超声","","","动态 动脉管 可用数量表示的;定量性;数值型;数量型;连续数值型标尺 时刻;随机;随意;瞬间 流 流量;流速;流体 血;全血 血流量;血液流量 速度(距离/时间);速率;速率(距离/时间)","" +"17787-3","血流速度.收缩期.最大值","速度","时间点","二尖瓣^胎儿","定量型","超声.多普勒","产科学检查与测量指标.超声","","","僧帽瓣 动态 可用数量表示的;定量性;数值型;数量型;连续数值型标尺 时刻;随机;随意;瞬间 流 流量;流速;流体 胎;超系统 - 胎儿 血;全血 血流量;血液流量 速度(距离/时间);速率;速率(距离/时间)","" +"61438-6",,"速度","时间点","二尖瓣^胎儿","定量型","超声.多普勒","产科学检查与测量指标.超声","","","僧帽瓣 动态 可用数量表示的;定量性;数值型;数量型;连续数值型标尺 时刻;随机;随意;瞬间 流 流量;流速;流体 胎;超系统 - 胎儿 血;全血 血流量;血液流量 速度(距离/时间);速率;速率(距离/时间)","" +"10000-8","血流速度.收缩期.最大值",,"时间点","二尖瓣^胎儿","定量型","超声.多普勒","产科学检查与测量指标.超声","","","僧帽瓣 动态 可用数量表示的;定量性;数值型;数量型;连续数值型标尺 时刻;随机;随意;瞬间 流 流量;流速;流体 胎;超系统 - 胎儿 血;全血 血流量;血液流量 速度(距离/时间);速率;速率(距离/时间)","" +"17788-1","血流速度.收缩期.最大值","速度",,"大脑中动脉","定量型","超声.多普勒","产科学检查与测量指标.超声","","","Cereb 动态 可用数量表示的;定量性;数值型;数量型;连续数值型标尺 大脑(Cerebral) 时刻;随机;随意;瞬间 术语""cerebral""指的是主要由中枢半球(大脑皮质和基底神经节)组成的那部分脑结构 流 流量;流速;流体 血;全血 血流量;血液流量 速度(距离/时间);速率;速率(距离/时间)","" +"11488-4","血流速度.收缩期.最大值","速度","时间点",,"定量型","超声.多普勒","产科学检查与测量指标.超声","","","Cereb 动态 可用数量表示的;定量性;数值型;数量型;连续数值型标尺 大脑(Cerebral) 时刻;随机;随意;瞬间 术语""cerebral""指的是主要由中枢半球(大脑皮质和基底神经节)组成的那部分脑结构 流 流量;流速;流体 血;全血 血流量;血液流量 速度(距离/时间);速率;速率(距离/时间)","" +"47239-9","血流速度.收缩期.最大值","速度","时间点","大脑中动脉",,"超声.多普勒","产科学检查与测量指标.超声","","","Cereb 动态 可用数量表示的;定量性;数值型;数量型;连续数值型标尺 大脑(Cerebral) 时刻;随机;随意;瞬间 术语""cerebral""指的是主要由中枢半球(大脑皮质和基底神经节)组成的那部分脑结构 流 流量;流速;流体 血;全血 血流量;血液流量 速度(距离/时间);速率;速率(距离/时间)","" diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/LoincIeeeMedicalDeviceCodeMappingTable/LoincIeeeMedicalDeviceCodeMappingTable.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/LoincIeeeMedicalDeviceCodeMappingTable/LoincIeeeMedicalDeviceCodeMappingTable.csv new file mode 100644 index 00000000000..d8cf83cd09e --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/LoincIeeeMedicalDeviceCodeMappingTable/LoincIeeeMedicalDeviceCodeMappingTable.csv @@ -0,0 +1,10 @@ +LOINC_NUM,LOINC_LONG_COMMON_NAME,IEEE_CF_CODE10,IEEE_REFID,IEEE_DESCRIPTION,IEEE_DIM,IEEE_UOM_UCUM +11556-8,Oxygen [Partial pressure] in Blood,160116,MDC_CONC_PO2_GEN,,LMT-2L-2 LMT-2L-2,kPa mm[Hg] +11557-6,Carbon dioxide [Partial pressure] in Blood,160064,MDC_CONC_PCO2_GEN,,LMT-2L-2 LMT-2L-2,kPa mm[Hg] +11558-4,pH of Blood,160004,MDC_CONC_PH_GEN,,[pH],[pH] +12961-9,Urea nitrogen [Mass/volume] in Arterial blood,160080,MDC_CONC_UREA_ART,,ML-3 NL-3,mg/dL mmol/L +14749-6,Glucose [Moles/volume] in Serum or Plasma,160196,MDC_CONC_GLU_VENOUS_PLASMA,Plasma glucose concentration taken from venous,NL-3 ,mmol/L +14749-6,Glucose [Moles/volume] in Serum or Plasma,160368,MDC_CONC_GLU_UNDETERMINED_PLASMA,Plasma glucose concentration taken from undetermined sample source,NL-3 ,mmol/L +15074-8,Glucose [Moles/volume] in Blood,160020,MDC_CONC_GLU_GEN,,NL-3,mmol/L +15074-8,Glucose [Moles/volume] in Blood,160364,MDC_CONC_GLU_UNDETERMINED_WHOLEBLOOD,Whole blood glucose concentration taken from undetermined sample source,NL-3 ,mmol/L +17861-6,Calcium [Mass/volume] in Serum or Plasma,160024,MDC_CONC_CA_GEN,,ML-3,mg/dL diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/LoincRsnaRadiologyPlaybook/LoincRsnaRadiologyPlaybook.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/LoincRsnaRadiologyPlaybook/LoincRsnaRadiologyPlaybook.csv new file mode 100644 index 00000000000..e49311f5b28 --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/LoincRsnaRadiologyPlaybook/LoincRsnaRadiologyPlaybook.csv @@ -0,0 +1,10 @@ +"LoincNumber","LongCommonName" ,"PartNumber","PartTypeName" ,"PartName" ,"PartSequenceOrder","RID" ,"PreferredName" ,"RPID" ,"LongName" +"17787-3" ,"v2.67 NM Thyroid gland Study report","LP199995-4","Rad.Anatomic Location.Region Imaged","Neck" ,"A" ,"RID7488" ,"neck" ,"" ,"" +"17787-3" ,"v2.67 NM Thyroid gland Study report","LP206648-0","Rad.Anatomic Location.Imaging Focus","Thyroid gland" ,"A" ,"RID7578" ,"thyroid gland" ,"" ,"" +"17787-3" ,"v2.67 NM Thyroid gland Study report","LP208891-4","Rad.Modality.Modality type" ,"NM" ,"A" ,"RID10330","nuclear medicine imaging","" ,"" +"24531-6" ,"v2.67 US Retroperitoneum" ,"LP207608-3","Rad.Modality.Modality type" ,"US" ,"A" ,"RID10326","Ultrasound" ,"RPID2142","US Retroperitoneum" +"24531-6" ,"v2.67 US Retroperitoneum" ,"LP199943-4","Rad.Anatomic Location.Imaging Focus","Retroperitoneum" ,"A" ,"RID431" ,"RETROPERITONEUM" ,"RPID2142","US Retroperitoneum" +"24531-6" ,"v2.67 US Retroperitoneum" ,"LP199956-6","Rad.Anatomic Location.Region Imaged","Abdomen" ,"A" ,"RID56" ,"Abdomen" ,"RPID2142","US Retroperitoneum" +"24532-4" ,"v2.67 US Abdomen RUQ" ,"LP199956-6","Rad.Anatomic Location.Region Imaged","Abdomen" ,"A" ,"RID56" ,"Abdomen" ,"" ,"" +"24532-4" ,"v2.67 US Abdomen RUQ" ,"LP207608-3","Rad.Modality.Modality type" ,"US" ,"A" ,"RID10326","Ultrasound" ,"" ,"" +"24532-4" ,"v2.67 US Abdomen RUQ" ,"LP208105-9","Rad.Anatomic Location.Imaging Focus","Right upper quadrant","A" ,"RID29994","Right upper quadrant" ,"" ,"" diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/LoincUniversalLabOrdersValueSet/LoincUniversalLabOrdersValueSet.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/LoincUniversalLabOrdersValueSet/LoincUniversalLabOrdersValueSet.csv new file mode 100644 index 00000000000..72d95485a58 --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/LoincUniversalLabOrdersValueSet/LoincUniversalLabOrdersValueSet.csv @@ -0,0 +1,10 @@ +"LOINC_NUM","LONG_COMMON_NAME","ORDER_OBS" +"42176-8","1,3 beta glucan [Mass/volume] in Serum","Both" +"53835-5","1,5-Anhydroglucitol [Mass/volume] in Serum or Plasma","Both" +"31019-3","10-Hydroxycarbazepine [Mass/volume] in Serum or Plasma","Both" +"6765-2","17-Hydroxypregnenolone [Mass/volume] in Serum or Plasma","Both" +"1668-3","17-Hydroxyprogesterone [Mass/volume] in Serum or Plasma","Both" +"32854-2","17-Hydroxyprogesterone [Presence] in DBS","Both" +"49054-0","25-Hydroxycalciferol [Mass/volume] in Serum or Plasma","Both" +"62292-8","25-Hydroxyvitamin D2+25-Hydroxyvitamin D3 [Mass/volume] in Serum or Plasma","Both" +"44907-4","5-Hydroxyindoleacetate panel - 24 hour Urine","Order" diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/MultiAxialHierarchy/MultiAxialHierarchy.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/MultiAxialHierarchy/MultiAxialHierarchy.csv new file mode 100644 index 00000000000..527b8fd5cae --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/MultiAxialHierarchy/MultiAxialHierarchy.csv @@ -0,0 +1,10 @@ +PATH_TO_ROOT,SEQUENCE,IMMEDIATE_PARENT,CODE,CODE_TEXT +,1,,LP31755-9,Microbiology +LP31755-9,1,LP31755-9,LP14559-6,Microorganism +LP31755-9.LP14559-6,1,LP14559-6,LP98185-9,Bacteria +LP31755-9.LP14559-6.LP98185-9,1,LP98185-9,LP14082-9,Bacteria +LP31755-9.LP14559-6.LP98185-9.LP14082-9,1,LP14082-9,LP52258-8,Bacteria | Body Fluid +LP31755-9.LP14559-6.LP98185-9.LP14082-9.LP52258-8,1,LP52258-8,41599-2,Bacteria Fld Ql Micro +LP31755-9.LP14559-6.LP98185-9.LP14082-9,2,LP14082-9,LP52260-4,Bacteria | Cerebral spinal fluid +LP31755-9.LP14559-6.LP98185-9.LP14082-9.LP52260-4,1,LP52260-4,41602-4,Bacteria CSF Ql Micro +LP31755-9.LP14559-6.LP98185-9.LP14082-9,3,LP14082-9,LP52960-9,Bacteria | Cervix diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/PanelsAndForms/AnswerList.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/PanelsAndForms/AnswerList.csv new file mode 100644 index 00000000000..a448cf80f2d --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/PanelsAndForms/AnswerList.csv @@ -0,0 +1,12 @@ +"AnswerListId","AnswerListName" ,"AnswerListOID" ,"ExtDefinedYN","ExtDefinedAnswerListCodeSystem","ExtDefinedAnswerListLink" ,"AnswerStringId","LocalAnswerCode","LocalAnswerCodeSystem","SequenceNumber","DisplayText" ,"ExtCodeId","ExtCodeDisplayName" ,"ExtCodeSystem" ,"ExtCodeSystemVersion" ,"ExtCodeSystemCopyrightNotice" ,"SubsequentTextPrompt","Description","Score" +"LL1000-0" ,"PhenX05_13_30D bread amt","1.3.6.1.4.1.12009.10.1.165" ,"N" , , ,"LA13825-7" ,"1" , ,1 ,"1 slice or 1 dinner roll" , , , , , , , , +"LL1000-0" ,"PhenX05_13_30D bread amt","1.3.6.1.4.1.12009.10.1.165" ,"N" , , ,"LA13838-0" ,"2" , ,2 ,"2 slices or 2 dinner rolls" , , , , , , , , +"LL1000-0" ,"PhenX05_13_30D bread amt","1.3.6.1.4.1.12009.10.1.165" ,"N" , , ,"LA13892-7" ,"3" , ,3 ,"More than 2 slices or 2 dinner rolls", , , , , , , , +"LL1001-8" ,"PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA6270-8" ,"00" , ,1 ,"Never" , , , , , , , , +"LL1001-8" ,"PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13836-4" ,"01" , ,2 ,"1-3 times per month" , , , , , , , , +"LL1001-8" ,"PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13834-9" ,"02" , ,3 ,"1-2 times per week" , , , , , , , , +"LL1001-8" ,"PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13853-9" ,"03" , ,4 ,"3-4 times per week" , , , , , , , , +"LL1001-8" ,"PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13860-4" ,"04" , ,5 ,"5-6 times per week" , , , , , , , , +"LL1001-8" ,"PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13827-3" ,"05" , ,6 ,"1 time per day" , , , , , , , , +"LL1001-8" ,"PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA4389-8" ,"97" , ,11 ,"Refused" ,"443390004","Refused (qualifier value)","http://snomed.info/sct","http://snomed.info/sct/900000000000207008/version/20170731","This material includes SNOMED Clinical Terms® (SNOMED CT®) which is used by permission of the International Health Terminology Standards Development Organisation (IHTSDO) under license. All rights reserved. SNOMED CT® was originally created by The College", , , +"LL1892-0" ,"ICD-9_ICD-10" ,"1.3.6.1.4.1.12009.10.1.1069","Y" , ,"http://www.cdc.gov/nchs/icd.htm", , , , , , , , , , , , , diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/PanelsAndForms/Loinc.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/PanelsAndForms/Loinc.csv new file mode 100644 index 00000000000..20379cb7f1d --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/PanelsAndForms/Loinc.csv @@ -0,0 +1,16 @@ +"LOINC_NUM","COMPONENT" ,"PROPERTY","TIME_ASPCT","SYSTEM" ,"SCALE_TYP","METHOD_TYP" ,"CLASS" ,"VersionLastChanged","CHNG_TYPE","DefinitionDescription" ,"STATUS","CONSUMER_NAME","CLASSTYPE","FORMULA","SPECIES","EXMPL_ANSWERS","SURVEY_QUEST_TEXT" ,"SURVEY_QUEST_SRC" ,"UNITSREQUIRED","SUBMITTED_UNITS","RELATEDNAMES2" ,"SHORTNAME" ,"ORDER_OBS" ,"CDISC_COMMON_TESTS","HL7_FIELD_SUBFIELD_ID","EXTERNAL_COPYRIGHT_NOTICE" ,"EXAMPLE_UNITS","LONG_COMMON_NAME" ,"UnitsAndRange","DOCUMENT_SECTION","EXAMPLE_UCUM_UNITS","EXAMPLE_SI_UCUM_UNITS","STATUS_REASON","STATUS_TEXT","CHANGE_REASON_PUBLIC" ,"COMMON_TEST_RANK","COMMON_ORDER_RANK","COMMON_SI_TEST_RANK","HL7_ATTACHMENT_STRUCTURE","EXTERNAL_COPYRIGHT_LINK","PanelType","AskAtOrderEntry","AssociatedObservations" ,"VersionFirstReleased","ValidHL7AttachmentRequest" +"10013-1" ,"R' wave amplitude.lead I" ,"Elpot" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"Cardiac; ECG; EKG.MEASUREMENTS; Electrical potential; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave Amp L-I; R wave Amp L-I; Random; Right; Voltage" ,"R' wave Amp L-I" ,"Observation", , , ,"mV" ,"R' wave amplitude in lead I" , , ,"mV" , , , , ,0 ,0 ,0 , , , , , , , +"10014-9" ,"R' wave amplitude.lead II" ,"Elpot" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"2; Cardiac; ECG; EKG.MEASUREMENTS; Electrical potential; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave Amp L-II; R wave Amp L-II; Random; Right; Voltage" ,"R' wave Amp L-II" ,"Observation", , , ,"mV" ,"R' wave amplitude in lead II" , , ,"mV" , , , , ,0 ,0 ,0 , , , , , , , +"10015-6" ,"R' wave amplitude.lead III" ,"Elpot" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"3; Cardiac; ECG; EKG.MEASUREMENTS; Electrical potential; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave Amp L-III; R wave Amp L-III; Random; Right; Voltage" ,"R' wave Amp L-III" ,"Observation", , , ,"mV" ,"R' wave amplitude in lead III" , , ,"mV" , , , , ,0 ,0 ,0 , , , , , , , +"10016-4" ,"R' wave amplitude.lead V1" ,"Elpot" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"Cardiac; ECG; EKG.MEASUREMENTS; Electrical potential; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave Amp L-V1; R wave Amp L-V1; Random; Right; Voltage" ,"R' wave Amp L-V1" ,"Observation", , , ,"mV" ,"R' wave amplitude in lead V1" , , ,"mV" , , , , ,0 ,0 ,0 , , , , , , , +"1001-7" ,"DBG Ab" ,"Pr" ,"Pt" ,"Ser/Plas^donor" ,"Ord" , ,"BLDBK" ,"2.44" ,"MIN" , ,"ACTIVE", ,1 , , , , , , , ,"ABS; Aby; Antby; Anti; Antibodies; Antibody; Autoantibodies; Autoantibody; BLOOD BANK; Donna Bennett-Goodspeed; Donr; Ordinal; Pl; Plasma; Plsm; Point in time; QL; Qual; Qualitative; Random; Screen; SerP; SerPl; SerPl^donor; SerPlas; Serum; Serum or plasma; SR" ,"DBG Ab SerPl Donr Ql" ,"Observation", , , , ,"DBG Ab [Presence] in Serum or Plasma from donor" , , , , , , ,"The Property has been changed from ACnc to Pr (Presence) to reflect the new model for ordinal terms where results are based on presence or absence." ,0 ,0 ,0 , , , , , , , +"10017-2" ,"R' wave amplitude.lead V2" ,"Elpot" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"Cardiac; ECG; EKG.MEASUREMENTS; Electrical potential; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave Amp L-V2; R wave Amp L-V2; Random; Right; Voltage" ,"R' wave Amp L-V2" ,"Observation", , , ,"mV" ,"R' wave amplitude in lead V2" , , ,"mV" , , , , ,0 ,0 ,0 , , , , , , , +"10018-0" ,"R' wave amplitude.lead V3" ,"Elpot" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"Cardiac; ECG; EKG.MEASUREMENTS; Electrical potential; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave Amp L-V3; R wave Amp L-V3; Random; Right; Voltage" ,"R' wave Amp L-V3" ,"Observation", , , ,"mV" ,"R' wave amplitude in lead V3" , , ,"mV" , , , , ,0 ,0 ,0 , , , , , , , +"10019-8" ,"R' wave amplitude.lead V4" ,"Elpot" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"Cardiac; ECG; EKG.MEASUREMENTS; Electrical potential; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave Amp L-V4; R wave Amp L-V4; Random; Right; Voltage" ,"R' wave Amp L-V4" ,"Observation", , , ,"mV" ,"R' wave amplitude in lead V4" , , ,"mV" , , , , ,0 ,0 ,0 , , , , , , , +"10020-6" ,"R' wave amplitude.lead V5" ,"Elpot" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"Cardiac; ECG; EKG.MEASUREMENTS; Electrical potential; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave Amp L-V5; R wave Amp L-V5; Random; Right; Voltage" ,"R' wave Amp L-V5" ,"Observation", , , ,"mV" ,"R' wave amplitude in lead V5" , , ,"mV" , , , , ,0 ,0 ,0 , , , , , , , +"61438-8" ,"Each time you ate bread, toast or dinner rolls, how much did you usually eat in the past 30D","Find" ,"Pt" ,"^Patient" ,"Ord" ,"PhenX" ,"PHENX" ,"2.44" ,"MIN" , ,"TRIAL" , ,2 , , , ,"Each time you eat bread, toast or dinner rolls, how much do you usually eat?","PhenX.050201100100","N" , ,"Finding; Findings; How much bread in 30D; Last; Ordinal; Point in time; QL; Qual; Qualitative; Random; Screen" ,"How much bread in 30D PhenX", , , , , ,"Each time you ate bread, toast or dinner rolls, how much did you usually eat in the past 30 days [PhenX]", , , , , , , ,0 ,0 ,0 , , , , , , , +"10000-8" ,"R wave duration.lead AVR" ,"Time" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"Cardiac; Durat; ECG; EKG.MEASUREMENTS; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave dur L-AVR; R wave dur L-AVR; Random; Right" ,"R wave dur L-AVR" ,"Observation", , , ,"s" ,"R wave duration in lead AVR" , , ,"s" , , , , ,0 ,0 ,0 , , , , , , , +"17787-3" ,"Study report" ,"Find" ,"Pt" ,"Neck>Thyroid gland","Doc" ,"NM" ,"RAD" ,"2.61" ,"MIN" , ,"ACTIVE", ,2 , , , , , , , ,"Document; Finding; Findings; Imaging; Point in time; Radiology; Random; Study report; Thy" ,"NM Thyroid Study report" ,"Both" , , , , ,"NM Thyroid gland Study report" , , , , , , ,"Changed System from ""Thyroid"" for conformance with the LOINC/RadLex unified model.; Method of ""Radnuc"" was changed to ""NM"". The LOINC/RadLex Committee agreed to use a subset of the two-letter DICOM modality codes as the primary modality identifier." ,0 ,0 ,0 ,"IG exists" , , , ,"81220-6;72230-6" ,"1.0l" , +"17788-1" ,"Large unstained cells/100 leukocytes" ,"NFr" ,"Pt" ,"Bld" ,"Qn" ,"Automated count","HEM/BC" ,"2.50" ,"MIN" ,"Part of auto diff output of Bayer H*3S; peroxidase negative cells too large to be classified as lymph or basophil" ,"ACTIVE", ,1 , , , , , ,"Y" ,"%" ,"100WBC; Auto; Automated detection; Blood; Cell; Cellularity; Elec; Elect; Electr; HEMATOLOGY/CELL COUNTS; Leuc; Leuk; Leukocyte; Lkcs; LUC; Number Fraction; Percent; Point in time; QNT; Quan; Quant; Quantitative; Random; WB; WBC; WBCs; White blood cell; White blood cells; Whole blood" ,"LUC/leuk NFr Bld Auto" ,"Observation", , , ,"%" ,"Large unstained cells/100 leukocytes in Blood by Automated count" , , ,"%" , , , , ,1894 ,0 ,1894 , , , , , ,"1.0l" , +"11488-4" ,"Consultation note" ,"Find" ,"Pt" ,"{Setting}" ,"Doc" ,"{Role}" ,"DOC.ONTOLOGY","2.63" ,"MIN" , ,"ACTIVE", ,2 , , , , , , , ,"Consult note; DOC.ONT; Document; Encounter; Evaluation and management; Evaluation and management note; Finding; Findings; notes; Point in time; Random; Visit note" ,"Consult note" ,"Both" , , , , ,"Consult note" , , , , , , ,"Edit made because this term is conformant to the Document Ontology axis values and therefore are being placed in this class.; Based on Clinical LOINC Committee decision during the September 2014 meeting, {Provider} was changed to {Author Type} to emphasize a greater breadth of potential document authors. At the September 2015 Clinical LOINC Committee meeting, the Committee decided to change {Author Type} to {Role} to align with the 'Role' axis name in the LOINC Document Ontology.; Because it is too difficult to maintain and because the distinction between documents and sections is not clear-cut nor necessary in most cases, the DOCUMENT_SECTION field has been deemed to have little value. The field has been set to null in the December 2017 release in preparation for removal in the December 2018 release. These changes were approved by the Clinical LOINC Committee.",0 ,0 ,0 ,"IG exists" , , , ,"81222-2;72231-4;81243-8","1.0j-a" ,"Y" +"47239-9" ,"Reason for stopping HIV Rx" ,"Type" ,"Pt" ,"^Patient" ,"Nom" ,"Reported" ,"ART" ,"2.50" ,"MIN" ,"Reason for stopping antiretroviral therapy" ,"ACTIVE", ,2 , , , , , ,"N" , ,"AIDS; Anti-retroviral therapy; ART; Human immunodeficiency virus; Nominal; Point in time; Random; Treatment; Typ" ,"Reason for stopping HIV Rx" ,"Observation", , ,"Copyright © 2006 World Health Organization. Used with permission. Publications of the World Health Organization can be obtained from WHO Press, World Health Organization, 20 Avenue Appia, 1211 Geneva 27, Switzerland (tel: +41 22 791 2476; fax: +41 22 791 4857; email: bookorders@who.int). Requests for permission to reproduce or translate WHO publications – whether for sale or for noncommercial distribution – should be addressed to WHO Press, at the above address (fax: +41 22 791 4806; email: permissions@who.int). The designations employed and the presentation of the material in this publication do not imply the expression of any opinion whatsoever on the part of the World Health Organization concerning the legal status of any country, territory, city or area or of its authorities, or concerning the delimitation of its frontiers or boundaries. Dotted lines on maps represent approximate border lines for which there may not yet be full agreement. The mention of specific companies or of certain manufacturers’ products does not imply that they are endorsed or recommended by the World Health Organization in preference to others of a similar nature that are not mentioned. Errors and omissions excepted, the names of proprietary products are distinguished by initial capital letters. All reasonable precautions have been taken by WHO to verify the information contained in this publication. However, the published material is being distributed without warranty of any kind, either express or implied. The responsibility for the interpretation and use of the material lies with the reader. In no event shall the World Health Organization be liable for damages arising from its use.", ,"Reason for stopping HIV treatment" , , , , , , , ,0 ,0 ,0 , ,"WHO_HIV" , , , ,"2.22" , diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/PanelsAndForms/LoincAnswerListLink.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/PanelsAndForms/LoincAnswerListLink.csv new file mode 100644 index 00000000000..820602c77ad --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/PanelsAndForms/LoincAnswerListLink.csv @@ -0,0 +1,11 @@ +"LoincNumber","LongCommonName" ,"AnswerListId","AnswerListName" ,"AnswerListLinkType","ApplicableContext" +"61438-8" ,"Each time you ate bread, toast or dinner rolls, how much did you usually eat in the past 30 days [PhenX]","LL1000-0" ,"PhenX05_13_30D bread amt","NORMATIVE" , +"10061-0" ,"S' wave amplitude in lead I" ,"LL1311-1" ,"PhenX12_44" ,"EXAMPLE" , +"10331-7" ,"Rh [Type] in Blood" ,"LL360-9" ,"Pos|Neg" ,"EXAMPLE" , +"10389-5" ,"Blood product.other [Type]" ,"LL2413-4" ,"Othr bld prod" ,"EXAMPLE" , +"10390-3" ,"Blood product special preparation [Type]" ,"LL2422-5" ,"Blood prod treatment" ,"EXAMPLE" , +"10393-7" ,"Factor IX given [Type]" ,"LL2420-9" ,"Human/Recomb" ,"EXAMPLE" , +"10395-2" ,"Factor VIII given [Type]" ,"LL2420-9" ,"Human/Recomb" ,"EXAMPLE" , +"10401-8" ,"Immune serum globulin given [Type]" ,"LL2421-7" ,"IM/IV" ,"EXAMPLE" , +"10410-9" ,"Plasma given [Type]" ,"LL2417-5" ,"Plasma type" ,"EXAMPLE" , +"10568-4" ,"Clarity of Semen" ,"LL2427-4" ,"Clear/Opales/Milky" ,"EXAMPLE" , diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/PartFile/LoincPartLink.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/PartFile/LoincPartLink.csv new file mode 100644 index 00000000000..36c84f3fe95 --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/PartFile/LoincPartLink.csv @@ -0,0 +1,10 @@ +"LoincNumber","LongCommonName","PartNumber","PartName","PartCodeSystem","PartTypeName","LinkTypeName","Property" +"10013-1","R' wave amplitude in lead I","LP31101-6","R' wave amplitude.lead I","http://loinc.org","COMPONENT","Primary","http://loinc.org/property/COMPONENT" +"10013-1","R' wave amplitude in lead I","LP6802-5","Elpot","http://loinc.org","PROPERTY","Primary","http://loinc.org/property/PROPERTY" +"10013-1","R' wave amplitude in lead I","LP6960-1","Pt","http://loinc.org","TIME","Primary","http://loinc.org/property/TIME_ASPCT" +"10013-1","R' wave amplitude in lead I","LP7289-4","Heart","http://loinc.org","SYSTEM","Primary","http://loinc.org/property/SYSTEM" +"10013-1","R' wave amplitude in lead I","LP7753-9","Qn","http://loinc.org","SCALE","Primary","http://loinc.org/property/SCALE_TYP" +"10013-1","R' wave amplitude in lead I","LP6244-0","EKG","http://loinc.org","METHOD","Primary","http://loinc.org/property/METHOD_TYP" +"10013-1","R' wave amplitude in lead I","LP31101-6","R' wave amplitude.lead I","http://loinc.org","COMPONENT","DetailedModel","http://loinc.org/property/analyte" +"10013-1","R' wave amplitude in lead I","LP6802-5","Elpot","http://loinc.org","PROPERTY","DetailedModel","http://loinc.org/property/PROPERTY" +"10013-1","R' wave amplitude in lead I","LP6960-1","Pt","http://loinc.org","TIME","DetailedModel","http://loinc.org/property/time-core" diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/PartFile/LoincPartLink_Primary.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/PartFile/LoincPartLink_Primary.csv new file mode 100644 index 00000000000..8dbe575ffd2 --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/PartFile/LoincPartLink_Primary.csv @@ -0,0 +1,7 @@ +"LoincNumber","LongCommonName" ,"PartNumber","PartName" ,"PartCodeSystem" ,"PartTypeName","LinkTypeName","Property" +"10013-1" ,"R' wave amplitude in lead I","LP31101-6" ,"R' wave amplitude.lead I","http://loinc.org","COMPONENT" ,"Primary" ,"http://loinc.org/property/COMPONENT" +"10013-1" ,"R' wave amplitude in lead I","LP6802-5" ,"Elpot" ,"http://loinc.org","PROPERTY" ,"Primary" ,"http://loinc.org/property/PROPERTY" +"10013-1" ,"R' wave amplitude in lead I","LP6960-1" ,"Pt" ,"http://loinc.org","TIME" ,"Primary" ,"http://loinc.org/property/TIME_ASPCT" +"10013-1" ,"R' wave amplitude in lead I","LP7289-4" ,"Heart" ,"http://loinc.org","SYSTEM" ,"Primary" ,"http://loinc.org/property/SYSTEM" +"10013-1" ,"R' wave amplitude in lead I","LP7753-9" ,"Qn" ,"http://loinc.org","SCALE" ,"Primary" ,"http://loinc.org/property/SCALE_TYP" +"10013-1" ,"R' wave amplitude in lead I","LP6244-0" ,"EKG" ,"http://loinc.org","METHOD" ,"Primary" ,"http://loinc.org/property/METHOD_TYP" diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/PartFile/LoincPartLink_Supplementary.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/PartFile/LoincPartLink_Supplementary.csv new file mode 100644 index 00000000000..869c2c1651d --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/PartFile/LoincPartLink_Supplementary.csv @@ -0,0 +1,13 @@ +"LoincNumber","LongCommonName" ,"PartNumber","PartName" ,"PartCodeSystem" ,"PartTypeName","LinkTypeName" ,"Property" +"10013-1" ,"R' wave amplitude in lead I","LP31101-6" ,"R' wave amplitude.lead I","http://loinc.org","COMPONENT" ,"DetailedModel" ,"http://loinc.org/property/analyte" +"10013-1" ,"R' wave amplitude in lead I","LP6802-5" ,"Elpot" ,"http://loinc.org","PROPERTY" ,"DetailedModel" ,"http://loinc.org/property/PROPERTY" +"10013-1" ,"R' wave amplitude in lead I","LP6960-1" ,"Pt" ,"http://loinc.org","TIME" ,"DetailedModel" ,"http://loinc.org/property/time-core" +"10013-1" ,"R' wave amplitude in lead I","LP7289-4" ,"Heart" ,"http://loinc.org","SYSTEM" ,"DetailedModel" ,"http://loinc.org/property/system-core" +"10013-1" ,"R' wave amplitude in lead I","LP7753-9" ,"Qn" ,"http://loinc.org","SCALE" ,"DetailedModel" ,"http://loinc.org/property/SCALE_TYP" +"10013-1" ,"R' wave amplitude in lead I","LP6244-0" ,"EKG" ,"http://loinc.org","METHOD" ,"DetailedModel" ,"http://loinc.org/property/METHOD_TYP" +"10013-1" ,"R' wave amplitude in lead I","LP31101-6" ,"R' wave amplitude.lead I","http://loinc.org","COMPONENT" ,"SyntaxEnhancement","http://loinc.org/property/analyte-core" +"10013-1" ,"R' wave amplitude in lead I","LP190563-9","Cardiology" ,"http://loinc.org","CLASS" ,"Metadata" ,"http://loinc.org/property/category" +"10013-1" ,"R' wave amplitude in lead I","LP29708-2" ,"Cardiology" ,"http://loinc.org","CLASS" ,"Metadata" ,"http://loinc.org/property/category" +"10013-1" ,"R' wave amplitude in lead I","LP7787-7" ,"Clinical" ,"http://loinc.org","CLASS" ,"Metadata" ,"http://loinc.org/property/category" +"10013-1" ,"R' wave amplitude in lead I","LP7795-0" ,"EKG measurements" ,"http://loinc.org","CLASS" ,"Metadata" ,"http://loinc.org/property/category" +"10013-1" ,"R' wave amplitude in lead I","LP7795-0" ,"EKG.MEAS" ,"http://loinc.org","CLASS" ,"Metadata" ,"http://loinc.org/property/CLASS" diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/PartFile/Part.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/PartFile/Part.csv new file mode 100644 index 00000000000..d5816ead286 --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/PartFile/Part.csv @@ -0,0 +1,46 @@ +"PartNumber","PartTypeName","PartName","PartDisplayName","Status" +"LP101394-7","ADJUSTMENT","adjusted for maternal weight","adjusted for maternal weight","ACTIVE" +"LP101907-6","ADJUSTMENT","corrected for age","corrected for age","ACTIVE" +"LP115711-6","ADJUSTMENT","corrected for background","corrected for background","ACTIVE" +"LP147359-6","ADJUSTMENT","adjusted for body weight","adjusted for body weight","ACTIVE" +"LP173482-3","ADJUSTMENT","1st specimen","1st specimen","DEPRECATED" +"LP173483-1","ADJUSTMENT","post cyanocobalamin",,"ACTIVE" +"LP173484-9","ADJUSTMENT","W hyperextension)",,"ACTIVE" +"LP6244-0","METHOD","EKG","Electrocardiogram (EKG)","ACTIVE" +"LP18172-4","COMPONENT","Interferon.beta","Interferon beta","ACTIVE" +"LP7289-4","SYSTEM","Heart","Heart","ACTIVE" +"LP6960-1","TIME","Pt","Point in time (spot)","ACTIVE" +"LP6802-5","PROPERTY","Elpot","Electrical Potential (Voltage)","ACTIVE" +"LP7753-9","SCALE","Qn","Qn","ACTIVE" +"LP31101-6","COMPONENT","R' wave amplitude.lead I","R' wave amplitude.lead I","ACTIVE" +"LP31102-4","COMPONENT","R' wave amplitude.lead II","R' wave amplitude.lead II","ACTIVE" +"LP31103-2","COMPONENT","R' wave amplitude.lead III","R' wave amplitude.lead III","ACTIVE" +"LP31104-0","COMPONENT","R' wave amplitude.lead V1","R' wave amplitude.lead V1","ACTIVE" +"LP31105-7","COMPONENT","R' wave amplitude.lead V2","R' wave amplitude.lead V2","ACTIVE" +"LP31106-5","COMPONENT","R' wave amplitude.lead V3","R' wave amplitude.lead V3","ACTIVE" +"LP31107-3","COMPONENT","R' wave amplitude.lead V4","R' wave amplitude.lead V4","ACTIVE" +"LP31108-1","COMPONENT","R' wave amplitude.lead V5","R' wave amplitude.lead V5","ACTIVE" +"LP31109-9","COMPONENT","R' wave amplitude.lead V6","R' wave amplitude.lead V6","ACTIVE" +"LP31110-7","COMPONENT","R' wave duration.lead AVF","R' wave duration.lead AVF","ACTIVE" +"LP30269-2","SYSTEM","Ser/Plas^donor",,"ACTIVE" +"LP149220-8","PROPERTY","Pr","Presence","ACTIVE" +"LP7751-3","SCALE","Ord","Ord","ACTIVE" +"LP37904-7","COMPONENT","DBG Ab","DBG Ab","ACTIVE" +"LP6813-2","PROPERTY","Find","Finding","ACTIVE" +"LP95333-8","METHOD","PhenX","PhenX","ACTIVE" +"LP102627-9","COMPONENT","Each time you ate bread, toast or dinner rolls, how much did you usually eat in the past 30D","Each time you ate bread, toast or dinner rolls, how much did you usually eat in the past 30 days","ACTIVE" +"LP6879-3","PROPERTY","Time","Time (e.g. seconds)","ACTIVE" +"LP31088-5","COMPONENT","R wave duration.lead AVR","R wave duration.lead AVR","ACTIVE" +"LP206647-2","SYSTEM","Neck>Thyroid gland","Thyroid gland","ACTIVE" +"LP208655-3","METHOD","NM","NM","ACTIVE" +"LP32888-7","SCALE","Doc","Doc","ACTIVE" +"LP31534-8","COMPONENT","Study report","Study report","ACTIVE" +"LP7057-5","SYSTEM","Bld","Blood","ACTIVE" +"LP6838-9","PROPERTY","NFr","Number Fraction","ACTIVE" +"LP6141-8","METHOD","Automated count","Automated count","ACTIVE" +"LP15842-5","COMPONENT","Pyridoxine","Pyridoxine","ACTIVE" +"LP19258-0","COMPONENT","Large unstained cells","Large unstained cells","ACTIVE" +"LP32887-9","SYSTEM","{Setting}","{Setting}","ACTIVE" +"LP187178-1","METHOD","{Role}","Role-unspecified","ACTIVE" +"LP72311-1","COMPONENT","Consultation note","Consultation note","ACTIVE" + diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/PartFile/PartRelatedCodeMapping.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/PartFile/PartRelatedCodeMapping.csv new file mode 100644 index 00000000000..495416894ce --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/PartFile/PartRelatedCodeMapping.csv @@ -0,0 +1,12 @@ +"PartNumber","PartName" ,"PartTypeName","ExtCodeId" ,"ExtCodeDisplayName" ,"ExtCodeSystem" ,"Equivalence","ContentOrigin","ExtCodeSystemVersion" ,"ExtCodeSystemCopyrightNotice" +"LP18172-4" ,"Interferon.beta" ,"COMPONENT" ," 420710006","Interferon beta (substance)" ,"http://snomed.info/sct" ,"equivalent" ,"Both" ,"http://snomed.info/sct/900000000000207008/version/20170731","This material includes SNOMED Clinical Terms® (SNOMED CT®) which is used by permission of the International Health Terminology Standards Development Organisation (IHTSDO) under license. All rights reserved. SNOMED CT® was originally created by The College of American Pathologists. “SNOMED” and “SNOMED CT” are registered trademarks of the IHTSDO.This material includes content from the US Edition to SNOMED CT, which is developed and maintained by the U.S. National Library of Medicine and is available to authorized UMLS Metathesaurus Licensees from the UTS Downloads site at https://uts.nlm.nih.gov.Use of SNOMED CT content is subject to the terms and conditions set forth in the SNOMED CT Affiliate License Agreement. It is the responsibility of those implementing this product to ensure they are appropriately licensed and for more information on the license, including how to register as an Affiliate Licensee, please refer to http://www.snomed.org/snomed-ct/get-snomed-ct or info@snomed.org<mailto:info@snomed.org>. This may incur a fee in SNOMED International non-Member countries." +"LP31706-2" ,"Nornicotine" ,"COMPONENT" ,"1018001" ,"Nornicotine (substance)" ,"http://snomed.info/sct" ,"equivalent" ,"Both" ,"http://snomed.info/sct/900000000000207008/version/20170731","This material includes SNOMED Clinical Terms® (SNOMED CT®) which is used by permission of the International Health Terminology Standards Development Organisation (IHTSDO) under license. All rights reserved. SNOMED CT® was originally created by The College of American Pathologists. “SNOMED” and “SNOMED CT” are registered trademarks of the IHTSDO.This material includes content from the US Edition to SNOMED CT, which is developed and maintained by the U.S. National Library of Medicine and is available to authorized UMLS Metathesaurus Licensees from the UTS Downloads site at https://uts.nlm.nih.gov.Use of SNOMED CT content is subject to the terms and conditions set forth in the SNOMED CT Affiliate License Agreement. It is the responsibility of those implementing this product to ensure they are appropriately licensed and for more information on the license, including how to register as an Affiliate Licensee, please refer to http://www.snomed.org/snomed-ct/get-snomed-ct or info@snomed.org<mailto:info@snomed.org>. This may incur a fee in SNOMED International non-Member countries." +"LP15826-8" ,"Prostaglandin F2","COMPONENT" ,"10192006" ,"Prostaglandin PGF2 (substance)" ,"http://snomed.info/sct" ,"equivalent" ,"Both" ,"http://snomed.info/sct/900000000000207008/version/20170731","This material includes SNOMED Clinical Terms® (SNOMED CT®) which is used by permission of the International Health Terminology Standards Development Organisation (IHTSDO) under license. All rights reserved. SNOMED CT® was originally created by The College of American Pathologists. “SNOMED” and “SNOMED CT” are registered trademarks of the IHTSDO.This material includes content from the US Edition to SNOMED CT, which is developed and maintained by the U.S. National Library of Medicine and is available to authorized UMLS Metathesaurus Licensees from the UTS Downloads site at https://uts.nlm.nih.gov.Use of SNOMED CT content is subject to the terms and conditions set forth in the SNOMED CT Affiliate License Agreement. It is the responsibility of those implementing this product to ensure they are appropriately licensed and for more information on the license, including how to register as an Affiliate Licensee, please refer to http://www.snomed.org/snomed-ct/get-snomed-ct or info@snomed.org<mailto:info@snomed.org>. This may incur a fee in SNOMED International non-Member countries." +"LP7400-7" ,"Liver" ,"SYSTEM" ,"10200004" ,"Liver structure (body structure)","http://snomed.info/sct" ,"wider" ,"Both" ,"http://snomed.info/sct/900000000000207008/version/20170731","This material includes SNOMED Clinical Terms® (SNOMED CT®) which is used by permission of the International Health Terminology Standards Development Organisation (IHTSDO) under license. All rights reserved. SNOMED CT® was originally created by The College of American Pathologists. “SNOMED” and “SNOMED CT” are registered trademarks of the IHTSDO.This material includes content from the US Edition to SNOMED CT, which is developed and maintained by the U.S. National Library of Medicine and is available to authorized UMLS Metathesaurus Licensees from the UTS Downloads site at https://uts.nlm.nih.gov.Use of SNOMED CT content is subject to the terms and conditions set forth in the SNOMED CT Affiliate License Agreement. It is the responsibility of those implementing this product to ensure they are appropriately licensed and for more information on the license, including how to register as an Affiliate Licensee, please refer to http://www.snomed.org/snomed-ct/get-snomed-ct or info@snomed.org<mailto:info@snomed.org>. This may incur a fee in SNOMED International non-Member countries." +"LP29165-5" ,"Liver.FNA" ,"SYSTEM" ,"10200004" ,"Liver structure (body structure)","http://snomed.info/sct" ,"narrower" ,"Both" ,"http://snomed.info/sct/900000000000207008/version/20170731","This material includes SNOMED Clinical Terms® (SNOMED CT®) which is used by permission of the International Health Terminology Standards Development Organisation (IHTSDO) under license. All rights reserved. SNOMED CT® was originally created by The College of American Pathologists. “SNOMED” and “SNOMED CT” are registered trademarks of the IHTSDO.This material includes content from the US Edition to SNOMED CT, which is developed and maintained by the U.S. National Library of Medicine and is available to authorized UMLS Metathesaurus Licensees from the UTS Downloads site at https://uts.nlm.nih.gov.Use of SNOMED CT content is subject to the terms and conditions set forth in the SNOMED CT Affiliate License Agreement. It is the responsibility of those implementing this product to ensure they are appropriately licensed and for more information on the license, including how to register as an Affiliate Licensee, please refer to http://www.snomed.org/snomed-ct/get-snomed-ct or info@snomed.org<mailto:info@snomed.org>. This may incur a fee in SNOMED International non-Member countries." +"LP15666-8" ,"Inosine" ,"COMPONENT" ,"102640000" ,"Inosine (substance)" ,"http://snomed.info/sct" ,"equivalent" ,"Both" ,"http://snomed.info/sct/900000000000207008/version/20170731","This material includes SNOMED Clinical Terms® (SNOMED CT®) which is used by permission of the International Health Terminology Standards Development Organisation (IHTSDO) under license. All rights reserved. SNOMED CT® was originally created by The College of American Pathologists. “SNOMED” and “SNOMED CT” are registered trademarks of the IHTSDO.This material includes content from the US Edition to SNOMED CT, which is developed and maintained by the U.S. National Library of Medicine and is available to authorized UMLS Metathesaurus Licensees from the UTS Downloads site at https://uts.nlm.nih.gov.Use of SNOMED CT content is subject to the terms and conditions set forth in the SNOMED CT Affiliate License Agreement. It is the responsibility of those implementing this product to ensure they are appropriately licensed and for more information on the license, including how to register as an Affiliate Licensee, please refer to http://www.snomed.org/snomed-ct/get-snomed-ct or info@snomed.org<mailto:info@snomed.org>. This may incur a fee in SNOMED International non-Member countries." +"LP15943-1" ,"Uronate" ,"COMPONENT" ,"102641001" ,"Uronic acid (substance)" ,"http://snomed.info/sct" ,"equivalent" ,"Both" ,"http://snomed.info/sct/900000000000207008/version/20170731","This material includes SNOMED Clinical Terms® (SNOMED CT®) which is used by permission of the International Health Terminology Standards Development Organisation (IHTSDO) under license. All rights reserved. SNOMED CT® was originally created by The College of American Pathologists. “SNOMED” and “SNOMED CT” are registered trademarks of the IHTSDO.This material includes content from the US Edition to SNOMED CT, which is developed and maintained by the U.S. National Library of Medicine and is available to authorized UMLS Metathesaurus Licensees from the UTS Downloads site at https://uts.nlm.nih.gov.Use of SNOMED CT content is subject to the terms and conditions set forth in the SNOMED CT Affiliate License Agreement. It is the responsibility of those implementing this product to ensure they are appropriately licensed and for more information on the license, including how to register as an Affiliate Licensee, please refer to http://www.snomed.org/snomed-ct/get-snomed-ct or info@snomed.org<mailto:info@snomed.org>. This may incur a fee in SNOMED International non-Member countries." +"LP15791-4" ,"Phenylketones" ,"COMPONENT" ,"102642008" ,"Phenylketones (substance)" ,"http://snomed.info/sct" ,"equivalent" ,"Both" ,"http://snomed.info/sct/900000000000207008/version/20170731","This material includes SNOMED Clinical Terms® (SNOMED CT®) which is used by permission of the International Health Terminology Standards Development Organisation (IHTSDO) under license. All rights reserved. SNOMED CT® was originally created by The College of American Pathologists. “SNOMED” and “SNOMED CT” are registered trademarks of the IHTSDO.This material includes content from the US Edition to SNOMED CT, which is developed and maintained by the U.S. National Library of Medicine and is available to authorized UMLS Metathesaurus Licensees from the UTS Downloads site at https://uts.nlm.nih.gov.Use of SNOMED CT content is subject to the terms and conditions set forth in the SNOMED CT Affiliate License Agreement. It is the responsibility of those implementing this product to ensure they are appropriately licensed and for more information on the license, including how to register as an Affiliate Licensee, please refer to http://www.snomed.org/snomed-ct/get-snomed-ct or info@snomed.org<mailto:info@snomed.org>. This may incur a fee in SNOMED International non-Member countries." +"LP15721-1" ,"Malonate" ,"COMPONENT" ,"102648007" ,"Malonic acid (substance)" ,"http://snomed.info/sct" ,"equivalent" ,"Both" ,"http://snomed.info/sct/900000000000207008/version/20170731","This material includes SNOMED Clinical Terms® (SNOMED CT®) which is used by permission of the International Health Terminology Standards Development Organisation (IHTSDO) under license. All rights reserved. SNOMED CT® was originally created by The College of American Pathologists. “SNOMED” and “SNOMED CT” are registered trademarks of the IHTSDO.This material includes content from the US Edition to SNOMED CT, which is developed and maintained by the U.S. National Library of Medicine and is available to authorized UMLS Metathesaurus Licensees from the UTS Downloads site at https://uts.nlm.nih.gov.Use of SNOMED CT content is subject to the terms and conditions set forth in the SNOMED CT Affiliate License Agreement. It is the responsibility of those implementing this product to ensure they are appropriately licensed and for more information on the license, including how to register as an Affiliate Licensee, please refer to http://www.snomed.org/snomed-ct/get-snomed-ct or info@snomed.org<mailto:info@snomed.org>. This may incur a fee in SNOMED International non-Member countries." +"LP15842-5" ,"Pyridoxine" ,"COMPONENT" ,"1054" ,"Pyridoxine" ,"http://pubchem.ncbi.nlm.nih.gov","equivalent" , , , +"LP15842-5" ,"Pyridoxine" ,"COMPONENT" ,"1054" ,"Pyridoxine" ,"http://foo/bar" ,"equivalent" , , , diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/Top2000Results/SI/Top2000CommonLabResultsSi.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/Top2000Results/SI/Top2000CommonLabResultsSi.csv new file mode 100644 index 00000000000..1e9b3872892 --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/Top2000Results/SI/Top2000CommonLabResultsSi.csv @@ -0,0 +1,10 @@ +LOINC #,Long Common Name,Short Name,CLASS,Rank +14682-9,Creatinine [Moles/volume] in Serum or Plasma,Creat SerPl-mCnc,Chem,1 +718-7,Hemoglobin [Mass/volume] in Blood,Hgb Bld-mCnc,HEM/BC,2 +2823-3,Potassium [Moles/volume] in Serum or Plasma,Potassium SerPl-sCnc,Chem,3 +14749-6,Glucose [Moles/volume] in Serum or Plasma,Glucose SerPl-mCnc,Chem,4 +2951-2,Sodium [Moles/volume] in Serum or Plasma,Sodium SerPl-sCnc,Chem,5 +3094-0,Urea nitrogen [Mass/volume] in Serum or Plasma,BUN SerPl-mCnc,Chem,6 +2028-9,"Carbon dioxide, total [Moles/volume] in Serum or Plasma",CO2 SerPl-sCnc,Chem,7 +2075-0,Chloride [Moles/volume] in Serum or Plasma,Chloride SerPl-sCnc,Chem,8 +789-8,Erythrocytes [#/volume] in Blood by Automated count,RBC # Bld Auto,HEM/BC,9 diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/Top2000Results/US/Top2000CommonLabResultsUs.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/Top2000Results/US/Top2000CommonLabResultsUs.csv new file mode 100644 index 00000000000..c80db052dd3 --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/Top2000Results/US/Top2000CommonLabResultsUs.csv @@ -0,0 +1,10 @@ +LOINC #,Long Common Name,Short Name,CLASS,Rank +2160-0,Creatinine [Mass/volume] in Serum or Plasma,Creat SerPl-mCnc,Chem,1 +718-7,Hemoglobin [Mass/volume] in Blood,Hgb Bld-mCnc,HEM/BC,2 +2823-3,Potassium [Moles/volume] in Serum or Plasma,Potassium SerPl-sCnc,Chem,3 +2345-7,Glucose [Mass/volume] in Serum or Plasma,Glucose SerPl-mCnc,Chem,4 +2951-2,Sodium [Moles/volume] in Serum or Plasma,Sodium SerPl-sCnc,Chem,5 +3094-0,Urea nitrogen [Mass/volume] in Serum or Plasma,BUN SerPl-mCnc,Chem,6 +2028-9,"Carbon dioxide, total [Moles/volume] in Serum or Plasma",CO2 SerPl-sCnc,Chem,7 +2075-0,Chloride [Moles/volume] in Serum or Plasma,Chloride SerPl-sCnc,Chem,8 +789-8,Erythrocytes [#/volume] in Blood by Automated count,RBC # Bld Auto,HEM/BC,9 diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/LoincTable/Loinc.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/LoincTable/Loinc.csv new file mode 100644 index 00000000000..4017edb85b0 --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/LoincTable/Loinc.csv @@ -0,0 +1,16 @@ +"LOINC_NUM","COMPONENT" ,"PROPERTY","TIME_ASPCT","SYSTEM" ,"SCALE_TYP","METHOD_TYP" ,"CLASS" ,"VersionLastChanged","CHNG_TYPE","DefinitionDescription" ,"STATUS","CONSUMER_NAME","CLASSTYPE","FORMULA","SPECIES","EXMPL_ANSWERS","SURVEY_QUEST_TEXT" ,"SURVEY_QUEST_SRC" ,"UNITSREQUIRED","SUBMITTED_UNITS","RELATEDNAMES2" ,"SHORTNAME" ,"ORDER_OBS" ,"CDISC_COMMON_TESTS","HL7_FIELD_SUBFIELD_ID","EXTERNAL_COPYRIGHT_NOTICE" ,"EXAMPLE_UNITS","LONG_COMMON_NAME" ,"UnitsAndRange","DOCUMENT_SECTION","EXAMPLE_UCUM_UNITS","EXAMPLE_SI_UCUM_UNITS","STATUS_REASON","STATUS_TEXT","CHANGE_REASON_PUBLIC" ,"COMMON_TEST_RANK","COMMON_ORDER_RANK","COMMON_SI_TEST_RANK","HL7_ATTACHMENT_STRUCTURE","EXTERNAL_COPYRIGHT_LINK","PanelType","AskAtOrderEntry","AssociatedObservations" ,"VersionFirstReleased","ValidHL7AttachmentRequest" +"10013-1" ,"v2.67 R' wave amplitude.lead I" ,"Elpot" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"Cardiac; ECG; EKG.MEASUREMENTS; Electrical potential; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave Amp L-I; R wave Amp L-I; Random; Right; Voltage" ,"R' wave Amp L-I" ,"Observation", , , ,"mV" ,"R' wave amplitude in lead I" , , ,"mV" , , , , ,0 ,0 ,0 , , , , , , , +"10014-9" ,"v2.67 R' wave amplitude.lead II" ,"Elpot" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"2; Cardiac; ECG; EKG.MEASUREMENTS; Electrical potential; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave Amp L-II; R wave Amp L-II; Random; Right; Voltage" ,"R' wave Amp L-II" ,"Observation", , , ,"mV" ,"R' wave amplitude in lead II" , , ,"mV" , , , , ,0 ,0 ,0 , , , , , , , +"10015-6" ,"v2.67 R' wave amplitude.lead III" ,"Elpot" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"3; Cardiac; ECG; EKG.MEASUREMENTS; Electrical potential; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave Amp L-III; R wave Amp L-III; Random; Right; Voltage" ,"R' wave Amp L-III" ,"Observation", , , ,"mV" ,"R' wave amplitude in lead III" , , ,"mV" , , , , ,0 ,0 ,0 , , , , , , , +"10016-4" ,"v2.67 R' wave amplitude.lead V1" ,"Elpot" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"Cardiac; ECG; EKG.MEASUREMENTS; Electrical potential; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave Amp L-V1; R wave Amp L-V1; Random; Right; Voltage" ,"R' wave Amp L-V1" ,"Observation", , , ,"mV" ,"R' wave amplitude in lead V1" , , ,"mV" , , , , ,0 ,0 ,0 , , , , , , , +"1001-7" ,"v2.67 DBG Ab" ,"Pr" ,"Pt" ,"Ser/Plas^donor" ,"Ord" , ,"BLDBK" ,"2.44" ,"MIN" , ,"ACTIVE", ,1 , , , , , , , ,"ABS; Aby; Antby; Anti; Antibodies; Antibody; Autoantibodies; Autoantibody; BLOOD BANK; Donna Bennett-Goodspeed; Donr; Ordinal; Pl; Plasma; Plsm; Point in time; QL; Qual; Qualitative; Random; Screen; SerP; SerPl; SerPl^donor; SerPlas; Serum; Serum or plasma; SR" ,"DBG Ab SerPl Donr Ql" ,"Observation", , , , ,"DBG Ab [Presence] in Serum or Plasma from donor" , , , , , , ,"The Property has been changed from ACnc to Pr (Presence) to reflect the new model for ordinal terms where results are based on presence or absence." ,0 ,0 ,0 , , , , , , , +"10017-2" ,"v2.67 R' wave amplitude.lead V2" ,"Elpot" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"Cardiac; ECG; EKG.MEASUREMENTS; Electrical potential; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave Amp L-V2; R wave Amp L-V2; Random; Right; Voltage" ,"R' wave Amp L-V2" ,"Observation", , , ,"mV" ,"R' wave amplitude in lead V2" , , ,"mV" , , , , ,0 ,0 ,0 , , , , , , , +"10018-0" ,"v2.67 R' wave amplitude.lead V3" ,"Elpot" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"Cardiac; ECG; EKG.MEASUREMENTS; Electrical potential; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave Amp L-V3; R wave Amp L-V3; Random; Right; Voltage" ,"R' wave Amp L-V3" ,"Observation", , , ,"mV" ,"R' wave amplitude in lead V3" , , ,"mV" , , , , ,0 ,0 ,0 , , , , , , , +"10019-8" ,"v2.67 R' wave amplitude.lead V4" ,"Elpot" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"Cardiac; ECG; EKG.MEASUREMENTS; Electrical potential; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave Amp L-V4; R wave Amp L-V4; Random; Right; Voltage" ,"R' wave Amp L-V4" ,"Observation", , , ,"mV" ,"R' wave amplitude in lead V4" , , ,"mV" , , , , ,0 ,0 ,0 , , , , , , , +"10020-6" ,"v2.67 R' wave amplitude.lead V5" ,"Elpot" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"Cardiac; ECG; EKG.MEASUREMENTS; Electrical potential; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave Amp L-V5; R wave Amp L-V5; Random; Right; Voltage" ,"R' wave Amp L-V5" ,"Observation", , , ,"mV" ,"R' wave amplitude in lead V5" , , ,"mV" , , , , ,0 ,0 ,0 , , , , , , , +"61438-8" ,"v2.67 Each time you ate bread, toast or dinner rolls, how much did you usually eat in the past 30D","Find" ,"Pt" ,"^Patient" ,"Ord" ,"PhenX" ,"PHENX" ,"2.44" ,"MIN" , ,"TRIAL" , ,2 , , , ,"Each time you eat bread, toast or dinner rolls, how much do you usually eat?","PhenX.050201100100","N" , ,"Finding; Findings; How much bread in 30D; Last; Ordinal; Point in time; QL; Qual; Qualitative; Random; Screen" ,"How much bread in 30D PhenX", , , , , ,"Each time you ate bread, toast or dinner rolls, how much did you usually eat in the past 30 days [PhenX]", , , , , , , ,0 ,0 ,0 , , , , , , , +"10000-8" ,"v2.67 R wave duration.lead AVR" ,"Time" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"Cardiac; Durat; ECG; EKG.MEASUREMENTS; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave dur L-AVR; R wave dur L-AVR; Random; Right" ,"R wave dur L-AVR" ,"Observation", , , ,"s" ,"R wave duration in lead AVR" , , ,"s" , , , , ,0 ,0 ,0 , , , , , , , +"17787-3" ,"v2.67 Study report" ,"Find" ,"Pt" ,"Neck>Thyroid gland","Doc" ,"NM" ,"RAD" ,"2.61" ,"MIN" , ,"ACTIVE", ,2 , , , , , , , ,"Document; Finding; Findings; Imaging; Point in time; Radiology; Random; Study report; Thy" ,"NM Thyroid Study report" ,"Both" , , , , ,"NM Thyroid gland Study report" , , , , , , ,"Changed System from ""Thyroid"" for conformance with the LOINC/RadLex unified model.; Method of ""Radnuc"" was changed to ""NM"". The LOINC/RadLex Committee agreed to use a subset of the two-letter DICOM modality codes as the primary modality identifier." ,0 ,0 ,0 ,"IG exists" , , , ,"81220-6;72230-6" ,"1.0l" , +"17788-1" ,"v2.67 Large unstained cells/100 leukocytes" ,"NFr" ,"Pt" ,"Bld" ,"Qn" ,"Automated count","HEM/BC" ,"2.50" ,"MIN" ,"Part of auto diff output of Bayer H*3S; peroxidase negative cells too large to be classified as lymph or basophil" ,"ACTIVE", ,1 , , , , , ,"Y" ,"%" ,"100WBC; Auto; Automated detection; Blood; Cell; Cellularity; Elec; Elect; Electr; HEMATOLOGY/CELL COUNTS; Leuc; Leuk; Leukocyte; Lkcs; LUC; Number Fraction; Percent; Point in time; QNT; Quan; Quant; Quantitative; Random; WB; WBC; WBCs; White blood cell; White blood cells; Whole blood" ,"LUC/leuk NFr Bld Auto" ,"Observation", , , ,"%" ,"Large unstained cells/100 leukocytes in Blood by Automated count" , , ,"%" , , , , ,1894 ,0 ,1894 , , , , , ,"1.0l" , +"11488-4" ,"v2.67 Consultation note" ,"Find" ,"Pt" ,"{Setting}" ,"Doc" ,"{Role}" ,"DOC.ONTOLOGY","2.63" ,"MIN" , ,"ACTIVE", ,2 , , , , , , , ,"Consult note; DOC.ONT; Document; Encounter; Evaluation and management; Evaluation and management note; Finding; Findings; notes; Point in time; Random; Visit note" ,"Consult note" ,"Both" , , , , ,"Consult note" , , , , , , ,"Edit made because this term is conformant to the Document Ontology axis values and therefore are being placed in this class.; Based on Clinical LOINC Committee decision during the September 2014 meeting, {Provider} was changed to {Author Type} to emphasize a greater breadth of potential document authors. At the September 2015 Clinical LOINC Committee meeting, the Committee decided to change {Author Type} to {Role} to align with the 'Role' axis name in the LOINC Document Ontology.; Because it is too difficult to maintain and because the distinction between documents and sections is not clear-cut nor necessary in most cases, the DOCUMENT_SECTION field has been deemed to have little value. The field has been set to null in the December 2017 release in preparation for removal in the December 2018 release. These changes were approved by the Clinical LOINC Committee.",0 ,0 ,0 ,"IG exists" , , , ,"81222-2;72231-4;81243-8","1.0j-a" ,"Y" +"47239-9" ,"v2.67 Reason for stopping HIV Rx" ,"Type" ,"Pt" ,"^Patient" ,"Nom" ,"Reported" ,"ART" ,"2.50" ,"MIN" ,"Reason for stopping antiretroviral therapy" ,"ACTIVE", ,2 , , , , , ,"N" , ,"AIDS; Anti-retroviral therapy; ART; Human immunodeficiency virus; Nominal; Point in time; Random; Treatment; Typ" ,"Reason for stopping HIV Rx" ,"Observation", , ,"Copyright © 2006 World Health Organization. Used with permission. Publications of the World Health Organization can be obtained from WHO Press, World Health Organization, 20 Avenue Appia, 1211 Geneva 27, Switzerland (tel: +41 22 791 2476; fax: +41 22 791 4857; email: bookorders@who.int). Requests for permission to reproduce or translate WHO publications – whether for sale or for noncommercial distribution – should be addressed to WHO Press, at the above address (fax: +41 22 791 4806; email: permissions@who.int). The designations employed and the presentation of the material in this publication do not imply the expression of any opinion whatsoever on the part of the World Health Organization concerning the legal status of any country, territory, city or area or of its authorities, or concerning the delimitation of its frontiers or boundaries. Dotted lines on maps represent approximate border lines for which there may not yet be full agreement. The mention of specific companies or of certain manufacturers’ products does not imply that they are endorsed or recommended by the World Health Organization in preference to others of a similar nature that are not mentioned. Errors and omissions excepted, the names of proprietary products are distinguished by initial capital letters. All reasonable precautions have been taken by WHO to verify the information contained in this publication. However, the published material is being distributed without warranty of any kind, either express or implied. The responsibility for the interpretation and use of the material lies with the reader. In no event shall the World Health Organization be liable for damages arising from its use.", ,"Reason for stopping HIV treatment" , , , , , , , ,0 ,0 ,0 , ,"WHO_HIV" , , , ,"2.22" , diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/loinc.xml b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/loinc.xml new file mode 100644 index 00000000000..46e29461fbb --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/loinc.xml @@ -0,0 +1,543 @@ +<!-- +LOINC is a freely available international standard for tests, measurements, and observations. It is a well maintained, version independent code system. + +Use of LOINC is governed by the LOINC License: https://loinc.org/license/ + +This CodeSystem resource describes 'LOINC' independent of any particular version. There are notes about changes for version specific LOINC code system resources. + +Note that the following set of codes are defined by the LOINC code systems: + - the main LOINC codes + - the LOINC Answer codes (LA) and the LOINC Answer list codes (LL) + - the LOINC Part codes (LP) in the Multiaxial Hierarchy + - the LOINC Part codes (LP) for the properties + Note: there are license restrictions on the use of LOINC Part codes + - the LOINC Group codes (LG) + Note: presently the LOINC Group codes are used to identify these roll-up groups as ValueSets, but are not yet loaded as codes in the CodeSystem + +Servers may generate variants of this for the LOINC version(s) and features they support. + +--> + +<CodeSystem xmlns="http://hl7.org/fhir"> + <id value="loinc"/> + + <!-- + This url is unchanged for all versions of LOINC. There can only be one correct Code System resource for each value of the version attribute (at least, only one per server). + --> + <url value="http://loinc.org"/> + + <!-- the HL7 v3 OID assigned to LOINC --> + <identifier> + <system value="urn:ietf:rfc:3986"/> + <value value="urn:oid:2.16.840.1.113883.6.1"/> + </identifier> + +<!-- <version value="2.67"/>--> + + <!-- + If a specific version is specified, the name should carry this information (e.g. LOINC_270). + --> + <name value="LOINC"/> + <title value="LOINC Code System (Testing Copy)"/> + <status value="active"/> + <experimental value="false"/> + + <publisher value="Regenstrief Institute, Inc."/> + <contact> + <telecom> + <system value="url" /> + <value value="http://loinc.org"/> + </telecom> + </contact> + + <!-- + <date value=2021-06/> + --> + <description value="LOINC is a freely available international standard for tests, measurements, and observations"/> + <copyright value="This material contains content from LOINC (http://loinc.org). LOINC is copyright ©1995-2021, Regenstrief Institute, Inc. and the Logical Observation Identifiers Names and Codes (LOINC) Committee and is available at no cost under the license at http://loinc.org/license. LOINC® is a registered United States trademark of Regenstrief Institute, Inc."/> + <caseSensitive value="false"/> + + <valueSet value="http://loinc.org/vs"/> + + <!-- + It's at the discretion of servers whether to present fragments of LOINC hierarchically or not, when using the code system resource. But, if they are hierarchical, the Hierarchy SHALL be based on the is-a relationship that is derived from the LOINC Multiaxial Hierarchy. + --> + <hierarchyMeaning value="is-a"/> + <compositional value="false"/> <!-- no compositional grammar in LOINC --> + <versionNeeded value="false"/> + + <!-- + This canonical definition of LOINC does not include the LOINC content, which is distributed separately for portability. + + Servers may choose to include fragments of LOINC for illustration purposes. + --> + <content value="not-present"/> + + <!-- + <count value="65000"/> + If working with a specific version, you could nominate a count of the total number of concepts (including the answers, Hierarchy, etc.). In this canonical definition we do not. + --> + + <!-- + FILTERS + Generally defined filters for specifying value sets + In LOINC, all the properties can also be used as filters, but they are not defined explicitly as filters. + Parent/child properties are as defined by FHIR. Note that at this time the LOINC code system resource does not support ancestor/descendant relationships. + + For illustration purposes, consider this slice of the LOINC Multiaxial Hierarchy when reading the descriptions below: + + Laboratory [LP29693-6] + Microbiology and Antimicrobial susceptibility [LP343406-7] + Microbiology [LP7819-8] + Microorganism [LP14559-6] + Virus [LP14855-8] + Zika virus [LP200137-0] + Zika virus RNA | XXX [LP203271-4] + Zika virus RNA | XXX | Microbiology [LP379670-5] + Zika virus RNA [Presence] in Unspecified specimen by Probe and target amplification method [79190-5] + + Language Note: The filters defined here are specified using the default LOINC language - English (US). Requests are meant to be specified and interpreted on the English version. The return can be in a specified language (if supported by the server). But note that not all filters/properties have language translations available. + --> + <filter> + <code value="parent"/> + <description value="Allows for the selection of a set of codes based on their appearance in the LOINC Multiaxial Hierarchy. Parent selects immediate parent only. For example, the code '79190-5' has the parent 'LP379670-5'"/> + <operator value="="/> + <value value="A Part code"/> + </filter> + <filter> + <code value="child"/> + <description value="Allows for the selection of a set of codes based on their appearance in the LOINC Multiaxial Hierarchy. Child selects immediate children only. For example, the code 'LP379670-5' has the child '79190-5'. Only LOINC Parts have children; LOINC codes do not have any children because they are leaf nodes."/> + <operator value="="/> + <value value="A comma separated list of Part or LOINC codes"/> + </filter> + <filter> + <code value="copyright"/> + <description value="Allows for the inclusion or exclusion of LOINC codes that include 3rd party copyright notices. LOINC = only codes with a sole copyright by Regenstrief. 3rdParty = only codes with a 3rd party copyright in addition to the one from Regenstrief"/> + <operator value="="/> + <value value="LOINC | 3rdParty"/> + </filter> + + <!-- + PROPERTIES + There are 4 kinds of properties that apply to all LOINC codes: + 1. FHIR: display, designation; these are not described here since they are inherent in the specification + 2. Infrastructural: defined by FHIR, but documented here for the LOINC Multiaxial Hierarchy + 3. Primary LOINC properties: defined by the main LOINC table + 4. Secondary LOINC properties: defined by the LoincPartLink table + Additionally, there are 2 kinds of properties specific to Document ontology and Radiology codes, respectively: + 1. LOINC/RSNA Radiology Playbook properties + 2. Document Ontology properties + --> + <!-- + Infrastructural properties - inherited from FHIR, but documented here for the LOINC Multiaxial Hierarchy. + --> + + <property> + <code value="parent"/> + <uri value="http://hl7.org/fhir/concept-properties#parent"/> + <description value="A parent code in the Multiaxial Hierarchy"/> + <type value="code"/> + </property> + <property> + <code value="child"/> + <uri value="http://hl7.org/fhir/concept-properties#child"/> + <description value="A child code in the Multiaxial Hierarchy"/> + <type value="code"/> + </property> + + <!-- + Primary LOINC properties. + These apply to the main LOINC codes, but not the Multiaxial Hierarchy, Answer lists, or the Part codes. + Notes: + In the LOINC code system resource, the display element = LONG_COMMON_NAME + Many properties are specified as type "Coding", which allows use of LOINC Part codes (LP-) and the display text. LOINC Parts and their associations to LOINC terms are published in the LOINC Part File. + The properties defined here follow the guidance of the LOINC Users' Guide, which states that they should be expressed with the LOINC attributes contained in the LOINC Table. Properties that are not defined in the LOINC Table use FHIR-styled names. + --> + + <property> + <code value="STATUS"/> + <uri value="http://loinc.org/property/STATUS"/> + <description value="Status of the term. Within LOINC, codes with STATUS=DEPRECATED are considered inactive. Current values: ACTIVE, TRIAL, DISCOURAGED, and DEPRECATED"/> + <type value="string"/> + </property> + <property> + <code value="COMPONENT"/> + <uri value="http://loinc.org/property/COMPONENT"/> + <description value="First major axis-component or analyte: Analyte Name, Analyte sub-class, Challenge"/> + <type value="Coding"/> + </property> + <property> + <code value="PROPERTY"/> + <uri value="http://loinc.org/property/PROPERTY"/> + <description value="Second major axis-property observed: Kind of Property (also called kind of quantity)"/> + <type value="Coding"/> + </property> + <property> + <code value="TIME_ASPCT"/> + <uri value="http://loinc.org/property/TIME_ASPCT"/> + <description value="Third major axis-timing of the measurement: Time Aspect (Point or moment in time vs. time interval)"/> + <type value="Coding"/> + </property> + <property> + <code value="SYSTEM"/> + <uri value="http://loinc.org/property/SYSTEM"/> + <description value="Fourth major axis-type of specimen or system: System (Sample) Type"/> + <type value="Coding"/> + </property> + <property> + <code value="SCALE_TYP"/> + <uri value="http://loinc.org/property/SCALE_TYP"/> + <description value="Fifth major axis-scale of measurement: Type of Scale"/> + <type value="Coding"/> + </property> + <property> + <code value="METHOD_TYP"/> + <uri value="http://loinc.org/property/METHOD_TYP"/> + <description value="Sixth major axis-method of measurement: Type of Method"/> + <type value="Coding"/> + </property> + <property> + <code value="CLASS"/> + <uri value="http://loinc.org/property/CLASS"/> + <description value="An arbitrary classification of terms for grouping related observations together"/> + <type value="Coding"/> + </property> + <property> + <code value="VersionLastChanged"/> + <uri value="http://loinc.org/property/VersionLastChanged"/> + <description value="The LOINC version number in which the record has last changed. For new records, this field contains the same value as the VersionFirstReleased property."/> + <type value="string"/> + </property> + <property> + <code value="CLASSTYPE"/> + <uri value="http://loinc.org/property/CLASSTYPE"/> + <description value="1=Laboratory class; 2=Clinical class; 3=Claims attachments; 4=Surveys"/> + <type value="string"/> + </property> + <property> + <code value="ORDER_OBS"/> + <uri value="http://loinc.org/property/ORDER_OBS"/> + <description value="Provides users with an idea of the intended use of the term by categorizing it as an order only, observation only, or both"/> + <type value="string"/> + </property> + <property> + <code value="HL7_ATTACHMENT_STRUCTURE"/> + <uri value="http://loinc.org/property/HL7_ATTACHMENT_STRUCTURE"/> + <description value="This property is populated in collaboration with the HL7 Payer-Provider Exchange (PIE) Work Group (previously called Attachments Work Group) as described in the HL7 Attachment Specification: Supplement to Consolidated CDA Templated Guide."/> + <type value="string"/> + </property> + <property> + <code value="VersionFirstReleased"/> + <uri value="http://loinc.org/property/VersionFirstReleased"/> + <description value="This is the LOINC version number in which this LOINC term was first published."/> + <type value="string"/> + </property> + <property> + <code value="PanelType"/> + <uri value="http://loinc.org/property/PanelType"/> + <description value="For LOINC terms that are panels, this attribute classifies them as a 'Convenience group', 'Organizer', or 'Panel'"/> + <type value="string"/> + </property> + <property> + <code value="ValidHL7AttachmentRequest"/> + <uri value="http://loinc.org/property/ValidHL7AttachmentRequest"/> + <description value="A value of Y in this field indicates that this LOINC code can be sent by a payer as part of an HL7 Attachment request for additional information."/> + <type value="string"/> + </property> + <property> + <code value="DisplayName"/> + <uri value="http://loinc.org/property/DisplayName"/> + <description value="A name that is more 'clinician-friendly' compared to the current LOINC Short Name, Long Common Name, and Fully Specified Name. It is created algorithmically from the manually crafted display text for each Part and is generally more concise than the Long Common Name."/> + <type value="string"/> + </property> + <property> + <code value="answer-list"/> + <uri value="http://loinc.org/property/answer-list"/> + <description value="An answer list associated with this LOINC code (if there are matching answer lists defined)."/> + <type value="Coding"/> + </property> + + <!-- + Secondary LOINC properties. + These properties also apply to the main LOINC codes, but not the Multiaxial Hierarchy, Answer lists, or the Part codes. + Notes: + These properties are defined in the LoincPartLink table. + --> + + <property> + <code value="analyte"/> + <uri value="http://loinc.org/property/analyte"/> + <description value="First sub-part of the Component, i.e., the part of the Component before the first carat"/> + <type value="Coding"/> + </property> + <property> + <code value="analyte-core"/> + <uri value="http://loinc.org/property/analyte-core"/> + <description value="The primary part of the analyte without the suffix"/> + <type value="Coding"/> + </property> + <property> + <code value="analyte-suffix"/> + <uri value="http://loinc.org/property/analyte-suffix"/> + <description value="The suffix part of the analyte, if present, e.g., Ab or DNA"/> + <type value="Coding"/> + </property> + <property> + <code value="analyte-numerator"/> + <uri value="http://loinc.org/property/analyte-numerator"/> + <description value="The numerator part of the analyte, i.e., everything before the slash in analytes that contain a divisor"/> + <type value="Coding"/> + </property> + <property> + <code value="analyte-divisor"/> + <uri value="http://loinc.org/property/analyte-divisor"/> + <description value="The divisor part of the analyte, if present, i.e., after the slash and before the first carat"/> + <type value="Coding"/> + </property> + <property> + <code value="analyte-divisor-suffix"/> + <uri value="http://loinc.org/property/analyte-divisor-suffix"/> + <description value="The suffix part of the divisor, if present"/> + <type value="Coding"/> + </property> + <property> + <code value="challenge"/> + <uri value="http://loinc.org/property/challenge"/> + <description value="Second sub-part of the Component, i.e., after the first carat"/> + <type value="Coding"/> + </property> + <property> + <code value="adjustment"/> + <uri value="http://loinc.org/property/adjustment"/> + <description value="Third sub-part of the Component, i.e., after the second carat"/> + <type value="Coding"/> + </property> + <property> + <code value="count"/> + <uri value="http://loinc.org/property/count"/> + <description value="Fourth sub-part of the Component, i.e., after the third carat"/> + <type value="Coding"/> + </property> + <property> + <code value="time-core"/> + <uri value="http://loinc.org/property/time-core"/> + <description value="The primary part of the Time"/> + <type value="Coding"/> + </property> + <property> + <code value="time-modifier"/> + <uri value="http://loinc.org/property/time-modifier"/> + <description value="The modifier of the Time value, such as mean or max"/> + <type value="Coding"/> + </property> + <property> + <code value="system-core"/> + <uri value="http://loinc.org/property/system-core"/> + <description value="The primary part of the System, i.e., without the super system"/> + <type value="Coding"/> + </property> + <property> + <code value="super-system"/> + <uri value="http://loinc.org/property/super-system"/> + <description value="The super system part of the System, if present. The super system represents the source of the specimen when the source is someone or something other than the patient whose chart the result will be stored in. For example, fetus is the super system for measurements done on obstetric ultrasounds, because the fetus is being measured and that measurement is being recorded in the patient's (mother's) chart."/> + <type value="Coding"/> + </property> + <property> + <code value="analyte-gene"/> + <uri value="http://loinc.org/property/analyte-gene"/> + <description value="The specific gene represented in the analyte"/> + <type value="Coding"/> + </property> + <property> + <code value="category"/> + <uri value="http://loinc.org/property/category"/> + <description value="A single LOINC term can be assigned one or more categories based on both programmatic and manual tagging. Category properties also utilize LOINC Class Parts."/> + <type value="Coding"/> + </property> + <property> + <code value="search"/> + <uri value="http://loinc.org/property/search"/> + <description value="Synonyms, fragments, and other Parts that are linked to a term to enable more encompassing search results."/> + <type value="Coding"/> + </property> + + <!-- + LOINC/RSNA Radiology Playbook properties. These apply only to terms in the LOINC/RSNA Radiology Playbook File. + Notes: + Properties are specified as type "Coding", which are represented by LOINC Part codes (LP-) and their display names. + The attribute names here use FHIR styled names rather than their original LOINC style names because the original names contain periods. + --> + + <property> + <code value="rad-modality-modality-type"/> + <uri value="http://loinc.org/property/rad-modality-modality-type"/> + <description value="Modality is used to represent the device used to acquire imaging information."/> + <type value="Coding"/> + </property> + <property> + <code value="rad-modality-modality-subtype"/> + <uri value="http://loinc.org/property/rad-modality-modality-subtype"/> + <description value="Modality subtype may be optionally included to signify a particularly common or evocative configuration of the modality."/> + <type value="Coding"/> + </property> + <property> + <code value="rad-anatomic-location-region-imaged"/> + <uri value="http://loinc.org/property/rad-anatomic-location-region-imaged"/> + <description value="The Anatomic Location Region Imaged attribute is used in two ways: as a coarse-grained descriptor of the area imaged and a grouper for finding related imaging exams; or, it is used just as a grouper."/> + <type value="Coding"/> + </property> + <property> + <code value="rad-anatomic-location-imaging-focus"/> + <uri value="http://loinc.org/property/rad-anatomic-location-imaging-focus"/> + <description value="The Anatomic Location Imaging Focus is a more fine-grained descriptor of the specific target structure of an imaging exam. In many areas, the focus should be a specific organ."/> + <type value="Coding"/> + </property> + <property> + <code value="rad-anatomic-location-laterality-presence"/> + <uri value="http://loinc.org/property/rad-anatomic-location-laterality-presence"/> + <description value="Radiology Exams that require laterality to be specified in order to be performed are signified with an Anatomic Location Laterality Presence attribute set to 'True'"/> + <type value="Coding"/> + </property> + <property> + <code value="rad-anatomic-location-laterality"/> + <uri value="http://loinc.org/property/rad-anatomic-location-laterality"/> + <description value="Radiology exam Laterality is specified as one of: Left, Right, Bilateral, Unilateral, Unspecified"/> + <type value="Coding"/> + </property> + <property> + <code value="rad-view-aggregation"/> + <uri value="http://loinc.org/property/rad-view-aggregation"/> + <description value="Aggregation describes the extent of the imaging performed, whether in quantitative terms (e.g., '3 or more views') or subjective terms (e.g., 'complete')."/> + <type value="Coding"/> + </property> + <property> + <code value="rad-view-view-type"/> + <uri value="http://loinc.org/property/rad-view-view-type"/> + <description value="View type names specific views, such as 'lateral' or 'AP'."/> + <type value="Coding"/> + </property> + <property> + <code value="rad-maneuver-maneuver-type"/> + <uri value="http://loinc.org/property/rad-maneuver-maneuver-type"/> + <description value="Maneuver type indicates an action taken with the goal of elucidating or testing a dynamic aspect of the anatomy."/> + <type value="Coding"/> + </property> + <property> + <code value="rad-timing"/> + <uri value="http://loinc.org/property/rad-timing"/> + <description value="The Timing/Existence property used in conjunction with pharmaceutical and maneuver properties. It specifies whether or not the imaging occurs in the presence of the administered pharmaceutical or a maneuver designed to test some dynamic aspect of anatomy or physiology ."/> + <type value="Coding"/> + </property> + <property> + <code value="rad-pharmaceutical-substance-given"/> + <uri value="http://loinc.org/property/rad-pharmaceutical-substance-given"/> + <description value="The Pharmaceutical Substance Given specifies administered contrast agents, radiopharmaceuticals, medications, or other clinically important agents and challenges during the imaging procedure."/> + <type value="Coding"/> + </property> + <property> + <code value="rad-pharmaceutical-route"/> + <uri value="http://loinc.org/property/rad-pharmaceutical-route"/> + <description value="Route specifies the route of administration of the pharmaceutical."/> + <type value="Coding"/> + </property> + <property> + <code value="rad-reason-for-exam"/> + <uri value="http://loinc.org/property/rad-reason-for-exam"/> + <description value="Reason for exam is used to describe a clinical indication or a purpose for the study."/> + <type value="Coding"/> + </property> + <property> + <code value="rad-guidance-for-presence"/> + <uri value="http://loinc.org/property/rad-guidance-for-presence"/> + <description value="Guidance for.Presence indicates when a procedure is guided by imaging."/> + <type value="Coding"/> + </property> + <property> + <code value="rad-guidance-for-approach"/> + <uri value="http://loinc.org/property/rad-guidance-for-approach"/> + <description value="Guidance for.Approach refers to the primary route of access used, such as percutaneous, transcatheter, or transhepatic."/> + <type value="Coding"/> + </property> + <property> + <code value="rad-guidance-for-action"/> + <uri value="http://loinc.org/property/rad-guidance-for-action"/> + <description value="Guidance for.Action indicates the intervention performed, such as biopsy, aspiration, or ablation."/> + <type value="Coding"/> + </property> + <property> + <code value="rad-guidance-for-object"/> + <uri value="http://loinc.org/property/rad-guidance-for-object"/> + <description value="Guidance for.Object specifies the target of the action, such as mass, abscess or cyst."/> + <type value="Coding"/> + </property> + <property> + <code value="rad-subject"/> + <uri value="http://loinc.org/property/rad-subject"/> + <description value="Subject is intended for use when there is a need to distinguish between the patient associated with an imaging study, and the target of the study."/> + <type value="Coding"/> + </property> + + <!-- + Document Ontology properties. + These apply only to terms in the LOINC Document Ontology File + Notes + Properties are specified as type "Coding", which are represented by LOINC Part codes (LP-) and their display names. + The attribute names here use FHIR styled names rather than their original LOINC style names because those contain periods. + --> + + <property> + <code value="document-kind"/> + <uri value="http://loinc.org/property/document-kind"/> + <description value="Characterizes the general structure of the document at a macro level."/> + <type value="Coding"/> + </property> + <property> + <code value="document-role"/> + <uri value="http://loinc.org/property/document-role"/> + <description value="Characterizes the training or professional level of the author of the document, but does not break down to specialty or subspecialty."/> + <type value="Coding"/> + </property> + <property> + <code value="document-setting"/> + <uri value="http://loinc.org/property/document-setting"/> + <description value="Setting is a modest extension of CMS’s coarse definition of care settings, such as outpatient, hospital, etc. Setting is not equivalent to location, which typically has more locally defined meanings."/> + <type value="Coding"/> + </property> + <property> + <code value="document-subject-matter-domain"/> + <uri value="http://loinc.org/property/document-subject-matter-domain"/> + <description value="Characterizes the clinical domain that is the subject of the document. For example, Internal Medicine, Neurology, Physical Therapy, etc."/> + <type value="Coding"/> + </property> + <property> + <code value="document-type-of-service"/> + <uri value="http://loinc.org/property/document-type-of-service"/> + <description value="Characterizes the kind of service or activity provided to/for the patient (or other subject of the service) that is described in the document."/> + <type value="Coding"/> + </property> + + <!-- Answer list related properties --> + <property> + <code value="answers-for"/> + <uri value="http://loinc.org/property/answers-for"/> + <description value="A LOINC Code for which this answer list is used."/> + <type value="Coding"/> + </property> + + <!-- Note for future consideration. These are properties of LA codes in the context of a particular list. Not global properties. + <property> + <code value="sequence"/> + <uri value="http://loinc.org/property/sequence"/> + <description value="Sequence Number of a answer in a set of answers (LA- codes only)"/> + <type value="integer"/> + </property> + <property> + <code value="score"/> + <uri value="http://loinc.org/property/score"/> + <description value="Score assigned to an answer (LA- codes only)"/> + <type value="integer"/> + </property> + --> +</CodeSystem> + + diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/AnswerFile/AnswerList.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/AnswerFile/AnswerList.csv new file mode 100644 index 00000000000..d82c5b4ad6a --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/AnswerFile/AnswerList.csv @@ -0,0 +1,12 @@ +"AnswerListId","AnswerListName" ,"AnswerListOID" ,"ExtDefinedYN","ExtDefinedAnswerListCodeSystem","ExtDefinedAnswerListLink" ,"AnswerStringId","LocalAnswerCode","LocalAnswerCodeSystem","SequenceNumber","DisplayText" ,"ExtCodeId","ExtCodeDisplayName" ,"ExtCodeSystem" ,"ExtCodeSystemVersion" ,"ExtCodeSystemCopyrightNotice" ,"SubsequentTextPrompt","Description","Score" +"LL1000-0" ,"v2.68 PhenX05_13_30D bread amt","1.3.6.1.4.1.12009.10.1.165" ,"N" , , ,"LA13825-7" ,"1" , ,1 ,"1 slice or 1 dinner roll" , , , , , , , , +"LL1000-0" ,"v2.68 PhenX05_13_30D bread amt","1.3.6.1.4.1.12009.10.1.165" ,"N" , , ,"LA13838-0" ,"2" , ,2 ,"2 slices or 2 dinner rolls" , , , , , , , , +"LL1000-0" ,"v2.68 PhenX05_13_30D bread amt","1.3.6.1.4.1.12009.10.1.165" ,"N" , , ,"LA13892-7" ,"3" , ,3 ,"More than 2 slices or 2 dinner rolls", , , , , , , , +"LL1001-8" ,"v2.68 PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA6270-8" ,"00" , ,1 ,"Never" , , , , , , , , +"LL1001-8" ,"v2.68 PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13836-4" ,"01" , ,2 ,"1-3 times per month" , , , , , , , , +"LL1001-8" ,"v2.68 PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13834-9" ,"02" , ,3 ,"1-2 times per week" , , , , , , , , +"LL1001-8" ,"v2.68 PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13853-9" ,"03" , ,4 ,"3-4 times per week" , , , , , , , , +"LL1001-8" ,"v2.68 PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13860-4" ,"04" , ,5 ,"5-6 times per week" , , , , , , , , +"LL1001-8" ,"v2.68 PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13827-3" ,"05" , ,6 ,"1 time per day" , , , , , , , , +"LL1001-8" ,"v2.68 PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA4389-8" ,"97" , ,11 ,"Refused" ,"443390004","Refused (qualifier value)","http://snomed.info/sct","http://snomed.info/sct/900000000000207008/version/20170731","This material includes SNOMED Clinical Terms® (SNOMED CT®) which is used by permission of the International Health Terminology Standards Development Organisation (IHTSDO) under license. All rights reserved. SNOMED CT® was originally created by The College", , , +"LL1892-0" ,"v2.68 ICD-9_ICD-10" ,"1.3.6.1.4.1.12009.10.1.1069","Y" , ,"http://www.cdc.gov/nchs/icd.htm", , , , , , , , , , , , , diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/AnswerFile/LoincAnswerListLink.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/AnswerFile/LoincAnswerListLink.csv new file mode 100644 index 00000000000..820602c77ad --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/AnswerFile/LoincAnswerListLink.csv @@ -0,0 +1,11 @@ +"LoincNumber","LongCommonName" ,"AnswerListId","AnswerListName" ,"AnswerListLinkType","ApplicableContext" +"61438-8" ,"Each time you ate bread, toast or dinner rolls, how much did you usually eat in the past 30 days [PhenX]","LL1000-0" ,"PhenX05_13_30D bread amt","NORMATIVE" , +"10061-0" ,"S' wave amplitude in lead I" ,"LL1311-1" ,"PhenX12_44" ,"EXAMPLE" , +"10331-7" ,"Rh [Type] in Blood" ,"LL360-9" ,"Pos|Neg" ,"EXAMPLE" , +"10389-5" ,"Blood product.other [Type]" ,"LL2413-4" ,"Othr bld prod" ,"EXAMPLE" , +"10390-3" ,"Blood product special preparation [Type]" ,"LL2422-5" ,"Blood prod treatment" ,"EXAMPLE" , +"10393-7" ,"Factor IX given [Type]" ,"LL2420-9" ,"Human/Recomb" ,"EXAMPLE" , +"10395-2" ,"Factor VIII given [Type]" ,"LL2420-9" ,"Human/Recomb" ,"EXAMPLE" , +"10401-8" ,"Immune serum globulin given [Type]" ,"LL2421-7" ,"IM/IV" ,"EXAMPLE" , +"10410-9" ,"Plasma given [Type]" ,"LL2417-5" ,"Plasma type" ,"EXAMPLE" , +"10568-4" ,"Clarity of Semen" ,"LL2427-4" ,"Clear/Opales/Milky" ,"EXAMPLE" , diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/ConsumerName/ConsumerName.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/ConsumerName/ConsumerName.csv new file mode 100644 index 00000000000..b4ec2907985 --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/ConsumerName/ConsumerName.csv @@ -0,0 +1,6 @@ +"LoincNumber","ConsumerName" +"61438-8","Consumer Name 61438-8" +,"Consumer Name X" +47239-9","" +"17787-3","Consumer Name 17787-3" +"38699-5","1,1-Dichloroethane, Air" diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/DocumentOntology/DocumentOntology.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/DocumentOntology/DocumentOntology.csv new file mode 100644 index 00000000000..f857d7f297b --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/DocumentOntology/DocumentOntology.csv @@ -0,0 +1,10 @@ +"LoincNumber","PartNumber","PartTypeName","PartSequenceOrder","PartName" +"11488-4","LP173418-7","Document.Kind","1","Note" +"11488-4","LP173110-0","Document.TypeOfService","1","Consultation" +"11488-4","LP173061-5","Document.Setting","1","{Setting}" +"11488-4","LP187187-2","Document.Role","1","{Role}" +"11490-0","LP173418-7","Document.Kind","1","Note" +"11490-0","LP173221-5","Document.TypeOfService","1","Discharge summary" +"11490-0","LP173061-5","Document.Setting","1","{Setting}" +"11490-0","LP173084-7","Document.Role","1","Physician" +"11492-6","LP173418-7","Document.Kind","1","Note" diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/GroupFile/Group.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/GroupFile/Group.csv new file mode 100644 index 00000000000..66f5561ea1c --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/GroupFile/Group.csv @@ -0,0 +1,2 @@ +"ParentGroupId","GroupId","Group","Archetype","Status","VersionFirstReleased" +"LG100-4","LG1695-8","1,4-Dichlorobenzene|MCnc|Pt|ANYBldSerPl","","Active","" diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/GroupFile/GroupLoincTerms.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/GroupFile/GroupLoincTerms.csv new file mode 100644 index 00000000000..04c19759cfb --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/GroupFile/GroupLoincTerms.csv @@ -0,0 +1,3 @@ +"Category","GroupId","Archetype","LoincNumber","LongCommonName" +"Flowsheet","LG1695-8","","17424-3","1,4-Dichlorobenzene [Mass/volume] in Blood" +"Flowsheet","LG1695-8","","13006-2","1,4-Dichlorobenzene [Mass/volume] in Serum or Plasma" diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/GroupFile/ParentGroup.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/GroupFile/ParentGroup.csv new file mode 100644 index 00000000000..734a86c43dd --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/GroupFile/ParentGroup.csv @@ -0,0 +1,2 @@ +"ParentGroupId","ParentGroup","Status" +"LG100-4","Chem_DrugTox_Chal_Sero_Allergy<SAME:Comp|Prop|Tm|Syst (except intravascular and urine)><ANYBldSerPlas,ANYUrineUrineSed><ROLLUP:Method>","ACTIVE" diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/ImagingDocuments/ImagingDocumentCodes.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/ImagingDocuments/ImagingDocumentCodes.csv new file mode 100644 index 00000000000..a26397639ff --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/ImagingDocuments/ImagingDocumentCodes.csv @@ -0,0 +1,10 @@ +"LOINC_NUM","LONG_COMMON_NAME" +"11525-3","US Pelvis Fetus for pregnancy" +"17787-3","NM Thyroid gland Study report" +"18744-3","Bronchoscopy study" +"18746-8","Colonoscopy study" +"18748-4","Diagnostic imaging study" +"18751-8","Endoscopy study" +"18753-4","Flexible sigmoidoscopy study" +"24531-6","US Retroperitoneum" +"24532-4","US Abdomen RUQ" diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/LinguisticVariants/LinguisticVariants.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/LinguisticVariants/LinguisticVariants.csv new file mode 100644 index 00000000000..c79b3197490 --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/LinguisticVariants/LinguisticVariants.csv @@ -0,0 +1,9 @@ +"ID","ISO_LANGUAGE","ISO_COUNTRY","LANGUAGE_NAME","PRODUCER" +"5","zh","CN","Chinese (CHINA)","Lin Zhang, A LOINC volunteer from China" +"7","es","AR","Spanish (ARGENTINA)","Conceptum Medical Terminology Center" +"8","fr","CA","French (CANADA)","Canada Health Infoway Inc." +,"de","AT","German (AUSTRIA)","ELGA, Austria" +"88",,"AT","German (AUSTRIA)","ELGA, Austria" +"89","de",,"German (AUSTRIA)","ELGA, Austria" +"90","de","AT",,"ELGA, Austria" +"24","de","AT","German (AUSTRIA)","ELGA, Austria" \ No newline at end of file diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/LinguisticVariants/deAT24LinguisticVariant.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/LinguisticVariants/deAT24LinguisticVariant.csv new file mode 100644 index 00000000000..c6882d47504 --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/LinguisticVariants/deAT24LinguisticVariant.csv @@ -0,0 +1,4 @@ +"LOINC_NUM","COMPONENT","PROPERTY","TIME_ASPCT","SYSTEM","SCALE_TYP","METHOD_TYP","CLASS","SHORTNAME","LONG_COMMON_NAME","RELATEDNAMES2","LinguisticVariantDisplayName" +"61438-8","Entlassungsbrief Ärztlich","Ergebnis","Zeitpunkt","{Setting}","Dokument","Dermatologie","DOC.ONTOLOGY","de shortname","de long common name","de related names 2","de linguistic variant display name" +"43730-1","","","","","","","","","","EBV-DNA qn. PCR","EBV-DNA quantitativ PCR" +"17787-3","","","","","","","","","","CoV OC43 RNA ql/SM P","Coronavirus OC43 RNA ql. /Sondermaterial PCR" diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/LinguisticVariants/frCA8LinguisticVariant.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/LinguisticVariants/frCA8LinguisticVariant.csv new file mode 100644 index 00000000000..fa09e0cb242 --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/LinguisticVariants/frCA8LinguisticVariant.csv @@ -0,0 +1,6 @@ +"LOINC_NUM","COMPONENT","PROPERTY","TIME_ASPCT","SYSTEM","SCALE_TYP","METHOD_TYP","CLASS","SHORTNAME","LONG_COMMON_NAME","RELATEDNAMES2","LinguisticVariantDisplayName" +"61438-8","Cellules de Purkinje cytoplasmique type 2 , IgG","Titre","Temps ponctuel","Sérum","Quantitatif","Immunofluorescence","Sérologie","","","","" +"11704-4","Gliale nucléaire de type 1 , IgG","Titre","Temps ponctuel","LCR","Quantitatif","Immunofluorescence","Sérologie","","","","" +,"Cellules de Purkinje cytoplasmique type 2 , IgG","Titre","Temps ponctuel","Sérum","Quantitatif",,,"","","","" +"17787-3","Virus respiratoire syncytial bovin","Présence-Seuil","Temps ponctuel","XXX","Ordinal","Culture spécifique à un microorganisme","Microbiologie","","","","" +"17788-1","Cellules de Purkinje cytoplasmique type 2 , IgG","Titre","Temps ponctuel","Sérum","Quantitatif",,,"","","","" diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/LinguisticVariants/zhCN5LinguisticVariant.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/LinguisticVariants/zhCN5LinguisticVariant.csv new file mode 100644 index 00000000000..48d07d9fdc3 --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/LinguisticVariants/zhCN5LinguisticVariant.csv @@ -0,0 +1,9 @@ +"LOINC_NUM","COMPONENT","PROPERTY","TIME_ASPCT","SYSTEM","SCALE_TYP","METHOD_TYP","CLASS","SHORTNAME","LONG_COMMON_NAME","RELATEDNAMES2","LinguisticVariantDisplayName" +"61438-8","血流速度.收缩期.最大值","速度","时间点","大脑中动脉","定量型","超声.多普勒","产科学检查与测量指标.超声","","","Cereb 动态 可用数量表示的;定量性;数值型;数量型;连续数值型标尺 大脑(Cerebral) 时刻;随机;随意;瞬间 术语""cerebral""指的是主要由中枢半球(大脑皮质和基底神经节)组成的那部分脑结构 流 流量;流速;流体 血;全血 血流量;血液流量 速度(距离/时间);速率;速率(距离/时间)","" +"11704-4","血流速度.收缩期.最大值","速度","时间点","动脉导管","定量型","超声.多普勒","产科学检查与测量指标.超声","","","动态 动脉管 可用数量表示的;定量性;数值型;数量型;连续数值型标尺 时刻;随机;随意;瞬间 流 流量;流速;流体 血;全血 血流量;血液流量 速度(距离/时间);速率;速率(距离/时间)","" +"17787-3","血流速度.收缩期.最大值","速度","时间点","二尖瓣^胎儿","定量型","超声.多普勒","产科学检查与测量指标.超声","","","僧帽瓣 动态 可用数量表示的;定量性;数值型;数量型;连续数值型标尺 时刻;随机;随意;瞬间 流 流量;流速;流体 胎;超系统 - 胎儿 血;全血 血流量;血液流量 速度(距离/时间);速率;速率(距离/时间)","" +"61438-6",,"速度","时间点","二尖瓣^胎儿","定量型","超声.多普勒","产科学检查与测量指标.超声","","","僧帽瓣 动态 可用数量表示的;定量性;数值型;数量型;连续数值型标尺 时刻;随机;随意;瞬间 流 流量;流速;流体 胎;超系统 - 胎儿 血;全血 血流量;血液流量 速度(距离/时间);速率;速率(距离/时间)","" +"10000-8","血流速度.收缩期.最大值",,"时间点","二尖瓣^胎儿","定量型","超声.多普勒","产科学检查与测量指标.超声","","","僧帽瓣 动态 可用数量表示的;定量性;数值型;数量型;连续数值型标尺 时刻;随机;随意;瞬间 流 流量;流速;流体 胎;超系统 - 胎儿 血;全血 血流量;血液流量 速度(距离/时间);速率;速率(距离/时间)","" +"17788-1","血流速度.收缩期.最大值","速度",,"大脑中动脉","定量型","超声.多普勒","产科学检查与测量指标.超声","","","Cereb 动态 可用数量表示的;定量性;数值型;数量型;连续数值型标尺 大脑(Cerebral) 时刻;随机;随意;瞬间 术语""cerebral""指的是主要由中枢半球(大脑皮质和基底神经节)组成的那部分脑结构 流 流量;流速;流体 血;全血 血流量;血液流量 速度(距离/时间);速率;速率(距离/时间)","" +"11488-4","血流速度.收缩期.最大值","速度","时间点",,"定量型","超声.多普勒","产科学检查与测量指标.超声","","","Cereb 动态 可用数量表示的;定量性;数值型;数量型;连续数值型标尺 大脑(Cerebral) 时刻;随机;随意;瞬间 术语""cerebral""指的是主要由中枢半球(大脑皮质和基底神经节)组成的那部分脑结构 流 流量;流速;流体 血;全血 血流量;血液流量 速度(距离/时间);速率;速率(距离/时间)","" +"47239-9","血流速度.收缩期.最大值","速度","时间点","大脑中动脉",,"超声.多普勒","产科学检查与测量指标.超声","","","Cereb 动态 可用数量表示的;定量性;数值型;数量型;连续数值型标尺 大脑(Cerebral) 时刻;随机;随意;瞬间 术语""cerebral""指的是主要由中枢半球(大脑皮质和基底神经节)组成的那部分脑结构 流 流量;流速;流体 血;全血 血流量;血液流量 速度(距离/时间);速率;速率(距离/时间)","" diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/LoincIeeeMedicalDeviceCodeMappingTable/LoincIeeeMedicalDeviceCodeMappingTable.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/LoincIeeeMedicalDeviceCodeMappingTable/LoincIeeeMedicalDeviceCodeMappingTable.csv new file mode 100644 index 00000000000..d8cf83cd09e --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/LoincIeeeMedicalDeviceCodeMappingTable/LoincIeeeMedicalDeviceCodeMappingTable.csv @@ -0,0 +1,10 @@ +LOINC_NUM,LOINC_LONG_COMMON_NAME,IEEE_CF_CODE10,IEEE_REFID,IEEE_DESCRIPTION,IEEE_DIM,IEEE_UOM_UCUM +11556-8,Oxygen [Partial pressure] in Blood,160116,MDC_CONC_PO2_GEN,,LMT-2L-2 LMT-2L-2,kPa mm[Hg] +11557-6,Carbon dioxide [Partial pressure] in Blood,160064,MDC_CONC_PCO2_GEN,,LMT-2L-2 LMT-2L-2,kPa mm[Hg] +11558-4,pH of Blood,160004,MDC_CONC_PH_GEN,,[pH],[pH] +12961-9,Urea nitrogen [Mass/volume] in Arterial blood,160080,MDC_CONC_UREA_ART,,ML-3 NL-3,mg/dL mmol/L +14749-6,Glucose [Moles/volume] in Serum or Plasma,160196,MDC_CONC_GLU_VENOUS_PLASMA,Plasma glucose concentration taken from venous,NL-3 ,mmol/L +14749-6,Glucose [Moles/volume] in Serum or Plasma,160368,MDC_CONC_GLU_UNDETERMINED_PLASMA,Plasma glucose concentration taken from undetermined sample source,NL-3 ,mmol/L +15074-8,Glucose [Moles/volume] in Blood,160020,MDC_CONC_GLU_GEN,,NL-3,mmol/L +15074-8,Glucose [Moles/volume] in Blood,160364,MDC_CONC_GLU_UNDETERMINED_WHOLEBLOOD,Whole blood glucose concentration taken from undetermined sample source,NL-3 ,mmol/L +17861-6,Calcium [Mass/volume] in Serum or Plasma,160024,MDC_CONC_CA_GEN,,ML-3,mg/dL diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/LoincRsnaRadiologyPlaybook/LoincRsnaRadiologyPlaybook.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/LoincRsnaRadiologyPlaybook/LoincRsnaRadiologyPlaybook.csv new file mode 100644 index 00000000000..f935aeec77b --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/LoincRsnaRadiologyPlaybook/LoincRsnaRadiologyPlaybook.csv @@ -0,0 +1,10 @@ +"LoincNumber","LongCommonName" ,"PartNumber","PartTypeName" ,"PartName" ,"PartSequenceOrder","RID" ,"PreferredName" ,"RPID" ,"LongName" +"17787-3" ,"v2.68 NM Thyroid gland Study report","LP199995-4","Rad.Anatomic Location.Region Imaged","Neck" ,"A" ,"RID7488" ,"neck" ,"" ,"" +"17787-3" ,"v2.68 NM Thyroid gland Study report","LP206648-0","Rad.Anatomic Location.Imaging Focus","Thyroid gland" ,"A" ,"RID7578" ,"thyroid gland" ,"" ,"" +"17787-3" ,"v2.68 NM Thyroid gland Study report","LP208891-4","Rad.Modality.Modality type" ,"NM" ,"A" ,"RID10330","nuclear medicine imaging","" ,"" +"24531-6" ,"v2.68 US Retroperitoneum" ,"LP207608-3","Rad.Modality.Modality type" ,"US" ,"A" ,"RID10326","Ultrasound" ,"RPID2142","US Retroperitoneum" +"24531-6" ,"v2.68 US Retroperitoneum" ,"LP199943-4","Rad.Anatomic Location.Imaging Focus","Retroperitoneum" ,"A" ,"RID431" ,"RETROPERITONEUM" ,"RPID2142","US Retroperitoneum" +"24531-6" ,"v2.68 US Retroperitoneum" ,"LP199956-6","Rad.Anatomic Location.Region Imaged","Abdomen" ,"A" ,"RID56" ,"Abdomen" ,"RPID2142","US Retroperitoneum" +"24532-4" ,"v2.68 US Abdomen RUQ" ,"LP199956-6","Rad.Anatomic Location.Region Imaged","Abdomen" ,"A" ,"RID56" ,"Abdomen" ,"" ,"" +"24532-4" ,"v2.68 US Abdomen RUQ" ,"LP207608-3","Rad.Modality.Modality type" ,"US" ,"A" ,"RID10326","Ultrasound" ,"" ,"" +"24532-4" ,"v2.68 US Abdomen RUQ" ,"LP208105-9","Rad.Anatomic Location.Imaging Focus","Right upper quadrant","A" ,"RID29994","Right upper quadrant" ,"" ,"" diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/LoincUniversalLabOrdersValueSet/LoincUniversalLabOrdersValueSet.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/LoincUniversalLabOrdersValueSet/LoincUniversalLabOrdersValueSet.csv new file mode 100644 index 00000000000..72d95485a58 --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/LoincUniversalLabOrdersValueSet/LoincUniversalLabOrdersValueSet.csv @@ -0,0 +1,10 @@ +"LOINC_NUM","LONG_COMMON_NAME","ORDER_OBS" +"42176-8","1,3 beta glucan [Mass/volume] in Serum","Both" +"53835-5","1,5-Anhydroglucitol [Mass/volume] in Serum or Plasma","Both" +"31019-3","10-Hydroxycarbazepine [Mass/volume] in Serum or Plasma","Both" +"6765-2","17-Hydroxypregnenolone [Mass/volume] in Serum or Plasma","Both" +"1668-3","17-Hydroxyprogesterone [Mass/volume] in Serum or Plasma","Both" +"32854-2","17-Hydroxyprogesterone [Presence] in DBS","Both" +"49054-0","25-Hydroxycalciferol [Mass/volume] in Serum or Plasma","Both" +"62292-8","25-Hydroxyvitamin D2+25-Hydroxyvitamin D3 [Mass/volume] in Serum or Plasma","Both" +"44907-4","5-Hydroxyindoleacetate panel - 24 hour Urine","Order" diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/MultiAxialHierarchy/MultiAxialHierarchy.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/MultiAxialHierarchy/MultiAxialHierarchy.csv new file mode 100644 index 00000000000..527b8fd5cae --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/MultiAxialHierarchy/MultiAxialHierarchy.csv @@ -0,0 +1,10 @@ +PATH_TO_ROOT,SEQUENCE,IMMEDIATE_PARENT,CODE,CODE_TEXT +,1,,LP31755-9,Microbiology +LP31755-9,1,LP31755-9,LP14559-6,Microorganism +LP31755-9.LP14559-6,1,LP14559-6,LP98185-9,Bacteria +LP31755-9.LP14559-6.LP98185-9,1,LP98185-9,LP14082-9,Bacteria +LP31755-9.LP14559-6.LP98185-9.LP14082-9,1,LP14082-9,LP52258-8,Bacteria | Body Fluid +LP31755-9.LP14559-6.LP98185-9.LP14082-9.LP52258-8,1,LP52258-8,41599-2,Bacteria Fld Ql Micro +LP31755-9.LP14559-6.LP98185-9.LP14082-9,2,LP14082-9,LP52260-4,Bacteria | Cerebral spinal fluid +LP31755-9.LP14559-6.LP98185-9.LP14082-9.LP52260-4,1,LP52260-4,41602-4,Bacteria CSF Ql Micro +LP31755-9.LP14559-6.LP98185-9.LP14082-9,3,LP14082-9,LP52960-9,Bacteria | Cervix diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/PanelsAndForms/AnswerList.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/PanelsAndForms/AnswerList.csv new file mode 100644 index 00000000000..a448cf80f2d --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/PanelsAndForms/AnswerList.csv @@ -0,0 +1,12 @@ +"AnswerListId","AnswerListName" ,"AnswerListOID" ,"ExtDefinedYN","ExtDefinedAnswerListCodeSystem","ExtDefinedAnswerListLink" ,"AnswerStringId","LocalAnswerCode","LocalAnswerCodeSystem","SequenceNumber","DisplayText" ,"ExtCodeId","ExtCodeDisplayName" ,"ExtCodeSystem" ,"ExtCodeSystemVersion" ,"ExtCodeSystemCopyrightNotice" ,"SubsequentTextPrompt","Description","Score" +"LL1000-0" ,"PhenX05_13_30D bread amt","1.3.6.1.4.1.12009.10.1.165" ,"N" , , ,"LA13825-7" ,"1" , ,1 ,"1 slice or 1 dinner roll" , , , , , , , , +"LL1000-0" ,"PhenX05_13_30D bread amt","1.3.6.1.4.1.12009.10.1.165" ,"N" , , ,"LA13838-0" ,"2" , ,2 ,"2 slices or 2 dinner rolls" , , , , , , , , +"LL1000-0" ,"PhenX05_13_30D bread amt","1.3.6.1.4.1.12009.10.1.165" ,"N" , , ,"LA13892-7" ,"3" , ,3 ,"More than 2 slices or 2 dinner rolls", , , , , , , , +"LL1001-8" ,"PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA6270-8" ,"00" , ,1 ,"Never" , , , , , , , , +"LL1001-8" ,"PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13836-4" ,"01" , ,2 ,"1-3 times per month" , , , , , , , , +"LL1001-8" ,"PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13834-9" ,"02" , ,3 ,"1-2 times per week" , , , , , , , , +"LL1001-8" ,"PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13853-9" ,"03" , ,4 ,"3-4 times per week" , , , , , , , , +"LL1001-8" ,"PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13860-4" ,"04" , ,5 ,"5-6 times per week" , , , , , , , , +"LL1001-8" ,"PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13827-3" ,"05" , ,6 ,"1 time per day" , , , , , , , , +"LL1001-8" ,"PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA4389-8" ,"97" , ,11 ,"Refused" ,"443390004","Refused (qualifier value)","http://snomed.info/sct","http://snomed.info/sct/900000000000207008/version/20170731","This material includes SNOMED Clinical Terms® (SNOMED CT®) which is used by permission of the International Health Terminology Standards Development Organisation (IHTSDO) under license. All rights reserved. SNOMED CT® was originally created by The College", , , +"LL1892-0" ,"ICD-9_ICD-10" ,"1.3.6.1.4.1.12009.10.1.1069","Y" , ,"http://www.cdc.gov/nchs/icd.htm", , , , , , , , , , , , , diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/PanelsAndForms/Loinc.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/PanelsAndForms/Loinc.csv new file mode 100644 index 00000000000..20379cb7f1d --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/PanelsAndForms/Loinc.csv @@ -0,0 +1,16 @@ +"LOINC_NUM","COMPONENT" ,"PROPERTY","TIME_ASPCT","SYSTEM" ,"SCALE_TYP","METHOD_TYP" ,"CLASS" ,"VersionLastChanged","CHNG_TYPE","DefinitionDescription" ,"STATUS","CONSUMER_NAME","CLASSTYPE","FORMULA","SPECIES","EXMPL_ANSWERS","SURVEY_QUEST_TEXT" ,"SURVEY_QUEST_SRC" ,"UNITSREQUIRED","SUBMITTED_UNITS","RELATEDNAMES2" ,"SHORTNAME" ,"ORDER_OBS" ,"CDISC_COMMON_TESTS","HL7_FIELD_SUBFIELD_ID","EXTERNAL_COPYRIGHT_NOTICE" ,"EXAMPLE_UNITS","LONG_COMMON_NAME" ,"UnitsAndRange","DOCUMENT_SECTION","EXAMPLE_UCUM_UNITS","EXAMPLE_SI_UCUM_UNITS","STATUS_REASON","STATUS_TEXT","CHANGE_REASON_PUBLIC" ,"COMMON_TEST_RANK","COMMON_ORDER_RANK","COMMON_SI_TEST_RANK","HL7_ATTACHMENT_STRUCTURE","EXTERNAL_COPYRIGHT_LINK","PanelType","AskAtOrderEntry","AssociatedObservations" ,"VersionFirstReleased","ValidHL7AttachmentRequest" +"10013-1" ,"R' wave amplitude.lead I" ,"Elpot" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"Cardiac; ECG; EKG.MEASUREMENTS; Electrical potential; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave Amp L-I; R wave Amp L-I; Random; Right; Voltage" ,"R' wave Amp L-I" ,"Observation", , , ,"mV" ,"R' wave amplitude in lead I" , , ,"mV" , , , , ,0 ,0 ,0 , , , , , , , +"10014-9" ,"R' wave amplitude.lead II" ,"Elpot" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"2; Cardiac; ECG; EKG.MEASUREMENTS; Electrical potential; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave Amp L-II; R wave Amp L-II; Random; Right; Voltage" ,"R' wave Amp L-II" ,"Observation", , , ,"mV" ,"R' wave amplitude in lead II" , , ,"mV" , , , , ,0 ,0 ,0 , , , , , , , +"10015-6" ,"R' wave amplitude.lead III" ,"Elpot" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"3; Cardiac; ECG; EKG.MEASUREMENTS; Electrical potential; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave Amp L-III; R wave Amp L-III; Random; Right; Voltage" ,"R' wave Amp L-III" ,"Observation", , , ,"mV" ,"R' wave amplitude in lead III" , , ,"mV" , , , , ,0 ,0 ,0 , , , , , , , +"10016-4" ,"R' wave amplitude.lead V1" ,"Elpot" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"Cardiac; ECG; EKG.MEASUREMENTS; Electrical potential; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave Amp L-V1; R wave Amp L-V1; Random; Right; Voltage" ,"R' wave Amp L-V1" ,"Observation", , , ,"mV" ,"R' wave amplitude in lead V1" , , ,"mV" , , , , ,0 ,0 ,0 , , , , , , , +"1001-7" ,"DBG Ab" ,"Pr" ,"Pt" ,"Ser/Plas^donor" ,"Ord" , ,"BLDBK" ,"2.44" ,"MIN" , ,"ACTIVE", ,1 , , , , , , , ,"ABS; Aby; Antby; Anti; Antibodies; Antibody; Autoantibodies; Autoantibody; BLOOD BANK; Donna Bennett-Goodspeed; Donr; Ordinal; Pl; Plasma; Plsm; Point in time; QL; Qual; Qualitative; Random; Screen; SerP; SerPl; SerPl^donor; SerPlas; Serum; Serum or plasma; SR" ,"DBG Ab SerPl Donr Ql" ,"Observation", , , , ,"DBG Ab [Presence] in Serum or Plasma from donor" , , , , , , ,"The Property has been changed from ACnc to Pr (Presence) to reflect the new model for ordinal terms where results are based on presence or absence." ,0 ,0 ,0 , , , , , , , +"10017-2" ,"R' wave amplitude.lead V2" ,"Elpot" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"Cardiac; ECG; EKG.MEASUREMENTS; Electrical potential; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave Amp L-V2; R wave Amp L-V2; Random; Right; Voltage" ,"R' wave Amp L-V2" ,"Observation", , , ,"mV" ,"R' wave amplitude in lead V2" , , ,"mV" , , , , ,0 ,0 ,0 , , , , , , , +"10018-0" ,"R' wave amplitude.lead V3" ,"Elpot" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"Cardiac; ECG; EKG.MEASUREMENTS; Electrical potential; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave Amp L-V3; R wave Amp L-V3; Random; Right; Voltage" ,"R' wave Amp L-V3" ,"Observation", , , ,"mV" ,"R' wave amplitude in lead V3" , , ,"mV" , , , , ,0 ,0 ,0 , , , , , , , +"10019-8" ,"R' wave amplitude.lead V4" ,"Elpot" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"Cardiac; ECG; EKG.MEASUREMENTS; Electrical potential; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave Amp L-V4; R wave Amp L-V4; Random; Right; Voltage" ,"R' wave Amp L-V4" ,"Observation", , , ,"mV" ,"R' wave amplitude in lead V4" , , ,"mV" , , , , ,0 ,0 ,0 , , , , , , , +"10020-6" ,"R' wave amplitude.lead V5" ,"Elpot" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"Cardiac; ECG; EKG.MEASUREMENTS; Electrical potential; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave Amp L-V5; R wave Amp L-V5; Random; Right; Voltage" ,"R' wave Amp L-V5" ,"Observation", , , ,"mV" ,"R' wave amplitude in lead V5" , , ,"mV" , , , , ,0 ,0 ,0 , , , , , , , +"61438-8" ,"Each time you ate bread, toast or dinner rolls, how much did you usually eat in the past 30D","Find" ,"Pt" ,"^Patient" ,"Ord" ,"PhenX" ,"PHENX" ,"2.44" ,"MIN" , ,"TRIAL" , ,2 , , , ,"Each time you eat bread, toast or dinner rolls, how much do you usually eat?","PhenX.050201100100","N" , ,"Finding; Findings; How much bread in 30D; Last; Ordinal; Point in time; QL; Qual; Qualitative; Random; Screen" ,"How much bread in 30D PhenX", , , , , ,"Each time you ate bread, toast or dinner rolls, how much did you usually eat in the past 30 days [PhenX]", , , , , , , ,0 ,0 ,0 , , , , , , , +"10000-8" ,"R wave duration.lead AVR" ,"Time" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"Cardiac; Durat; ECG; EKG.MEASUREMENTS; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave dur L-AVR; R wave dur L-AVR; Random; Right" ,"R wave dur L-AVR" ,"Observation", , , ,"s" ,"R wave duration in lead AVR" , , ,"s" , , , , ,0 ,0 ,0 , , , , , , , +"17787-3" ,"Study report" ,"Find" ,"Pt" ,"Neck>Thyroid gland","Doc" ,"NM" ,"RAD" ,"2.61" ,"MIN" , ,"ACTIVE", ,2 , , , , , , , ,"Document; Finding; Findings; Imaging; Point in time; Radiology; Random; Study report; Thy" ,"NM Thyroid Study report" ,"Both" , , , , ,"NM Thyroid gland Study report" , , , , , , ,"Changed System from ""Thyroid"" for conformance with the LOINC/RadLex unified model.; Method of ""Radnuc"" was changed to ""NM"". The LOINC/RadLex Committee agreed to use a subset of the two-letter DICOM modality codes as the primary modality identifier." ,0 ,0 ,0 ,"IG exists" , , , ,"81220-6;72230-6" ,"1.0l" , +"17788-1" ,"Large unstained cells/100 leukocytes" ,"NFr" ,"Pt" ,"Bld" ,"Qn" ,"Automated count","HEM/BC" ,"2.50" ,"MIN" ,"Part of auto diff output of Bayer H*3S; peroxidase negative cells too large to be classified as lymph or basophil" ,"ACTIVE", ,1 , , , , , ,"Y" ,"%" ,"100WBC; Auto; Automated detection; Blood; Cell; Cellularity; Elec; Elect; Electr; HEMATOLOGY/CELL COUNTS; Leuc; Leuk; Leukocyte; Lkcs; LUC; Number Fraction; Percent; Point in time; QNT; Quan; Quant; Quantitative; Random; WB; WBC; WBCs; White blood cell; White blood cells; Whole blood" ,"LUC/leuk NFr Bld Auto" ,"Observation", , , ,"%" ,"Large unstained cells/100 leukocytes in Blood by Automated count" , , ,"%" , , , , ,1894 ,0 ,1894 , , , , , ,"1.0l" , +"11488-4" ,"Consultation note" ,"Find" ,"Pt" ,"{Setting}" ,"Doc" ,"{Role}" ,"DOC.ONTOLOGY","2.63" ,"MIN" , ,"ACTIVE", ,2 , , , , , , , ,"Consult note; DOC.ONT; Document; Encounter; Evaluation and management; Evaluation and management note; Finding; Findings; notes; Point in time; Random; Visit note" ,"Consult note" ,"Both" , , , , ,"Consult note" , , , , , , ,"Edit made because this term is conformant to the Document Ontology axis values and therefore are being placed in this class.; Based on Clinical LOINC Committee decision during the September 2014 meeting, {Provider} was changed to {Author Type} to emphasize a greater breadth of potential document authors. At the September 2015 Clinical LOINC Committee meeting, the Committee decided to change {Author Type} to {Role} to align with the 'Role' axis name in the LOINC Document Ontology.; Because it is too difficult to maintain and because the distinction between documents and sections is not clear-cut nor necessary in most cases, the DOCUMENT_SECTION field has been deemed to have little value. The field has been set to null in the December 2017 release in preparation for removal in the December 2018 release. These changes were approved by the Clinical LOINC Committee.",0 ,0 ,0 ,"IG exists" , , , ,"81222-2;72231-4;81243-8","1.0j-a" ,"Y" +"47239-9" ,"Reason for stopping HIV Rx" ,"Type" ,"Pt" ,"^Patient" ,"Nom" ,"Reported" ,"ART" ,"2.50" ,"MIN" ,"Reason for stopping antiretroviral therapy" ,"ACTIVE", ,2 , , , , , ,"N" , ,"AIDS; Anti-retroviral therapy; ART; Human immunodeficiency virus; Nominal; Point in time; Random; Treatment; Typ" ,"Reason for stopping HIV Rx" ,"Observation", , ,"Copyright © 2006 World Health Organization. Used with permission. Publications of the World Health Organization can be obtained from WHO Press, World Health Organization, 20 Avenue Appia, 1211 Geneva 27, Switzerland (tel: +41 22 791 2476; fax: +41 22 791 4857; email: bookorders@who.int). Requests for permission to reproduce or translate WHO publications – whether for sale or for noncommercial distribution – should be addressed to WHO Press, at the above address (fax: +41 22 791 4806; email: permissions@who.int). The designations employed and the presentation of the material in this publication do not imply the expression of any opinion whatsoever on the part of the World Health Organization concerning the legal status of any country, territory, city or area or of its authorities, or concerning the delimitation of its frontiers or boundaries. Dotted lines on maps represent approximate border lines for which there may not yet be full agreement. The mention of specific companies or of certain manufacturers’ products does not imply that they are endorsed or recommended by the World Health Organization in preference to others of a similar nature that are not mentioned. Errors and omissions excepted, the names of proprietary products are distinguished by initial capital letters. All reasonable precautions have been taken by WHO to verify the information contained in this publication. However, the published material is being distributed without warranty of any kind, either express or implied. The responsibility for the interpretation and use of the material lies with the reader. In no event shall the World Health Organization be liable for damages arising from its use.", ,"Reason for stopping HIV treatment" , , , , , , , ,0 ,0 ,0 , ,"WHO_HIV" , , , ,"2.22" , diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/PanelsAndForms/LoincAnswerListLink.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/PanelsAndForms/LoincAnswerListLink.csv new file mode 100644 index 00000000000..820602c77ad --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/PanelsAndForms/LoincAnswerListLink.csv @@ -0,0 +1,11 @@ +"LoincNumber","LongCommonName" ,"AnswerListId","AnswerListName" ,"AnswerListLinkType","ApplicableContext" +"61438-8" ,"Each time you ate bread, toast or dinner rolls, how much did you usually eat in the past 30 days [PhenX]","LL1000-0" ,"PhenX05_13_30D bread amt","NORMATIVE" , +"10061-0" ,"S' wave amplitude in lead I" ,"LL1311-1" ,"PhenX12_44" ,"EXAMPLE" , +"10331-7" ,"Rh [Type] in Blood" ,"LL360-9" ,"Pos|Neg" ,"EXAMPLE" , +"10389-5" ,"Blood product.other [Type]" ,"LL2413-4" ,"Othr bld prod" ,"EXAMPLE" , +"10390-3" ,"Blood product special preparation [Type]" ,"LL2422-5" ,"Blood prod treatment" ,"EXAMPLE" , +"10393-7" ,"Factor IX given [Type]" ,"LL2420-9" ,"Human/Recomb" ,"EXAMPLE" , +"10395-2" ,"Factor VIII given [Type]" ,"LL2420-9" ,"Human/Recomb" ,"EXAMPLE" , +"10401-8" ,"Immune serum globulin given [Type]" ,"LL2421-7" ,"IM/IV" ,"EXAMPLE" , +"10410-9" ,"Plasma given [Type]" ,"LL2417-5" ,"Plasma type" ,"EXAMPLE" , +"10568-4" ,"Clarity of Semen" ,"LL2427-4" ,"Clear/Opales/Milky" ,"EXAMPLE" , diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/PartFile/LoincPartLink.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/PartFile/LoincPartLink.csv new file mode 100644 index 00000000000..36c84f3fe95 --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/PartFile/LoincPartLink.csv @@ -0,0 +1,10 @@ +"LoincNumber","LongCommonName","PartNumber","PartName","PartCodeSystem","PartTypeName","LinkTypeName","Property" +"10013-1","R' wave amplitude in lead I","LP31101-6","R' wave amplitude.lead I","http://loinc.org","COMPONENT","Primary","http://loinc.org/property/COMPONENT" +"10013-1","R' wave amplitude in lead I","LP6802-5","Elpot","http://loinc.org","PROPERTY","Primary","http://loinc.org/property/PROPERTY" +"10013-1","R' wave amplitude in lead I","LP6960-1","Pt","http://loinc.org","TIME","Primary","http://loinc.org/property/TIME_ASPCT" +"10013-1","R' wave amplitude in lead I","LP7289-4","Heart","http://loinc.org","SYSTEM","Primary","http://loinc.org/property/SYSTEM" +"10013-1","R' wave amplitude in lead I","LP7753-9","Qn","http://loinc.org","SCALE","Primary","http://loinc.org/property/SCALE_TYP" +"10013-1","R' wave amplitude in lead I","LP6244-0","EKG","http://loinc.org","METHOD","Primary","http://loinc.org/property/METHOD_TYP" +"10013-1","R' wave amplitude in lead I","LP31101-6","R' wave amplitude.lead I","http://loinc.org","COMPONENT","DetailedModel","http://loinc.org/property/analyte" +"10013-1","R' wave amplitude in lead I","LP6802-5","Elpot","http://loinc.org","PROPERTY","DetailedModel","http://loinc.org/property/PROPERTY" +"10013-1","R' wave amplitude in lead I","LP6960-1","Pt","http://loinc.org","TIME","DetailedModel","http://loinc.org/property/time-core" diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/PartFile/LoincPartLink_Primary.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/PartFile/LoincPartLink_Primary.csv new file mode 100644 index 00000000000..8dbe575ffd2 --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/PartFile/LoincPartLink_Primary.csv @@ -0,0 +1,7 @@ +"LoincNumber","LongCommonName" ,"PartNumber","PartName" ,"PartCodeSystem" ,"PartTypeName","LinkTypeName","Property" +"10013-1" ,"R' wave amplitude in lead I","LP31101-6" ,"R' wave amplitude.lead I","http://loinc.org","COMPONENT" ,"Primary" ,"http://loinc.org/property/COMPONENT" +"10013-1" ,"R' wave amplitude in lead I","LP6802-5" ,"Elpot" ,"http://loinc.org","PROPERTY" ,"Primary" ,"http://loinc.org/property/PROPERTY" +"10013-1" ,"R' wave amplitude in lead I","LP6960-1" ,"Pt" ,"http://loinc.org","TIME" ,"Primary" ,"http://loinc.org/property/TIME_ASPCT" +"10013-1" ,"R' wave amplitude in lead I","LP7289-4" ,"Heart" ,"http://loinc.org","SYSTEM" ,"Primary" ,"http://loinc.org/property/SYSTEM" +"10013-1" ,"R' wave amplitude in lead I","LP7753-9" ,"Qn" ,"http://loinc.org","SCALE" ,"Primary" ,"http://loinc.org/property/SCALE_TYP" +"10013-1" ,"R' wave amplitude in lead I","LP6244-0" ,"EKG" ,"http://loinc.org","METHOD" ,"Primary" ,"http://loinc.org/property/METHOD_TYP" diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/PartFile/LoincPartLink_Supplementary.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/PartFile/LoincPartLink_Supplementary.csv new file mode 100644 index 00000000000..869c2c1651d --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/PartFile/LoincPartLink_Supplementary.csv @@ -0,0 +1,13 @@ +"LoincNumber","LongCommonName" ,"PartNumber","PartName" ,"PartCodeSystem" ,"PartTypeName","LinkTypeName" ,"Property" +"10013-1" ,"R' wave amplitude in lead I","LP31101-6" ,"R' wave amplitude.lead I","http://loinc.org","COMPONENT" ,"DetailedModel" ,"http://loinc.org/property/analyte" +"10013-1" ,"R' wave amplitude in lead I","LP6802-5" ,"Elpot" ,"http://loinc.org","PROPERTY" ,"DetailedModel" ,"http://loinc.org/property/PROPERTY" +"10013-1" ,"R' wave amplitude in lead I","LP6960-1" ,"Pt" ,"http://loinc.org","TIME" ,"DetailedModel" ,"http://loinc.org/property/time-core" +"10013-1" ,"R' wave amplitude in lead I","LP7289-4" ,"Heart" ,"http://loinc.org","SYSTEM" ,"DetailedModel" ,"http://loinc.org/property/system-core" +"10013-1" ,"R' wave amplitude in lead I","LP7753-9" ,"Qn" ,"http://loinc.org","SCALE" ,"DetailedModel" ,"http://loinc.org/property/SCALE_TYP" +"10013-1" ,"R' wave amplitude in lead I","LP6244-0" ,"EKG" ,"http://loinc.org","METHOD" ,"DetailedModel" ,"http://loinc.org/property/METHOD_TYP" +"10013-1" ,"R' wave amplitude in lead I","LP31101-6" ,"R' wave amplitude.lead I","http://loinc.org","COMPONENT" ,"SyntaxEnhancement","http://loinc.org/property/analyte-core" +"10013-1" ,"R' wave amplitude in lead I","LP190563-9","Cardiology" ,"http://loinc.org","CLASS" ,"Metadata" ,"http://loinc.org/property/category" +"10013-1" ,"R' wave amplitude in lead I","LP29708-2" ,"Cardiology" ,"http://loinc.org","CLASS" ,"Metadata" ,"http://loinc.org/property/category" +"10013-1" ,"R' wave amplitude in lead I","LP7787-7" ,"Clinical" ,"http://loinc.org","CLASS" ,"Metadata" ,"http://loinc.org/property/category" +"10013-1" ,"R' wave amplitude in lead I","LP7795-0" ,"EKG measurements" ,"http://loinc.org","CLASS" ,"Metadata" ,"http://loinc.org/property/category" +"10013-1" ,"R' wave amplitude in lead I","LP7795-0" ,"EKG.MEAS" ,"http://loinc.org","CLASS" ,"Metadata" ,"http://loinc.org/property/CLASS" diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/PartFile/Part.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/PartFile/Part.csv new file mode 100644 index 00000000000..d5816ead286 --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/PartFile/Part.csv @@ -0,0 +1,46 @@ +"PartNumber","PartTypeName","PartName","PartDisplayName","Status" +"LP101394-7","ADJUSTMENT","adjusted for maternal weight","adjusted for maternal weight","ACTIVE" +"LP101907-6","ADJUSTMENT","corrected for age","corrected for age","ACTIVE" +"LP115711-6","ADJUSTMENT","corrected for background","corrected for background","ACTIVE" +"LP147359-6","ADJUSTMENT","adjusted for body weight","adjusted for body weight","ACTIVE" +"LP173482-3","ADJUSTMENT","1st specimen","1st specimen","DEPRECATED" +"LP173483-1","ADJUSTMENT","post cyanocobalamin",,"ACTIVE" +"LP173484-9","ADJUSTMENT","W hyperextension)",,"ACTIVE" +"LP6244-0","METHOD","EKG","Electrocardiogram (EKG)","ACTIVE" +"LP18172-4","COMPONENT","Interferon.beta","Interferon beta","ACTIVE" +"LP7289-4","SYSTEM","Heart","Heart","ACTIVE" +"LP6960-1","TIME","Pt","Point in time (spot)","ACTIVE" +"LP6802-5","PROPERTY","Elpot","Electrical Potential (Voltage)","ACTIVE" +"LP7753-9","SCALE","Qn","Qn","ACTIVE" +"LP31101-6","COMPONENT","R' wave amplitude.lead I","R' wave amplitude.lead I","ACTIVE" +"LP31102-4","COMPONENT","R' wave amplitude.lead II","R' wave amplitude.lead II","ACTIVE" +"LP31103-2","COMPONENT","R' wave amplitude.lead III","R' wave amplitude.lead III","ACTIVE" +"LP31104-0","COMPONENT","R' wave amplitude.lead V1","R' wave amplitude.lead V1","ACTIVE" +"LP31105-7","COMPONENT","R' wave amplitude.lead V2","R' wave amplitude.lead V2","ACTIVE" +"LP31106-5","COMPONENT","R' wave amplitude.lead V3","R' wave amplitude.lead V3","ACTIVE" +"LP31107-3","COMPONENT","R' wave amplitude.lead V4","R' wave amplitude.lead V4","ACTIVE" +"LP31108-1","COMPONENT","R' wave amplitude.lead V5","R' wave amplitude.lead V5","ACTIVE" +"LP31109-9","COMPONENT","R' wave amplitude.lead V6","R' wave amplitude.lead V6","ACTIVE" +"LP31110-7","COMPONENT","R' wave duration.lead AVF","R' wave duration.lead AVF","ACTIVE" +"LP30269-2","SYSTEM","Ser/Plas^donor",,"ACTIVE" +"LP149220-8","PROPERTY","Pr","Presence","ACTIVE" +"LP7751-3","SCALE","Ord","Ord","ACTIVE" +"LP37904-7","COMPONENT","DBG Ab","DBG Ab","ACTIVE" +"LP6813-2","PROPERTY","Find","Finding","ACTIVE" +"LP95333-8","METHOD","PhenX","PhenX","ACTIVE" +"LP102627-9","COMPONENT","Each time you ate bread, toast or dinner rolls, how much did you usually eat in the past 30D","Each time you ate bread, toast or dinner rolls, how much did you usually eat in the past 30 days","ACTIVE" +"LP6879-3","PROPERTY","Time","Time (e.g. seconds)","ACTIVE" +"LP31088-5","COMPONENT","R wave duration.lead AVR","R wave duration.lead AVR","ACTIVE" +"LP206647-2","SYSTEM","Neck>Thyroid gland","Thyroid gland","ACTIVE" +"LP208655-3","METHOD","NM","NM","ACTIVE" +"LP32888-7","SCALE","Doc","Doc","ACTIVE" +"LP31534-8","COMPONENT","Study report","Study report","ACTIVE" +"LP7057-5","SYSTEM","Bld","Blood","ACTIVE" +"LP6838-9","PROPERTY","NFr","Number Fraction","ACTIVE" +"LP6141-8","METHOD","Automated count","Automated count","ACTIVE" +"LP15842-5","COMPONENT","Pyridoxine","Pyridoxine","ACTIVE" +"LP19258-0","COMPONENT","Large unstained cells","Large unstained cells","ACTIVE" +"LP32887-9","SYSTEM","{Setting}","{Setting}","ACTIVE" +"LP187178-1","METHOD","{Role}","Role-unspecified","ACTIVE" +"LP72311-1","COMPONENT","Consultation note","Consultation note","ACTIVE" + diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/PartFile/PartRelatedCodeMapping.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/PartFile/PartRelatedCodeMapping.csv new file mode 100644 index 00000000000..495416894ce --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/PartFile/PartRelatedCodeMapping.csv @@ -0,0 +1,12 @@ +"PartNumber","PartName" ,"PartTypeName","ExtCodeId" ,"ExtCodeDisplayName" ,"ExtCodeSystem" ,"Equivalence","ContentOrigin","ExtCodeSystemVersion" ,"ExtCodeSystemCopyrightNotice" +"LP18172-4" ,"Interferon.beta" ,"COMPONENT" ," 420710006","Interferon beta (substance)" ,"http://snomed.info/sct" ,"equivalent" ,"Both" ,"http://snomed.info/sct/900000000000207008/version/20170731","This material includes SNOMED Clinical Terms® (SNOMED CT®) which is used by permission of the International Health Terminology Standards Development Organisation (IHTSDO) under license. All rights reserved. SNOMED CT® was originally created by The College of American Pathologists. “SNOMED” and “SNOMED CT” are registered trademarks of the IHTSDO.This material includes content from the US Edition to SNOMED CT, which is developed and maintained by the U.S. National Library of Medicine and is available to authorized UMLS Metathesaurus Licensees from the UTS Downloads site at https://uts.nlm.nih.gov.Use of SNOMED CT content is subject to the terms and conditions set forth in the SNOMED CT Affiliate License Agreement. It is the responsibility of those implementing this product to ensure they are appropriately licensed and for more information on the license, including how to register as an Affiliate Licensee, please refer to http://www.snomed.org/snomed-ct/get-snomed-ct or info@snomed.org<mailto:info@snomed.org>. This may incur a fee in SNOMED International non-Member countries." +"LP31706-2" ,"Nornicotine" ,"COMPONENT" ,"1018001" ,"Nornicotine (substance)" ,"http://snomed.info/sct" ,"equivalent" ,"Both" ,"http://snomed.info/sct/900000000000207008/version/20170731","This material includes SNOMED Clinical Terms® (SNOMED CT®) which is used by permission of the International Health Terminology Standards Development Organisation (IHTSDO) under license. All rights reserved. SNOMED CT® was originally created by The College of American Pathologists. “SNOMED” and “SNOMED CT” are registered trademarks of the IHTSDO.This material includes content from the US Edition to SNOMED CT, which is developed and maintained by the U.S. National Library of Medicine and is available to authorized UMLS Metathesaurus Licensees from the UTS Downloads site at https://uts.nlm.nih.gov.Use of SNOMED CT content is subject to the terms and conditions set forth in the SNOMED CT Affiliate License Agreement. It is the responsibility of those implementing this product to ensure they are appropriately licensed and for more information on the license, including how to register as an Affiliate Licensee, please refer to http://www.snomed.org/snomed-ct/get-snomed-ct or info@snomed.org<mailto:info@snomed.org>. This may incur a fee in SNOMED International non-Member countries." +"LP15826-8" ,"Prostaglandin F2","COMPONENT" ,"10192006" ,"Prostaglandin PGF2 (substance)" ,"http://snomed.info/sct" ,"equivalent" ,"Both" ,"http://snomed.info/sct/900000000000207008/version/20170731","This material includes SNOMED Clinical Terms® (SNOMED CT®) which is used by permission of the International Health Terminology Standards Development Organisation (IHTSDO) under license. All rights reserved. SNOMED CT® was originally created by The College of American Pathologists. “SNOMED” and “SNOMED CT” are registered trademarks of the IHTSDO.This material includes content from the US Edition to SNOMED CT, which is developed and maintained by the U.S. National Library of Medicine and is available to authorized UMLS Metathesaurus Licensees from the UTS Downloads site at https://uts.nlm.nih.gov.Use of SNOMED CT content is subject to the terms and conditions set forth in the SNOMED CT Affiliate License Agreement. It is the responsibility of those implementing this product to ensure they are appropriately licensed and for more information on the license, including how to register as an Affiliate Licensee, please refer to http://www.snomed.org/snomed-ct/get-snomed-ct or info@snomed.org<mailto:info@snomed.org>. This may incur a fee in SNOMED International non-Member countries." +"LP7400-7" ,"Liver" ,"SYSTEM" ,"10200004" ,"Liver structure (body structure)","http://snomed.info/sct" ,"wider" ,"Both" ,"http://snomed.info/sct/900000000000207008/version/20170731","This material includes SNOMED Clinical Terms® (SNOMED CT®) which is used by permission of the International Health Terminology Standards Development Organisation (IHTSDO) under license. All rights reserved. SNOMED CT® was originally created by The College of American Pathologists. “SNOMED” and “SNOMED CT” are registered trademarks of the IHTSDO.This material includes content from the US Edition to SNOMED CT, which is developed and maintained by the U.S. National Library of Medicine and is available to authorized UMLS Metathesaurus Licensees from the UTS Downloads site at https://uts.nlm.nih.gov.Use of SNOMED CT content is subject to the terms and conditions set forth in the SNOMED CT Affiliate License Agreement. It is the responsibility of those implementing this product to ensure they are appropriately licensed and for more information on the license, including how to register as an Affiliate Licensee, please refer to http://www.snomed.org/snomed-ct/get-snomed-ct or info@snomed.org<mailto:info@snomed.org>. This may incur a fee in SNOMED International non-Member countries." +"LP29165-5" ,"Liver.FNA" ,"SYSTEM" ,"10200004" ,"Liver structure (body structure)","http://snomed.info/sct" ,"narrower" ,"Both" ,"http://snomed.info/sct/900000000000207008/version/20170731","This material includes SNOMED Clinical Terms® (SNOMED CT®) which is used by permission of the International Health Terminology Standards Development Organisation (IHTSDO) under license. All rights reserved. SNOMED CT® was originally created by The College of American Pathologists. “SNOMED” and “SNOMED CT” are registered trademarks of the IHTSDO.This material includes content from the US Edition to SNOMED CT, which is developed and maintained by the U.S. National Library of Medicine and is available to authorized UMLS Metathesaurus Licensees from the UTS Downloads site at https://uts.nlm.nih.gov.Use of SNOMED CT content is subject to the terms and conditions set forth in the SNOMED CT Affiliate License Agreement. It is the responsibility of those implementing this product to ensure they are appropriately licensed and for more information on the license, including how to register as an Affiliate Licensee, please refer to http://www.snomed.org/snomed-ct/get-snomed-ct or info@snomed.org<mailto:info@snomed.org>. This may incur a fee in SNOMED International non-Member countries." +"LP15666-8" ,"Inosine" ,"COMPONENT" ,"102640000" ,"Inosine (substance)" ,"http://snomed.info/sct" ,"equivalent" ,"Both" ,"http://snomed.info/sct/900000000000207008/version/20170731","This material includes SNOMED Clinical Terms® (SNOMED CT®) which is used by permission of the International Health Terminology Standards Development Organisation (IHTSDO) under license. All rights reserved. SNOMED CT® was originally created by The College of American Pathologists. “SNOMED” and “SNOMED CT” are registered trademarks of the IHTSDO.This material includes content from the US Edition to SNOMED CT, which is developed and maintained by the U.S. National Library of Medicine and is available to authorized UMLS Metathesaurus Licensees from the UTS Downloads site at https://uts.nlm.nih.gov.Use of SNOMED CT content is subject to the terms and conditions set forth in the SNOMED CT Affiliate License Agreement. It is the responsibility of those implementing this product to ensure they are appropriately licensed and for more information on the license, including how to register as an Affiliate Licensee, please refer to http://www.snomed.org/snomed-ct/get-snomed-ct or info@snomed.org<mailto:info@snomed.org>. This may incur a fee in SNOMED International non-Member countries." +"LP15943-1" ,"Uronate" ,"COMPONENT" ,"102641001" ,"Uronic acid (substance)" ,"http://snomed.info/sct" ,"equivalent" ,"Both" ,"http://snomed.info/sct/900000000000207008/version/20170731","This material includes SNOMED Clinical Terms® (SNOMED CT®) which is used by permission of the International Health Terminology Standards Development Organisation (IHTSDO) under license. All rights reserved. SNOMED CT® was originally created by The College of American Pathologists. “SNOMED” and “SNOMED CT” are registered trademarks of the IHTSDO.This material includes content from the US Edition to SNOMED CT, which is developed and maintained by the U.S. National Library of Medicine and is available to authorized UMLS Metathesaurus Licensees from the UTS Downloads site at https://uts.nlm.nih.gov.Use of SNOMED CT content is subject to the terms and conditions set forth in the SNOMED CT Affiliate License Agreement. It is the responsibility of those implementing this product to ensure they are appropriately licensed and for more information on the license, including how to register as an Affiliate Licensee, please refer to http://www.snomed.org/snomed-ct/get-snomed-ct or info@snomed.org<mailto:info@snomed.org>. This may incur a fee in SNOMED International non-Member countries." +"LP15791-4" ,"Phenylketones" ,"COMPONENT" ,"102642008" ,"Phenylketones (substance)" ,"http://snomed.info/sct" ,"equivalent" ,"Both" ,"http://snomed.info/sct/900000000000207008/version/20170731","This material includes SNOMED Clinical Terms® (SNOMED CT®) which is used by permission of the International Health Terminology Standards Development Organisation (IHTSDO) under license. All rights reserved. SNOMED CT® was originally created by The College of American Pathologists. “SNOMED” and “SNOMED CT” are registered trademarks of the IHTSDO.This material includes content from the US Edition to SNOMED CT, which is developed and maintained by the U.S. National Library of Medicine and is available to authorized UMLS Metathesaurus Licensees from the UTS Downloads site at https://uts.nlm.nih.gov.Use of SNOMED CT content is subject to the terms and conditions set forth in the SNOMED CT Affiliate License Agreement. It is the responsibility of those implementing this product to ensure they are appropriately licensed and for more information on the license, including how to register as an Affiliate Licensee, please refer to http://www.snomed.org/snomed-ct/get-snomed-ct or info@snomed.org<mailto:info@snomed.org>. This may incur a fee in SNOMED International non-Member countries." +"LP15721-1" ,"Malonate" ,"COMPONENT" ,"102648007" ,"Malonic acid (substance)" ,"http://snomed.info/sct" ,"equivalent" ,"Both" ,"http://snomed.info/sct/900000000000207008/version/20170731","This material includes SNOMED Clinical Terms® (SNOMED CT®) which is used by permission of the International Health Terminology Standards Development Organisation (IHTSDO) under license. All rights reserved. SNOMED CT® was originally created by The College of American Pathologists. “SNOMED” and “SNOMED CT” are registered trademarks of the IHTSDO.This material includes content from the US Edition to SNOMED CT, which is developed and maintained by the U.S. National Library of Medicine and is available to authorized UMLS Metathesaurus Licensees from the UTS Downloads site at https://uts.nlm.nih.gov.Use of SNOMED CT content is subject to the terms and conditions set forth in the SNOMED CT Affiliate License Agreement. It is the responsibility of those implementing this product to ensure they are appropriately licensed and for more information on the license, including how to register as an Affiliate Licensee, please refer to http://www.snomed.org/snomed-ct/get-snomed-ct or info@snomed.org<mailto:info@snomed.org>. This may incur a fee in SNOMED International non-Member countries." +"LP15842-5" ,"Pyridoxine" ,"COMPONENT" ,"1054" ,"Pyridoxine" ,"http://pubchem.ncbi.nlm.nih.gov","equivalent" , , , +"LP15842-5" ,"Pyridoxine" ,"COMPONENT" ,"1054" ,"Pyridoxine" ,"http://foo/bar" ,"equivalent" , , , diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/Top2000Results/SI/Top2000CommonLabResultsSi.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/Top2000Results/SI/Top2000CommonLabResultsSi.csv new file mode 100644 index 00000000000..1e9b3872892 --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/Top2000Results/SI/Top2000CommonLabResultsSi.csv @@ -0,0 +1,10 @@ +LOINC #,Long Common Name,Short Name,CLASS,Rank +14682-9,Creatinine [Moles/volume] in Serum or Plasma,Creat SerPl-mCnc,Chem,1 +718-7,Hemoglobin [Mass/volume] in Blood,Hgb Bld-mCnc,HEM/BC,2 +2823-3,Potassium [Moles/volume] in Serum or Plasma,Potassium SerPl-sCnc,Chem,3 +14749-6,Glucose [Moles/volume] in Serum or Plasma,Glucose SerPl-mCnc,Chem,4 +2951-2,Sodium [Moles/volume] in Serum or Plasma,Sodium SerPl-sCnc,Chem,5 +3094-0,Urea nitrogen [Mass/volume] in Serum or Plasma,BUN SerPl-mCnc,Chem,6 +2028-9,"Carbon dioxide, total [Moles/volume] in Serum or Plasma",CO2 SerPl-sCnc,Chem,7 +2075-0,Chloride [Moles/volume] in Serum or Plasma,Chloride SerPl-sCnc,Chem,8 +789-8,Erythrocytes [#/volume] in Blood by Automated count,RBC # Bld Auto,HEM/BC,9 diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/Top2000Results/US/Top2000CommonLabResultsUs.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/Top2000Results/US/Top2000CommonLabResultsUs.csv new file mode 100644 index 00000000000..c80db052dd3 --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/Top2000Results/US/Top2000CommonLabResultsUs.csv @@ -0,0 +1,10 @@ +LOINC #,Long Common Name,Short Name,CLASS,Rank +2160-0,Creatinine [Mass/volume] in Serum or Plasma,Creat SerPl-mCnc,Chem,1 +718-7,Hemoglobin [Mass/volume] in Blood,Hgb Bld-mCnc,HEM/BC,2 +2823-3,Potassium [Moles/volume] in Serum or Plasma,Potassium SerPl-sCnc,Chem,3 +2345-7,Glucose [Mass/volume] in Serum or Plasma,Glucose SerPl-mCnc,Chem,4 +2951-2,Sodium [Moles/volume] in Serum or Plasma,Sodium SerPl-sCnc,Chem,5 +3094-0,Urea nitrogen [Mass/volume] in Serum or Plasma,BUN SerPl-mCnc,Chem,6 +2028-9,"Carbon dioxide, total [Moles/volume] in Serum or Plasma",CO2 SerPl-sCnc,Chem,7 +2075-0,Chloride [Moles/volume] in Serum or Plasma,Chloride SerPl-sCnc,Chem,8 +789-8,Erythrocytes [#/volume] in Blood by Automated count,RBC # Bld Auto,HEM/BC,9 diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/LoincTable/Loinc.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/LoincTable/Loinc.csv new file mode 100644 index 00000000000..8f43cfb4941 --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/LoincTable/Loinc.csv @@ -0,0 +1,16 @@ +"LOINC_NUM","COMPONENT" ,"PROPERTY","TIME_ASPCT","SYSTEM" ,"SCALE_TYP","METHOD_TYP" ,"CLASS" ,"VersionLastChanged","CHNG_TYPE","DefinitionDescription" ,"STATUS","CONSUMER_NAME","CLASSTYPE","FORMULA","SPECIES","EXMPL_ANSWERS","SURVEY_QUEST_TEXT" ,"SURVEY_QUEST_SRC" ,"UNITSREQUIRED","SUBMITTED_UNITS","RELATEDNAMES2" ,"SHORTNAME" ,"ORDER_OBS" ,"CDISC_COMMON_TESTS","HL7_FIELD_SUBFIELD_ID","EXTERNAL_COPYRIGHT_NOTICE" ,"EXAMPLE_UNITS","LONG_COMMON_NAME" ,"UnitsAndRange","DOCUMENT_SECTION","EXAMPLE_UCUM_UNITS","EXAMPLE_SI_UCUM_UNITS","STATUS_REASON","STATUS_TEXT","CHANGE_REASON_PUBLIC" ,"COMMON_TEST_RANK","COMMON_ORDER_RANK","COMMON_SI_TEST_RANK","HL7_ATTACHMENT_STRUCTURE","EXTERNAL_COPYRIGHT_LINK","PanelType","AskAtOrderEntry","AssociatedObservations" ,"VersionFirstReleased","ValidHL7AttachmentRequest" +"10013-1" ,"v2.68 R' wave amplitude.lead I" ,"Elpot" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"Cardiac; ECG; EKG.MEASUREMENTS; Electrical potential; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave Amp L-I; R wave Amp L-I; Random; Right; Voltage" ,"R' wave Amp L-I" ,"Observation", , , ,"mV" ,"R' wave amplitude in lead I" , , ,"mV" , , , , ,0 ,0 ,0 , , , , , , , +"10014-9" ,"v2.68 R' wave amplitude.lead II" ,"Elpot" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"2; Cardiac; ECG; EKG.MEASUREMENTS; Electrical potential; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave Amp L-II; R wave Amp L-II; Random; Right; Voltage" ,"R' wave Amp L-II" ,"Observation", , , ,"mV" ,"R' wave amplitude in lead II" , , ,"mV" , , , , ,0 ,0 ,0 , , , , , , , +"10015-6" ,"v2.68 R' wave amplitude.lead III" ,"Elpot" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"3; Cardiac; ECG; EKG.MEASUREMENTS; Electrical potential; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave Amp L-III; R wave Amp L-III; Random; Right; Voltage" ,"R' wave Amp L-III" ,"Observation", , , ,"mV" ,"R' wave amplitude in lead III" , , ,"mV" , , , , ,0 ,0 ,0 , , , , , , , +"10016-4" ,"v2.68 R' wave amplitude.lead V1" ,"Elpot" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"Cardiac; ECG; EKG.MEASUREMENTS; Electrical potential; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave Amp L-V1; R wave Amp L-V1; Random; Right; Voltage" ,"R' wave Amp L-V1" ,"Observation", , , ,"mV" ,"R' wave amplitude in lead V1" , , ,"mV" , , , , ,0 ,0 ,0 , , , , , , , +"1001-7" ,"v2.68 DBG Ab" ,"Pr" ,"Pt" ,"Ser/Plas^donor" ,"Ord" , ,"BLDBK" ,"2.44" ,"MIN" , ,"ACTIVE", ,1 , , , , , , , ,"ABS; Aby; Antby; Anti; Antibodies; Antibody; Autoantibodies; Autoantibody; BLOOD BANK; Donna Bennett-Goodspeed; Donr; Ordinal; Pl; Plasma; Plsm; Point in time; QL; Qual; Qualitative; Random; Screen; SerP; SerPl; SerPl^donor; SerPlas; Serum; Serum or plasma; SR" ,"DBG Ab SerPl Donr Ql" ,"Observation", , , , ,"DBG Ab [Presence] in Serum or Plasma from donor" , , , , , , ,"The Property has been changed from ACnc to Pr (Presence) to reflect the new model for ordinal terms where results are based on presence or absence." ,0 ,0 ,0 , , , , , , , +"10017-2" ,"v2.68 R' wave amplitude.lead V2" ,"Elpot" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"Cardiac; ECG; EKG.MEASUREMENTS; Electrical potential; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave Amp L-V2; R wave Amp L-V2; Random; Right; Voltage" ,"R' wave Amp L-V2" ,"Observation", , , ,"mV" ,"R' wave amplitude in lead V2" , , ,"mV" , , , , ,0 ,0 ,0 , , , , , , , +"10018-0" ,"v2.68 R' wave amplitude.lead V3" ,"Elpot" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"Cardiac; ECG; EKG.MEASUREMENTS; Electrical potential; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave Amp L-V3; R wave Amp L-V3; Random; Right; Voltage" ,"R' wave Amp L-V3" ,"Observation", , , ,"mV" ,"R' wave amplitude in lead V3" , , ,"mV" , , , , ,0 ,0 ,0 , , , , , , , +"10019-8" ,"v2.68 R' wave amplitude.lead V4" ,"Elpot" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"Cardiac; ECG; EKG.MEASUREMENTS; Electrical potential; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave Amp L-V4; R wave Amp L-V4; Random; Right; Voltage" ,"R' wave Amp L-V4" ,"Observation", , , ,"mV" ,"R' wave amplitude in lead V4" , , ,"mV" , , , , ,0 ,0 ,0 , , , , , , , +"10020-6" ,"v2.68 R' wave amplitude.lead V5" ,"Elpot" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"Cardiac; ECG; EKG.MEASUREMENTS; Electrical potential; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave Amp L-V5; R wave Amp L-V5; Random; Right; Voltage" ,"R' wave Amp L-V5" ,"Observation", , , ,"mV" ,"R' wave amplitude in lead V5" , , ,"mV" , , , , ,0 ,0 ,0 , , , , , , , +"61438-8" ,"v2.68 Each time you ate bread, toast or dinner rolls, how much did you usually eat in the past 30D","Find" ,"Pt" ,"^Patient" ,"Ord" ,"PhenX" ,"PHENX" ,"2.44" ,"MIN" , ,"TRIAL" , ,2 , , , ,"Each time you eat bread, toast or dinner rolls, how much do you usually eat?","PhenX.050201100100","N" , ,"Finding; Findings; How much bread in 30D; Last; Ordinal; Point in time; QL; Qual; Qualitative; Random; Screen" ,"How much bread in 30D PhenX", , , , , ,"Each time you ate bread, toast or dinner rolls, how much did you usually eat in the past 30 days [PhenX]", , , , , , , ,0 ,0 ,0 , , , , , , , +"10000-8" ,"v2.68 R wave duration.lead AVR" ,"Time" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"Cardiac; Durat; ECG; EKG.MEASUREMENTS; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave dur L-AVR; R wave dur L-AVR; Random; Right" ,"R wave dur L-AVR" ,"Observation", , , ,"s" ,"R wave duration in lead AVR" , , ,"s" , , , , ,0 ,0 ,0 , , , , , , , +"17787-3" ,"v2.68 Study report" ,"Find" ,"Pt" ,"Neck>Thyroid gland","Doc" ,"NM" ,"RAD" ,"2.61" ,"MIN" , ,"ACTIVE", ,2 , , , , , , , ,"Document; Finding; Findings; Imaging; Point in time; Radiology; Random; Study report; Thy" ,"NM Thyroid Study report" ,"Both" , , , , ,"NM Thyroid gland Study report" , , , , , , ,"Changed System from ""Thyroid"" for conformance with the LOINC/RadLex unified model.; Method of ""Radnuc"" was changed to ""NM"". The LOINC/RadLex Committee agreed to use a subset of the two-letter DICOM modality codes as the primary modality identifier." ,0 ,0 ,0 ,"IG exists" , , , ,"81220-6;72230-6" ,"1.0l" , +"17788-1" ,"v2.68 Large unstained cells/100 leukocytes" ,"NFr" ,"Pt" ,"Bld" ,"Qn" ,"Automated count","HEM/BC" ,"2.50" ,"MIN" ,"Part of auto diff output of Bayer H*3S; peroxidase negative cells too large to be classified as lymph or basophil" ,"ACTIVE", ,1 , , , , , ,"Y" ,"%" ,"100WBC; Auto; Automated detection; Blood; Cell; Cellularity; Elec; Elect; Electr; HEMATOLOGY/CELL COUNTS; Leuc; Leuk; Leukocyte; Lkcs; LUC; Number Fraction; Percent; Point in time; QNT; Quan; Quant; Quantitative; Random; WB; WBC; WBCs; White blood cell; White blood cells; Whole blood" ,"LUC/leuk NFr Bld Auto" ,"Observation", , , ,"%" ,"Large unstained cells/100 leukocytes in Blood by Automated count" , , ,"%" , , , , ,1894 ,0 ,1894 , , , , , ,"1.0l" , +"11488-4" ,"v2.68 Consultation note" ,"Find" ,"Pt" ,"{Setting}" ,"Doc" ,"{Role}" ,"DOC.ONTOLOGY","2.63" ,"MIN" , ,"ACTIVE", ,2 , , , , , , , ,"Consult note; DOC.ONT; Document; Encounter; Evaluation and management; Evaluation and management note; Finding; Findings; notes; Point in time; Random; Visit note" ,"Consult note" ,"Both" , , , , ,"Consult note" , , , , , , ,"Edit made because this term is conformant to the Document Ontology axis values and therefore are being placed in this class.; Based on Clinical LOINC Committee decision during the September 2014 meeting, {Provider} was changed to {Author Type} to emphasize a greater breadth of potential document authors. At the September 2015 Clinical LOINC Committee meeting, the Committee decided to change {Author Type} to {Role} to align with the 'Role' axis name in the LOINC Document Ontology.; Because it is too difficult to maintain and because the distinction between documents and sections is not clear-cut nor necessary in most cases, the DOCUMENT_SECTION field has been deemed to have little value. The field has been set to null in the December 2017 release in preparation for removal in the December 2018 release. These changes were approved by the Clinical LOINC Committee.",0 ,0 ,0 ,"IG exists" , , , ,"81222-2;72231-4;81243-8","1.0j-a" ,"Y" +"47239-9" ,"v2.68 Reason for stopping HIV Rx" ,"Type" ,"Pt" ,"^Patient" ,"Nom" ,"Reported" ,"ART" ,"2.50" ,"MIN" ,"Reason for stopping antiretroviral therapy" ,"ACTIVE", ,2 , , , , , ,"N" , ,"AIDS; Anti-retroviral therapy; ART; Human immunodeficiency virus; Nominal; Point in time; Random; Treatment; Typ" ,"Reason for stopping HIV Rx" ,"Observation", , ,"Copyright © 2006 World Health Organization. Used with permission. Publications of the World Health Organization can be obtained from WHO Press, World Health Organization, 20 Avenue Appia, 1211 Geneva 27, Switzerland (tel: +41 22 791 2476; fax: +41 22 791 4857; email: bookorders@who.int). Requests for permission to reproduce or translate WHO publications – whether for sale or for noncommercial distribution – should be addressed to WHO Press, at the above address (fax: +41 22 791 4806; email: permissions@who.int). The designations employed and the presentation of the material in this publication do not imply the expression of any opinion whatsoever on the part of the World Health Organization concerning the legal status of any country, territory, city or area or of its authorities, or concerning the delimitation of its frontiers or boundaries. Dotted lines on maps represent approximate border lines for which there may not yet be full agreement. The mention of specific companies or of certain manufacturers’ products does not imply that they are endorsed or recommended by the World Health Organization in preference to others of a similar nature that are not mentioned. Errors and omissions excepted, the names of proprietary products are distinguished by initial capital letters. All reasonable precautions have been taken by WHO to verify the information contained in this publication. However, the published material is being distributed without warranty of any kind, either express or implied. The responsibility for the interpretation and use of the material lies with the reader. In no event shall the World Health Organization be liable for damages arising from its use.", ,"Reason for stopping HIV treatment" , , , , , , , ,0 ,0 ,0 , ,"WHO_HIV" , , , ,"2.22" , diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/loinc.xml b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/loinc.xml new file mode 100644 index 00000000000..0212b1d705e --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/loinc.xml @@ -0,0 +1,543 @@ +<!-- +LOINC is a freely available international standard for tests, measurements, and observations. It is a well maintained, version independent code system. + +Use of LOINC is governed by the LOINC License: https://loinc.org/license/ + +This CodeSystem resource describes 'LOINC' independent of any particular version. There are notes about changes for version specific LOINC code system resources. + +Note that the following set of codes are defined by the LOINC code systems: + - the main LOINC codes + - the LOINC Answer codes (LA) and the LOINC Answer list codes (LL) + - the LOINC Part codes (LP) in the Multiaxial Hierarchy + - the LOINC Part codes (LP) for the properties + Note: there are license restrictions on the use of LOINC Part codes + - the LOINC Group codes (LG) + Note: presently the LOINC Group codes are used to identify these roll-up groups as ValueSets, but are not yet loaded as codes in the CodeSystem + +Servers may generate variants of this for the LOINC version(s) and features they support. + +--> + +<CodeSystem xmlns="http://hl7.org/fhir"> + <id value="loinc"/> + + <!-- + This url is unchanged for all versions of LOINC. There can only be one correct Code System resource for each value of the version attribute (at least, only one per server). + --> + <url value="http://loinc.org"/> + + <!-- the HL7 v3 OID assigned to LOINC --> + <identifier> + <system value="urn:ietf:rfc:3986"/> + <value value="urn:oid:2.16.840.1.113883.6.1"/> + </identifier> + +<!-- <version value="2.68"/>--> + + <!-- + If a specific version is specified, the name should carry this information (e.g. LOINC_270). + --> + <name value="LOINC"/> + <title value="LOINC Code System (Testing Copy)"/> + <status value="active"/> + <experimental value="false"/> + + <publisher value="Regenstrief Institute, Inc."/> + <contact> + <telecom> + <system value="url" /> + <value value="http://loinc.org"/> + </telecom> + </contact> + + <!-- + <date value=2021-06/> + --> + <description value="LOINC is a freely available international standard for tests, measurements, and observations"/> + <copyright value="This material contains content from LOINC (http://loinc.org). LOINC is copyright ©1995-2021, Regenstrief Institute, Inc. and the Logical Observation Identifiers Names and Codes (LOINC) Committee and is available at no cost under the license at http://loinc.org/license. LOINC® is a registered United States trademark of Regenstrief Institute, Inc."/> + <caseSensitive value="false"/> + + <valueSet value="http://loinc.org/vs"/> + + <!-- + It's at the discretion of servers whether to present fragments of LOINC hierarchically or not, when using the code system resource. But, if they are hierarchical, the Hierarchy SHALL be based on the is-a relationship that is derived from the LOINC Multiaxial Hierarchy. + --> + <hierarchyMeaning value="is-a"/> + <compositional value="false"/> <!-- no compositional grammar in LOINC --> + <versionNeeded value="false"/> + + <!-- + This canonical definition of LOINC does not include the LOINC content, which is distributed separately for portability. + + Servers may choose to include fragments of LOINC for illustration purposes. + --> + <content value="not-present"/> + + <!-- + <count value="65000"/> + If working with a specific version, you could nominate a count of the total number of concepts (including the answers, Hierarchy, etc.). In this canonical definition we do not. + --> + + <!-- + FILTERS + Generally defined filters for specifying value sets + In LOINC, all the properties can also be used as filters, but they are not defined explicitly as filters. + Parent/child properties are as defined by FHIR. Note that at this time the LOINC code system resource does not support ancestor/descendant relationships. + + For illustration purposes, consider this slice of the LOINC Multiaxial Hierarchy when reading the descriptions below: + + Laboratory [LP29693-6] + Microbiology and Antimicrobial susceptibility [LP343406-7] + Microbiology [LP7819-8] + Microorganism [LP14559-6] + Virus [LP14855-8] + Zika virus [LP200137-0] + Zika virus RNA | XXX [LP203271-4] + Zika virus RNA | XXX | Microbiology [LP379670-5] + Zika virus RNA [Presence] in Unspecified specimen by Probe and target amplification method [79190-5] + + Language Note: The filters defined here are specified using the default LOINC language - English (US). Requests are meant to be specified and interpreted on the English version. The return can be in a specified language (if supported by the server). But note that not all filters/properties have language translations available. + --> + <filter> + <code value="parent"/> + <description value="Allows for the selection of a set of codes based on their appearance in the LOINC Multiaxial Hierarchy. Parent selects immediate parent only. For example, the code '79190-5' has the parent 'LP379670-5'"/> + <operator value="="/> + <value value="A Part code"/> + </filter> + <filter> + <code value="child"/> + <description value="Allows for the selection of a set of codes based on their appearance in the LOINC Multiaxial Hierarchy. Child selects immediate children only. For example, the code 'LP379670-5' has the child '79190-5'. Only LOINC Parts have children; LOINC codes do not have any children because they are leaf nodes."/> + <operator value="="/> + <value value="A comma separated list of Part or LOINC codes"/> + </filter> + <filter> + <code value="copyright"/> + <description value="Allows for the inclusion or exclusion of LOINC codes that include 3rd party copyright notices. LOINC = only codes with a sole copyright by Regenstrief. 3rdParty = only codes with a 3rd party copyright in addition to the one from Regenstrief"/> + <operator value="="/> + <value value="LOINC | 3rdParty"/> + </filter> + + <!-- + PROPERTIES + There are 4 kinds of properties that apply to all LOINC codes: + 1. FHIR: display, designation; these are not described here since they are inherent in the specification + 2. Infrastructural: defined by FHIR, but documented here for the LOINC Multiaxial Hierarchy + 3. Primary LOINC properties: defined by the main LOINC table + 4. Secondary LOINC properties: defined by the LoincPartLink table + Additionally, there are 2 kinds of properties specific to Document ontology and Radiology codes, respectively: + 1. LOINC/RSNA Radiology Playbook properties + 2. Document Ontology properties + --> + <!-- + Infrastructural properties - inherited from FHIR, but documented here for the LOINC Multiaxial Hierarchy. + --> + + <property> + <code value="parent"/> + <uri value="http://hl7.org/fhir/concept-properties#parent"/> + <description value="A parent code in the Multiaxial Hierarchy"/> + <type value="code"/> + </property> + <property> + <code value="child"/> + <uri value="http://hl7.org/fhir/concept-properties#child"/> + <description value="A child code in the Multiaxial Hierarchy"/> + <type value="code"/> + </property> + + <!-- + Primary LOINC properties. + These apply to the main LOINC codes, but not the Multiaxial Hierarchy, Answer lists, or the Part codes. + Notes: + In the LOINC code system resource, the display element = LONG_COMMON_NAME + Many properties are specified as type "Coding", which allows use of LOINC Part codes (LP-) and the display text. LOINC Parts and their associations to LOINC terms are published in the LOINC Part File. + The properties defined here follow the guidance of the LOINC Users' Guide, which states that they should be expressed with the LOINC attributes contained in the LOINC Table. Properties that are not defined in the LOINC Table use FHIR-styled names. + --> + + <property> + <code value="STATUS"/> + <uri value="http://loinc.org/property/STATUS"/> + <description value="Status of the term. Within LOINC, codes with STATUS=DEPRECATED are considered inactive. Current values: ACTIVE, TRIAL, DISCOURAGED, and DEPRECATED"/> + <type value="string"/> + </property> + <property> + <code value="COMPONENT"/> + <uri value="http://loinc.org/property/COMPONENT"/> + <description value="First major axis-component or analyte: Analyte Name, Analyte sub-class, Challenge"/> + <type value="Coding"/> + </property> + <property> + <code value="PROPERTY"/> + <uri value="http://loinc.org/property/PROPERTY"/> + <description value="Second major axis-property observed: Kind of Property (also called kind of quantity)"/> + <type value="Coding"/> + </property> + <property> + <code value="TIME_ASPCT"/> + <uri value="http://loinc.org/property/TIME_ASPCT"/> + <description value="Third major axis-timing of the measurement: Time Aspect (Point or moment in time vs. time interval)"/> + <type value="Coding"/> + </property> + <property> + <code value="SYSTEM"/> + <uri value="http://loinc.org/property/SYSTEM"/> + <description value="Fourth major axis-type of specimen or system: System (Sample) Type"/> + <type value="Coding"/> + </property> + <property> + <code value="SCALE_TYP"/> + <uri value="http://loinc.org/property/SCALE_TYP"/> + <description value="Fifth major axis-scale of measurement: Type of Scale"/> + <type value="Coding"/> + </property> + <property> + <code value="METHOD_TYP"/> + <uri value="http://loinc.org/property/METHOD_TYP"/> + <description value="Sixth major axis-method of measurement: Type of Method"/> + <type value="Coding"/> + </property> + <property> + <code value="CLASS"/> + <uri value="http://loinc.org/property/CLASS"/> + <description value="An arbitrary classification of terms for grouping related observations together"/> + <type value="Coding"/> + </property> + <property> + <code value="VersionLastChanged"/> + <uri value="http://loinc.org/property/VersionLastChanged"/> + <description value="The LOINC version number in which the record has last changed. For new records, this field contains the same value as the VersionFirstReleased property."/> + <type value="string"/> + </property> + <property> + <code value="CLASSTYPE"/> + <uri value="http://loinc.org/property/CLASSTYPE"/> + <description value="1=Laboratory class; 2=Clinical class; 3=Claims attachments; 4=Surveys"/> + <type value="string"/> + </property> + <property> + <code value="ORDER_OBS"/> + <uri value="http://loinc.org/property/ORDER_OBS"/> + <description value="Provides users with an idea of the intended use of the term by categorizing it as an order only, observation only, or both"/> + <type value="string"/> + </property> + <property> + <code value="HL7_ATTACHMENT_STRUCTURE"/> + <uri value="http://loinc.org/property/HL7_ATTACHMENT_STRUCTURE"/> + <description value="This property is populated in collaboration with the HL7 Payer-Provider Exchange (PIE) Work Group (previously called Attachments Work Group) as described in the HL7 Attachment Specification: Supplement to Consolidated CDA Templated Guide."/> + <type value="string"/> + </property> + <property> + <code value="VersionFirstReleased"/> + <uri value="http://loinc.org/property/VersionFirstReleased"/> + <description value="This is the LOINC version number in which this LOINC term was first published."/> + <type value="string"/> + </property> + <property> + <code value="PanelType"/> + <uri value="http://loinc.org/property/PanelType"/> + <description value="For LOINC terms that are panels, this attribute classifies them as a 'Convenience group', 'Organizer', or 'Panel'"/> + <type value="string"/> + </property> + <property> + <code value="ValidHL7AttachmentRequest"/> + <uri value="http://loinc.org/property/ValidHL7AttachmentRequest"/> + <description value="A value of Y in this field indicates that this LOINC code can be sent by a payer as part of an HL7 Attachment request for additional information."/> + <type value="string"/> + </property> + <property> + <code value="DisplayName"/> + <uri value="http://loinc.org/property/DisplayName"/> + <description value="A name that is more 'clinician-friendly' compared to the current LOINC Short Name, Long Common Name, and Fully Specified Name. It is created algorithmically from the manually crafted display text for each Part and is generally more concise than the Long Common Name."/> + <type value="string"/> + </property> + <property> + <code value="answer-list"/> + <uri value="http://loinc.org/property/answer-list"/> + <description value="An answer list associated with this LOINC code (if there are matching answer lists defined)."/> + <type value="Coding"/> + </property> + + <!-- + Secondary LOINC properties. + These properties also apply to the main LOINC codes, but not the Multiaxial Hierarchy, Answer lists, or the Part codes. + Notes: + These properties are defined in the LoincPartLink table. + --> + + <property> + <code value="analyte"/> + <uri value="http://loinc.org/property/analyte"/> + <description value="First sub-part of the Component, i.e., the part of the Component before the first carat"/> + <type value="Coding"/> + </property> + <property> + <code value="analyte-core"/> + <uri value="http://loinc.org/property/analyte-core"/> + <description value="The primary part of the analyte without the suffix"/> + <type value="Coding"/> + </property> + <property> + <code value="analyte-suffix"/> + <uri value="http://loinc.org/property/analyte-suffix"/> + <description value="The suffix part of the analyte, if present, e.g., Ab or DNA"/> + <type value="Coding"/> + </property> + <property> + <code value="analyte-numerator"/> + <uri value="http://loinc.org/property/analyte-numerator"/> + <description value="The numerator part of the analyte, i.e., everything before the slash in analytes that contain a divisor"/> + <type value="Coding"/> + </property> + <property> + <code value="analyte-divisor"/> + <uri value="http://loinc.org/property/analyte-divisor"/> + <description value="The divisor part of the analyte, if present, i.e., after the slash and before the first carat"/> + <type value="Coding"/> + </property> + <property> + <code value="analyte-divisor-suffix"/> + <uri value="http://loinc.org/property/analyte-divisor-suffix"/> + <description value="The suffix part of the divisor, if present"/> + <type value="Coding"/> + </property> + <property> + <code value="challenge"/> + <uri value="http://loinc.org/property/challenge"/> + <description value="Second sub-part of the Component, i.e., after the first carat"/> + <type value="Coding"/> + </property> + <property> + <code value="adjustment"/> + <uri value="http://loinc.org/property/adjustment"/> + <description value="Third sub-part of the Component, i.e., after the second carat"/> + <type value="Coding"/> + </property> + <property> + <code value="count"/> + <uri value="http://loinc.org/property/count"/> + <description value="Fourth sub-part of the Component, i.e., after the third carat"/> + <type value="Coding"/> + </property> + <property> + <code value="time-core"/> + <uri value="http://loinc.org/property/time-core"/> + <description value="The primary part of the Time"/> + <type value="Coding"/> + </property> + <property> + <code value="time-modifier"/> + <uri value="http://loinc.org/property/time-modifier"/> + <description value="The modifier of the Time value, such as mean or max"/> + <type value="Coding"/> + </property> + <property> + <code value="system-core"/> + <uri value="http://loinc.org/property/system-core"/> + <description value="The primary part of the System, i.e., without the super system"/> + <type value="Coding"/> + </property> + <property> + <code value="super-system"/> + <uri value="http://loinc.org/property/super-system"/> + <description value="The super system part of the System, if present. The super system represents the source of the specimen when the source is someone or something other than the patient whose chart the result will be stored in. For example, fetus is the super system for measurements done on obstetric ultrasounds, because the fetus is being measured and that measurement is being recorded in the patient's (mother's) chart."/> + <type value="Coding"/> + </property> + <property> + <code value="analyte-gene"/> + <uri value="http://loinc.org/property/analyte-gene"/> + <description value="The specific gene represented in the analyte"/> + <type value="Coding"/> + </property> + <property> + <code value="category"/> + <uri value="http://loinc.org/property/category"/> + <description value="A single LOINC term can be assigned one or more categories based on both programmatic and manual tagging. Category properties also utilize LOINC Class Parts."/> + <type value="Coding"/> + </property> + <property> + <code value="search"/> + <uri value="http://loinc.org/property/search"/> + <description value="Synonyms, fragments, and other Parts that are linked to a term to enable more encompassing search results."/> + <type value="Coding"/> + </property> + + <!-- + LOINC/RSNA Radiology Playbook properties. These apply only to terms in the LOINC/RSNA Radiology Playbook File. + Notes: + Properties are specified as type "Coding", which are represented by LOINC Part codes (LP-) and their display names. + The attribute names here use FHIR styled names rather than their original LOINC style names because the original names contain periods. + --> + + <property> + <code value="rad-modality-modality-type"/> + <uri value="http://loinc.org/property/rad-modality-modality-type"/> + <description value="Modality is used to represent the device used to acquire imaging information."/> + <type value="Coding"/> + </property> + <property> + <code value="rad-modality-modality-subtype"/> + <uri value="http://loinc.org/property/rad-modality-modality-subtype"/> + <description value="Modality subtype may be optionally included to signify a particularly common or evocative configuration of the modality."/> + <type value="Coding"/> + </property> + <property> + <code value="rad-anatomic-location-region-imaged"/> + <uri value="http://loinc.org/property/rad-anatomic-location-region-imaged"/> + <description value="The Anatomic Location Region Imaged attribute is used in two ways: as a coarse-grained descriptor of the area imaged and a grouper for finding related imaging exams; or, it is used just as a grouper."/> + <type value="Coding"/> + </property> + <property> + <code value="rad-anatomic-location-imaging-focus"/> + <uri value="http://loinc.org/property/rad-anatomic-location-imaging-focus"/> + <description value="The Anatomic Location Imaging Focus is a more fine-grained descriptor of the specific target structure of an imaging exam. In many areas, the focus should be a specific organ."/> + <type value="Coding"/> + </property> + <property> + <code value="rad-anatomic-location-laterality-presence"/> + <uri value="http://loinc.org/property/rad-anatomic-location-laterality-presence"/> + <description value="Radiology Exams that require laterality to be specified in order to be performed are signified with an Anatomic Location Laterality Presence attribute set to 'True'"/> + <type value="Coding"/> + </property> + <property> + <code value="rad-anatomic-location-laterality"/> + <uri value="http://loinc.org/property/rad-anatomic-location-laterality"/> + <description value="Radiology exam Laterality is specified as one of: Left, Right, Bilateral, Unilateral, Unspecified"/> + <type value="Coding"/> + </property> + <property> + <code value="rad-view-aggregation"/> + <uri value="http://loinc.org/property/rad-view-aggregation"/> + <description value="Aggregation describes the extent of the imaging performed, whether in quantitative terms (e.g., '3 or more views') or subjective terms (e.g., 'complete')."/> + <type value="Coding"/> + </property> + <property> + <code value="rad-view-view-type"/> + <uri value="http://loinc.org/property/rad-view-view-type"/> + <description value="View type names specific views, such as 'lateral' or 'AP'."/> + <type value="Coding"/> + </property> + <property> + <code value="rad-maneuver-maneuver-type"/> + <uri value="http://loinc.org/property/rad-maneuver-maneuver-type"/> + <description value="Maneuver type indicates an action taken with the goal of elucidating or testing a dynamic aspect of the anatomy."/> + <type value="Coding"/> + </property> + <property> + <code value="rad-timing"/> + <uri value="http://loinc.org/property/rad-timing"/> + <description value="The Timing/Existence property used in conjunction with pharmaceutical and maneuver properties. It specifies whether or not the imaging occurs in the presence of the administered pharmaceutical or a maneuver designed to test some dynamic aspect of anatomy or physiology ."/> + <type value="Coding"/> + </property> + <property> + <code value="rad-pharmaceutical-substance-given"/> + <uri value="http://loinc.org/property/rad-pharmaceutical-substance-given"/> + <description value="The Pharmaceutical Substance Given specifies administered contrast agents, radiopharmaceuticals, medications, or other clinically important agents and challenges during the imaging procedure."/> + <type value="Coding"/> + </property> + <property> + <code value="rad-pharmaceutical-route"/> + <uri value="http://loinc.org/property/rad-pharmaceutical-route"/> + <description value="Route specifies the route of administration of the pharmaceutical."/> + <type value="Coding"/> + </property> + <property> + <code value="rad-reason-for-exam"/> + <uri value="http://loinc.org/property/rad-reason-for-exam"/> + <description value="Reason for exam is used to describe a clinical indication or a purpose for the study."/> + <type value="Coding"/> + </property> + <property> + <code value="rad-guidance-for-presence"/> + <uri value="http://loinc.org/property/rad-guidance-for-presence"/> + <description value="Guidance for.Presence indicates when a procedure is guided by imaging."/> + <type value="Coding"/> + </property> + <property> + <code value="rad-guidance-for-approach"/> + <uri value="http://loinc.org/property/rad-guidance-for-approach"/> + <description value="Guidance for.Approach refers to the primary route of access used, such as percutaneous, transcatheter, or transhepatic."/> + <type value="Coding"/> + </property> + <property> + <code value="rad-guidance-for-action"/> + <uri value="http://loinc.org/property/rad-guidance-for-action"/> + <description value="Guidance for.Action indicates the intervention performed, such as biopsy, aspiration, or ablation."/> + <type value="Coding"/> + </property> + <property> + <code value="rad-guidance-for-object"/> + <uri value="http://loinc.org/property/rad-guidance-for-object"/> + <description value="Guidance for.Object specifies the target of the action, such as mass, abscess or cyst."/> + <type value="Coding"/> + </property> + <property> + <code value="rad-subject"/> + <uri value="http://loinc.org/property/rad-subject"/> + <description value="Subject is intended for use when there is a need to distinguish between the patient associated with an imaging study, and the target of the study."/> + <type value="Coding"/> + </property> + + <!-- + Document Ontology properties. + These apply only to terms in the LOINC Document Ontology File + Notes + Properties are specified as type "Coding", which are represented by LOINC Part codes (LP-) and their display names. + The attribute names here use FHIR styled names rather than their original LOINC style names because those contain periods. + --> + + <property> + <code value="document-kind"/> + <uri value="http://loinc.org/property/document-kind"/> + <description value="Characterizes the general structure of the document at a macro level."/> + <type value="Coding"/> + </property> + <property> + <code value="document-role"/> + <uri value="http://loinc.org/property/document-role"/> + <description value="Characterizes the training or professional level of the author of the document, but does not break down to specialty or subspecialty."/> + <type value="Coding"/> + </property> + <property> + <code value="document-setting"/> + <uri value="http://loinc.org/property/document-setting"/> + <description value="Setting is a modest extension of CMS’s coarse definition of care settings, such as outpatient, hospital, etc. Setting is not equivalent to location, which typically has more locally defined meanings."/> + <type value="Coding"/> + </property> + <property> + <code value="document-subject-matter-domain"/> + <uri value="http://loinc.org/property/document-subject-matter-domain"/> + <description value="Characterizes the clinical domain that is the subject of the document. For example, Internal Medicine, Neurology, Physical Therapy, etc."/> + <type value="Coding"/> + </property> + <property> + <code value="document-type-of-service"/> + <uri value="http://loinc.org/property/document-type-of-service"/> + <description value="Characterizes the kind of service or activity provided to/for the patient (or other subject of the service) that is described in the document."/> + <type value="Coding"/> + </property> + + <!-- Answer list related properties --> + <property> + <code value="answers-for"/> + <uri value="http://loinc.org/property/answers-for"/> + <description value="A LOINC Code for which this answer list is used."/> + <type value="Coding"/> + </property> + + <!-- Note for future consideration. These are properties of LA codes in the context of a particular list. Not global properties. + <property> + <code value="sequence"/> + <uri value="http://loinc.org/property/sequence"/> + <description value="Sequence Number of a answer in a set of answers (LA- codes only)"/> + <type value="integer"/> + </property> + <property> + <code value="score"/> + <uri value="http://loinc.org/property/score"/> + <description value="Score assigned to an answer (LA- codes only)"/> + <type value="integer"/> + </property> + --> +</CodeSystem> + + diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/AnswerFile/AnswerList.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/AnswerFile/AnswerList.csv new file mode 100644 index 00000000000..ec157fd70fe --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/AnswerFile/AnswerList.csv @@ -0,0 +1,12 @@ +"AnswerListId","AnswerListName" ,"AnswerListOID" ,"ExtDefinedYN","ExtDefinedAnswerListCodeSystem","ExtDefinedAnswerListLink" ,"AnswerStringId","LocalAnswerCode","LocalAnswerCodeSystem","SequenceNumber","DisplayText" ,"ExtCodeId","ExtCodeDisplayName" ,"ExtCodeSystem" ,"ExtCodeSystemVersion" ,"ExtCodeSystemCopyrightNotice" ,"SubsequentTextPrompt","Description","Score" +"LL1000-0" ,"v2.69 PhenX05_13_30D bread amt","1.3.6.1.4.1.12009.10.1.165" ,"N" , , ,"LA13825-7" ,"1" , ,1 ,"1 slice or 1 dinner roll" , , , , , , , , +"LL1000-0" ,"v2.69 PhenX05_13_30D bread amt","1.3.6.1.4.1.12009.10.1.165" ,"N" , , ,"LA13838-0" ,"2" , ,2 ,"2 slices or 2 dinner rolls" , , , , , , , , +"LL1000-0" ,"v2.69 PhenX05_13_30D bread amt","1.3.6.1.4.1.12009.10.1.165" ,"N" , , ,"LA13892-7" ,"3" , ,3 ,"More than 2 slices or 2 dinner rolls", , , , , , , , +"LL1001-8" ,"v2.69 PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA6270-8" ,"00" , ,1 ,"Never" , , , , , , , , +"LL1001-8" ,"v2.69 PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13836-4" ,"01" , ,2 ,"1-3 times per month" , , , , , , , , +"LL1001-8" ,"v2.69 PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13834-9" ,"02" , ,3 ,"1-2 times per week" , , , , , , , , +"LL1001-8" ,"v2.69 PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13853-9" ,"03" , ,4 ,"3-4 times per week" , , , , , , , , +"LL1001-8" ,"v2.69 PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13860-4" ,"04" , ,5 ,"5-6 times per week" , , , , , , , , +"LL1001-8" ,"v2.69 PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13827-3" ,"05" , ,6 ,"1 time per day" , , , , , , , , +"LL1001-8" ,"v2.69 PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA4389-8" ,"97" , ,11 ,"Refused" ,"443390004","Refused (qualifier value)","http://snomed.info/sct","http://snomed.info/sct/900000000000207008/version/20170731","This material includes SNOMED Clinical Terms® (SNOMED CT®) which is used by permission of the International Health Terminology Standards Development Organisation (IHTSDO) under license. All rights reserved. SNOMED CT® was originally created by The College", , , +"LL1892-0" ,"v2.69 ICD-9_ICD-10" ,"1.3.6.1.4.1.12009.10.1.1069","Y" , ,"http://www.cdc.gov/nchs/icd.htm", , , , , , , , , , , , , diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/AnswerFile/LoincAnswerListLink.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/AnswerFile/LoincAnswerListLink.csv new file mode 100644 index 00000000000..820602c77ad --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/AnswerFile/LoincAnswerListLink.csv @@ -0,0 +1,11 @@ +"LoincNumber","LongCommonName" ,"AnswerListId","AnswerListName" ,"AnswerListLinkType","ApplicableContext" +"61438-8" ,"Each time you ate bread, toast or dinner rolls, how much did you usually eat in the past 30 days [PhenX]","LL1000-0" ,"PhenX05_13_30D bread amt","NORMATIVE" , +"10061-0" ,"S' wave amplitude in lead I" ,"LL1311-1" ,"PhenX12_44" ,"EXAMPLE" , +"10331-7" ,"Rh [Type] in Blood" ,"LL360-9" ,"Pos|Neg" ,"EXAMPLE" , +"10389-5" ,"Blood product.other [Type]" ,"LL2413-4" ,"Othr bld prod" ,"EXAMPLE" , +"10390-3" ,"Blood product special preparation [Type]" ,"LL2422-5" ,"Blood prod treatment" ,"EXAMPLE" , +"10393-7" ,"Factor IX given [Type]" ,"LL2420-9" ,"Human/Recomb" ,"EXAMPLE" , +"10395-2" ,"Factor VIII given [Type]" ,"LL2420-9" ,"Human/Recomb" ,"EXAMPLE" , +"10401-8" ,"Immune serum globulin given [Type]" ,"LL2421-7" ,"IM/IV" ,"EXAMPLE" , +"10410-9" ,"Plasma given [Type]" ,"LL2417-5" ,"Plasma type" ,"EXAMPLE" , +"10568-4" ,"Clarity of Semen" ,"LL2427-4" ,"Clear/Opales/Milky" ,"EXAMPLE" , diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/ConsumerName/ConsumerName.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/ConsumerName/ConsumerName.csv new file mode 100644 index 00000000000..b4ec2907985 --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/ConsumerName/ConsumerName.csv @@ -0,0 +1,6 @@ +"LoincNumber","ConsumerName" +"61438-8","Consumer Name 61438-8" +,"Consumer Name X" +47239-9","" +"17787-3","Consumer Name 17787-3" +"38699-5","1,1-Dichloroethane, Air" diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/DocumentOntology/DocumentOntology.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/DocumentOntology/DocumentOntology.csv new file mode 100644 index 00000000000..f857d7f297b --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/DocumentOntology/DocumentOntology.csv @@ -0,0 +1,10 @@ +"LoincNumber","PartNumber","PartTypeName","PartSequenceOrder","PartName" +"11488-4","LP173418-7","Document.Kind","1","Note" +"11488-4","LP173110-0","Document.TypeOfService","1","Consultation" +"11488-4","LP173061-5","Document.Setting","1","{Setting}" +"11488-4","LP187187-2","Document.Role","1","{Role}" +"11490-0","LP173418-7","Document.Kind","1","Note" +"11490-0","LP173221-5","Document.TypeOfService","1","Discharge summary" +"11490-0","LP173061-5","Document.Setting","1","{Setting}" +"11490-0","LP173084-7","Document.Role","1","Physician" +"11492-6","LP173418-7","Document.Kind","1","Note" diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/GroupFile/Group.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/GroupFile/Group.csv new file mode 100644 index 00000000000..66f5561ea1c --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/GroupFile/Group.csv @@ -0,0 +1,2 @@ +"ParentGroupId","GroupId","Group","Archetype","Status","VersionFirstReleased" +"LG100-4","LG1695-8","1,4-Dichlorobenzene|MCnc|Pt|ANYBldSerPl","","Active","" diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/GroupFile/GroupLoincTerms.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/GroupFile/GroupLoincTerms.csv new file mode 100644 index 00000000000..04c19759cfb --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/GroupFile/GroupLoincTerms.csv @@ -0,0 +1,3 @@ +"Category","GroupId","Archetype","LoincNumber","LongCommonName" +"Flowsheet","LG1695-8","","17424-3","1,4-Dichlorobenzene [Mass/volume] in Blood" +"Flowsheet","LG1695-8","","13006-2","1,4-Dichlorobenzene [Mass/volume] in Serum or Plasma" diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/GroupFile/ParentGroup.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/GroupFile/ParentGroup.csv new file mode 100644 index 00000000000..734a86c43dd --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/GroupFile/ParentGroup.csv @@ -0,0 +1,2 @@ +"ParentGroupId","ParentGroup","Status" +"LG100-4","Chem_DrugTox_Chal_Sero_Allergy<SAME:Comp|Prop|Tm|Syst (except intravascular and urine)><ANYBldSerPlas,ANYUrineUrineSed><ROLLUP:Method>","ACTIVE" diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/ImagingDocuments/ImagingDocumentCodes.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/ImagingDocuments/ImagingDocumentCodes.csv new file mode 100644 index 00000000000..a26397639ff --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/ImagingDocuments/ImagingDocumentCodes.csv @@ -0,0 +1,10 @@ +"LOINC_NUM","LONG_COMMON_NAME" +"11525-3","US Pelvis Fetus for pregnancy" +"17787-3","NM Thyroid gland Study report" +"18744-3","Bronchoscopy study" +"18746-8","Colonoscopy study" +"18748-4","Diagnostic imaging study" +"18751-8","Endoscopy study" +"18753-4","Flexible sigmoidoscopy study" +"24531-6","US Retroperitoneum" +"24532-4","US Abdomen RUQ" diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/LinguisticVariants/LinguisticVariants.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/LinguisticVariants/LinguisticVariants.csv new file mode 100644 index 00000000000..c79b3197490 --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/LinguisticVariants/LinguisticVariants.csv @@ -0,0 +1,9 @@ +"ID","ISO_LANGUAGE","ISO_COUNTRY","LANGUAGE_NAME","PRODUCER" +"5","zh","CN","Chinese (CHINA)","Lin Zhang, A LOINC volunteer from China" +"7","es","AR","Spanish (ARGENTINA)","Conceptum Medical Terminology Center" +"8","fr","CA","French (CANADA)","Canada Health Infoway Inc." +,"de","AT","German (AUSTRIA)","ELGA, Austria" +"88",,"AT","German (AUSTRIA)","ELGA, Austria" +"89","de",,"German (AUSTRIA)","ELGA, Austria" +"90","de","AT",,"ELGA, Austria" +"24","de","AT","German (AUSTRIA)","ELGA, Austria" \ No newline at end of file diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/LinguisticVariants/deAT24LinguisticVariant.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/LinguisticVariants/deAT24LinguisticVariant.csv new file mode 100644 index 00000000000..c6882d47504 --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/LinguisticVariants/deAT24LinguisticVariant.csv @@ -0,0 +1,4 @@ +"LOINC_NUM","COMPONENT","PROPERTY","TIME_ASPCT","SYSTEM","SCALE_TYP","METHOD_TYP","CLASS","SHORTNAME","LONG_COMMON_NAME","RELATEDNAMES2","LinguisticVariantDisplayName" +"61438-8","Entlassungsbrief Ärztlich","Ergebnis","Zeitpunkt","{Setting}","Dokument","Dermatologie","DOC.ONTOLOGY","de shortname","de long common name","de related names 2","de linguistic variant display name" +"43730-1","","","","","","","","","","EBV-DNA qn. PCR","EBV-DNA quantitativ PCR" +"17787-3","","","","","","","","","","CoV OC43 RNA ql/SM P","Coronavirus OC43 RNA ql. /Sondermaterial PCR" diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/LinguisticVariants/frCA8LinguisticVariant.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/LinguisticVariants/frCA8LinguisticVariant.csv new file mode 100644 index 00000000000..fa09e0cb242 --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/LinguisticVariants/frCA8LinguisticVariant.csv @@ -0,0 +1,6 @@ +"LOINC_NUM","COMPONENT","PROPERTY","TIME_ASPCT","SYSTEM","SCALE_TYP","METHOD_TYP","CLASS","SHORTNAME","LONG_COMMON_NAME","RELATEDNAMES2","LinguisticVariantDisplayName" +"61438-8","Cellules de Purkinje cytoplasmique type 2 , IgG","Titre","Temps ponctuel","Sérum","Quantitatif","Immunofluorescence","Sérologie","","","","" +"11704-4","Gliale nucléaire de type 1 , IgG","Titre","Temps ponctuel","LCR","Quantitatif","Immunofluorescence","Sérologie","","","","" +,"Cellules de Purkinje cytoplasmique type 2 , IgG","Titre","Temps ponctuel","Sérum","Quantitatif",,,"","","","" +"17787-3","Virus respiratoire syncytial bovin","Présence-Seuil","Temps ponctuel","XXX","Ordinal","Culture spécifique à un microorganisme","Microbiologie","","","","" +"17788-1","Cellules de Purkinje cytoplasmique type 2 , IgG","Titre","Temps ponctuel","Sérum","Quantitatif",,,"","","","" diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/LinguisticVariants/zhCN5LinguisticVariant.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/LinguisticVariants/zhCN5LinguisticVariant.csv new file mode 100644 index 00000000000..48d07d9fdc3 --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/LinguisticVariants/zhCN5LinguisticVariant.csv @@ -0,0 +1,9 @@ +"LOINC_NUM","COMPONENT","PROPERTY","TIME_ASPCT","SYSTEM","SCALE_TYP","METHOD_TYP","CLASS","SHORTNAME","LONG_COMMON_NAME","RELATEDNAMES2","LinguisticVariantDisplayName" +"61438-8","血流速度.收缩期.最大值","速度","时间点","大脑中动脉","定量型","超声.多普勒","产科学检查与测量指标.超声","","","Cereb 动态 可用数量表示的;定量性;数值型;数量型;连续数值型标尺 大脑(Cerebral) 时刻;随机;随意;瞬间 术语""cerebral""指的是主要由中枢半球(大脑皮质和基底神经节)组成的那部分脑结构 流 流量;流速;流体 血;全血 血流量;血液流量 速度(距离/时间);速率;速率(距离/时间)","" +"11704-4","血流速度.收缩期.最大值","速度","时间点","动脉导管","定量型","超声.多普勒","产科学检查与测量指标.超声","","","动态 动脉管 可用数量表示的;定量性;数值型;数量型;连续数值型标尺 时刻;随机;随意;瞬间 流 流量;流速;流体 血;全血 血流量;血液流量 速度(距离/时间);速率;速率(距离/时间)","" +"17787-3","血流速度.收缩期.最大值","速度","时间点","二尖瓣^胎儿","定量型","超声.多普勒","产科学检查与测量指标.超声","","","僧帽瓣 动态 可用数量表示的;定量性;数值型;数量型;连续数值型标尺 时刻;随机;随意;瞬间 流 流量;流速;流体 胎;超系统 - 胎儿 血;全血 血流量;血液流量 速度(距离/时间);速率;速率(距离/时间)","" +"61438-6",,"速度","时间点","二尖瓣^胎儿","定量型","超声.多普勒","产科学检查与测量指标.超声","","","僧帽瓣 动态 可用数量表示的;定量性;数值型;数量型;连续数值型标尺 时刻;随机;随意;瞬间 流 流量;流速;流体 胎;超系统 - 胎儿 血;全血 血流量;血液流量 速度(距离/时间);速率;速率(距离/时间)","" +"10000-8","血流速度.收缩期.最大值",,"时间点","二尖瓣^胎儿","定量型","超声.多普勒","产科学检查与测量指标.超声","","","僧帽瓣 动态 可用数量表示的;定量性;数值型;数量型;连续数值型标尺 时刻;随机;随意;瞬间 流 流量;流速;流体 胎;超系统 - 胎儿 血;全血 血流量;血液流量 速度(距离/时间);速率;速率(距离/时间)","" +"17788-1","血流速度.收缩期.最大值","速度",,"大脑中动脉","定量型","超声.多普勒","产科学检查与测量指标.超声","","","Cereb 动态 可用数量表示的;定量性;数值型;数量型;连续数值型标尺 大脑(Cerebral) 时刻;随机;随意;瞬间 术语""cerebral""指的是主要由中枢半球(大脑皮质和基底神经节)组成的那部分脑结构 流 流量;流速;流体 血;全血 血流量;血液流量 速度(距离/时间);速率;速率(距离/时间)","" +"11488-4","血流速度.收缩期.最大值","速度","时间点",,"定量型","超声.多普勒","产科学检查与测量指标.超声","","","Cereb 动态 可用数量表示的;定量性;数值型;数量型;连续数值型标尺 大脑(Cerebral) 时刻;随机;随意;瞬间 术语""cerebral""指的是主要由中枢半球(大脑皮质和基底神经节)组成的那部分脑结构 流 流量;流速;流体 血;全血 血流量;血液流量 速度(距离/时间);速率;速率(距离/时间)","" +"47239-9","血流速度.收缩期.最大值","速度","时间点","大脑中动脉",,"超声.多普勒","产科学检查与测量指标.超声","","","Cereb 动态 可用数量表示的;定量性;数值型;数量型;连续数值型标尺 大脑(Cerebral) 时刻;随机;随意;瞬间 术语""cerebral""指的是主要由中枢半球(大脑皮质和基底神经节)组成的那部分脑结构 流 流量;流速;流体 血;全血 血流量;血液流量 速度(距离/时间);速率;速率(距离/时间)","" diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/LoincIeeeMedicalDeviceCodeMappingTable/LoincIeeeMedicalDeviceCodeMappingTable.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/LoincIeeeMedicalDeviceCodeMappingTable/LoincIeeeMedicalDeviceCodeMappingTable.csv new file mode 100644 index 00000000000..d8cf83cd09e --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/LoincIeeeMedicalDeviceCodeMappingTable/LoincIeeeMedicalDeviceCodeMappingTable.csv @@ -0,0 +1,10 @@ +LOINC_NUM,LOINC_LONG_COMMON_NAME,IEEE_CF_CODE10,IEEE_REFID,IEEE_DESCRIPTION,IEEE_DIM,IEEE_UOM_UCUM +11556-8,Oxygen [Partial pressure] in Blood,160116,MDC_CONC_PO2_GEN,,LMT-2L-2 LMT-2L-2,kPa mm[Hg] +11557-6,Carbon dioxide [Partial pressure] in Blood,160064,MDC_CONC_PCO2_GEN,,LMT-2L-2 LMT-2L-2,kPa mm[Hg] +11558-4,pH of Blood,160004,MDC_CONC_PH_GEN,,[pH],[pH] +12961-9,Urea nitrogen [Mass/volume] in Arterial blood,160080,MDC_CONC_UREA_ART,,ML-3 NL-3,mg/dL mmol/L +14749-6,Glucose [Moles/volume] in Serum or Plasma,160196,MDC_CONC_GLU_VENOUS_PLASMA,Plasma glucose concentration taken from venous,NL-3 ,mmol/L +14749-6,Glucose [Moles/volume] in Serum or Plasma,160368,MDC_CONC_GLU_UNDETERMINED_PLASMA,Plasma glucose concentration taken from undetermined sample source,NL-3 ,mmol/L +15074-8,Glucose [Moles/volume] in Blood,160020,MDC_CONC_GLU_GEN,,NL-3,mmol/L +15074-8,Glucose [Moles/volume] in Blood,160364,MDC_CONC_GLU_UNDETERMINED_WHOLEBLOOD,Whole blood glucose concentration taken from undetermined sample source,NL-3 ,mmol/L +17861-6,Calcium [Mass/volume] in Serum or Plasma,160024,MDC_CONC_CA_GEN,,ML-3,mg/dL diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/LoincRsnaRadiologyPlaybook/LoincRsnaRadiologyPlaybook.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/LoincRsnaRadiologyPlaybook/LoincRsnaRadiologyPlaybook.csv new file mode 100644 index 00000000000..f935aeec77b --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/LoincRsnaRadiologyPlaybook/LoincRsnaRadiologyPlaybook.csv @@ -0,0 +1,10 @@ +"LoincNumber","LongCommonName" ,"PartNumber","PartTypeName" ,"PartName" ,"PartSequenceOrder","RID" ,"PreferredName" ,"RPID" ,"LongName" +"17787-3" ,"v2.68 NM Thyroid gland Study report","LP199995-4","Rad.Anatomic Location.Region Imaged","Neck" ,"A" ,"RID7488" ,"neck" ,"" ,"" +"17787-3" ,"v2.68 NM Thyroid gland Study report","LP206648-0","Rad.Anatomic Location.Imaging Focus","Thyroid gland" ,"A" ,"RID7578" ,"thyroid gland" ,"" ,"" +"17787-3" ,"v2.68 NM Thyroid gland Study report","LP208891-4","Rad.Modality.Modality type" ,"NM" ,"A" ,"RID10330","nuclear medicine imaging","" ,"" +"24531-6" ,"v2.68 US Retroperitoneum" ,"LP207608-3","Rad.Modality.Modality type" ,"US" ,"A" ,"RID10326","Ultrasound" ,"RPID2142","US Retroperitoneum" +"24531-6" ,"v2.68 US Retroperitoneum" ,"LP199943-4","Rad.Anatomic Location.Imaging Focus","Retroperitoneum" ,"A" ,"RID431" ,"RETROPERITONEUM" ,"RPID2142","US Retroperitoneum" +"24531-6" ,"v2.68 US Retroperitoneum" ,"LP199956-6","Rad.Anatomic Location.Region Imaged","Abdomen" ,"A" ,"RID56" ,"Abdomen" ,"RPID2142","US Retroperitoneum" +"24532-4" ,"v2.68 US Abdomen RUQ" ,"LP199956-6","Rad.Anatomic Location.Region Imaged","Abdomen" ,"A" ,"RID56" ,"Abdomen" ,"" ,"" +"24532-4" ,"v2.68 US Abdomen RUQ" ,"LP207608-3","Rad.Modality.Modality type" ,"US" ,"A" ,"RID10326","Ultrasound" ,"" ,"" +"24532-4" ,"v2.68 US Abdomen RUQ" ,"LP208105-9","Rad.Anatomic Location.Imaging Focus","Right upper quadrant","A" ,"RID29994","Right upper quadrant" ,"" ,"" diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/LoincUniversalLabOrdersValueSet/LoincUniversalLabOrdersValueSet.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/LoincUniversalLabOrdersValueSet/LoincUniversalLabOrdersValueSet.csv new file mode 100644 index 00000000000..72d95485a58 --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/LoincUniversalLabOrdersValueSet/LoincUniversalLabOrdersValueSet.csv @@ -0,0 +1,10 @@ +"LOINC_NUM","LONG_COMMON_NAME","ORDER_OBS" +"42176-8","1,3 beta glucan [Mass/volume] in Serum","Both" +"53835-5","1,5-Anhydroglucitol [Mass/volume] in Serum or Plasma","Both" +"31019-3","10-Hydroxycarbazepine [Mass/volume] in Serum or Plasma","Both" +"6765-2","17-Hydroxypregnenolone [Mass/volume] in Serum or Plasma","Both" +"1668-3","17-Hydroxyprogesterone [Mass/volume] in Serum or Plasma","Both" +"32854-2","17-Hydroxyprogesterone [Presence] in DBS","Both" +"49054-0","25-Hydroxycalciferol [Mass/volume] in Serum or Plasma","Both" +"62292-8","25-Hydroxyvitamin D2+25-Hydroxyvitamin D3 [Mass/volume] in Serum or Plasma","Both" +"44907-4","5-Hydroxyindoleacetate panel - 24 hour Urine","Order" diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/MultiAxialHierarchy/MultiAxialHierarchy.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/MultiAxialHierarchy/MultiAxialHierarchy.csv new file mode 100644 index 00000000000..527b8fd5cae --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/MultiAxialHierarchy/MultiAxialHierarchy.csv @@ -0,0 +1,10 @@ +PATH_TO_ROOT,SEQUENCE,IMMEDIATE_PARENT,CODE,CODE_TEXT +,1,,LP31755-9,Microbiology +LP31755-9,1,LP31755-9,LP14559-6,Microorganism +LP31755-9.LP14559-6,1,LP14559-6,LP98185-9,Bacteria +LP31755-9.LP14559-6.LP98185-9,1,LP98185-9,LP14082-9,Bacteria +LP31755-9.LP14559-6.LP98185-9.LP14082-9,1,LP14082-9,LP52258-8,Bacteria | Body Fluid +LP31755-9.LP14559-6.LP98185-9.LP14082-9.LP52258-8,1,LP52258-8,41599-2,Bacteria Fld Ql Micro +LP31755-9.LP14559-6.LP98185-9.LP14082-9,2,LP14082-9,LP52260-4,Bacteria | Cerebral spinal fluid +LP31755-9.LP14559-6.LP98185-9.LP14082-9.LP52260-4,1,LP52260-4,41602-4,Bacteria CSF Ql Micro +LP31755-9.LP14559-6.LP98185-9.LP14082-9,3,LP14082-9,LP52960-9,Bacteria | Cervix diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/PanelsAndForms/AnswerList.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/PanelsAndForms/AnswerList.csv new file mode 100644 index 00000000000..a448cf80f2d --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/PanelsAndForms/AnswerList.csv @@ -0,0 +1,12 @@ +"AnswerListId","AnswerListName" ,"AnswerListOID" ,"ExtDefinedYN","ExtDefinedAnswerListCodeSystem","ExtDefinedAnswerListLink" ,"AnswerStringId","LocalAnswerCode","LocalAnswerCodeSystem","SequenceNumber","DisplayText" ,"ExtCodeId","ExtCodeDisplayName" ,"ExtCodeSystem" ,"ExtCodeSystemVersion" ,"ExtCodeSystemCopyrightNotice" ,"SubsequentTextPrompt","Description","Score" +"LL1000-0" ,"PhenX05_13_30D bread amt","1.3.6.1.4.1.12009.10.1.165" ,"N" , , ,"LA13825-7" ,"1" , ,1 ,"1 slice or 1 dinner roll" , , , , , , , , +"LL1000-0" ,"PhenX05_13_30D bread amt","1.3.6.1.4.1.12009.10.1.165" ,"N" , , ,"LA13838-0" ,"2" , ,2 ,"2 slices or 2 dinner rolls" , , , , , , , , +"LL1000-0" ,"PhenX05_13_30D bread amt","1.3.6.1.4.1.12009.10.1.165" ,"N" , , ,"LA13892-7" ,"3" , ,3 ,"More than 2 slices or 2 dinner rolls", , , , , , , , +"LL1001-8" ,"PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA6270-8" ,"00" , ,1 ,"Never" , , , , , , , , +"LL1001-8" ,"PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13836-4" ,"01" , ,2 ,"1-3 times per month" , , , , , , , , +"LL1001-8" ,"PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13834-9" ,"02" , ,3 ,"1-2 times per week" , , , , , , , , +"LL1001-8" ,"PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13853-9" ,"03" , ,4 ,"3-4 times per week" , , , , , , , , +"LL1001-8" ,"PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13860-4" ,"04" , ,5 ,"5-6 times per week" , , , , , , , , +"LL1001-8" ,"PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13827-3" ,"05" , ,6 ,"1 time per day" , , , , , , , , +"LL1001-8" ,"PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA4389-8" ,"97" , ,11 ,"Refused" ,"443390004","Refused (qualifier value)","http://snomed.info/sct","http://snomed.info/sct/900000000000207008/version/20170731","This material includes SNOMED Clinical Terms® (SNOMED CT®) which is used by permission of the International Health Terminology Standards Development Organisation (IHTSDO) under license. All rights reserved. SNOMED CT® was originally created by The College", , , +"LL1892-0" ,"ICD-9_ICD-10" ,"1.3.6.1.4.1.12009.10.1.1069","Y" , ,"http://www.cdc.gov/nchs/icd.htm", , , , , , , , , , , , , diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/PanelsAndForms/Loinc.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/PanelsAndForms/Loinc.csv new file mode 100644 index 00000000000..20379cb7f1d --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/PanelsAndForms/Loinc.csv @@ -0,0 +1,16 @@ +"LOINC_NUM","COMPONENT" ,"PROPERTY","TIME_ASPCT","SYSTEM" ,"SCALE_TYP","METHOD_TYP" ,"CLASS" ,"VersionLastChanged","CHNG_TYPE","DefinitionDescription" ,"STATUS","CONSUMER_NAME","CLASSTYPE","FORMULA","SPECIES","EXMPL_ANSWERS","SURVEY_QUEST_TEXT" ,"SURVEY_QUEST_SRC" ,"UNITSREQUIRED","SUBMITTED_UNITS","RELATEDNAMES2" ,"SHORTNAME" ,"ORDER_OBS" ,"CDISC_COMMON_TESTS","HL7_FIELD_SUBFIELD_ID","EXTERNAL_COPYRIGHT_NOTICE" ,"EXAMPLE_UNITS","LONG_COMMON_NAME" ,"UnitsAndRange","DOCUMENT_SECTION","EXAMPLE_UCUM_UNITS","EXAMPLE_SI_UCUM_UNITS","STATUS_REASON","STATUS_TEXT","CHANGE_REASON_PUBLIC" ,"COMMON_TEST_RANK","COMMON_ORDER_RANK","COMMON_SI_TEST_RANK","HL7_ATTACHMENT_STRUCTURE","EXTERNAL_COPYRIGHT_LINK","PanelType","AskAtOrderEntry","AssociatedObservations" ,"VersionFirstReleased","ValidHL7AttachmentRequest" +"10013-1" ,"R' wave amplitude.lead I" ,"Elpot" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"Cardiac; ECG; EKG.MEASUREMENTS; Electrical potential; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave Amp L-I; R wave Amp L-I; Random; Right; Voltage" ,"R' wave Amp L-I" ,"Observation", , , ,"mV" ,"R' wave amplitude in lead I" , , ,"mV" , , , , ,0 ,0 ,0 , , , , , , , +"10014-9" ,"R' wave amplitude.lead II" ,"Elpot" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"2; Cardiac; ECG; EKG.MEASUREMENTS; Electrical potential; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave Amp L-II; R wave Amp L-II; Random; Right; Voltage" ,"R' wave Amp L-II" ,"Observation", , , ,"mV" ,"R' wave amplitude in lead II" , , ,"mV" , , , , ,0 ,0 ,0 , , , , , , , +"10015-6" ,"R' wave amplitude.lead III" ,"Elpot" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"3; Cardiac; ECG; EKG.MEASUREMENTS; Electrical potential; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave Amp L-III; R wave Amp L-III; Random; Right; Voltage" ,"R' wave Amp L-III" ,"Observation", , , ,"mV" ,"R' wave amplitude in lead III" , , ,"mV" , , , , ,0 ,0 ,0 , , , , , , , +"10016-4" ,"R' wave amplitude.lead V1" ,"Elpot" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"Cardiac; ECG; EKG.MEASUREMENTS; Electrical potential; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave Amp L-V1; R wave Amp L-V1; Random; Right; Voltage" ,"R' wave Amp L-V1" ,"Observation", , , ,"mV" ,"R' wave amplitude in lead V1" , , ,"mV" , , , , ,0 ,0 ,0 , , , , , , , +"1001-7" ,"DBG Ab" ,"Pr" ,"Pt" ,"Ser/Plas^donor" ,"Ord" , ,"BLDBK" ,"2.44" ,"MIN" , ,"ACTIVE", ,1 , , , , , , , ,"ABS; Aby; Antby; Anti; Antibodies; Antibody; Autoantibodies; Autoantibody; BLOOD BANK; Donna Bennett-Goodspeed; Donr; Ordinal; Pl; Plasma; Plsm; Point in time; QL; Qual; Qualitative; Random; Screen; SerP; SerPl; SerPl^donor; SerPlas; Serum; Serum or plasma; SR" ,"DBG Ab SerPl Donr Ql" ,"Observation", , , , ,"DBG Ab [Presence] in Serum or Plasma from donor" , , , , , , ,"The Property has been changed from ACnc to Pr (Presence) to reflect the new model for ordinal terms where results are based on presence or absence." ,0 ,0 ,0 , , , , , , , +"10017-2" ,"R' wave amplitude.lead V2" ,"Elpot" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"Cardiac; ECG; EKG.MEASUREMENTS; Electrical potential; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave Amp L-V2; R wave Amp L-V2; Random; Right; Voltage" ,"R' wave Amp L-V2" ,"Observation", , , ,"mV" ,"R' wave amplitude in lead V2" , , ,"mV" , , , , ,0 ,0 ,0 , , , , , , , +"10018-0" ,"R' wave amplitude.lead V3" ,"Elpot" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"Cardiac; ECG; EKG.MEASUREMENTS; Electrical potential; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave Amp L-V3; R wave Amp L-V3; Random; Right; Voltage" ,"R' wave Amp L-V3" ,"Observation", , , ,"mV" ,"R' wave amplitude in lead V3" , , ,"mV" , , , , ,0 ,0 ,0 , , , , , , , +"10019-8" ,"R' wave amplitude.lead V4" ,"Elpot" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"Cardiac; ECG; EKG.MEASUREMENTS; Electrical potential; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave Amp L-V4; R wave Amp L-V4; Random; Right; Voltage" ,"R' wave Amp L-V4" ,"Observation", , , ,"mV" ,"R' wave amplitude in lead V4" , , ,"mV" , , , , ,0 ,0 ,0 , , , , , , , +"10020-6" ,"R' wave amplitude.lead V5" ,"Elpot" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"Cardiac; ECG; EKG.MEASUREMENTS; Electrical potential; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave Amp L-V5; R wave Amp L-V5; Random; Right; Voltage" ,"R' wave Amp L-V5" ,"Observation", , , ,"mV" ,"R' wave amplitude in lead V5" , , ,"mV" , , , , ,0 ,0 ,0 , , , , , , , +"61438-8" ,"Each time you ate bread, toast or dinner rolls, how much did you usually eat in the past 30D","Find" ,"Pt" ,"^Patient" ,"Ord" ,"PhenX" ,"PHENX" ,"2.44" ,"MIN" , ,"TRIAL" , ,2 , , , ,"Each time you eat bread, toast or dinner rolls, how much do you usually eat?","PhenX.050201100100","N" , ,"Finding; Findings; How much bread in 30D; Last; Ordinal; Point in time; QL; Qual; Qualitative; Random; Screen" ,"How much bread in 30D PhenX", , , , , ,"Each time you ate bread, toast or dinner rolls, how much did you usually eat in the past 30 days [PhenX]", , , , , , , ,0 ,0 ,0 , , , , , , , +"10000-8" ,"R wave duration.lead AVR" ,"Time" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"Cardiac; Durat; ECG; EKG.MEASUREMENTS; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave dur L-AVR; R wave dur L-AVR; Random; Right" ,"R wave dur L-AVR" ,"Observation", , , ,"s" ,"R wave duration in lead AVR" , , ,"s" , , , , ,0 ,0 ,0 , , , , , , , +"17787-3" ,"Study report" ,"Find" ,"Pt" ,"Neck>Thyroid gland","Doc" ,"NM" ,"RAD" ,"2.61" ,"MIN" , ,"ACTIVE", ,2 , , , , , , , ,"Document; Finding; Findings; Imaging; Point in time; Radiology; Random; Study report; Thy" ,"NM Thyroid Study report" ,"Both" , , , , ,"NM Thyroid gland Study report" , , , , , , ,"Changed System from ""Thyroid"" for conformance with the LOINC/RadLex unified model.; Method of ""Radnuc"" was changed to ""NM"". The LOINC/RadLex Committee agreed to use a subset of the two-letter DICOM modality codes as the primary modality identifier." ,0 ,0 ,0 ,"IG exists" , , , ,"81220-6;72230-6" ,"1.0l" , +"17788-1" ,"Large unstained cells/100 leukocytes" ,"NFr" ,"Pt" ,"Bld" ,"Qn" ,"Automated count","HEM/BC" ,"2.50" ,"MIN" ,"Part of auto diff output of Bayer H*3S; peroxidase negative cells too large to be classified as lymph or basophil" ,"ACTIVE", ,1 , , , , , ,"Y" ,"%" ,"100WBC; Auto; Automated detection; Blood; Cell; Cellularity; Elec; Elect; Electr; HEMATOLOGY/CELL COUNTS; Leuc; Leuk; Leukocyte; Lkcs; LUC; Number Fraction; Percent; Point in time; QNT; Quan; Quant; Quantitative; Random; WB; WBC; WBCs; White blood cell; White blood cells; Whole blood" ,"LUC/leuk NFr Bld Auto" ,"Observation", , , ,"%" ,"Large unstained cells/100 leukocytes in Blood by Automated count" , , ,"%" , , , , ,1894 ,0 ,1894 , , , , , ,"1.0l" , +"11488-4" ,"Consultation note" ,"Find" ,"Pt" ,"{Setting}" ,"Doc" ,"{Role}" ,"DOC.ONTOLOGY","2.63" ,"MIN" , ,"ACTIVE", ,2 , , , , , , , ,"Consult note; DOC.ONT; Document; Encounter; Evaluation and management; Evaluation and management note; Finding; Findings; notes; Point in time; Random; Visit note" ,"Consult note" ,"Both" , , , , ,"Consult note" , , , , , , ,"Edit made because this term is conformant to the Document Ontology axis values and therefore are being placed in this class.; Based on Clinical LOINC Committee decision during the September 2014 meeting, {Provider} was changed to {Author Type} to emphasize a greater breadth of potential document authors. At the September 2015 Clinical LOINC Committee meeting, the Committee decided to change {Author Type} to {Role} to align with the 'Role' axis name in the LOINC Document Ontology.; Because it is too difficult to maintain and because the distinction between documents and sections is not clear-cut nor necessary in most cases, the DOCUMENT_SECTION field has been deemed to have little value. The field has been set to null in the December 2017 release in preparation for removal in the December 2018 release. These changes were approved by the Clinical LOINC Committee.",0 ,0 ,0 ,"IG exists" , , , ,"81222-2;72231-4;81243-8","1.0j-a" ,"Y" +"47239-9" ,"Reason for stopping HIV Rx" ,"Type" ,"Pt" ,"^Patient" ,"Nom" ,"Reported" ,"ART" ,"2.50" ,"MIN" ,"Reason for stopping antiretroviral therapy" ,"ACTIVE", ,2 , , , , , ,"N" , ,"AIDS; Anti-retroviral therapy; ART; Human immunodeficiency virus; Nominal; Point in time; Random; Treatment; Typ" ,"Reason for stopping HIV Rx" ,"Observation", , ,"Copyright © 2006 World Health Organization. Used with permission. Publications of the World Health Organization can be obtained from WHO Press, World Health Organization, 20 Avenue Appia, 1211 Geneva 27, Switzerland (tel: +41 22 791 2476; fax: +41 22 791 4857; email: bookorders@who.int). Requests for permission to reproduce or translate WHO publications – whether for sale or for noncommercial distribution – should be addressed to WHO Press, at the above address (fax: +41 22 791 4806; email: permissions@who.int). The designations employed and the presentation of the material in this publication do not imply the expression of any opinion whatsoever on the part of the World Health Organization concerning the legal status of any country, territory, city or area or of its authorities, or concerning the delimitation of its frontiers or boundaries. Dotted lines on maps represent approximate border lines for which there may not yet be full agreement. The mention of specific companies or of certain manufacturers’ products does not imply that they are endorsed or recommended by the World Health Organization in preference to others of a similar nature that are not mentioned. Errors and omissions excepted, the names of proprietary products are distinguished by initial capital letters. All reasonable precautions have been taken by WHO to verify the information contained in this publication. However, the published material is being distributed without warranty of any kind, either express or implied. The responsibility for the interpretation and use of the material lies with the reader. In no event shall the World Health Organization be liable for damages arising from its use.", ,"Reason for stopping HIV treatment" , , , , , , , ,0 ,0 ,0 , ,"WHO_HIV" , , , ,"2.22" , diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/PanelsAndForms/LoincAnswerListLink.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/PanelsAndForms/LoincAnswerListLink.csv new file mode 100644 index 00000000000..820602c77ad --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/PanelsAndForms/LoincAnswerListLink.csv @@ -0,0 +1,11 @@ +"LoincNumber","LongCommonName" ,"AnswerListId","AnswerListName" ,"AnswerListLinkType","ApplicableContext" +"61438-8" ,"Each time you ate bread, toast or dinner rolls, how much did you usually eat in the past 30 days [PhenX]","LL1000-0" ,"PhenX05_13_30D bread amt","NORMATIVE" , +"10061-0" ,"S' wave amplitude in lead I" ,"LL1311-1" ,"PhenX12_44" ,"EXAMPLE" , +"10331-7" ,"Rh [Type] in Blood" ,"LL360-9" ,"Pos|Neg" ,"EXAMPLE" , +"10389-5" ,"Blood product.other [Type]" ,"LL2413-4" ,"Othr bld prod" ,"EXAMPLE" , +"10390-3" ,"Blood product special preparation [Type]" ,"LL2422-5" ,"Blood prod treatment" ,"EXAMPLE" , +"10393-7" ,"Factor IX given [Type]" ,"LL2420-9" ,"Human/Recomb" ,"EXAMPLE" , +"10395-2" ,"Factor VIII given [Type]" ,"LL2420-9" ,"Human/Recomb" ,"EXAMPLE" , +"10401-8" ,"Immune serum globulin given [Type]" ,"LL2421-7" ,"IM/IV" ,"EXAMPLE" , +"10410-9" ,"Plasma given [Type]" ,"LL2417-5" ,"Plasma type" ,"EXAMPLE" , +"10568-4" ,"Clarity of Semen" ,"LL2427-4" ,"Clear/Opales/Milky" ,"EXAMPLE" , diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/PartFile/LoincPartLink.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/PartFile/LoincPartLink.csv new file mode 100644 index 00000000000..36c84f3fe95 --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/PartFile/LoincPartLink.csv @@ -0,0 +1,10 @@ +"LoincNumber","LongCommonName","PartNumber","PartName","PartCodeSystem","PartTypeName","LinkTypeName","Property" +"10013-1","R' wave amplitude in lead I","LP31101-6","R' wave amplitude.lead I","http://loinc.org","COMPONENT","Primary","http://loinc.org/property/COMPONENT" +"10013-1","R' wave amplitude in lead I","LP6802-5","Elpot","http://loinc.org","PROPERTY","Primary","http://loinc.org/property/PROPERTY" +"10013-1","R' wave amplitude in lead I","LP6960-1","Pt","http://loinc.org","TIME","Primary","http://loinc.org/property/TIME_ASPCT" +"10013-1","R' wave amplitude in lead I","LP7289-4","Heart","http://loinc.org","SYSTEM","Primary","http://loinc.org/property/SYSTEM" +"10013-1","R' wave amplitude in lead I","LP7753-9","Qn","http://loinc.org","SCALE","Primary","http://loinc.org/property/SCALE_TYP" +"10013-1","R' wave amplitude in lead I","LP6244-0","EKG","http://loinc.org","METHOD","Primary","http://loinc.org/property/METHOD_TYP" +"10013-1","R' wave amplitude in lead I","LP31101-6","R' wave amplitude.lead I","http://loinc.org","COMPONENT","DetailedModel","http://loinc.org/property/analyte" +"10013-1","R' wave amplitude in lead I","LP6802-5","Elpot","http://loinc.org","PROPERTY","DetailedModel","http://loinc.org/property/PROPERTY" +"10013-1","R' wave amplitude in lead I","LP6960-1","Pt","http://loinc.org","TIME","DetailedModel","http://loinc.org/property/time-core" diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/PartFile/LoincPartLink_Primary.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/PartFile/LoincPartLink_Primary.csv new file mode 100644 index 00000000000..8dbe575ffd2 --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/PartFile/LoincPartLink_Primary.csv @@ -0,0 +1,7 @@ +"LoincNumber","LongCommonName" ,"PartNumber","PartName" ,"PartCodeSystem" ,"PartTypeName","LinkTypeName","Property" +"10013-1" ,"R' wave amplitude in lead I","LP31101-6" ,"R' wave amplitude.lead I","http://loinc.org","COMPONENT" ,"Primary" ,"http://loinc.org/property/COMPONENT" +"10013-1" ,"R' wave amplitude in lead I","LP6802-5" ,"Elpot" ,"http://loinc.org","PROPERTY" ,"Primary" ,"http://loinc.org/property/PROPERTY" +"10013-1" ,"R' wave amplitude in lead I","LP6960-1" ,"Pt" ,"http://loinc.org","TIME" ,"Primary" ,"http://loinc.org/property/TIME_ASPCT" +"10013-1" ,"R' wave amplitude in lead I","LP7289-4" ,"Heart" ,"http://loinc.org","SYSTEM" ,"Primary" ,"http://loinc.org/property/SYSTEM" +"10013-1" ,"R' wave amplitude in lead I","LP7753-9" ,"Qn" ,"http://loinc.org","SCALE" ,"Primary" ,"http://loinc.org/property/SCALE_TYP" +"10013-1" ,"R' wave amplitude in lead I","LP6244-0" ,"EKG" ,"http://loinc.org","METHOD" ,"Primary" ,"http://loinc.org/property/METHOD_TYP" diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/PartFile/LoincPartLink_Supplementary.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/PartFile/LoincPartLink_Supplementary.csv new file mode 100644 index 00000000000..869c2c1651d --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/PartFile/LoincPartLink_Supplementary.csv @@ -0,0 +1,13 @@ +"LoincNumber","LongCommonName" ,"PartNumber","PartName" ,"PartCodeSystem" ,"PartTypeName","LinkTypeName" ,"Property" +"10013-1" ,"R' wave amplitude in lead I","LP31101-6" ,"R' wave amplitude.lead I","http://loinc.org","COMPONENT" ,"DetailedModel" ,"http://loinc.org/property/analyte" +"10013-1" ,"R' wave amplitude in lead I","LP6802-5" ,"Elpot" ,"http://loinc.org","PROPERTY" ,"DetailedModel" ,"http://loinc.org/property/PROPERTY" +"10013-1" ,"R' wave amplitude in lead I","LP6960-1" ,"Pt" ,"http://loinc.org","TIME" ,"DetailedModel" ,"http://loinc.org/property/time-core" +"10013-1" ,"R' wave amplitude in lead I","LP7289-4" ,"Heart" ,"http://loinc.org","SYSTEM" ,"DetailedModel" ,"http://loinc.org/property/system-core" +"10013-1" ,"R' wave amplitude in lead I","LP7753-9" ,"Qn" ,"http://loinc.org","SCALE" ,"DetailedModel" ,"http://loinc.org/property/SCALE_TYP" +"10013-1" ,"R' wave amplitude in lead I","LP6244-0" ,"EKG" ,"http://loinc.org","METHOD" ,"DetailedModel" ,"http://loinc.org/property/METHOD_TYP" +"10013-1" ,"R' wave amplitude in lead I","LP31101-6" ,"R' wave amplitude.lead I","http://loinc.org","COMPONENT" ,"SyntaxEnhancement","http://loinc.org/property/analyte-core" +"10013-1" ,"R' wave amplitude in lead I","LP190563-9","Cardiology" ,"http://loinc.org","CLASS" ,"Metadata" ,"http://loinc.org/property/category" +"10013-1" ,"R' wave amplitude in lead I","LP29708-2" ,"Cardiology" ,"http://loinc.org","CLASS" ,"Metadata" ,"http://loinc.org/property/category" +"10013-1" ,"R' wave amplitude in lead I","LP7787-7" ,"Clinical" ,"http://loinc.org","CLASS" ,"Metadata" ,"http://loinc.org/property/category" +"10013-1" ,"R' wave amplitude in lead I","LP7795-0" ,"EKG measurements" ,"http://loinc.org","CLASS" ,"Metadata" ,"http://loinc.org/property/category" +"10013-1" ,"R' wave amplitude in lead I","LP7795-0" ,"EKG.MEAS" ,"http://loinc.org","CLASS" ,"Metadata" ,"http://loinc.org/property/CLASS" diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/PartFile/Part.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/PartFile/Part.csv new file mode 100644 index 00000000000..d5816ead286 --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/PartFile/Part.csv @@ -0,0 +1,46 @@ +"PartNumber","PartTypeName","PartName","PartDisplayName","Status" +"LP101394-7","ADJUSTMENT","adjusted for maternal weight","adjusted for maternal weight","ACTIVE" +"LP101907-6","ADJUSTMENT","corrected for age","corrected for age","ACTIVE" +"LP115711-6","ADJUSTMENT","corrected for background","corrected for background","ACTIVE" +"LP147359-6","ADJUSTMENT","adjusted for body weight","adjusted for body weight","ACTIVE" +"LP173482-3","ADJUSTMENT","1st specimen","1st specimen","DEPRECATED" +"LP173483-1","ADJUSTMENT","post cyanocobalamin",,"ACTIVE" +"LP173484-9","ADJUSTMENT","W hyperextension)",,"ACTIVE" +"LP6244-0","METHOD","EKG","Electrocardiogram (EKG)","ACTIVE" +"LP18172-4","COMPONENT","Interferon.beta","Interferon beta","ACTIVE" +"LP7289-4","SYSTEM","Heart","Heart","ACTIVE" +"LP6960-1","TIME","Pt","Point in time (spot)","ACTIVE" +"LP6802-5","PROPERTY","Elpot","Electrical Potential (Voltage)","ACTIVE" +"LP7753-9","SCALE","Qn","Qn","ACTIVE" +"LP31101-6","COMPONENT","R' wave amplitude.lead I","R' wave amplitude.lead I","ACTIVE" +"LP31102-4","COMPONENT","R' wave amplitude.lead II","R' wave amplitude.lead II","ACTIVE" +"LP31103-2","COMPONENT","R' wave amplitude.lead III","R' wave amplitude.lead III","ACTIVE" +"LP31104-0","COMPONENT","R' wave amplitude.lead V1","R' wave amplitude.lead V1","ACTIVE" +"LP31105-7","COMPONENT","R' wave amplitude.lead V2","R' wave amplitude.lead V2","ACTIVE" +"LP31106-5","COMPONENT","R' wave amplitude.lead V3","R' wave amplitude.lead V3","ACTIVE" +"LP31107-3","COMPONENT","R' wave amplitude.lead V4","R' wave amplitude.lead V4","ACTIVE" +"LP31108-1","COMPONENT","R' wave amplitude.lead V5","R' wave amplitude.lead V5","ACTIVE" +"LP31109-9","COMPONENT","R' wave amplitude.lead V6","R' wave amplitude.lead V6","ACTIVE" +"LP31110-7","COMPONENT","R' wave duration.lead AVF","R' wave duration.lead AVF","ACTIVE" +"LP30269-2","SYSTEM","Ser/Plas^donor",,"ACTIVE" +"LP149220-8","PROPERTY","Pr","Presence","ACTIVE" +"LP7751-3","SCALE","Ord","Ord","ACTIVE" +"LP37904-7","COMPONENT","DBG Ab","DBG Ab","ACTIVE" +"LP6813-2","PROPERTY","Find","Finding","ACTIVE" +"LP95333-8","METHOD","PhenX","PhenX","ACTIVE" +"LP102627-9","COMPONENT","Each time you ate bread, toast or dinner rolls, how much did you usually eat in the past 30D","Each time you ate bread, toast or dinner rolls, how much did you usually eat in the past 30 days","ACTIVE" +"LP6879-3","PROPERTY","Time","Time (e.g. seconds)","ACTIVE" +"LP31088-5","COMPONENT","R wave duration.lead AVR","R wave duration.lead AVR","ACTIVE" +"LP206647-2","SYSTEM","Neck>Thyroid gland","Thyroid gland","ACTIVE" +"LP208655-3","METHOD","NM","NM","ACTIVE" +"LP32888-7","SCALE","Doc","Doc","ACTIVE" +"LP31534-8","COMPONENT","Study report","Study report","ACTIVE" +"LP7057-5","SYSTEM","Bld","Blood","ACTIVE" +"LP6838-9","PROPERTY","NFr","Number Fraction","ACTIVE" +"LP6141-8","METHOD","Automated count","Automated count","ACTIVE" +"LP15842-5","COMPONENT","Pyridoxine","Pyridoxine","ACTIVE" +"LP19258-0","COMPONENT","Large unstained cells","Large unstained cells","ACTIVE" +"LP32887-9","SYSTEM","{Setting}","{Setting}","ACTIVE" +"LP187178-1","METHOD","{Role}","Role-unspecified","ACTIVE" +"LP72311-1","COMPONENT","Consultation note","Consultation note","ACTIVE" + diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/PartFile/PartRelatedCodeMapping.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/PartFile/PartRelatedCodeMapping.csv new file mode 100644 index 00000000000..495416894ce --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/PartFile/PartRelatedCodeMapping.csv @@ -0,0 +1,12 @@ +"PartNumber","PartName" ,"PartTypeName","ExtCodeId" ,"ExtCodeDisplayName" ,"ExtCodeSystem" ,"Equivalence","ContentOrigin","ExtCodeSystemVersion" ,"ExtCodeSystemCopyrightNotice" +"LP18172-4" ,"Interferon.beta" ,"COMPONENT" ," 420710006","Interferon beta (substance)" ,"http://snomed.info/sct" ,"equivalent" ,"Both" ,"http://snomed.info/sct/900000000000207008/version/20170731","This material includes SNOMED Clinical Terms® (SNOMED CT®) which is used by permission of the International Health Terminology Standards Development Organisation (IHTSDO) under license. All rights reserved. SNOMED CT® was originally created by The College of American Pathologists. “SNOMED” and “SNOMED CT” are registered trademarks of the IHTSDO.This material includes content from the US Edition to SNOMED CT, which is developed and maintained by the U.S. National Library of Medicine and is available to authorized UMLS Metathesaurus Licensees from the UTS Downloads site at https://uts.nlm.nih.gov.Use of SNOMED CT content is subject to the terms and conditions set forth in the SNOMED CT Affiliate License Agreement. It is the responsibility of those implementing this product to ensure they are appropriately licensed and for more information on the license, including how to register as an Affiliate Licensee, please refer to http://www.snomed.org/snomed-ct/get-snomed-ct or info@snomed.org<mailto:info@snomed.org>. This may incur a fee in SNOMED International non-Member countries." +"LP31706-2" ,"Nornicotine" ,"COMPONENT" ,"1018001" ,"Nornicotine (substance)" ,"http://snomed.info/sct" ,"equivalent" ,"Both" ,"http://snomed.info/sct/900000000000207008/version/20170731","This material includes SNOMED Clinical Terms® (SNOMED CT®) which is used by permission of the International Health Terminology Standards Development Organisation (IHTSDO) under license. All rights reserved. SNOMED CT® was originally created by The College of American Pathologists. “SNOMED” and “SNOMED CT” are registered trademarks of the IHTSDO.This material includes content from the US Edition to SNOMED CT, which is developed and maintained by the U.S. National Library of Medicine and is available to authorized UMLS Metathesaurus Licensees from the UTS Downloads site at https://uts.nlm.nih.gov.Use of SNOMED CT content is subject to the terms and conditions set forth in the SNOMED CT Affiliate License Agreement. It is the responsibility of those implementing this product to ensure they are appropriately licensed and for more information on the license, including how to register as an Affiliate Licensee, please refer to http://www.snomed.org/snomed-ct/get-snomed-ct or info@snomed.org<mailto:info@snomed.org>. This may incur a fee in SNOMED International non-Member countries." +"LP15826-8" ,"Prostaglandin F2","COMPONENT" ,"10192006" ,"Prostaglandin PGF2 (substance)" ,"http://snomed.info/sct" ,"equivalent" ,"Both" ,"http://snomed.info/sct/900000000000207008/version/20170731","This material includes SNOMED Clinical Terms® (SNOMED CT®) which is used by permission of the International Health Terminology Standards Development Organisation (IHTSDO) under license. All rights reserved. SNOMED CT® was originally created by The College of American Pathologists. “SNOMED” and “SNOMED CT” are registered trademarks of the IHTSDO.This material includes content from the US Edition to SNOMED CT, which is developed and maintained by the U.S. National Library of Medicine and is available to authorized UMLS Metathesaurus Licensees from the UTS Downloads site at https://uts.nlm.nih.gov.Use of SNOMED CT content is subject to the terms and conditions set forth in the SNOMED CT Affiliate License Agreement. It is the responsibility of those implementing this product to ensure they are appropriately licensed and for more information on the license, including how to register as an Affiliate Licensee, please refer to http://www.snomed.org/snomed-ct/get-snomed-ct or info@snomed.org<mailto:info@snomed.org>. This may incur a fee in SNOMED International non-Member countries." +"LP7400-7" ,"Liver" ,"SYSTEM" ,"10200004" ,"Liver structure (body structure)","http://snomed.info/sct" ,"wider" ,"Both" ,"http://snomed.info/sct/900000000000207008/version/20170731","This material includes SNOMED Clinical Terms® (SNOMED CT®) which is used by permission of the International Health Terminology Standards Development Organisation (IHTSDO) under license. All rights reserved. SNOMED CT® was originally created by The College of American Pathologists. “SNOMED” and “SNOMED CT” are registered trademarks of the IHTSDO.This material includes content from the US Edition to SNOMED CT, which is developed and maintained by the U.S. National Library of Medicine and is available to authorized UMLS Metathesaurus Licensees from the UTS Downloads site at https://uts.nlm.nih.gov.Use of SNOMED CT content is subject to the terms and conditions set forth in the SNOMED CT Affiliate License Agreement. It is the responsibility of those implementing this product to ensure they are appropriately licensed and for more information on the license, including how to register as an Affiliate Licensee, please refer to http://www.snomed.org/snomed-ct/get-snomed-ct or info@snomed.org<mailto:info@snomed.org>. This may incur a fee in SNOMED International non-Member countries." +"LP29165-5" ,"Liver.FNA" ,"SYSTEM" ,"10200004" ,"Liver structure (body structure)","http://snomed.info/sct" ,"narrower" ,"Both" ,"http://snomed.info/sct/900000000000207008/version/20170731","This material includes SNOMED Clinical Terms® (SNOMED CT®) which is used by permission of the International Health Terminology Standards Development Organisation (IHTSDO) under license. All rights reserved. SNOMED CT® was originally created by The College of American Pathologists. “SNOMED” and “SNOMED CT” are registered trademarks of the IHTSDO.This material includes content from the US Edition to SNOMED CT, which is developed and maintained by the U.S. National Library of Medicine and is available to authorized UMLS Metathesaurus Licensees from the UTS Downloads site at https://uts.nlm.nih.gov.Use of SNOMED CT content is subject to the terms and conditions set forth in the SNOMED CT Affiliate License Agreement. It is the responsibility of those implementing this product to ensure they are appropriately licensed and for more information on the license, including how to register as an Affiliate Licensee, please refer to http://www.snomed.org/snomed-ct/get-snomed-ct or info@snomed.org<mailto:info@snomed.org>. This may incur a fee in SNOMED International non-Member countries." +"LP15666-8" ,"Inosine" ,"COMPONENT" ,"102640000" ,"Inosine (substance)" ,"http://snomed.info/sct" ,"equivalent" ,"Both" ,"http://snomed.info/sct/900000000000207008/version/20170731","This material includes SNOMED Clinical Terms® (SNOMED CT®) which is used by permission of the International Health Terminology Standards Development Organisation (IHTSDO) under license. All rights reserved. SNOMED CT® was originally created by The College of American Pathologists. “SNOMED” and “SNOMED CT” are registered trademarks of the IHTSDO.This material includes content from the US Edition to SNOMED CT, which is developed and maintained by the U.S. National Library of Medicine and is available to authorized UMLS Metathesaurus Licensees from the UTS Downloads site at https://uts.nlm.nih.gov.Use of SNOMED CT content is subject to the terms and conditions set forth in the SNOMED CT Affiliate License Agreement. It is the responsibility of those implementing this product to ensure they are appropriately licensed and for more information on the license, including how to register as an Affiliate Licensee, please refer to http://www.snomed.org/snomed-ct/get-snomed-ct or info@snomed.org<mailto:info@snomed.org>. This may incur a fee in SNOMED International non-Member countries." +"LP15943-1" ,"Uronate" ,"COMPONENT" ,"102641001" ,"Uronic acid (substance)" ,"http://snomed.info/sct" ,"equivalent" ,"Both" ,"http://snomed.info/sct/900000000000207008/version/20170731","This material includes SNOMED Clinical Terms® (SNOMED CT®) which is used by permission of the International Health Terminology Standards Development Organisation (IHTSDO) under license. All rights reserved. SNOMED CT® was originally created by The College of American Pathologists. “SNOMED” and “SNOMED CT” are registered trademarks of the IHTSDO.This material includes content from the US Edition to SNOMED CT, which is developed and maintained by the U.S. National Library of Medicine and is available to authorized UMLS Metathesaurus Licensees from the UTS Downloads site at https://uts.nlm.nih.gov.Use of SNOMED CT content is subject to the terms and conditions set forth in the SNOMED CT Affiliate License Agreement. It is the responsibility of those implementing this product to ensure they are appropriately licensed and for more information on the license, including how to register as an Affiliate Licensee, please refer to http://www.snomed.org/snomed-ct/get-snomed-ct or info@snomed.org<mailto:info@snomed.org>. This may incur a fee in SNOMED International non-Member countries." +"LP15791-4" ,"Phenylketones" ,"COMPONENT" ,"102642008" ,"Phenylketones (substance)" ,"http://snomed.info/sct" ,"equivalent" ,"Both" ,"http://snomed.info/sct/900000000000207008/version/20170731","This material includes SNOMED Clinical Terms® (SNOMED CT®) which is used by permission of the International Health Terminology Standards Development Organisation (IHTSDO) under license. All rights reserved. SNOMED CT® was originally created by The College of American Pathologists. “SNOMED” and “SNOMED CT” are registered trademarks of the IHTSDO.This material includes content from the US Edition to SNOMED CT, which is developed and maintained by the U.S. National Library of Medicine and is available to authorized UMLS Metathesaurus Licensees from the UTS Downloads site at https://uts.nlm.nih.gov.Use of SNOMED CT content is subject to the terms and conditions set forth in the SNOMED CT Affiliate License Agreement. It is the responsibility of those implementing this product to ensure they are appropriately licensed and for more information on the license, including how to register as an Affiliate Licensee, please refer to http://www.snomed.org/snomed-ct/get-snomed-ct or info@snomed.org<mailto:info@snomed.org>. This may incur a fee in SNOMED International non-Member countries." +"LP15721-1" ,"Malonate" ,"COMPONENT" ,"102648007" ,"Malonic acid (substance)" ,"http://snomed.info/sct" ,"equivalent" ,"Both" ,"http://snomed.info/sct/900000000000207008/version/20170731","This material includes SNOMED Clinical Terms® (SNOMED CT®) which is used by permission of the International Health Terminology Standards Development Organisation (IHTSDO) under license. All rights reserved. SNOMED CT® was originally created by The College of American Pathologists. “SNOMED” and “SNOMED CT” are registered trademarks of the IHTSDO.This material includes content from the US Edition to SNOMED CT, which is developed and maintained by the U.S. National Library of Medicine and is available to authorized UMLS Metathesaurus Licensees from the UTS Downloads site at https://uts.nlm.nih.gov.Use of SNOMED CT content is subject to the terms and conditions set forth in the SNOMED CT Affiliate License Agreement. It is the responsibility of those implementing this product to ensure they are appropriately licensed and for more information on the license, including how to register as an Affiliate Licensee, please refer to http://www.snomed.org/snomed-ct/get-snomed-ct or info@snomed.org<mailto:info@snomed.org>. This may incur a fee in SNOMED International non-Member countries." +"LP15842-5" ,"Pyridoxine" ,"COMPONENT" ,"1054" ,"Pyridoxine" ,"http://pubchem.ncbi.nlm.nih.gov","equivalent" , , , +"LP15842-5" ,"Pyridoxine" ,"COMPONENT" ,"1054" ,"Pyridoxine" ,"http://foo/bar" ,"equivalent" , , , diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/Top2000Results/SI/Top2000CommonLabResultsSi.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/Top2000Results/SI/Top2000CommonLabResultsSi.csv new file mode 100644 index 00000000000..1e9b3872892 --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/Top2000Results/SI/Top2000CommonLabResultsSi.csv @@ -0,0 +1,10 @@ +LOINC #,Long Common Name,Short Name,CLASS,Rank +14682-9,Creatinine [Moles/volume] in Serum or Plasma,Creat SerPl-mCnc,Chem,1 +718-7,Hemoglobin [Mass/volume] in Blood,Hgb Bld-mCnc,HEM/BC,2 +2823-3,Potassium [Moles/volume] in Serum or Plasma,Potassium SerPl-sCnc,Chem,3 +14749-6,Glucose [Moles/volume] in Serum or Plasma,Glucose SerPl-mCnc,Chem,4 +2951-2,Sodium [Moles/volume] in Serum or Plasma,Sodium SerPl-sCnc,Chem,5 +3094-0,Urea nitrogen [Mass/volume] in Serum or Plasma,BUN SerPl-mCnc,Chem,6 +2028-9,"Carbon dioxide, total [Moles/volume] in Serum or Plasma",CO2 SerPl-sCnc,Chem,7 +2075-0,Chloride [Moles/volume] in Serum or Plasma,Chloride SerPl-sCnc,Chem,8 +789-8,Erythrocytes [#/volume] in Blood by Automated count,RBC # Bld Auto,HEM/BC,9 diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/Top2000Results/US/Top2000CommonLabResultsUs.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/Top2000Results/US/Top2000CommonLabResultsUs.csv new file mode 100644 index 00000000000..c80db052dd3 --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/Top2000Results/US/Top2000CommonLabResultsUs.csv @@ -0,0 +1,10 @@ +LOINC #,Long Common Name,Short Name,CLASS,Rank +2160-0,Creatinine [Mass/volume] in Serum or Plasma,Creat SerPl-mCnc,Chem,1 +718-7,Hemoglobin [Mass/volume] in Blood,Hgb Bld-mCnc,HEM/BC,2 +2823-3,Potassium [Moles/volume] in Serum or Plasma,Potassium SerPl-sCnc,Chem,3 +2345-7,Glucose [Mass/volume] in Serum or Plasma,Glucose SerPl-mCnc,Chem,4 +2951-2,Sodium [Moles/volume] in Serum or Plasma,Sodium SerPl-sCnc,Chem,5 +3094-0,Urea nitrogen [Mass/volume] in Serum or Plasma,BUN SerPl-mCnc,Chem,6 +2028-9,"Carbon dioxide, total [Moles/volume] in Serum or Plasma",CO2 SerPl-sCnc,Chem,7 +2075-0,Chloride [Moles/volume] in Serum or Plasma,Chloride SerPl-sCnc,Chem,8 +789-8,Erythrocytes [#/volume] in Blood by Automated count,RBC # Bld Auto,HEM/BC,9 diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/LoincTable/Loinc.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/LoincTable/Loinc.csv new file mode 100644 index 00000000000..c519331fc53 --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/LoincTable/Loinc.csv @@ -0,0 +1,16 @@ +"LOINC_NUM","COMPONENT" ,"PROPERTY","TIME_ASPCT","SYSTEM" ,"SCALE_TYP","METHOD_TYP" ,"CLASS" ,"VersionLastChanged","CHNG_TYPE","DefinitionDescription" ,"STATUS","CONSUMER_NAME","CLASSTYPE","FORMULA","SPECIES","EXMPL_ANSWERS","SURVEY_QUEST_TEXT" ,"SURVEY_QUEST_SRC" ,"UNITSREQUIRED","SUBMITTED_UNITS","RELATEDNAMES2" ,"SHORTNAME" ,"ORDER_OBS" ,"CDISC_COMMON_TESTS","HL7_FIELD_SUBFIELD_ID","EXTERNAL_COPYRIGHT_NOTICE" ,"EXAMPLE_UNITS","LONG_COMMON_NAME" ,"UnitsAndRange","DOCUMENT_SECTION","EXAMPLE_UCUM_UNITS","EXAMPLE_SI_UCUM_UNITS","STATUS_REASON","STATUS_TEXT","CHANGE_REASON_PUBLIC" ,"COMMON_TEST_RANK","COMMON_ORDER_RANK","COMMON_SI_TEST_RANK","HL7_ATTACHMENT_STRUCTURE","EXTERNAL_COPYRIGHT_LINK","PanelType","AskAtOrderEntry","AssociatedObservations" ,"VersionFirstReleased","ValidHL7AttachmentRequest" +"10013-1" ,"v2.69 R' wave amplitude.lead I" ,"Elpot" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"Cardiac; ECG; EKG.MEASUREMENTS; Electrical potential; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave Amp L-I; R wave Amp L-I; Random; Right; Voltage" ,"R' wave Amp L-I" ,"Observation", , , ,"mV" ,"R' wave amplitude in lead I" , , ,"mV" , , , , ,0 ,0 ,0 , , , , , , , +"10014-9" ,"v2.69 R' wave amplitude.lead II" ,"Elpot" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"2; Cardiac; ECG; EKG.MEASUREMENTS; Electrical potential; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave Amp L-II; R wave Amp L-II; Random; Right; Voltage" ,"R' wave Amp L-II" ,"Observation", , , ,"mV" ,"R' wave amplitude in lead II" , , ,"mV" , , , , ,0 ,0 ,0 , , , , , , , +"10015-6" ,"v2.69 R' wave amplitude.lead III" ,"Elpot" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"3; Cardiac; ECG; EKG.MEASUREMENTS; Electrical potential; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave Amp L-III; R wave Amp L-III; Random; Right; Voltage" ,"R' wave Amp L-III" ,"Observation", , , ,"mV" ,"R' wave amplitude in lead III" , , ,"mV" , , , , ,0 ,0 ,0 , , , , , , , +"10016-4" ,"v2.69 R' wave amplitude.lead V1" ,"Elpot" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"Cardiac; ECG; EKG.MEASUREMENTS; Electrical potential; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave Amp L-V1; R wave Amp L-V1; Random; Right; Voltage" ,"R' wave Amp L-V1" ,"Observation", , , ,"mV" ,"R' wave amplitude in lead V1" , , ,"mV" , , , , ,0 ,0 ,0 , , , , , , , +"1001-7" ,"v2.69 DBG Ab" ,"Pr" ,"Pt" ,"Ser/Plas^donor" ,"Ord" , ,"BLDBK" ,"2.44" ,"MIN" , ,"ACTIVE", ,1 , , , , , , , ,"ABS; Aby; Antby; Anti; Antibodies; Antibody; Autoantibodies; Autoantibody; BLOOD BANK; Donna Bennett-Goodspeed; Donr; Ordinal; Pl; Plasma; Plsm; Point in time; QL; Qual; Qualitative; Random; Screen; SerP; SerPl; SerPl^donor; SerPlas; Serum; Serum or plasma; SR" ,"DBG Ab SerPl Donr Ql" ,"Observation", , , , ,"DBG Ab [Presence] in Serum or Plasma from donor" , , , , , , ,"The Property has been changed from ACnc to Pr (Presence) to reflect the new model for ordinal terms where results are based on presence or absence." ,0 ,0 ,0 , , , , , , , +"10017-2" ,"v2.69 R' wave amplitude.lead V2" ,"Elpot" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"Cardiac; ECG; EKG.MEASUREMENTS; Electrical potential; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave Amp L-V2; R wave Amp L-V2; Random; Right; Voltage" ,"R' wave Amp L-V2" ,"Observation", , , ,"mV" ,"R' wave amplitude in lead V2" , , ,"mV" , , , , ,0 ,0 ,0 , , , , , , , +"10018-0" ,"v2.69 R' wave amplitude.lead V3" ,"Elpot" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"Cardiac; ECG; EKG.MEASUREMENTS; Electrical potential; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave Amp L-V3; R wave Amp L-V3; Random; Right; Voltage" ,"R' wave Amp L-V3" ,"Observation", , , ,"mV" ,"R' wave amplitude in lead V3" , , ,"mV" , , , , ,0 ,0 ,0 , , , , , , , +"10019-8" ,"v2.69 R' wave amplitude.lead V4" ,"Elpot" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"Cardiac; ECG; EKG.MEASUREMENTS; Electrical potential; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave Amp L-V4; R wave Amp L-V4; Random; Right; Voltage" ,"R' wave Amp L-V4" ,"Observation", , , ,"mV" ,"R' wave amplitude in lead V4" , , ,"mV" , , , , ,0 ,0 ,0 , , , , , , , +"10020-6" ,"v2.69 R' wave amplitude.lead V5" ,"Elpot" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"Cardiac; ECG; EKG.MEASUREMENTS; Electrical potential; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave Amp L-V5; R wave Amp L-V5; Random; Right; Voltage" ,"R' wave Amp L-V5" ,"Observation", , , ,"mV" ,"R' wave amplitude in lead V5" , , ,"mV" , , , , ,0 ,0 ,0 , , , , , , , +"61438-8" ,"v2.69 Each time you ate bread, toast or dinner rolls, how much did you usually eat in the past 30D","Find" ,"Pt" ,"^Patient" ,"Ord" ,"PhenX" ,"PHENX" ,"2.44" ,"MIN" , ,"TRIAL" , ,2 , , , ,"Each time you eat bread, toast or dinner rolls, how much do you usually eat?","PhenX.050201100100","N" , ,"Finding; Findings; How much bread in 30D; Last; Ordinal; Point in time; QL; Qual; Qualitative; Random; Screen" ,"How much bread in 30D PhenX", , , , , ,"Each time you ate bread, toast or dinner rolls, how much did you usually eat in the past 30 days [PhenX]", , , , , , , ,0 ,0 ,0 , , , , , , , +"10000-8" ,"v2.69 R wave duration.lead AVR" ,"Time" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"Cardiac; Durat; ECG; EKG.MEASUREMENTS; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave dur L-AVR; R wave dur L-AVR; Random; Right" ,"R wave dur L-AVR" ,"Observation", , , ,"s" ,"R wave duration in lead AVR" , , ,"s" , , , , ,0 ,0 ,0 , , , , , , , +"17787-3" ,"v2.69 Study report" ,"Find" ,"Pt" ,"Neck>Thyroid gland","Doc" ,"NM" ,"RAD" ,"2.61" ,"MIN" , ,"ACTIVE", ,2 , , , , , , , ,"Document; Finding; Findings; Imaging; Point in time; Radiology; Random; Study report; Thy" ,"NM Thyroid Study report" ,"Both" , , , , ,"NM Thyroid gland Study report" , , , , , , ,"Changed System from ""Thyroid"" for conformance with the LOINC/RadLex unified model.; Method of ""Radnuc"" was changed to ""NM"". The LOINC/RadLex Committee agreed to use a subset of the two-letter DICOM modality codes as the primary modality identifier." ,0 ,0 ,0 ,"IG exists" , , , ,"81220-6;72230-6" ,"1.0l" , +"17788-1" ,"v2.69 Large unstained cells/100 leukocytes" ,"NFr" ,"Pt" ,"Bld" ,"Qn" ,"Automated count","HEM/BC" ,"2.50" ,"MIN" ,"Part of auto diff output of Bayer H*3S; peroxidase negative cells too large to be classified as lymph or basophil" ,"ACTIVE", ,1 , , , , , ,"Y" ,"%" ,"100WBC; Auto; Automated detection; Blood; Cell; Cellularity; Elec; Elect; Electr; HEMATOLOGY/CELL COUNTS; Leuc; Leuk; Leukocyte; Lkcs; LUC; Number Fraction; Percent; Point in time; QNT; Quan; Quant; Quantitative; Random; WB; WBC; WBCs; White blood cell; White blood cells; Whole blood" ,"LUC/leuk NFr Bld Auto" ,"Observation", , , ,"%" ,"Large unstained cells/100 leukocytes in Blood by Automated count" , , ,"%" , , , , ,1894 ,0 ,1894 , , , , , ,"1.0l" , +"11488-4" ,"v2.69 Consultation note" ,"Find" ,"Pt" ,"{Setting}" ,"Doc" ,"{Role}" ,"DOC.ONTOLOGY","2.63" ,"MIN" , ,"ACTIVE", ,2 , , , , , , , ,"Consult note; DOC.ONT; Document; Encounter; Evaluation and management; Evaluation and management note; Finding; Findings; notes; Point in time; Random; Visit note" ,"Consult note" ,"Both" , , , , ,"Consult note" , , , , , , ,"Edit made because this term is conformant to the Document Ontology axis values and therefore are being placed in this class.; Based on Clinical LOINC Committee decision during the September 2014 meeting, {Provider} was changed to {Author Type} to emphasize a greater breadth of potential document authors. At the September 2015 Clinical LOINC Committee meeting, the Committee decided to change {Author Type} to {Role} to align with the 'Role' axis name in the LOINC Document Ontology.; Because it is too difficult to maintain and because the distinction between documents and sections is not clear-cut nor necessary in most cases, the DOCUMENT_SECTION field has been deemed to have little value. The field has been set to null in the December 2017 release in preparation for removal in the December 2018 release. These changes were approved by the Clinical LOINC Committee.",0 ,0 ,0 ,"IG exists" , , , ,"81222-2;72231-4;81243-8","1.0j-a" ,"Y" +"47239-9" ,"v2.69 Reason for stopping HIV Rx" ,"Type" ,"Pt" ,"^Patient" ,"Nom" ,"Reported" ,"ART" ,"2.50" ,"MIN" ,"Reason for stopping antiretroviral therapy" ,"ACTIVE", ,2 , , , , , ,"N" , ,"AIDS; Anti-retroviral therapy; ART; Human immunodeficiency virus; Nominal; Point in time; Random; Treatment; Typ" ,"Reason for stopping HIV Rx" ,"Observation", , ,"Copyright © 2006 World Health Organization. Used with permission. Publications of the World Health Organization can be obtained from WHO Press, World Health Organization, 20 Avenue Appia, 1211 Geneva 27, Switzerland (tel: +41 22 791 2476; fax: +41 22 791 4857; email: bookorders@who.int). Requests for permission to reproduce or translate WHO publications – whether for sale or for noncommercial distribution – should be addressed to WHO Press, at the above address (fax: +41 22 791 4806; email: permissions@who.int). The designations employed and the presentation of the material in this publication do not imply the expression of any opinion whatsoever on the part of the World Health Organization concerning the legal status of any country, territory, city or area or of its authorities, or concerning the delimitation of its frontiers or boundaries. Dotted lines on maps represent approximate border lines for which there may not yet be full agreement. The mention of specific companies or of certain manufacturers’ products does not imply that they are endorsed or recommended by the World Health Organization in preference to others of a similar nature that are not mentioned. Errors and omissions excepted, the names of proprietary products are distinguished by initial capital letters. All reasonable precautions have been taken by WHO to verify the information contained in this publication. However, the published material is being distributed without warranty of any kind, either express or implied. The responsibility for the interpretation and use of the material lies with the reader. In no event shall the World Health Organization be liable for damages arising from its use.", ,"Reason for stopping HIV treatment" , , , , , , , ,0 ,0 ,0 , ,"WHO_HIV" , , , ,"2.22" , diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/loinc.xml b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/loinc.xml new file mode 100644 index 00000000000..15f65f5766e --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/loinc.xml @@ -0,0 +1,543 @@ +<!-- +LOINC is a freely available international standard for tests, measurements, and observations. It is a well maintained, version independent code system. + +Use of LOINC is governed by the LOINC License: https://loinc.org/license/ + +This CodeSystem resource describes 'LOINC' independent of any particular version. There are notes about changes for version specific LOINC code system resources. + +Note that the following set of codes are defined by the LOINC code systems: + - the main LOINC codes + - the LOINC Answer codes (LA) and the LOINC Answer list codes (LL) + - the LOINC Part codes (LP) in the Multiaxial Hierarchy + - the LOINC Part codes (LP) for the properties + Note: there are license restrictions on the use of LOINC Part codes + - the LOINC Group codes (LG) + Note: presently the LOINC Group codes are used to identify these roll-up groups as ValueSets, but are not yet loaded as codes in the CodeSystem + +Servers may generate variants of this for the LOINC version(s) and features they support. + +--> + +<CodeSystem xmlns="http://hl7.org/fhir"> + <id value="loinc"/> + + <!-- + This url is unchanged for all versions of LOINC. There can only be one correct Code System resource for each value of the version attribute (at least, only one per server). + --> + <url value="http://loinc.org"/> + + <!-- the HL7 v3 OID assigned to LOINC --> + <identifier> + <system value="urn:ietf:rfc:3986"/> + <value value="urn:oid:2.16.840.1.113883.6.1"/> + </identifier> + +<!-- <version value="2.69"/>--> + + <!-- + If a specific version is specified, the name should carry this information (e.g. LOINC_270). + --> + <name value="LOINC"/> + <title value="LOINC Code System (Testing Copy)"/> + <status value="active"/> + <experimental value="false"/> + + <publisher value="Regenstrief Institute, Inc."/> + <contact> + <telecom> + <system value="url" /> + <value value="http://loinc.org"/> + </telecom> + </contact> + + <!-- + <date value=2021-06/> + --> + <description value="LOINC is a freely available international standard for tests, measurements, and observations"/> + <copyright value="This material contains content from LOINC (http://loinc.org). LOINC is copyright ©1995-2021, Regenstrief Institute, Inc. and the Logical Observation Identifiers Names and Codes (LOINC) Committee and is available at no cost under the license at http://loinc.org/license. LOINC® is a registered United States trademark of Regenstrief Institute, Inc."/> + <caseSensitive value="false"/> + + <valueSet value="http://loinc.org/vs"/> + + <!-- + It's at the discretion of servers whether to present fragments of LOINC hierarchically or not, when using the code system resource. But, if they are hierarchical, the Hierarchy SHALL be based on the is-a relationship that is derived from the LOINC Multiaxial Hierarchy. + --> + <hierarchyMeaning value="is-a"/> + <compositional value="false"/> <!-- no compositional grammar in LOINC --> + <versionNeeded value="false"/> + + <!-- + This canonical definition of LOINC does not include the LOINC content, which is distributed separately for portability. + + Servers may choose to include fragments of LOINC for illustration purposes. + --> + <content value="not-present"/> + + <!-- + <count value="65000"/> + If working with a specific version, you could nominate a count of the total number of concepts (including the answers, Hierarchy, etc.). In this canonical definition we do not. + --> + + <!-- + FILTERS + Generally defined filters for specifying value sets + In LOINC, all the properties can also be used as filters, but they are not defined explicitly as filters. + Parent/child properties are as defined by FHIR. Note that at this time the LOINC code system resource does not support ancestor/descendant relationships. + + For illustration purposes, consider this slice of the LOINC Multiaxial Hierarchy when reading the descriptions below: + + Laboratory [LP29693-6] + Microbiology and Antimicrobial susceptibility [LP343406-7] + Microbiology [LP7819-8] + Microorganism [LP14559-6] + Virus [LP14855-8] + Zika virus [LP200137-0] + Zika virus RNA | XXX [LP203271-4] + Zika virus RNA | XXX | Microbiology [LP379670-5] + Zika virus RNA [Presence] in Unspecified specimen by Probe and target amplification method [79190-5] + + Language Note: The filters defined here are specified using the default LOINC language - English (US). Requests are meant to be specified and interpreted on the English version. The return can be in a specified language (if supported by the server). But note that not all filters/properties have language translations available. + --> + <filter> + <code value="parent"/> + <description value="Allows for the selection of a set of codes based on their appearance in the LOINC Multiaxial Hierarchy. Parent selects immediate parent only. For example, the code '79190-5' has the parent 'LP379670-5'"/> + <operator value="="/> + <value value="A Part code"/> + </filter> + <filter> + <code value="child"/> + <description value="Allows for the selection of a set of codes based on their appearance in the LOINC Multiaxial Hierarchy. Child selects immediate children only. For example, the code 'LP379670-5' has the child '79190-5'. Only LOINC Parts have children; LOINC codes do not have any children because they are leaf nodes."/> + <operator value="="/> + <value value="A comma separated list of Part or LOINC codes"/> + </filter> + <filter> + <code value="copyright"/> + <description value="Allows for the inclusion or exclusion of LOINC codes that include 3rd party copyright notices. LOINC = only codes with a sole copyright by Regenstrief. 3rdParty = only codes with a 3rd party copyright in addition to the one from Regenstrief"/> + <operator value="="/> + <value value="LOINC | 3rdParty"/> + </filter> + + <!-- + PROPERTIES + There are 4 kinds of properties that apply to all LOINC codes: + 1. FHIR: display, designation; these are not described here since they are inherent in the specification + 2. Infrastructural: defined by FHIR, but documented here for the LOINC Multiaxial Hierarchy + 3. Primary LOINC properties: defined by the main LOINC table + 4. Secondary LOINC properties: defined by the LoincPartLink table + Additionally, there are 2 kinds of properties specific to Document ontology and Radiology codes, respectively: + 1. LOINC/RSNA Radiology Playbook properties + 2. Document Ontology properties + --> + <!-- + Infrastructural properties - inherited from FHIR, but documented here for the LOINC Multiaxial Hierarchy. + --> + + <property> + <code value="parent"/> + <uri value="http://hl7.org/fhir/concept-properties#parent"/> + <description value="A parent code in the Multiaxial Hierarchy"/> + <type value="code"/> + </property> + <property> + <code value="child"/> + <uri value="http://hl7.org/fhir/concept-properties#child"/> + <description value="A child code in the Multiaxial Hierarchy"/> + <type value="code"/> + </property> + + <!-- + Primary LOINC properties. + These apply to the main LOINC codes, but not the Multiaxial Hierarchy, Answer lists, or the Part codes. + Notes: + In the LOINC code system resource, the display element = LONG_COMMON_NAME + Many properties are specified as type "Coding", which allows use of LOINC Part codes (LP-) and the display text. LOINC Parts and their associations to LOINC terms are published in the LOINC Part File. + The properties defined here follow the guidance of the LOINC Users' Guide, which states that they should be expressed with the LOINC attributes contained in the LOINC Table. Properties that are not defined in the LOINC Table use FHIR-styled names. + --> + + <property> + <code value="STATUS"/> + <uri value="http://loinc.org/property/STATUS"/> + <description value="Status of the term. Within LOINC, codes with STATUS=DEPRECATED are considered inactive. Current values: ACTIVE, TRIAL, DISCOURAGED, and DEPRECATED"/> + <type value="string"/> + </property> + <property> + <code value="COMPONENT"/> + <uri value="http://loinc.org/property/COMPONENT"/> + <description value="First major axis-component or analyte: Analyte Name, Analyte sub-class, Challenge"/> + <type value="Coding"/> + </property> + <property> + <code value="PROPERTY"/> + <uri value="http://loinc.org/property/PROPERTY"/> + <description value="Second major axis-property observed: Kind of Property (also called kind of quantity)"/> + <type value="Coding"/> + </property> + <property> + <code value="TIME_ASPCT"/> + <uri value="http://loinc.org/property/TIME_ASPCT"/> + <description value="Third major axis-timing of the measurement: Time Aspect (Point or moment in time vs. time interval)"/> + <type value="Coding"/> + </property> + <property> + <code value="SYSTEM"/> + <uri value="http://loinc.org/property/SYSTEM"/> + <description value="Fourth major axis-type of specimen or system: System (Sample) Type"/> + <type value="Coding"/> + </property> + <property> + <code value="SCALE_TYP"/> + <uri value="http://loinc.org/property/SCALE_TYP"/> + <description value="Fifth major axis-scale of measurement: Type of Scale"/> + <type value="Coding"/> + </property> + <property> + <code value="METHOD_TYP"/> + <uri value="http://loinc.org/property/METHOD_TYP"/> + <description value="Sixth major axis-method of measurement: Type of Method"/> + <type value="Coding"/> + </property> + <property> + <code value="CLASS"/> + <uri value="http://loinc.org/property/CLASS"/> + <description value="An arbitrary classification of terms for grouping related observations together"/> + <type value="Coding"/> + </property> + <property> + <code value="VersionLastChanged"/> + <uri value="http://loinc.org/property/VersionLastChanged"/> + <description value="The LOINC version number in which the record has last changed. For new records, this field contains the same value as the VersionFirstReleased property."/> + <type value="string"/> + </property> + <property> + <code value="CLASSTYPE"/> + <uri value="http://loinc.org/property/CLASSTYPE"/> + <description value="1=Laboratory class; 2=Clinical class; 3=Claims attachments; 4=Surveys"/> + <type value="string"/> + </property> + <property> + <code value="ORDER_OBS"/> + <uri value="http://loinc.org/property/ORDER_OBS"/> + <description value="Provides users with an idea of the intended use of the term by categorizing it as an order only, observation only, or both"/> + <type value="string"/> + </property> + <property> + <code value="HL7_ATTACHMENT_STRUCTURE"/> + <uri value="http://loinc.org/property/HL7_ATTACHMENT_STRUCTURE"/> + <description value="This property is populated in collaboration with the HL7 Payer-Provider Exchange (PIE) Work Group (previously called Attachments Work Group) as described in the HL7 Attachment Specification: Supplement to Consolidated CDA Templated Guide."/> + <type value="string"/> + </property> + <property> + <code value="VersionFirstReleased"/> + <uri value="http://loinc.org/property/VersionFirstReleased"/> + <description value="This is the LOINC version number in which this LOINC term was first published."/> + <type value="string"/> + </property> + <property> + <code value="PanelType"/> + <uri value="http://loinc.org/property/PanelType"/> + <description value="For LOINC terms that are panels, this attribute classifies them as a 'Convenience group', 'Organizer', or 'Panel'"/> + <type value="string"/> + </property> + <property> + <code value="ValidHL7AttachmentRequest"/> + <uri value="http://loinc.org/property/ValidHL7AttachmentRequest"/> + <description value="A value of Y in this field indicates that this LOINC code can be sent by a payer as part of an HL7 Attachment request for additional information."/> + <type value="string"/> + </property> + <property> + <code value="DisplayName"/> + <uri value="http://loinc.org/property/DisplayName"/> + <description value="A name that is more 'clinician-friendly' compared to the current LOINC Short Name, Long Common Name, and Fully Specified Name. It is created algorithmically from the manually crafted display text for each Part and is generally more concise than the Long Common Name."/> + <type value="string"/> + </property> + <property> + <code value="answer-list"/> + <uri value="http://loinc.org/property/answer-list"/> + <description value="An answer list associated with this LOINC code (if there are matching answer lists defined)."/> + <type value="Coding"/> + </property> + + <!-- + Secondary LOINC properties. + These properties also apply to the main LOINC codes, but not the Multiaxial Hierarchy, Answer lists, or the Part codes. + Notes: + These properties are defined in the LoincPartLink table. + --> + + <property> + <code value="analyte"/> + <uri value="http://loinc.org/property/analyte"/> + <description value="First sub-part of the Component, i.e., the part of the Component before the first carat"/> + <type value="Coding"/> + </property> + <property> + <code value="analyte-core"/> + <uri value="http://loinc.org/property/analyte-core"/> + <description value="The primary part of the analyte without the suffix"/> + <type value="Coding"/> + </property> + <property> + <code value="analyte-suffix"/> + <uri value="http://loinc.org/property/analyte-suffix"/> + <description value="The suffix part of the analyte, if present, e.g., Ab or DNA"/> + <type value="Coding"/> + </property> + <property> + <code value="analyte-numerator"/> + <uri value="http://loinc.org/property/analyte-numerator"/> + <description value="The numerator part of the analyte, i.e., everything before the slash in analytes that contain a divisor"/> + <type value="Coding"/> + </property> + <property> + <code value="analyte-divisor"/> + <uri value="http://loinc.org/property/analyte-divisor"/> + <description value="The divisor part of the analyte, if present, i.e., after the slash and before the first carat"/> + <type value="Coding"/> + </property> + <property> + <code value="analyte-divisor-suffix"/> + <uri value="http://loinc.org/property/analyte-divisor-suffix"/> + <description value="The suffix part of the divisor, if present"/> + <type value="Coding"/> + </property> + <property> + <code value="challenge"/> + <uri value="http://loinc.org/property/challenge"/> + <description value="Second sub-part of the Component, i.e., after the first carat"/> + <type value="Coding"/> + </property> + <property> + <code value="adjustment"/> + <uri value="http://loinc.org/property/adjustment"/> + <description value="Third sub-part of the Component, i.e., after the second carat"/> + <type value="Coding"/> + </property> + <property> + <code value="count"/> + <uri value="http://loinc.org/property/count"/> + <description value="Fourth sub-part of the Component, i.e., after the third carat"/> + <type value="Coding"/> + </property> + <property> + <code value="time-core"/> + <uri value="http://loinc.org/property/time-core"/> + <description value="The primary part of the Time"/> + <type value="Coding"/> + </property> + <property> + <code value="time-modifier"/> + <uri value="http://loinc.org/property/time-modifier"/> + <description value="The modifier of the Time value, such as mean or max"/> + <type value="Coding"/> + </property> + <property> + <code value="system-core"/> + <uri value="http://loinc.org/property/system-core"/> + <description value="The primary part of the System, i.e., without the super system"/> + <type value="Coding"/> + </property> + <property> + <code value="super-system"/> + <uri value="http://loinc.org/property/super-system"/> + <description value="The super system part of the System, if present. The super system represents the source of the specimen when the source is someone or something other than the patient whose chart the result will be stored in. For example, fetus is the super system for measurements done on obstetric ultrasounds, because the fetus is being measured and that measurement is being recorded in the patient's (mother's) chart."/> + <type value="Coding"/> + </property> + <property> + <code value="analyte-gene"/> + <uri value="http://loinc.org/property/analyte-gene"/> + <description value="The specific gene represented in the analyte"/> + <type value="Coding"/> + </property> + <property> + <code value="category"/> + <uri value="http://loinc.org/property/category"/> + <description value="A single LOINC term can be assigned one or more categories based on both programmatic and manual tagging. Category properties also utilize LOINC Class Parts."/> + <type value="Coding"/> + </property> + <property> + <code value="search"/> + <uri value="http://loinc.org/property/search"/> + <description value="Synonyms, fragments, and other Parts that are linked to a term to enable more encompassing search results."/> + <type value="Coding"/> + </property> + + <!-- + LOINC/RSNA Radiology Playbook properties. These apply only to terms in the LOINC/RSNA Radiology Playbook File. + Notes: + Properties are specified as type "Coding", which are represented by LOINC Part codes (LP-) and their display names. + The attribute names here use FHIR styled names rather than their original LOINC style names because the original names contain periods. + --> + + <property> + <code value="rad-modality-modality-type"/> + <uri value="http://loinc.org/property/rad-modality-modality-type"/> + <description value="Modality is used to represent the device used to acquire imaging information."/> + <type value="Coding"/> + </property> + <property> + <code value="rad-modality-modality-subtype"/> + <uri value="http://loinc.org/property/rad-modality-modality-subtype"/> + <description value="Modality subtype may be optionally included to signify a particularly common or evocative configuration of the modality."/> + <type value="Coding"/> + </property> + <property> + <code value="rad-anatomic-location-region-imaged"/> + <uri value="http://loinc.org/property/rad-anatomic-location-region-imaged"/> + <description value="The Anatomic Location Region Imaged attribute is used in two ways: as a coarse-grained descriptor of the area imaged and a grouper for finding related imaging exams; or, it is used just as a grouper."/> + <type value="Coding"/> + </property> + <property> + <code value="rad-anatomic-location-imaging-focus"/> + <uri value="http://loinc.org/property/rad-anatomic-location-imaging-focus"/> + <description value="The Anatomic Location Imaging Focus is a more fine-grained descriptor of the specific target structure of an imaging exam. In many areas, the focus should be a specific organ."/> + <type value="Coding"/> + </property> + <property> + <code value="rad-anatomic-location-laterality-presence"/> + <uri value="http://loinc.org/property/rad-anatomic-location-laterality-presence"/> + <description value="Radiology Exams that require laterality to be specified in order to be performed are signified with an Anatomic Location Laterality Presence attribute set to 'True'"/> + <type value="Coding"/> + </property> + <property> + <code value="rad-anatomic-location-laterality"/> + <uri value="http://loinc.org/property/rad-anatomic-location-laterality"/> + <description value="Radiology exam Laterality is specified as one of: Left, Right, Bilateral, Unilateral, Unspecified"/> + <type value="Coding"/> + </property> + <property> + <code value="rad-view-aggregation"/> + <uri value="http://loinc.org/property/rad-view-aggregation"/> + <description value="Aggregation describes the extent of the imaging performed, whether in quantitative terms (e.g., '3 or more views') or subjective terms (e.g., 'complete')."/> + <type value="Coding"/> + </property> + <property> + <code value="rad-view-view-type"/> + <uri value="http://loinc.org/property/rad-view-view-type"/> + <description value="View type names specific views, such as 'lateral' or 'AP'."/> + <type value="Coding"/> + </property> + <property> + <code value="rad-maneuver-maneuver-type"/> + <uri value="http://loinc.org/property/rad-maneuver-maneuver-type"/> + <description value="Maneuver type indicates an action taken with the goal of elucidating or testing a dynamic aspect of the anatomy."/> + <type value="Coding"/> + </property> + <property> + <code value="rad-timing"/> + <uri value="http://loinc.org/property/rad-timing"/> + <description value="The Timing/Existence property used in conjunction with pharmaceutical and maneuver properties. It specifies whether or not the imaging occurs in the presence of the administered pharmaceutical or a maneuver designed to test some dynamic aspect of anatomy or physiology ."/> + <type value="Coding"/> + </property> + <property> + <code value="rad-pharmaceutical-substance-given"/> + <uri value="http://loinc.org/property/rad-pharmaceutical-substance-given"/> + <description value="The Pharmaceutical Substance Given specifies administered contrast agents, radiopharmaceuticals, medications, or other clinically important agents and challenges during the imaging procedure."/> + <type value="Coding"/> + </property> + <property> + <code value="rad-pharmaceutical-route"/> + <uri value="http://loinc.org/property/rad-pharmaceutical-route"/> + <description value="Route specifies the route of administration of the pharmaceutical."/> + <type value="Coding"/> + </property> + <property> + <code value="rad-reason-for-exam"/> + <uri value="http://loinc.org/property/rad-reason-for-exam"/> + <description value="Reason for exam is used to describe a clinical indication or a purpose for the study."/> + <type value="Coding"/> + </property> + <property> + <code value="rad-guidance-for-presence"/> + <uri value="http://loinc.org/property/rad-guidance-for-presence"/> + <description value="Guidance for.Presence indicates when a procedure is guided by imaging."/> + <type value="Coding"/> + </property> + <property> + <code value="rad-guidance-for-approach"/> + <uri value="http://loinc.org/property/rad-guidance-for-approach"/> + <description value="Guidance for.Approach refers to the primary route of access used, such as percutaneous, transcatheter, or transhepatic."/> + <type value="Coding"/> + </property> + <property> + <code value="rad-guidance-for-action"/> + <uri value="http://loinc.org/property/rad-guidance-for-action"/> + <description value="Guidance for.Action indicates the intervention performed, such as biopsy, aspiration, or ablation."/> + <type value="Coding"/> + </property> + <property> + <code value="rad-guidance-for-object"/> + <uri value="http://loinc.org/property/rad-guidance-for-object"/> + <description value="Guidance for.Object specifies the target of the action, such as mass, abscess or cyst."/> + <type value="Coding"/> + </property> + <property> + <code value="rad-subject"/> + <uri value="http://loinc.org/property/rad-subject"/> + <description value="Subject is intended for use when there is a need to distinguish between the patient associated with an imaging study, and the target of the study."/> + <type value="Coding"/> + </property> + + <!-- + Document Ontology properties. + These apply only to terms in the LOINC Document Ontology File + Notes + Properties are specified as type "Coding", which are represented by LOINC Part codes (LP-) and their display names. + The attribute names here use FHIR styled names rather than their original LOINC style names because those contain periods. + --> + + <property> + <code value="document-kind"/> + <uri value="http://loinc.org/property/document-kind"/> + <description value="Characterizes the general structure of the document at a macro level."/> + <type value="Coding"/> + </property> + <property> + <code value="document-role"/> + <uri value="http://loinc.org/property/document-role"/> + <description value="Characterizes the training or professional level of the author of the document, but does not break down to specialty or subspecialty."/> + <type value="Coding"/> + </property> + <property> + <code value="document-setting"/> + <uri value="http://loinc.org/property/document-setting"/> + <description value="Setting is a modest extension of CMS’s coarse definition of care settings, such as outpatient, hospital, etc. Setting is not equivalent to location, which typically has more locally defined meanings."/> + <type value="Coding"/> + </property> + <property> + <code value="document-subject-matter-domain"/> + <uri value="http://loinc.org/property/document-subject-matter-domain"/> + <description value="Characterizes the clinical domain that is the subject of the document. For example, Internal Medicine, Neurology, Physical Therapy, etc."/> + <type value="Coding"/> + </property> + <property> + <code value="document-type-of-service"/> + <uri value="http://loinc.org/property/document-type-of-service"/> + <description value="Characterizes the kind of service or activity provided to/for the patient (or other subject of the service) that is described in the document."/> + <type value="Coding"/> + </property> + + <!-- Answer list related properties --> + <property> + <code value="answers-for"/> + <uri value="http://loinc.org/property/answers-for"/> + <description value="A LOINC Code for which this answer list is used."/> + <type value="Coding"/> + </property> + + <!-- Note for future consideration. These are properties of LA codes in the context of a particular list. Not global properties. + <property> + <code value="sequence"/> + <uri value="http://loinc.org/property/sequence"/> + <description value="Sequence Number of a answer in a set of answers (LA- codes only)"/> + <type value="integer"/> + </property> + <property> + <code value="score"/> + <uri value="http://loinc.org/property/score"/> + <description value="Score assigned to an answer (LA- codes only)"/> + <type value="integer"/> + </property> + --> +</CodeSystem> + + From 5b6ac3e6d668c2d169361ed23cce6094a8b6f917 Mon Sep 17 00:00:00 2001 From: "juan.marchionatto" <juan.marchionatto@smilecdr.com> Date: Fri, 10 Sep 2021 11:22:04 -0400 Subject: [PATCH 05/20] Refactor to eliminate duplication --- ...JpaPersistedResourceValidationSupport.java | 26 +++++++----- .../fhir/jpa/term/BaseTermReadSvcImpl.java | 41 ++++++++++++++----- .../uhn/fhir/jpa/term/api/ITermReadSvc.java | 4 ++ 3 files changed, 50 insertions(+), 21 deletions(-) diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/JpaPersistedResourceValidationSupport.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/JpaPersistedResourceValidationSupport.java index 77467bd3431..b88cff4231d 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/JpaPersistedResourceValidationSupport.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/JpaPersistedResourceValidationSupport.java @@ -26,6 +26,7 @@ import ca.uhn.fhir.context.support.IValidationSupport; import ca.uhn.fhir.jpa.api.dao.DaoRegistry; import ca.uhn.fhir.jpa.api.dao.IFhirResourceDao; import ca.uhn.fhir.jpa.searchparam.SearchParameterMap; +import ca.uhn.fhir.jpa.term.api.ITermReadSvc; import ca.uhn.fhir.model.primitive.IdDt; import ca.uhn.fhir.rest.api.SortOrderEnum; import ca.uhn.fhir.rest.api.SortSpec; @@ -81,6 +82,10 @@ public class JpaPersistedResourceValidationSupport implements IValidationSupport @Autowired private DaoRegistry myDaoRegistry; + + @Autowired + private ITermReadSvc myTermReadSvc; + private Class<? extends IBaseResource> myCodeSystemType; private Class<? extends IBaseResource> myStructureDefinitionType; private Class<? extends IBaseResource> myValueSetType; @@ -107,25 +112,20 @@ public class JpaPersistedResourceValidationSupport implements IValidationSupport @Override public IBaseResource fetchValueSet(String theSystem) { - boolean isNotLoincCodeSystem = ! StringUtils.containsIgnoreCase(theSystem, "loinc"); - boolean hasVersion = theSystem.contains("|"); - boolean isForGenericValueSet = theSystem.equals(LOINC_GENERIC_VALUESET_URL); - if (isNotLoincCodeSystem || hasVersion || isForGenericValueSet) { - return fetchResource(myValueSetType, theSystem); + if (myTermReadSvc.isLoincNotGenericUnversionedValueSet(theSystem)) { + Optional<IBaseResource> currentVSOpt = getValueSetCurrentVersion(new UriType(theSystem)); + return currentVSOpt.orElseThrow(() -> new ResourceNotFoundException( + "Couldn't find current version ValueSet for url: " + theSystem)); } - // if no version is present, we need to fetch the resource for the current version if one exists, - // in case it is not the last loaded - Optional<IBaseResource> currentVSOpt = getValueSetCurrentVersion(new UriType(theSystem)); - return currentVSOpt.orElseThrow(() -> new ResourceNotFoundException( - "Couldn't find current version ValueSet for url: " + theSystem)); + return fetchResource(myValueSetType, theSystem); } /** * Obtains the current version of a ValueSet using the fact that the current * version is always pointed by the ForcedId for the no-versioned VS */ - public Optional<IBaseResource> getValueSetCurrentVersion(UriType theUrl) { + private Optional<IBaseResource> getValueSetCurrentVersion(UriType theUrl) { if (! theUrl.getValueAsString().startsWith(LOINC_GENERIC_VALUESET_URL)) return Optional.empty(); if (! theUrl.getValue().startsWith(LOINC_GENERIC_VALUESET_URL_PLUS_SLASH)) { @@ -133,6 +133,10 @@ public class JpaPersistedResourceValidationSupport implements IValidationSupport } String forcedId = theUrl.getValue().substring(LOINC_GENERIC_VALUESET_URL_PLUS_SLASH.length()); + if (StringUtils.isBlank(forcedId)) return Optional.empty(); + + if (myTermReadSvc.mustReturnEmptyValueSet(theUrl.getValueAsString())) return Optional.empty(); + IFhirResourceDao<? extends IBaseResource> valueSetResourceDao = myDaoRegistry.getResourceDao(myValueSetType); IBaseResource valueSet = valueSetResourceDao.read(new IdDt("ValueSet", forcedId)); return Optional.ofNullable(valueSet); diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/BaseTermReadSvcImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/BaseTermReadSvcImpl.java index b55dab9e7a4..cd96da10f42 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/BaseTermReadSvcImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/BaseTermReadSvcImpl.java @@ -2337,27 +2337,48 @@ public abstract class BaseTermReadSvcImpl implements ITermReadSvc { } + /** + * When the search is for no-version loinc system it uses the forcedId to obtain the current + * version, as it is not necessarily the last one anymore. + * For other cases it keeps on considering the last uploaded as the current + */ @Override public Optional<TermValueSet> findCurrentTermValueSet(String theUrl) { - boolean isNotLoincCodeSystem = ! StringUtils.containsIgnoreCase(theUrl, "loinc"); - boolean hasVersion = theUrl.contains("|"); - boolean isForGenericValueSet = theUrl.equals(LOINC_GENERIC_VALUESET_URL); - if (isNotLoincCodeSystem || hasVersion || isForGenericValueSet) { - List<TermValueSet> termValueSetList = myTermValueSetDao.findTermValueSetByUrl(Pageable.ofSize(1), theUrl); - if (termValueSetList.isEmpty()) return Optional.empty(); - return Optional.of(termValueSetList.get(0)); + if (isLoincNotGenericUnversionedValueSet(theUrl)) { + if (mustReturnEmptyValueSet(theUrl)) return Optional.empty(); + + String forcedId = theUrl.substring(LOINC_GENERIC_VALUESET_URL_PLUS_SLASH.length()); + if (StringUtils.isBlank(forcedId)) return Optional.empty(); + + return myTermValueSetDao.findTermValueSetByForcedId(forcedId); } - if (! theUrl.startsWith(LOINC_GENERIC_VALUESET_URL)) return Optional.empty(); + List<TermValueSet> termValueSetList = myTermValueSetDao.findTermValueSetByUrl(Pageable.ofSize(1), theUrl); + if (termValueSetList.isEmpty()) return Optional.empty(); + return Optional.of(termValueSetList.get(0)); + } + + + @Override + public boolean mustReturnEmptyValueSet(String theUrl) { + if (! theUrl.startsWith(LOINC_GENERIC_VALUESET_URL)) return true; if (! theUrl.startsWith(LOINC_GENERIC_VALUESET_URL_PLUS_SLASH)) { throw new InternalErrorException("Don't know how to extract ForcedId from url: " + theUrl); } String forcedId = theUrl.substring(LOINC_GENERIC_VALUESET_URL_PLUS_SLASH.length()); - if (StringUtils.isBlank(forcedId)) return Optional.empty(); + return StringUtils.isBlank(forcedId); + } - return myTermValueSetDao.findTermValueSetByForcedId(forcedId); + + @Override + public boolean isLoincNotGenericUnversionedValueSet(String theUrl) { + boolean isLoincCodeSystem = StringUtils.containsIgnoreCase(theUrl, "loinc"); + boolean isNoVersion = ! theUrl.contains("|"); + boolean isNotLoincGenericValueSet = ! theUrl.equals(LOINC_GENERIC_VALUESET_URL); + + return isLoincCodeSystem && isNoVersion && isNotLoincGenericValueSet; } diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/api/ITermReadSvc.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/api/ITermReadSvc.java index b4d0d94e2e7..31569dedfd9 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/api/ITermReadSvc.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/api/ITermReadSvc.java @@ -120,4 +120,8 @@ public interface ITermReadSvc extends IValidationSupport { * Version independent */ Optional<TermValueSet> findCurrentTermValueSet(String theUrl); + + boolean mustReturnEmptyValueSet(String theUrl); + + boolean isLoincNotGenericUnversionedValueSet(String theUrl); } From 8288d12e976f1851c6506f7c3361f65ceabdd183 Mon Sep 17 00:00:00 2001 From: "juan.marchionatto" <juan.marchionatto@smilecdr.com> Date: Tue, 14 Sep 2021 09:58:32 -0400 Subject: [PATCH 06/20] Obtain current CodeSystem from null-pointed ForcedId, as done for ValueSet --- ...JpaPersistedResourceValidationSupport.java | 32 +++++++++++++------ .../fhir/jpa/term/BaseTermReadSvcImpl.java | 9 ++++++ .../uhn/fhir/jpa/term/api/ITermReadSvc.java | 12 +++++++ 3 files changed, 44 insertions(+), 9 deletions(-) diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/JpaPersistedResourceValidationSupport.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/JpaPersistedResourceValidationSupport.java index b88cff4231d..44b0b2582e2 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/JpaPersistedResourceValidationSupport.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/JpaPersistedResourceValidationSupport.java @@ -34,7 +34,6 @@ import ca.uhn.fhir.rest.api.server.IBundleProvider; import ca.uhn.fhir.rest.param.StringParam; import ca.uhn.fhir.rest.param.TokenParam; import ca.uhn.fhir.rest.param.UriParam; -import ca.uhn.fhir.rest.server.exceptions.InternalErrorException; import ca.uhn.fhir.rest.server.exceptions.ResourceNotFoundException; import com.github.benmanes.caffeine.cache.Cache; import com.github.benmanes.caffeine.cache.Caffeine; @@ -74,7 +73,8 @@ public class JpaPersistedResourceValidationSupport implements IValidationSupport private static final Logger ourLog = LoggerFactory.getLogger(JpaPersistedResourceValidationSupport.class); - public static final String LOINC_GENERIC_VALUESET_URL = "http://loinc.org/vs"; + public static final String LOINC_GENERIC_CODE_SYSTEM_URL = "http://loinc.org"; + public static final String LOINC_GENERIC_VALUESET_URL = LOINC_GENERIC_CODE_SYSTEM_URL + "/vs"; public static final String LOINC_GENERIC_VALUESET_URL_PLUS_SLASH = LOINC_GENERIC_VALUESET_URL + "/"; private final FhirContext myFhirContext; @@ -107,9 +107,29 @@ public class JpaPersistedResourceValidationSupport implements IValidationSupport @Override public IBaseResource fetchCodeSystem(String theSystem) { + if (myTermReadSvc.isLoincNotGenericUnversionedCodeSystem(theSystem)) { + Optional<IBaseResource> currentCSOpt = getCodeSystemCurrentVersion(new UriType(theSystem)); + return currentCSOpt.orElseThrow(() -> new ResourceNotFoundException( + "Couldn't find current version CodeSystem for url: " + theSystem)); + } + return fetchResource(myCodeSystemType, theSystem); } + /** + * Obtains the current version of a CodeSystem using the fact that the current + * version is always pointed by the ForcedId for the no-versioned CS + */ + private Optional<IBaseResource> getCodeSystemCurrentVersion(UriType theUrl) { + if (! theUrl.getValueAsString().contains("loinc")) return Optional.empty(); + + IFhirResourceDao<? extends IBaseResource> valueSetResourceDao = myDaoRegistry.getResourceDao(myCodeSystemType); + String forcedId = "loinc"; + IBaseResource codeSystem = valueSetResourceDao.read(new IdDt("CodeSystem", forcedId)); + return Optional.ofNullable(codeSystem); + } + + @Override public IBaseResource fetchValueSet(String theSystem) { if (myTermReadSvc.isLoincNotGenericUnversionedValueSet(theSystem)) { @@ -126,17 +146,11 @@ public class JpaPersistedResourceValidationSupport implements IValidationSupport * version is always pointed by the ForcedId for the no-versioned VS */ private Optional<IBaseResource> getValueSetCurrentVersion(UriType theUrl) { - if (! theUrl.getValueAsString().startsWith(LOINC_GENERIC_VALUESET_URL)) return Optional.empty(); - - if (! theUrl.getValue().startsWith(LOINC_GENERIC_VALUESET_URL_PLUS_SLASH)) { - throw new InternalErrorException("Don't know how to extract ForcedId from url: " + theUrl.getValueAsString()); - } + if (myTermReadSvc.mustReturnEmptyValueSet(theUrl.getValueAsString())) return Optional.empty(); String forcedId = theUrl.getValue().substring(LOINC_GENERIC_VALUESET_URL_PLUS_SLASH.length()); if (StringUtils.isBlank(forcedId)) return Optional.empty(); - if (myTermReadSvc.mustReturnEmptyValueSet(theUrl.getValueAsString())) return Optional.empty(); - IFhirResourceDao<? extends IBaseResource> valueSetResourceDao = myDaoRegistry.getResourceDao(myValueSetType); IBaseResource valueSet = valueSetResourceDao.read(new IdDt("ValueSet", forcedId)); return Optional.ofNullable(valueSet); diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/BaseTermReadSvcImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/BaseTermReadSvcImpl.java index cd96da10f42..069117b8ad0 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/BaseTermReadSvcImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/BaseTermReadSvcImpl.java @@ -2382,6 +2382,15 @@ public abstract class BaseTermReadSvcImpl implements ITermReadSvc { } + @Override + public boolean isLoincNotGenericUnversionedCodeSystem(String theUrl) { + boolean isLoincCodeSystem = StringUtils.containsIgnoreCase(theUrl, "loinc"); + boolean isNoVersion = ! theUrl.contains("|"); + + return isLoincCodeSystem && isNoVersion; + } + + @SuppressWarnings("unchecked") private CodeValidationResult codeSystemValidateCode(String theCodeSystemUrl, String theCodeSystemVersion, String theCode, String theDisplay) { diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/api/ITermReadSvc.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/api/ITermReadSvc.java index 31569dedfd9..43c4ab902cc 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/api/ITermReadSvc.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/api/ITermReadSvc.java @@ -121,7 +121,19 @@ public interface ITermReadSvc extends IValidationSupport { */ Optional<TermValueSet> findCurrentTermValueSet(String theUrl); + /** + * Version independent + */ boolean mustReturnEmptyValueSet(String theUrl); + /** + * Version independent + */ + boolean isLoincNotGenericUnversionedCodeSystem(String theSystem); + + /** + * Version independent + */ boolean isLoincNotGenericUnversionedValueSet(String theUrl); + } From bd456dfff28e0a608cca161e3b7b1e9779c82838 Mon Sep 17 00:00:00 2001 From: "juan.marchionatto" <juan.marchionatto@smilecdr.com> Date: Tue, 14 Sep 2021 10:00:15 -0400 Subject: [PATCH 07/20] Enhance test by adding operations use cases. Improve test data with more version differentiators. --- ...erminologySvcImplCurrentVersionR4Test.java | 373 +++++++++++------- .../AccessoryFiles/AnswerFile/AnswerList.csv | 20 +- .../ImagingDocuments/ImagingDocumentCodes.csv | 2 +- .../AccessoryFiles/PanelsAndForms/Loinc.csv | 2 +- .../loinc-ver/v267/LoincTable/Loinc.csv | 2 +- .../ImagingDocuments/ImagingDocumentCodes.csv | 2 +- .../AccessoryFiles/PanelsAndForms/Loinc.csv | 2 +- .../loinc-ver/v268/LoincTable/Loinc.csv | 2 +- .../ImagingDocuments/ImagingDocumentCodes.csv | 2 +- .../LoincRsnaRadiologyPlaybook.csv | 18 +- .../AccessoryFiles/PanelsAndForms/Loinc.csv | 2 +- .../loinc-ver/v269/LoincTable/Loinc.csv | 2 +- 12 files changed, 254 insertions(+), 175 deletions(-) diff --git a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/term/TerminologySvcImplCurrentVersionR4Test.java b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/term/TerminologySvcImplCurrentVersionR4Test.java index 1358c66cecb..21ace9a8c7a 100644 --- a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/term/TerminologySvcImplCurrentVersionR4Test.java +++ b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/term/TerminologySvcImplCurrentVersionR4Test.java @@ -1,8 +1,12 @@ package ca.uhn.fhir.jpa.term; +import ca.uhn.fhir.context.support.IValidationSupport; +import ca.uhn.fhir.context.support.ValidationSupportContext; import ca.uhn.fhir.jpa.api.dao.IFhirResourceDao; +import ca.uhn.fhir.jpa.config.BaseConfig; import ca.uhn.fhir.jpa.dao.r4.BaseJpaR4Test; import ca.uhn.fhir.jpa.entity.TermCodeSystemVersion; +import ca.uhn.fhir.jpa.entity.TermConcept; import ca.uhn.fhir.jpa.entity.TermValueSet; import ca.uhn.fhir.jpa.searchparam.SearchParameterMap; import ca.uhn.fhir.jpa.term.api.ITermReadSvc; @@ -10,12 +14,15 @@ import ca.uhn.fhir.rest.api.server.IBundleProvider; import ca.uhn.fhir.rest.param.TokenParam; import ca.uhn.fhir.rest.param.UriParam; import ca.uhn.fhir.rest.server.servlet.ServletRequestDetails; +import com.google.common.collect.Lists; import com.google.common.collect.Sets; import org.apache.commons.lang3.StringUtils; import org.hl7.fhir.instance.model.api.IBaseResource; import org.hl7.fhir.instance.model.api.IIdType; import org.hl7.fhir.r4.model.CodeSystem; +import org.hl7.fhir.r4.model.CodeType; import org.hl7.fhir.r4.model.IdType; +import org.hl7.fhir.r4.model.UriType; import org.hl7.fhir.r4.model.ValueSet; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -24,6 +31,7 @@ import org.mockito.Mock; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.util.ResourceUtils; import javax.persistence.EntityManager; @@ -81,15 +89,20 @@ import static org.mockito.Mockito.when; public class TerminologySvcImplCurrentVersionR4Test extends BaseJpaR4Test { private static final Logger ourLog = LoggerFactory.getLogger(TerminologySvcImplCurrentVersionR4Test.class); - public static final String BASE_VS_URL = "http://loinc.org/vs/"; - - // some ValueSets have a version specified independent of the CS version being uploaded. This is one of them - public static final String VS_VERSIONED_ON_UPLOAD_ID = "LL1000-0"; - public static final String VS_VERSIONED_ON_UPLOAD = BASE_VS_URL + VS_VERSIONED_ON_UPLOAD_ID; + public static final String BASE_LOINC_URL = "http://loinc.org"; + public static final String BASE_LOINC_VS_URL = BASE_LOINC_URL + "/vs/"; // some ValueSets have a version specified independent of the CS version being uploaded. This one doesn't public static final String VS_NO_VERSIONED_ON_UPLOAD_ID = "loinc-rsna-radiology-playbook"; - public static final String VS_NO_VERSIONED_ON_UPLOAD = BASE_VS_URL + VS_NO_VERSIONED_ON_UPLOAD_ID; + public static final String VS_NO_VERSIONED_ON_UPLOAD = BASE_LOINC_VS_URL + VS_NO_VERSIONED_ON_UPLOAD_ID; + public static final String VS_NO_VERSIONED_ON_UPLOAD_FIRST_CODE = "17787-3"; + public static final String VS_NO_VERSIONED_ON_UPLOAD_FIRST_DISPLAY = "NM Thyroid gland Study report"; + + // some ValueSets have a version specified independent of the CS version being uploaded. This is one of them + public static final String VS_VERSIONED_ON_UPLOAD_ID = "LL1000-0"; + public static final String VS_VERSIONED_ON_UPLOAD = BASE_LOINC_VS_URL + VS_VERSIONED_ON_UPLOAD_ID; + public static final String VS_VERSIONED_ON_UPLOAD_FIRST_CODE = "LA13825-7"; + public static final String VS_VERSIONED_ON_UPLOAD_FIRST_DISPLAY = "1 slice or 1 dinner roll"; public static final String VS_ANSWER_LIST_VERSION = "Beta.1"; public static final Set<String> possibleVersions = Sets.newHashSet("2.67", "2.68", "2.69"); @@ -104,6 +117,9 @@ public class TerminologySvcImplCurrentVersionR4Test extends BaseJpaR4Test { @Autowired private TermLoaderSvcImpl myTermLoaderSvc; @Autowired private ITermReadSvc myITermReadSvc; + @Autowired + @Qualifier(BaseConfig.JPA_VALIDATION_SUPPORT) + private IValidationSupport myJpaPersistedResourceValidationSupport; private ZipCollectionBuilder myFiles; private ServletRequestDetails myRequestDetails = new ServletRequestDetails(); @@ -124,6 +140,9 @@ public class TerminologySvcImplCurrentVersionR4Test extends BaseJpaR4Test { public void beforeEach() throws Exception { // myTermLoaderSvc = TermLoaderSvcImpl.withoutProxyCheck(myTermDeferredStorageSvc, myTermCodeSystemStorageSvc); + // myTermSvc.preExpandDeferredValueSetsToTerminologyTables(); + + File file = ResourceUtils.getFile("classpath:loinc-ver/" + LOINC_UPLOAD_PROPERTIES_FILE.getCode()); uploadProperties = new Properties(); uploadProperties.load(new FileInputStream(file)); @@ -136,58 +155,188 @@ public class TerminologySvcImplCurrentVersionR4Test extends BaseJpaR4Test { /** - * For input version or for current (when input is null) validates following operations: - * _ JpaTerminologyProvider.in() - * _ JpaTerminologyProvider.expand() - * _ JpaTerminologyProvider.lookup() - * - * _ BaseJpaResourceProvider.read() - * _ BaseJpaResourceProvider.validate() + * For input version or for current (when input is null) validates search, expand, lookup and validateCode operations */ - private void validateOperations(Collection<String> theExpectedVersions) { + private void validateOperations(String currentVersion, Collection<String> theExpectedVersions) { validateValueSetSearch(theExpectedVersions); - validateValueExpand(theExpectedVersions); + validateValueExpand(currentVersion, theExpectedVersions); - validateValueLookup(theExpectedVersions); - - -// // JpaTerminologyProvider.lookup() -// // JpaTerminologyProvider.in() -// BaseJpaResourceProviderCodeSystemR4.lookup() -// BaseJpaResourceProviderCodeSystemR4.subsumes() -// BaseJpaResourceProviderCodeSystemR4.validateCode() +// validateValueLookup(currentVersion, theExpectedVersions); // - } - - private void validateValueLookup(Collection<String> theExpectedVersions) { +// validateValidateCode(currentVersion, theExpectedVersions); } - private void validateValueExpand(Collection<String> theExpectedVersions) { + private void validateValidateCode(String theCurrentVersion, Collection<String> allVersions) { + IValidationSupport.CodeValidationResult resultNoVersioned = myCodeSystemDao.validateCode(null, + new UriType(BASE_LOINC_URL), null, new CodeType(VS_NO_VERSIONED_ON_UPLOAD_FIRST_CODE), + null, null, null, null); + assertNotNull(resultNoVersioned); + assertEquals(prefixWithVersion(theCurrentVersion, VS_NO_VERSIONED_ON_UPLOAD_FIRST_DISPLAY), resultNoVersioned.getDisplay()); + + IValidationSupport.CodeValidationResult resultVersioned = myCodeSystemDao.validateCode(null, + new UriType(BASE_LOINC_URL), null, new CodeType(VS_VERSIONED_ON_UPLOAD_FIRST_CODE), + null, null, null, null); + assertNotNull(resultVersioned); + assertEquals(prefixWithVersion(theCurrentVersion, VS_VERSIONED_ON_UPLOAD_FIRST_DISPLAY), resultVersioned.getDisplay()); + + allVersions.forEach(this::validateValidateCodeForVersion); + } + + + private void validateValidateCodeForVersion(String theVersion) { + IValidationSupport.CodeValidationResult resultNoVersioned = myCodeSystemDao.validateCode(null, + new UriType(BASE_LOINC_URL), null, new CodeType(VS_NO_VERSIONED_ON_UPLOAD_FIRST_CODE), + null, null, null, null); + assertNotNull(resultNoVersioned); + assertEquals(prefixWithVersion(theVersion, VS_NO_VERSIONED_ON_UPLOAD_FIRST_DISPLAY), resultNoVersioned.getDisplay()); + + IValidationSupport.CodeValidationResult resultVersioned = myCodeSystemDao.validateCode(null, + new UriType(BASE_LOINC_URL), null, new CodeType(VS_VERSIONED_ON_UPLOAD_FIRST_CODE), + null, null, null, null); + assertNotNull(resultVersioned); + assertEquals(prefixWithVersion(theVersion, VS_VERSIONED_ON_UPLOAD_FIRST_DISPLAY), resultVersioned.getDisplay()); + } + + + + private void validateValueLookup(String theCurrentVersion, Collection<String> allVersions) { + IValidationSupport.LookupCodeResult resultNoVer = myValidationSupport.lookupCode( + new ValidationSupportContext(myValidationSupport), BASE_LOINC_URL, VS_NO_VERSIONED_ON_UPLOAD_FIRST_CODE, null); + assertNotNull(resultNoVer); + String expectedNoVer = prefixWithVersion(theCurrentVersion, VS_NO_VERSIONED_ON_UPLOAD_FIRST_DISPLAY); + assertEquals(expectedNoVer, resultNoVer.getCodeDisplay()); + + IValidationSupport.LookupCodeResult resultWithVer = myValidationSupport.lookupCode( + new ValidationSupportContext(myValidationSupport), BASE_LOINC_URL, VS_VERSIONED_ON_UPLOAD_FIRST_CODE, null); + assertNotNull(resultWithVer); + String expectedWithVer = prefixWithVersion(theCurrentVersion, VS_VERSIONED_ON_UPLOAD_FIRST_DISPLAY); + assertEquals(expectedWithVer, resultWithVer.getCodeDisplay()); + + allVersions.forEach(this::lookupForVersion); + } + + + private void lookupForVersion(String theVersion) { + IValidationSupport.LookupCodeResult resultNoVer = myValidationSupport.lookupCode( + new ValidationSupportContext(myValidationSupport), BASE_LOINC_URL + "|" + theVersion, + VS_NO_VERSIONED_ON_UPLOAD_FIRST_CODE, null); + assertNotNull(resultNoVer); + String expectedNoVer = prefixWithVersion(theVersion, VS_NO_VERSIONED_ON_UPLOAD_FIRST_DISPLAY); + assertEquals(expectedNoVer, resultNoVer.getCodeDisplay()); + + IValidationSupport.LookupCodeResult resultWithVer = myValidationSupport.lookupCode( + new ValidationSupportContext(myValidationSupport), BASE_LOINC_URL + "|" + theVersion, + VS_VERSIONED_ON_UPLOAD_FIRST_CODE, null); + assertNotNull(resultWithVer); + String expectedWithVer = prefixWithVersion(theVersion, VS_VERSIONED_ON_UPLOAD_FIRST_DISPLAY); + assertEquals(expectedWithVer, resultWithVer.getCodeDisplay()); + } + + + private String prefixWithVersion(String version, String suffix) { + return (version == null ? "" : "v" + version + " ") + suffix; + + } + + private void validateValueExpand(String currentVersion, Collection<String> theAllVersions) { // for CS ver = null, VS ver = null ValueSet vs = myValueSetDao.expandByIdentifier(VS_NO_VERSIONED_ON_UPLOAD, null); assertEquals(1, vs.getExpansion().getContains().size()); + // version was added before code display to validate + assertEquals(prefixWithVersion(currentVersion, VS_NO_VERSIONED_ON_UPLOAD_FIRST_DISPLAY), + vs.getExpansion().getContains().iterator().next().getDisplay()); + // for CS ver = null, VS ver != null ValueSet vs1 = myValueSetDao.expandByIdentifier(VS_VERSIONED_ON_UPLOAD + "|" + VS_ANSWER_LIST_VERSION, null); assertEquals(3, vs1.getExpansion().getContains().size()); - // now for each uploaded version - theExpectedVersions.forEach(this::validateValueExpandForVersion); + assertEquals(prefixWithVersion(currentVersion, VS_VERSIONED_ON_UPLOAD_FIRST_DISPLAY), + vs1.getExpansion().getContains().iterator().next().getDisplay()); + validateExpandedTermConcepts(currentVersion, theAllVersions); + + // now for each uploaded version + theAllVersions.forEach(this::validateValueExpandForVersion); } + + private void validateExpandedTermConcepts(String theCurrentVersion, Collection<String> theAllVersions) { + @SuppressWarnings("unchecked") + TermConcept termConceptNoVerCsvNoVer = (TermConcept) myEntityManager.createQuery( + "select tc from TermConcept tc join fetch tc.myCodeSystem tcsv where tc.myCode = '" + + VS_NO_VERSIONED_ON_UPLOAD_FIRST_CODE + "' and tcsv.myCodeSystemVersionId is null").getSingleResult(); + assertNotNull(termConceptNoVerCsvNoVer); + assertEquals(VS_NO_VERSIONED_ON_UPLOAD_FIRST_DISPLAY, termConceptNoVerCsvNoVer.getDisplay()); + + @SuppressWarnings("unchecked") + TermConcept termConceptVerCsvNoVer = (TermConcept) myEntityManager.createQuery( + "select tc from TermConcept tc join fetch tc.myCodeSystem tcsv where tc.myCode = '" + + VS_VERSIONED_ON_UPLOAD_FIRST_CODE + "' and tcsv.myCodeSystemVersionId is null").getSingleResult(); + assertNotNull(termConceptVerCsvNoVer); + assertEquals(VS_VERSIONED_ON_UPLOAD_FIRST_DISPLAY, termConceptVerCsvNoVer.getDisplay()); + + if (theCurrentVersion != null) { + @SuppressWarnings("unchecked") + TermConcept termConceptNoVerCsvVer = (TermConcept) myEntityManager.createQuery( + "select tc from TermConcept tc join fetch tc.myCodeSystem tcsv where tc.myCode = '" + + VS_NO_VERSIONED_ON_UPLOAD_FIRST_CODE + "' and tcsv.myCodeSystemVersionId is null").getSingleResult(); + assertNotNull(termConceptNoVerCsvVer); + assertEquals(VS_NO_VERSIONED_ON_UPLOAD_FIRST_DISPLAY, termConceptNoVerCsvVer.getDisplay()); + + @SuppressWarnings("unchecked") + TermConcept termConceptVerCsvVer = (TermConcept) myEntityManager.createQuery( + "select tc from TermConcept tc join fetch tc.myCodeSystem tcsv where tc.myCode = '" + + VS_VERSIONED_ON_UPLOAD_FIRST_CODE + "' and tcsv.myCodeSystemVersionId is null").getSingleResult(); + assertNotNull(termConceptVerCsvVer); + assertEquals(VS_VERSIONED_ON_UPLOAD_FIRST_DISPLAY, termConceptVerCsvVer.getDisplay()); + } + + + theAllVersions.forEach(this::validateExpandedTermConceptsForVersion); + } + + + private void validateExpandedTermConceptsForVersion(String theVersion) { + @SuppressWarnings("unchecked") + TermConcept termConceptNoVer = (TermConcept) myEntityManager.createQuery( + "select tc from TermConcept tc join fetch tc.myCodeSystem tcsv where tc.myCode = '" + + VS_NO_VERSIONED_ON_UPLOAD_FIRST_CODE + "' and tcsv.myCodeSystemVersionId = '" + theVersion + "'").getSingleResult(); + assertNotNull(termConceptNoVer); + assertEquals(prefixWithVersion(theVersion, VS_NO_VERSIONED_ON_UPLOAD_FIRST_DISPLAY), termConceptNoVer.getDisplay()); + + @SuppressWarnings("unchecked") + TermConcept termConceptVer = (TermConcept) myEntityManager.createQuery( + "select tc from TermConcept tc join fetch tc.myCodeSystem tcsv where tc.myCode = '" + + VS_VERSIONED_ON_UPLOAD_FIRST_CODE + "' and tcsv.myCodeSystemVersionId = '" + theVersion + "'").getSingleResult(); + assertNotNull(termConceptVer); + assertEquals(prefixWithVersion(theVersion, VS_VERSIONED_ON_UPLOAD_FIRST_DISPLAY), termConceptVer.getDisplay()); + } + + private void validateValueExpandForVersion(String theVersion) { // for CS ver != null, VS ver = null + ValueSet vs2 = myValueSetDao.expandByIdentifier( VS_NO_VERSIONED_ON_UPLOAD + "|" + theVersion, null); assertEquals(1, vs2.getExpansion().getContains().size()); + // version was added before code display to validate + assertEquals(prefixWithVersion(theVersion, VS_NO_VERSIONED_ON_UPLOAD_FIRST_DISPLAY), + vs2.getExpansion().getContains().iterator().next().getDisplay()); + + // for CS ver != null, VS ver != null + ValueSet vs3 = myValueSetDao.expandByIdentifier( VS_VERSIONED_ON_UPLOAD + "|" + VS_ANSWER_LIST_VERSION + "-" + theVersion, null); assertEquals(3, vs3.getExpansion().getContains().size()); + + // version was added before code display to validate + assertEquals(prefixWithVersion( theVersion, VS_VERSIONED_ON_UPLOAD_FIRST_DISPLAY), + vs3.getExpansion().getContains().iterator().next().getDisplay()); } @@ -288,13 +437,11 @@ public class TerminologySvcImplCurrentVersionR4Test extends BaseJpaR4Test { /** * Validates that: * for CodeSystem: - * _ current CS has no version, obtaining it from DAO + * _ current CS has no version * _ current TCS has no version * for ValueSet: * _ current TVSs with upload version have upload-version with no version append * _ current TVSs with no upload version have null version - * operations: - * _ validate operation for current (no version parameter) */ private void runCommonValidations(String theVersion) { // for CodeSystem: @@ -308,6 +455,11 @@ public class TerminologySvcImplCurrentVersionR4Test extends BaseJpaR4Test { shouldNotBePresentVersions.remove(theVersion); shouldNotBePresentVersions.stream().forEach(vv -> assertFalse(csString.contains(vv))); + // same reading it from term service + CodeSystem cs = myITermReadSvc.fetchCanonicalCodeSystemFromCompleteContext(BASE_LOINC_URL); + assertEquals(BASE_LOINC_URL, cs.getUrl()); + assertNull(cs.getVersion()); + // _ current TermCodeSystem has no version TermCodeSystemVersion termCSVersion = fetchCurrentCodeSystemVersion(); assertNotNull(termCSVersion); @@ -315,6 +467,11 @@ public class TerminologySvcImplCurrentVersionR4Test extends BaseJpaR4Test { // for ValueSet: + // for ValueSet resource + ValueSet vs = (ValueSet) myJpaPersistedResourceValidationSupport.fetchValueSet(VS_NO_VERSIONED_ON_UPLOAD); + assertEquals(VS_NO_VERSIONED_ON_UPLOAD, vs.getUrl()); + assertNull(vs.getVersion()); + // current TermVSs with no upload version have null version Optional<TermValueSet> noUploadCurrentVsOpt = myITermReadSvc.findCurrentTermValueSet(VS_NO_VERSIONED_ON_UPLOAD); assertTrue(noUploadCurrentVsOpt.isPresent()); @@ -324,64 +481,50 @@ public class TerminologySvcImplCurrentVersionR4Test extends BaseJpaR4Test { Optional<TermValueSet> uploadCurrentVsOpt = myITermReadSvc.findCurrentTermValueSet(VS_VERSIONED_ON_UPLOAD); assertTrue(uploadCurrentVsOpt.isPresent()); assertEquals(VS_ANSWER_LIST_VERSION, uploadCurrentVsOpt.get().getVersion()); + } @Test() - public void uploadCSCurrentNoVersion() throws Exception { + public void uploadCurrentNoVersion() throws Exception { IIdType csId = uploadLoincCodeSystem(null, true); runCommonValidations(null); // validate operation for current (no version parameter) - validateOperations(Collections.emptySet()); - + validateOperations(null, Collections.emptySet()); } @Test() - public void uploadCSCurrentWithVersion() throws Exception { + public void uploadCurrentWithVersion() throws Exception { String ver = "2.67"; IIdType csId = uploadLoincCodeSystem(ver, true); runCommonValidations(ver); -// myTermSvc.preExpandDeferredValueSetsToTerminologyTables(); - // validate operation for specific version - validateOperations(Collections.singleton(ver)); + validateOperations(ver, Collections.singleton(ver)); } -// @Test + @Test public void uploadCurrentNoVersionThenNoCurrent() throws Exception { uploadLoincCodeSystem(null, true); + String ver = "2.67"; uploadLoincCodeSystem(ver, false); - Optional<Long> csIdNoVersionedOpt = myForcedIdDao.findByTypeAndForcedId("CodeSystem", "loinc"); - assertTrue(csIdNoVersionedOpt.isPresent()); + myTermSvc.preExpandDeferredValueSetsToTerminologyTables(); - Optional<Long> csIdVersionedOpt = myForcedIdDao.findByTypeAndForcedId("CodeSystem", "loinc" + "-" + ver); - assertTrue(csIdVersionedOpt.isPresent()); - - // current CS data is no-ver - CodeSystem codeSystem = myCodeSystemDao.read(new IdType("loinc")); - String csString = myFhirCtx.newJsonParser().setPrettyPrint(true).encodeResourceToString(codeSystem); - ourLog.info("CodeSystem:\n" + csString); - - // no versions present in CS data - possibleVersions.stream().forEach(vv -> assertFalse(csString.contains(vv))); - - - // ValueSets - - checkVsVersionExists(null); + runCommonValidations(ver); + // validate operation for specific version + validateOperations(null, Collections.singleton(ver)); } -// @Test + @Test public void uploadFirstCurrentWithVersionThenNoCurrent() throws Exception { String firstVer = "2.67"; uploadLoincCodeSystem(firstVer, true); @@ -389,116 +532,52 @@ public class TerminologySvcImplCurrentVersionR4Test extends BaseJpaR4Test { String secondVer = "2.68"; uploadLoincCodeSystem(secondVer, false); - Optional<Long> csIdNoVersionedOpt = myForcedIdDao.findByTypeAndForcedId("CodeSystem", "loinc"); - assertTrue(csIdNoVersionedOpt.isPresent()); + runCommonValidations(firstVer); + runCommonValidations(secondVer); - Optional<Long> csIdFirstVersionedOpt = myForcedIdDao.findByTypeAndForcedId("CodeSystem", "loinc" + "-" + firstVer); - assertTrue(csIdFirstVersionedOpt.isPresent()); - - Optional<Long> csIdSecondVersionedOpt = myForcedIdDao.findByTypeAndForcedId("CodeSystem", "loinc" + "-" + secondVer); - assertTrue(csIdSecondVersionedOpt.isPresent()); - - // current CS data is no-ver - CodeSystem codeSystem = myCodeSystemDao.read(new IdType("loinc")); - String csString = myFhirCtx.newJsonParser().setPrettyPrint(true).encodeResourceToString(codeSystem); - ourLog.info("CodeSystem:\n" + csString); - - // only 2.67 versions present in CS data - Set<String> noVersionsPresent = new HashSet(possibleVersions); - noVersionsPresent.remove(firstVer); - noVersionsPresent.stream().forEach(vv -> assertFalse(csString.contains(vv))); - - // ValueSets - - checkVsVersionExists(firstVer); - checkVsVersionExists(secondVer); - - - - -// Optional<Long> csIdVersionedOpt = myForcedIdDao.findByTypeAndForcedId("CodeSystem", "loinc" + "-" + "2.58"); -// assertFalse(csIdVersionedOpt.isPresent()); -// -// Optional<Long> csIdNoVersionedOpt = myForcedIdDao.findByTypeAndForcedId("CodeSystem", "loinc"); -// assertTrue(csIdNoVersionedOpt.isPresent()); - - // make sure: - - // curr CS ver is null ver with 2.59 data - - // VS present for V 2.58 (curr = true), 2,59 (curr = false) & null (curr = true) - - // only one VS per url-ver true - } - - private void checkVsVersionExists(String ver) { - String vsNoVersionedVersion = VS_NO_VERSIONED_ON_UPLOAD + (ver == null ? "" : "-" + ver); - Optional<TermValueSet> noUploadVersionedVsOpt = myITermReadSvc.findCurrentTermValueSet(vsNoVersionedVersion); - assertTrue(noUploadVersionedVsOpt.isPresent()); - assertNull(noUploadVersionedVsOpt.get().getVersion()); - - String vsersionedVersion = VS_VERSIONED_ON_UPLOAD + (ver == null ? "" : "-" + ver); - Optional<TermValueSet> uploadVersionedVsOpt = myITermReadSvc.findCurrentTermValueSet(vsersionedVersion); - assertTrue(uploadVersionedVsOpt.isPresent()); - assertEquals(VS_ANSWER_LIST_VERSION, uploadVersionedVsOpt.get().getVersion()); + // validate operation for specific version + validateOperations(null, Lists.newArrayList(firstVer, secondVer)); } - // @Test + @Test public void uploadFirstCurrentNoVersionThenNoCurrentThenCurrent() throws Exception { uploadLoincCodeSystem(null, true); - uploadLoincCodeSystem("2.58", false); - uploadLoincCodeSystem("2.59", true); -// Optional<Long> csIdVersionedOpt = myForcedIdDao.findByTypeAndForcedId("CodeSystem", "loinc" + "-" + "2.58"); -// assertFalse(csIdVersionedOpt.isPresent()); -// -// Optional<Long> csIdNoVersionedOpt = myForcedIdDao.findByTypeAndForcedId("CodeSystem", "loinc"); -// assertTrue(csIdNoVersionedOpt.isPresent()); + String firstVer = "2.67"; + uploadLoincCodeSystem(firstVer, false); - // make sure: + String secondVer = "2.68"; + uploadLoincCodeSystem(secondVer, true); - // curr CS ver is null ver with 2.59 data + runCommonValidations(firstVer); + runCommonValidations(secondVer); - // VS present for V 2.58 (curr = false), 2.59 (curr = true) & null (curr = true) - - // only one VS per url-ver true - // both curr = true have same data (2.59) + // validate operation for specific version + validateOperations(secondVer, Lists.newArrayList(firstVer, secondVer)); } -// @Test + @Test public void uploadFirstCurrentWithVersionThenNoCurrentThenCurrent() throws Exception { - uploadLoincCodeSystem("2.57", true); - uploadLoincCodeSystem("2.58", false); - uploadLoincCodeSystem("2.59", true); + String firstVer = "2.67"; + uploadLoincCodeSystem(firstVer, true); -// Optional<Long> csIdVersionedOpt = myForcedIdDao.findByTypeAndForcedId("CodeSystem", "loinc" + "-" + "2.58"); -// assertFalse(csIdVersionedOpt.isPresent()); -// -// Optional<Long> csIdNoVersionedOpt = myForcedIdDao.findByTypeAndForcedId("CodeSystem", "loinc"); -// assertTrue(csIdNoVersionedOpt.isPresent()); + String secondVer = "2.68"; + uploadLoincCodeSystem(secondVer, false); - // make sure: + String thirdVer = "2.68"; + uploadLoincCodeSystem(thirdVer, true); - // curr CS ver is null ver with 2.59 data + runCommonValidations(firstVer); + runCommonValidations(secondVer); + runCommonValidations(thirdVer); - // VS present for V 2.57 (curr = false), 2.58 (curr = false), 2,59 (curr = true) & null (curr = true) - - // both curr = true have same data (2.59) + // validate operation for specific version + validateOperations(thirdVer, Lists.newArrayList(firstVer, secondVer, thirdVer)); } -// @Test -// public void testValidateCode() { -// createCodeSystem(); -// -// IValidationSupport.CodeValidationResult validation = myTermSvc.validateCode(new ValidationSupportContext(myValidationSupport), new ConceptValidationOptions(), CS_URL, "ParentWithNoChildrenA", null, null); -// assertTrue(validation.isOk()); -// -// validation = myTermSvc.validateCode(new ValidationSupportContext(myValidationSupport), new ConceptValidationOptions(), CS_URL, "ZZZZZZZ", null, null); -// assertFalse(validation.isOk()); -// } private IIdType uploadLoincCodeSystem(String theVersion, boolean theMakeItCurrent) throws Exception { diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/AnswerFile/AnswerList.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/AnswerFile/AnswerList.csv index fae22daef78..f07d57edd54 100644 --- a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/AnswerFile/AnswerList.csv +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/AnswerFile/AnswerList.csv @@ -1,12 +1,12 @@ "AnswerListId","AnswerListName" ,"AnswerListOID" ,"ExtDefinedYN","ExtDefinedAnswerListCodeSystem","ExtDefinedAnswerListLink" ,"AnswerStringId","LocalAnswerCode","LocalAnswerCodeSystem","SequenceNumber","DisplayText" ,"ExtCodeId","ExtCodeDisplayName" ,"ExtCodeSystem" ,"ExtCodeSystemVersion" ,"ExtCodeSystemCopyrightNotice" ,"SubsequentTextPrompt","Description","Score" -"LL1000-0" ,"v2.67 PhenX05_13_30D bread amt","1.3.6.1.4.1.12009.10.1.165" ,"N" , , ,"LA13825-7" ,"1" , ,1 ,"1 slice or 1 dinner roll" , , , , , , , , -"LL1000-0" ,"v2.67 PhenX05_13_30D bread amt","1.3.6.1.4.1.12009.10.1.165" ,"N" , , ,"LA13838-0" ,"2" , ,2 ,"2 slices or 2 dinner rolls" , , , , , , , , -"LL1000-0" ,"v2.67 PhenX05_13_30D bread amt","1.3.6.1.4.1.12009.10.1.165" ,"N" , , ,"LA13892-7" ,"3" , ,3 ,"More than 2 slices or 2 dinner rolls", , , , , , , , -"LL1001-8" ,"v2.67 PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA6270-8" ,"00" , ,1 ,"Never" , , , , , , , , -"LL1001-8" ,"v2.67 PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13836-4" ,"01" , ,2 ,"1-3 times per month" , , , , , , , , -"LL1001-8" ,"v2.67 PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13834-9" ,"02" , ,3 ,"1-2 times per week" , , , , , , , , -"LL1001-8" ,"v2.67 PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13853-9" ,"03" , ,4 ,"3-4 times per week" , , , , , , , , -"LL1001-8" ,"v2.67 PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13860-4" ,"04" , ,5 ,"5-6 times per week" , , , , , , , , -"LL1001-8" ,"v2.67 PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13827-3" ,"05" , ,6 ,"1 time per day" , , , , , , , , -"LL1001-8" ,"v2.67 PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA4389-8" ,"97" , ,11 ,"Refused" ,"443390004","Refused (qualifier value)","http://snomed.info/sct","http://snomed.info/sct/900000000000207008/version/20170731","This material includes SNOMED Clinical Terms® (SNOMED CT®) which is used by permission of the International Health Terminology Standards Development Organisation (IHTSDO) under license. All rights reserved. SNOMED CT® was originally created by The College", , , +"LL1000-0" ,"v2.67 PhenX05_13_30D bread amt","1.3.6.1.4.1.12009.10.1.165" ,"N" , , ,"LA13825-7" ,"1" , ,1 ,"v2.67 1 slice or 1 dinner roll" , , , , , , , , +"LL1000-0" ,"v2.67 PhenX05_13_30D bread amt","1.3.6.1.4.1.12009.10.1.165" ,"N" , , ,"LA13838-0" ,"2" , ,2 ,"v2.67 2 slices or 2 dinner rolls" , , , , , , , , +"LL1000-0" ,"v2.67 PhenX05_13_30D bread amt","1.3.6.1.4.1.12009.10.1.165" ,"N" , , ,"LA13892-7" ,"3" , ,3 ,"v2.67 More than 2 slices or 2 dinner rolls", , , , , , , , +"LL1001-8" ,"v2.67 PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA6270-8" ,"00" , ,1 ,"v2.67 Never" , , , , , , , , +"LL1001-8" ,"v2.67 PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13836-4" ,"01" , ,2 ,"v2.67 1-3 times per month" , , , , , , , , +"LL1001-8" ,"v2.67 PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13834-9" ,"02" , ,3 ,"v2.67 1-2 times per week" , , , , , , , , +"LL1001-8" ,"v2.67 PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13853-9" ,"03" , ,4 ,"v2.67 3-4 times per week" , , , , , , , , +"LL1001-8" ,"v2.67 PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13860-4" ,"04" , ,5 ,"v2.67 5-6 times per week" , , , , , , , , +"LL1001-8" ,"v2.67 PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13827-3" ,"05" , ,6 ,"v2.67 1 time per day" , , , , , , , , +"LL1001-8" ,"v2.67 PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA4389-8" ,"97" , ,11 ,"v2.67 Refused" ,"443390004","Refused (qualifier value)","http://snomed.info/sct","http://snomed.info/sct/900000000000207008/version/20170731","This material includes SNOMED Clinical Terms® (SNOMED CT®) which is used by permission of the International Health Terminology Standards Development Organisation (IHTSDO) under license. All rights reserved. SNOMED CT® was originally created by The College", , , "LL1892-0" ,"v2.67 ICD-9_ICD-10" ,"1.3.6.1.4.1.12009.10.1.1069","Y" , ,"http://www.cdc.gov/nchs/icd.htm", , , , , , , , , , , , , diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/ImagingDocuments/ImagingDocumentCodes.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/ImagingDocuments/ImagingDocumentCodes.csv index a26397639ff..06e5b67b70d 100644 --- a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/ImagingDocuments/ImagingDocumentCodes.csv +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/ImagingDocuments/ImagingDocumentCodes.csv @@ -1,6 +1,6 @@ "LOINC_NUM","LONG_COMMON_NAME" "11525-3","US Pelvis Fetus for pregnancy" -"17787-3","NM Thyroid gland Study report" +"17787-3","v2.67 NM Thyroid gland Study report" "18744-3","Bronchoscopy study" "18746-8","Colonoscopy study" "18748-4","Diagnostic imaging study" diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/PanelsAndForms/Loinc.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/PanelsAndForms/Loinc.csv index 20379cb7f1d..62a7af00421 100644 --- a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/PanelsAndForms/Loinc.csv +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/PanelsAndForms/Loinc.csv @@ -10,7 +10,7 @@ "10020-6" ,"R' wave amplitude.lead V5" ,"Elpot" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"Cardiac; ECG; EKG.MEASUREMENTS; Electrical potential; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave Amp L-V5; R wave Amp L-V5; Random; Right; Voltage" ,"R' wave Amp L-V5" ,"Observation", , , ,"mV" ,"R' wave amplitude in lead V5" , , ,"mV" , , , , ,0 ,0 ,0 , , , , , , , "61438-8" ,"Each time you ate bread, toast or dinner rolls, how much did you usually eat in the past 30D","Find" ,"Pt" ,"^Patient" ,"Ord" ,"PhenX" ,"PHENX" ,"2.44" ,"MIN" , ,"TRIAL" , ,2 , , , ,"Each time you eat bread, toast or dinner rolls, how much do you usually eat?","PhenX.050201100100","N" , ,"Finding; Findings; How much bread in 30D; Last; Ordinal; Point in time; QL; Qual; Qualitative; Random; Screen" ,"How much bread in 30D PhenX", , , , , ,"Each time you ate bread, toast or dinner rolls, how much did you usually eat in the past 30 days [PhenX]", , , , , , , ,0 ,0 ,0 , , , , , , , "10000-8" ,"R wave duration.lead AVR" ,"Time" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"Cardiac; Durat; ECG; EKG.MEASUREMENTS; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave dur L-AVR; R wave dur L-AVR; Random; Right" ,"R wave dur L-AVR" ,"Observation", , , ,"s" ,"R wave duration in lead AVR" , , ,"s" , , , , ,0 ,0 ,0 , , , , , , , -"17787-3" ,"Study report" ,"Find" ,"Pt" ,"Neck>Thyroid gland","Doc" ,"NM" ,"RAD" ,"2.61" ,"MIN" , ,"ACTIVE", ,2 , , , , , , , ,"Document; Finding; Findings; Imaging; Point in time; Radiology; Random; Study report; Thy" ,"NM Thyroid Study report" ,"Both" , , , , ,"NM Thyroid gland Study report" , , , , , , ,"Changed System from ""Thyroid"" for conformance with the LOINC/RadLex unified model.; Method of ""Radnuc"" was changed to ""NM"". The LOINC/RadLex Committee agreed to use a subset of the two-letter DICOM modality codes as the primary modality identifier." ,0 ,0 ,0 ,"IG exists" , , , ,"81220-6;72230-6" ,"1.0l" , +"17787-3" ,"Study report" ,"Find" ,"Pt" ,"Neck>Thyroid gland","Doc" ,"NM" ,"RAD" ,"2.61" ,"MIN" , ,"ACTIVE", ,2 , , , , , , , ,"Document; Finding; Findings; Imaging; Point in time; Radiology; Random; Study report; Thy" ,"NM Thyroid Study report" ,"Both" , , , , ,"v2.67 NM Thyroid gland Study report" , , , , , , ,"Changed System from ""Thyroid"" for conformance with the LOINC/RadLex unified model.; Method of ""Radnuc"" was changed to ""NM"". The LOINC/RadLex Committee agreed to use a subset of the two-letter DICOM modality codes as the primary modality identifier." ,0 ,0 ,0 ,"IG exists" , , , ,"81220-6;72230-6" ,"1.0l" , "17788-1" ,"Large unstained cells/100 leukocytes" ,"NFr" ,"Pt" ,"Bld" ,"Qn" ,"Automated count","HEM/BC" ,"2.50" ,"MIN" ,"Part of auto diff output of Bayer H*3S; peroxidase negative cells too large to be classified as lymph or basophil" ,"ACTIVE", ,1 , , , , , ,"Y" ,"%" ,"100WBC; Auto; Automated detection; Blood; Cell; Cellularity; Elec; Elect; Electr; HEMATOLOGY/CELL COUNTS; Leuc; Leuk; Leukocyte; Lkcs; LUC; Number Fraction; Percent; Point in time; QNT; Quan; Quant; Quantitative; Random; WB; WBC; WBCs; White blood cell; White blood cells; Whole blood" ,"LUC/leuk NFr Bld Auto" ,"Observation", , , ,"%" ,"Large unstained cells/100 leukocytes in Blood by Automated count" , , ,"%" , , , , ,1894 ,0 ,1894 , , , , , ,"1.0l" , "11488-4" ,"Consultation note" ,"Find" ,"Pt" ,"{Setting}" ,"Doc" ,"{Role}" ,"DOC.ONTOLOGY","2.63" ,"MIN" , ,"ACTIVE", ,2 , , , , , , , ,"Consult note; DOC.ONT; Document; Encounter; Evaluation and management; Evaluation and management note; Finding; Findings; notes; Point in time; Random; Visit note" ,"Consult note" ,"Both" , , , , ,"Consult note" , , , , , , ,"Edit made because this term is conformant to the Document Ontology axis values and therefore are being placed in this class.; Based on Clinical LOINC Committee decision during the September 2014 meeting, {Provider} was changed to {Author Type} to emphasize a greater breadth of potential document authors. At the September 2015 Clinical LOINC Committee meeting, the Committee decided to change {Author Type} to {Role} to align with the 'Role' axis name in the LOINC Document Ontology.; Because it is too difficult to maintain and because the distinction between documents and sections is not clear-cut nor necessary in most cases, the DOCUMENT_SECTION field has been deemed to have little value. The field has been set to null in the December 2017 release in preparation for removal in the December 2018 release. These changes were approved by the Clinical LOINC Committee.",0 ,0 ,0 ,"IG exists" , , , ,"81222-2;72231-4;81243-8","1.0j-a" ,"Y" "47239-9" ,"Reason for stopping HIV Rx" ,"Type" ,"Pt" ,"^Patient" ,"Nom" ,"Reported" ,"ART" ,"2.50" ,"MIN" ,"Reason for stopping antiretroviral therapy" ,"ACTIVE", ,2 , , , , , ,"N" , ,"AIDS; Anti-retroviral therapy; ART; Human immunodeficiency virus; Nominal; Point in time; Random; Treatment; Typ" ,"Reason for stopping HIV Rx" ,"Observation", , ,"Copyright © 2006 World Health Organization. Used with permission. Publications of the World Health Organization can be obtained from WHO Press, World Health Organization, 20 Avenue Appia, 1211 Geneva 27, Switzerland (tel: +41 22 791 2476; fax: +41 22 791 4857; email: bookorders@who.int). Requests for permission to reproduce or translate WHO publications – whether for sale or for noncommercial distribution – should be addressed to WHO Press, at the above address (fax: +41 22 791 4806; email: permissions@who.int). The designations employed and the presentation of the material in this publication do not imply the expression of any opinion whatsoever on the part of the World Health Organization concerning the legal status of any country, territory, city or area or of its authorities, or concerning the delimitation of its frontiers or boundaries. Dotted lines on maps represent approximate border lines for which there may not yet be full agreement. The mention of specific companies or of certain manufacturers’ products does not imply that they are endorsed or recommended by the World Health Organization in preference to others of a similar nature that are not mentioned. Errors and omissions excepted, the names of proprietary products are distinguished by initial capital letters. All reasonable precautions have been taken by WHO to verify the information contained in this publication. However, the published material is being distributed without warranty of any kind, either express or implied. The responsibility for the interpretation and use of the material lies with the reader. In no event shall the World Health Organization be liable for damages arising from its use.", ,"Reason for stopping HIV treatment" , , , , , , , ,0 ,0 ,0 , ,"WHO_HIV" , , , ,"2.22" , diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/LoincTable/Loinc.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/LoincTable/Loinc.csv index 4017edb85b0..1998b5c00e5 100644 --- a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/LoincTable/Loinc.csv +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/LoincTable/Loinc.csv @@ -10,7 +10,7 @@ "10020-6" ,"v2.67 R' wave amplitude.lead V5" ,"Elpot" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"Cardiac; ECG; EKG.MEASUREMENTS; Electrical potential; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave Amp L-V5; R wave Amp L-V5; Random; Right; Voltage" ,"R' wave Amp L-V5" ,"Observation", , , ,"mV" ,"R' wave amplitude in lead V5" , , ,"mV" , , , , ,0 ,0 ,0 , , , , , , , "61438-8" ,"v2.67 Each time you ate bread, toast or dinner rolls, how much did you usually eat in the past 30D","Find" ,"Pt" ,"^Patient" ,"Ord" ,"PhenX" ,"PHENX" ,"2.44" ,"MIN" , ,"TRIAL" , ,2 , , , ,"Each time you eat bread, toast or dinner rolls, how much do you usually eat?","PhenX.050201100100","N" , ,"Finding; Findings; How much bread in 30D; Last; Ordinal; Point in time; QL; Qual; Qualitative; Random; Screen" ,"How much bread in 30D PhenX", , , , , ,"Each time you ate bread, toast or dinner rolls, how much did you usually eat in the past 30 days [PhenX]", , , , , , , ,0 ,0 ,0 , , , , , , , "10000-8" ,"v2.67 R wave duration.lead AVR" ,"Time" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"Cardiac; Durat; ECG; EKG.MEASUREMENTS; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave dur L-AVR; R wave dur L-AVR; Random; Right" ,"R wave dur L-AVR" ,"Observation", , , ,"s" ,"R wave duration in lead AVR" , , ,"s" , , , , ,0 ,0 ,0 , , , , , , , -"17787-3" ,"v2.67 Study report" ,"Find" ,"Pt" ,"Neck>Thyroid gland","Doc" ,"NM" ,"RAD" ,"2.61" ,"MIN" , ,"ACTIVE", ,2 , , , , , , , ,"Document; Finding; Findings; Imaging; Point in time; Radiology; Random; Study report; Thy" ,"NM Thyroid Study report" ,"Both" , , , , ,"NM Thyroid gland Study report" , , , , , , ,"Changed System from ""Thyroid"" for conformance with the LOINC/RadLex unified model.; Method of ""Radnuc"" was changed to ""NM"". The LOINC/RadLex Committee agreed to use a subset of the two-letter DICOM modality codes as the primary modality identifier." ,0 ,0 ,0 ,"IG exists" , , , ,"81220-6;72230-6" ,"1.0l" , +"17787-3" ,"v2.67 Study report" ,"Find" ,"Pt" ,"Neck>Thyroid gland","Doc" ,"NM" ,"RAD" ,"2.61" ,"MIN" , ,"ACTIVE", ,2 , , , , , , , ,"Document; Finding; Findings; Imaging; Point in time; Radiology; Random; Study report; Thy" ,"NM Thyroid Study report" ,"Both" , , , , ,"v2.67 NM Thyroid gland Study report" , , , , , , ,"Changed System from ""Thyroid"" for conformance with the LOINC/RadLex unified model.; Method of ""Radnuc"" was changed to ""NM"". The LOINC/RadLex Committee agreed to use a subset of the two-letter DICOM modality codes as the primary modality identifier." ,0 ,0 ,0 ,"IG exists" , , , ,"81220-6;72230-6" ,"1.0l" , "17788-1" ,"v2.67 Large unstained cells/100 leukocytes" ,"NFr" ,"Pt" ,"Bld" ,"Qn" ,"Automated count","HEM/BC" ,"2.50" ,"MIN" ,"Part of auto diff output of Bayer H*3S; peroxidase negative cells too large to be classified as lymph or basophil" ,"ACTIVE", ,1 , , , , , ,"Y" ,"%" ,"100WBC; Auto; Automated detection; Blood; Cell; Cellularity; Elec; Elect; Electr; HEMATOLOGY/CELL COUNTS; Leuc; Leuk; Leukocyte; Lkcs; LUC; Number Fraction; Percent; Point in time; QNT; Quan; Quant; Quantitative; Random; WB; WBC; WBCs; White blood cell; White blood cells; Whole blood" ,"LUC/leuk NFr Bld Auto" ,"Observation", , , ,"%" ,"Large unstained cells/100 leukocytes in Blood by Automated count" , , ,"%" , , , , ,1894 ,0 ,1894 , , , , , ,"1.0l" , "11488-4" ,"v2.67 Consultation note" ,"Find" ,"Pt" ,"{Setting}" ,"Doc" ,"{Role}" ,"DOC.ONTOLOGY","2.63" ,"MIN" , ,"ACTIVE", ,2 , , , , , , , ,"Consult note; DOC.ONT; Document; Encounter; Evaluation and management; Evaluation and management note; Finding; Findings; notes; Point in time; Random; Visit note" ,"Consult note" ,"Both" , , , , ,"Consult note" , , , , , , ,"Edit made because this term is conformant to the Document Ontology axis values and therefore are being placed in this class.; Based on Clinical LOINC Committee decision during the September 2014 meeting, {Provider} was changed to {Author Type} to emphasize a greater breadth of potential document authors. At the September 2015 Clinical LOINC Committee meeting, the Committee decided to change {Author Type} to {Role} to align with the 'Role' axis name in the LOINC Document Ontology.; Because it is too difficult to maintain and because the distinction between documents and sections is not clear-cut nor necessary in most cases, the DOCUMENT_SECTION field has been deemed to have little value. The field has been set to null in the December 2017 release in preparation for removal in the December 2018 release. These changes were approved by the Clinical LOINC Committee.",0 ,0 ,0 ,"IG exists" , , , ,"81222-2;72231-4;81243-8","1.0j-a" ,"Y" "47239-9" ,"v2.67 Reason for stopping HIV Rx" ,"Type" ,"Pt" ,"^Patient" ,"Nom" ,"Reported" ,"ART" ,"2.50" ,"MIN" ,"Reason for stopping antiretroviral therapy" ,"ACTIVE", ,2 , , , , , ,"N" , ,"AIDS; Anti-retroviral therapy; ART; Human immunodeficiency virus; Nominal; Point in time; Random; Treatment; Typ" ,"Reason for stopping HIV Rx" ,"Observation", , ,"Copyright © 2006 World Health Organization. Used with permission. Publications of the World Health Organization can be obtained from WHO Press, World Health Organization, 20 Avenue Appia, 1211 Geneva 27, Switzerland (tel: +41 22 791 2476; fax: +41 22 791 4857; email: bookorders@who.int). Requests for permission to reproduce or translate WHO publications – whether for sale or for noncommercial distribution – should be addressed to WHO Press, at the above address (fax: +41 22 791 4806; email: permissions@who.int). The designations employed and the presentation of the material in this publication do not imply the expression of any opinion whatsoever on the part of the World Health Organization concerning the legal status of any country, territory, city or area or of its authorities, or concerning the delimitation of its frontiers or boundaries. Dotted lines on maps represent approximate border lines for which there may not yet be full agreement. The mention of specific companies or of certain manufacturers’ products does not imply that they are endorsed or recommended by the World Health Organization in preference to others of a similar nature that are not mentioned. Errors and omissions excepted, the names of proprietary products are distinguished by initial capital letters. All reasonable precautions have been taken by WHO to verify the information contained in this publication. However, the published material is being distributed without warranty of any kind, either express or implied. The responsibility for the interpretation and use of the material lies with the reader. In no event shall the World Health Organization be liable for damages arising from its use.", ,"Reason for stopping HIV treatment" , , , , , , , ,0 ,0 ,0 , ,"WHO_HIV" , , , ,"2.22" , diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/ImagingDocuments/ImagingDocumentCodes.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/ImagingDocuments/ImagingDocumentCodes.csv index a26397639ff..a78b16dd69a 100644 --- a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/ImagingDocuments/ImagingDocumentCodes.csv +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/ImagingDocuments/ImagingDocumentCodes.csv @@ -1,6 +1,6 @@ "LOINC_NUM","LONG_COMMON_NAME" "11525-3","US Pelvis Fetus for pregnancy" -"17787-3","NM Thyroid gland Study report" +"17787-3","v2.68 NM Thyroid gland Study report" "18744-3","Bronchoscopy study" "18746-8","Colonoscopy study" "18748-4","Diagnostic imaging study" diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/PanelsAndForms/Loinc.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/PanelsAndForms/Loinc.csv index 20379cb7f1d..ec4fd526a0c 100644 --- a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/PanelsAndForms/Loinc.csv +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/PanelsAndForms/Loinc.csv @@ -10,7 +10,7 @@ "10020-6" ,"R' wave amplitude.lead V5" ,"Elpot" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"Cardiac; ECG; EKG.MEASUREMENTS; Electrical potential; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave Amp L-V5; R wave Amp L-V5; Random; Right; Voltage" ,"R' wave Amp L-V5" ,"Observation", , , ,"mV" ,"R' wave amplitude in lead V5" , , ,"mV" , , , , ,0 ,0 ,0 , , , , , , , "61438-8" ,"Each time you ate bread, toast or dinner rolls, how much did you usually eat in the past 30D","Find" ,"Pt" ,"^Patient" ,"Ord" ,"PhenX" ,"PHENX" ,"2.44" ,"MIN" , ,"TRIAL" , ,2 , , , ,"Each time you eat bread, toast or dinner rolls, how much do you usually eat?","PhenX.050201100100","N" , ,"Finding; Findings; How much bread in 30D; Last; Ordinal; Point in time; QL; Qual; Qualitative; Random; Screen" ,"How much bread in 30D PhenX", , , , , ,"Each time you ate bread, toast or dinner rolls, how much did you usually eat in the past 30 days [PhenX]", , , , , , , ,0 ,0 ,0 , , , , , , , "10000-8" ,"R wave duration.lead AVR" ,"Time" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"Cardiac; Durat; ECG; EKG.MEASUREMENTS; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave dur L-AVR; R wave dur L-AVR; Random; Right" ,"R wave dur L-AVR" ,"Observation", , , ,"s" ,"R wave duration in lead AVR" , , ,"s" , , , , ,0 ,0 ,0 , , , , , , , -"17787-3" ,"Study report" ,"Find" ,"Pt" ,"Neck>Thyroid gland","Doc" ,"NM" ,"RAD" ,"2.61" ,"MIN" , ,"ACTIVE", ,2 , , , , , , , ,"Document; Finding; Findings; Imaging; Point in time; Radiology; Random; Study report; Thy" ,"NM Thyroid Study report" ,"Both" , , , , ,"NM Thyroid gland Study report" , , , , , , ,"Changed System from ""Thyroid"" for conformance with the LOINC/RadLex unified model.; Method of ""Radnuc"" was changed to ""NM"". The LOINC/RadLex Committee agreed to use a subset of the two-letter DICOM modality codes as the primary modality identifier." ,0 ,0 ,0 ,"IG exists" , , , ,"81220-6;72230-6" ,"1.0l" , +"17787-3" ,"Study report" ,"Find" ,"Pt" ,"Neck>Thyroid gland","Doc" ,"NM" ,"RAD" ,"2.61" ,"MIN" , ,"ACTIVE", ,2 , , , , , , , ,"Document; Finding; Findings; Imaging; Point in time; Radiology; Random; Study report; Thy" ,"NM Thyroid Study report" ,"Both" , , , , ,"v2.68 NM Thyroid gland Study report" , , , , , , ,"Changed System from ""Thyroid"" for conformance with the LOINC/RadLex unified model.; Method of ""Radnuc"" was changed to ""NM"". The LOINC/RadLex Committee agreed to use a subset of the two-letter DICOM modality codes as the primary modality identifier." ,0 ,0 ,0 ,"IG exists" , , , ,"81220-6;72230-6" ,"1.0l" , "17788-1" ,"Large unstained cells/100 leukocytes" ,"NFr" ,"Pt" ,"Bld" ,"Qn" ,"Automated count","HEM/BC" ,"2.50" ,"MIN" ,"Part of auto diff output of Bayer H*3S; peroxidase negative cells too large to be classified as lymph or basophil" ,"ACTIVE", ,1 , , , , , ,"Y" ,"%" ,"100WBC; Auto; Automated detection; Blood; Cell; Cellularity; Elec; Elect; Electr; HEMATOLOGY/CELL COUNTS; Leuc; Leuk; Leukocyte; Lkcs; LUC; Number Fraction; Percent; Point in time; QNT; Quan; Quant; Quantitative; Random; WB; WBC; WBCs; White blood cell; White blood cells; Whole blood" ,"LUC/leuk NFr Bld Auto" ,"Observation", , , ,"%" ,"Large unstained cells/100 leukocytes in Blood by Automated count" , , ,"%" , , , , ,1894 ,0 ,1894 , , , , , ,"1.0l" , "11488-4" ,"Consultation note" ,"Find" ,"Pt" ,"{Setting}" ,"Doc" ,"{Role}" ,"DOC.ONTOLOGY","2.63" ,"MIN" , ,"ACTIVE", ,2 , , , , , , , ,"Consult note; DOC.ONT; Document; Encounter; Evaluation and management; Evaluation and management note; Finding; Findings; notes; Point in time; Random; Visit note" ,"Consult note" ,"Both" , , , , ,"Consult note" , , , , , , ,"Edit made because this term is conformant to the Document Ontology axis values and therefore are being placed in this class.; Based on Clinical LOINC Committee decision during the September 2014 meeting, {Provider} was changed to {Author Type} to emphasize a greater breadth of potential document authors. At the September 2015 Clinical LOINC Committee meeting, the Committee decided to change {Author Type} to {Role} to align with the 'Role' axis name in the LOINC Document Ontology.; Because it is too difficult to maintain and because the distinction between documents and sections is not clear-cut nor necessary in most cases, the DOCUMENT_SECTION field has been deemed to have little value. The field has been set to null in the December 2017 release in preparation for removal in the December 2018 release. These changes were approved by the Clinical LOINC Committee.",0 ,0 ,0 ,"IG exists" , , , ,"81222-2;72231-4;81243-8","1.0j-a" ,"Y" "47239-9" ,"Reason for stopping HIV Rx" ,"Type" ,"Pt" ,"^Patient" ,"Nom" ,"Reported" ,"ART" ,"2.50" ,"MIN" ,"Reason for stopping antiretroviral therapy" ,"ACTIVE", ,2 , , , , , ,"N" , ,"AIDS; Anti-retroviral therapy; ART; Human immunodeficiency virus; Nominal; Point in time; Random; Treatment; Typ" ,"Reason for stopping HIV Rx" ,"Observation", , ,"Copyright © 2006 World Health Organization. Used with permission. Publications of the World Health Organization can be obtained from WHO Press, World Health Organization, 20 Avenue Appia, 1211 Geneva 27, Switzerland (tel: +41 22 791 2476; fax: +41 22 791 4857; email: bookorders@who.int). Requests for permission to reproduce or translate WHO publications – whether for sale or for noncommercial distribution – should be addressed to WHO Press, at the above address (fax: +41 22 791 4806; email: permissions@who.int). The designations employed and the presentation of the material in this publication do not imply the expression of any opinion whatsoever on the part of the World Health Organization concerning the legal status of any country, territory, city or area or of its authorities, or concerning the delimitation of its frontiers or boundaries. Dotted lines on maps represent approximate border lines for which there may not yet be full agreement. The mention of specific companies or of certain manufacturers’ products does not imply that they are endorsed or recommended by the World Health Organization in preference to others of a similar nature that are not mentioned. Errors and omissions excepted, the names of proprietary products are distinguished by initial capital letters. All reasonable precautions have been taken by WHO to verify the information contained in this publication. However, the published material is being distributed without warranty of any kind, either express or implied. The responsibility for the interpretation and use of the material lies with the reader. In no event shall the World Health Organization be liable for damages arising from its use.", ,"Reason for stopping HIV treatment" , , , , , , , ,0 ,0 ,0 , ,"WHO_HIV" , , , ,"2.22" , diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/LoincTable/Loinc.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/LoincTable/Loinc.csv index 8f43cfb4941..215f236095b 100644 --- a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/LoincTable/Loinc.csv +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/LoincTable/Loinc.csv @@ -10,7 +10,7 @@ "10020-6" ,"v2.68 R' wave amplitude.lead V5" ,"Elpot" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"Cardiac; ECG; EKG.MEASUREMENTS; Electrical potential; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave Amp L-V5; R wave Amp L-V5; Random; Right; Voltage" ,"R' wave Amp L-V5" ,"Observation", , , ,"mV" ,"R' wave amplitude in lead V5" , , ,"mV" , , , , ,0 ,0 ,0 , , , , , , , "61438-8" ,"v2.68 Each time you ate bread, toast or dinner rolls, how much did you usually eat in the past 30D","Find" ,"Pt" ,"^Patient" ,"Ord" ,"PhenX" ,"PHENX" ,"2.44" ,"MIN" , ,"TRIAL" , ,2 , , , ,"Each time you eat bread, toast or dinner rolls, how much do you usually eat?","PhenX.050201100100","N" , ,"Finding; Findings; How much bread in 30D; Last; Ordinal; Point in time; QL; Qual; Qualitative; Random; Screen" ,"How much bread in 30D PhenX", , , , , ,"Each time you ate bread, toast or dinner rolls, how much did you usually eat in the past 30 days [PhenX]", , , , , , , ,0 ,0 ,0 , , , , , , , "10000-8" ,"v2.68 R wave duration.lead AVR" ,"Time" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"Cardiac; Durat; ECG; EKG.MEASUREMENTS; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave dur L-AVR; R wave dur L-AVR; Random; Right" ,"R wave dur L-AVR" ,"Observation", , , ,"s" ,"R wave duration in lead AVR" , , ,"s" , , , , ,0 ,0 ,0 , , , , , , , -"17787-3" ,"v2.68 Study report" ,"Find" ,"Pt" ,"Neck>Thyroid gland","Doc" ,"NM" ,"RAD" ,"2.61" ,"MIN" , ,"ACTIVE", ,2 , , , , , , , ,"Document; Finding; Findings; Imaging; Point in time; Radiology; Random; Study report; Thy" ,"NM Thyroid Study report" ,"Both" , , , , ,"NM Thyroid gland Study report" , , , , , , ,"Changed System from ""Thyroid"" for conformance with the LOINC/RadLex unified model.; Method of ""Radnuc"" was changed to ""NM"". The LOINC/RadLex Committee agreed to use a subset of the two-letter DICOM modality codes as the primary modality identifier." ,0 ,0 ,0 ,"IG exists" , , , ,"81220-6;72230-6" ,"1.0l" , +"17787-3" ,"v2.68 Study report" ,"Find" ,"Pt" ,"Neck>Thyroid gland","Doc" ,"NM" ,"RAD" ,"2.61" ,"MIN" , ,"ACTIVE", ,2 , , , , , , , ,"Document; Finding; Findings; Imaging; Point in time; Radiology; Random; Study report; Thy" ,"NM Thyroid Study report" ,"Both" , , , , ,"v2.68 NM Thyroid gland Study report" , , , , , , ,"Changed System from ""Thyroid"" for conformance with the LOINC/RadLex unified model.; Method of ""Radnuc"" was changed to ""NM"". The LOINC/RadLex Committee agreed to use a subset of the two-letter DICOM modality codes as the primary modality identifier." ,0 ,0 ,0 ,"IG exists" , , , ,"81220-6;72230-6" ,"1.0l" , "17788-1" ,"v2.68 Large unstained cells/100 leukocytes" ,"NFr" ,"Pt" ,"Bld" ,"Qn" ,"Automated count","HEM/BC" ,"2.50" ,"MIN" ,"Part of auto diff output of Bayer H*3S; peroxidase negative cells too large to be classified as lymph or basophil" ,"ACTIVE", ,1 , , , , , ,"Y" ,"%" ,"100WBC; Auto; Automated detection; Blood; Cell; Cellularity; Elec; Elect; Electr; HEMATOLOGY/CELL COUNTS; Leuc; Leuk; Leukocyte; Lkcs; LUC; Number Fraction; Percent; Point in time; QNT; Quan; Quant; Quantitative; Random; WB; WBC; WBCs; White blood cell; White blood cells; Whole blood" ,"LUC/leuk NFr Bld Auto" ,"Observation", , , ,"%" ,"Large unstained cells/100 leukocytes in Blood by Automated count" , , ,"%" , , , , ,1894 ,0 ,1894 , , , , , ,"1.0l" , "11488-4" ,"v2.68 Consultation note" ,"Find" ,"Pt" ,"{Setting}" ,"Doc" ,"{Role}" ,"DOC.ONTOLOGY","2.63" ,"MIN" , ,"ACTIVE", ,2 , , , , , , , ,"Consult note; DOC.ONT; Document; Encounter; Evaluation and management; Evaluation and management note; Finding; Findings; notes; Point in time; Random; Visit note" ,"Consult note" ,"Both" , , , , ,"Consult note" , , , , , , ,"Edit made because this term is conformant to the Document Ontology axis values and therefore are being placed in this class.; Based on Clinical LOINC Committee decision during the September 2014 meeting, {Provider} was changed to {Author Type} to emphasize a greater breadth of potential document authors. At the September 2015 Clinical LOINC Committee meeting, the Committee decided to change {Author Type} to {Role} to align with the 'Role' axis name in the LOINC Document Ontology.; Because it is too difficult to maintain and because the distinction between documents and sections is not clear-cut nor necessary in most cases, the DOCUMENT_SECTION field has been deemed to have little value. The field has been set to null in the December 2017 release in preparation for removal in the December 2018 release. These changes were approved by the Clinical LOINC Committee.",0 ,0 ,0 ,"IG exists" , , , ,"81222-2;72231-4;81243-8","1.0j-a" ,"Y" "47239-9" ,"v2.68 Reason for stopping HIV Rx" ,"Type" ,"Pt" ,"^Patient" ,"Nom" ,"Reported" ,"ART" ,"2.50" ,"MIN" ,"Reason for stopping antiretroviral therapy" ,"ACTIVE", ,2 , , , , , ,"N" , ,"AIDS; Anti-retroviral therapy; ART; Human immunodeficiency virus; Nominal; Point in time; Random; Treatment; Typ" ,"Reason for stopping HIV Rx" ,"Observation", , ,"Copyright © 2006 World Health Organization. Used with permission. Publications of the World Health Organization can be obtained from WHO Press, World Health Organization, 20 Avenue Appia, 1211 Geneva 27, Switzerland (tel: +41 22 791 2476; fax: +41 22 791 4857; email: bookorders@who.int). Requests for permission to reproduce or translate WHO publications – whether for sale or for noncommercial distribution – should be addressed to WHO Press, at the above address (fax: +41 22 791 4806; email: permissions@who.int). The designations employed and the presentation of the material in this publication do not imply the expression of any opinion whatsoever on the part of the World Health Organization concerning the legal status of any country, territory, city or area or of its authorities, or concerning the delimitation of its frontiers or boundaries. Dotted lines on maps represent approximate border lines for which there may not yet be full agreement. The mention of specific companies or of certain manufacturers’ products does not imply that they are endorsed or recommended by the World Health Organization in preference to others of a similar nature that are not mentioned. Errors and omissions excepted, the names of proprietary products are distinguished by initial capital letters. All reasonable precautions have been taken by WHO to verify the information contained in this publication. However, the published material is being distributed without warranty of any kind, either express or implied. The responsibility for the interpretation and use of the material lies with the reader. In no event shall the World Health Organization be liable for damages arising from its use.", ,"Reason for stopping HIV treatment" , , , , , , , ,0 ,0 ,0 , ,"WHO_HIV" , , , ,"2.22" , diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/ImagingDocuments/ImagingDocumentCodes.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/ImagingDocuments/ImagingDocumentCodes.csv index a26397639ff..30bb5209e9f 100644 --- a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/ImagingDocuments/ImagingDocumentCodes.csv +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/ImagingDocuments/ImagingDocumentCodes.csv @@ -1,6 +1,6 @@ "LOINC_NUM","LONG_COMMON_NAME" "11525-3","US Pelvis Fetus for pregnancy" -"17787-3","NM Thyroid gland Study report" +"17787-3","v2.69 NM Thyroid gland Study report" "18744-3","Bronchoscopy study" "18746-8","Colonoscopy study" "18748-4","Diagnostic imaging study" diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/LoincRsnaRadiologyPlaybook/LoincRsnaRadiologyPlaybook.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/LoincRsnaRadiologyPlaybook/LoincRsnaRadiologyPlaybook.csv index f935aeec77b..0d02ad7cb0b 100644 --- a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/LoincRsnaRadiologyPlaybook/LoincRsnaRadiologyPlaybook.csv +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/LoincRsnaRadiologyPlaybook/LoincRsnaRadiologyPlaybook.csv @@ -1,10 +1,10 @@ "LoincNumber","LongCommonName" ,"PartNumber","PartTypeName" ,"PartName" ,"PartSequenceOrder","RID" ,"PreferredName" ,"RPID" ,"LongName" -"17787-3" ,"v2.68 NM Thyroid gland Study report","LP199995-4","Rad.Anatomic Location.Region Imaged","Neck" ,"A" ,"RID7488" ,"neck" ,"" ,"" -"17787-3" ,"v2.68 NM Thyroid gland Study report","LP206648-0","Rad.Anatomic Location.Imaging Focus","Thyroid gland" ,"A" ,"RID7578" ,"thyroid gland" ,"" ,"" -"17787-3" ,"v2.68 NM Thyroid gland Study report","LP208891-4","Rad.Modality.Modality type" ,"NM" ,"A" ,"RID10330","nuclear medicine imaging","" ,"" -"24531-6" ,"v2.68 US Retroperitoneum" ,"LP207608-3","Rad.Modality.Modality type" ,"US" ,"A" ,"RID10326","Ultrasound" ,"RPID2142","US Retroperitoneum" -"24531-6" ,"v2.68 US Retroperitoneum" ,"LP199943-4","Rad.Anatomic Location.Imaging Focus","Retroperitoneum" ,"A" ,"RID431" ,"RETROPERITONEUM" ,"RPID2142","US Retroperitoneum" -"24531-6" ,"v2.68 US Retroperitoneum" ,"LP199956-6","Rad.Anatomic Location.Region Imaged","Abdomen" ,"A" ,"RID56" ,"Abdomen" ,"RPID2142","US Retroperitoneum" -"24532-4" ,"v2.68 US Abdomen RUQ" ,"LP199956-6","Rad.Anatomic Location.Region Imaged","Abdomen" ,"A" ,"RID56" ,"Abdomen" ,"" ,"" -"24532-4" ,"v2.68 US Abdomen RUQ" ,"LP207608-3","Rad.Modality.Modality type" ,"US" ,"A" ,"RID10326","Ultrasound" ,"" ,"" -"24532-4" ,"v2.68 US Abdomen RUQ" ,"LP208105-9","Rad.Anatomic Location.Imaging Focus","Right upper quadrant","A" ,"RID29994","Right upper quadrant" ,"" ,"" +"17787-3" ,"v2.69 NM Thyroid gland Study report","LP199995-4","Rad.Anatomic Location.Region Imaged","Neck" ,"A" ,"RID7488" ,"neck" ,"" ,"" +"17787-3" ,"v2.69 NM Thyroid gland Study report","LP206648-0","Rad.Anatomic Location.Imaging Focus","Thyroid gland" ,"A" ,"RID7578" ,"thyroid gland" ,"" ,"" +"17787-3" ,"v2.69 NM Thyroid gland Study report","LP208891-4","Rad.Modality.Modality type" ,"NM" ,"A" ,"RID10330","nuclear medicine imaging","" ,"" +"24531-6" ,"v2.69 US Retroperitoneum" ,"LP207608-3","Rad.Modality.Modality type" ,"US" ,"A" ,"RID10326","Ultrasound" ,"RPID2142","US Retroperitoneum" +"24531-6" ,"v2.69 US Retroperitoneum" ,"LP199943-4","Rad.Anatomic Location.Imaging Focus","Retroperitoneum" ,"A" ,"RID431" ,"RETROPERITONEUM" ,"RPID2142","US Retroperitoneum" +"24531-6" ,"v2.69 US Retroperitoneum" ,"LP199956-6","Rad.Anatomic Location.Region Imaged","Abdomen" ,"A" ,"RID56" ,"Abdomen" ,"RPID2142","US Retroperitoneum" +"24532-4" ,"v2.69 US Abdomen RUQ" ,"LP199956-6","Rad.Anatomic Location.Region Imaged","Abdomen" ,"A" ,"RID56" ,"Abdomen" ,"" ,"" +"24532-4" ,"v2.69 US Abdomen RUQ" ,"LP207608-3","Rad.Modality.Modality type" ,"US" ,"A" ,"RID10326","Ultrasound" ,"" ,"" +"24532-4" ,"v2.69 US Abdomen RUQ" ,"LP208105-9","Rad.Anatomic Location.Imaging Focus","Right upper quadrant","A" ,"RID29994","Right upper quadrant" ,"" ,"" diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/PanelsAndForms/Loinc.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/PanelsAndForms/Loinc.csv index 20379cb7f1d..051297e87a0 100644 --- a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/PanelsAndForms/Loinc.csv +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/PanelsAndForms/Loinc.csv @@ -10,7 +10,7 @@ "10020-6" ,"R' wave amplitude.lead V5" ,"Elpot" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"Cardiac; ECG; EKG.MEASUREMENTS; Electrical potential; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave Amp L-V5; R wave Amp L-V5; Random; Right; Voltage" ,"R' wave Amp L-V5" ,"Observation", , , ,"mV" ,"R' wave amplitude in lead V5" , , ,"mV" , , , , ,0 ,0 ,0 , , , , , , , "61438-8" ,"Each time you ate bread, toast or dinner rolls, how much did you usually eat in the past 30D","Find" ,"Pt" ,"^Patient" ,"Ord" ,"PhenX" ,"PHENX" ,"2.44" ,"MIN" , ,"TRIAL" , ,2 , , , ,"Each time you eat bread, toast or dinner rolls, how much do you usually eat?","PhenX.050201100100","N" , ,"Finding; Findings; How much bread in 30D; Last; Ordinal; Point in time; QL; Qual; Qualitative; Random; Screen" ,"How much bread in 30D PhenX", , , , , ,"Each time you ate bread, toast or dinner rolls, how much did you usually eat in the past 30 days [PhenX]", , , , , , , ,0 ,0 ,0 , , , , , , , "10000-8" ,"R wave duration.lead AVR" ,"Time" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"Cardiac; Durat; ECG; EKG.MEASUREMENTS; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave dur L-AVR; R wave dur L-AVR; Random; Right" ,"R wave dur L-AVR" ,"Observation", , , ,"s" ,"R wave duration in lead AVR" , , ,"s" , , , , ,0 ,0 ,0 , , , , , , , -"17787-3" ,"Study report" ,"Find" ,"Pt" ,"Neck>Thyroid gland","Doc" ,"NM" ,"RAD" ,"2.61" ,"MIN" , ,"ACTIVE", ,2 , , , , , , , ,"Document; Finding; Findings; Imaging; Point in time; Radiology; Random; Study report; Thy" ,"NM Thyroid Study report" ,"Both" , , , , ,"NM Thyroid gland Study report" , , , , , , ,"Changed System from ""Thyroid"" for conformance with the LOINC/RadLex unified model.; Method of ""Radnuc"" was changed to ""NM"". The LOINC/RadLex Committee agreed to use a subset of the two-letter DICOM modality codes as the primary modality identifier." ,0 ,0 ,0 ,"IG exists" , , , ,"81220-6;72230-6" ,"1.0l" , +"17787-3" ,"Study report" ,"Find" ,"Pt" ,"Neck>Thyroid gland","Doc" ,"NM" ,"RAD" ,"2.61" ,"MIN" , ,"ACTIVE", ,2 , , , , , , , ,"Document; Finding; Findings; Imaging; Point in time; Radiology; Random; Study report; Thy" ,"NM Thyroid Study report" ,"Both" , , , , ,"v2.69 NM Thyroid gland Study report" , , , , , , ,"Changed System from ""Thyroid"" for conformance with the LOINC/RadLex unified model.; Method of ""Radnuc"" was changed to ""NM"". The LOINC/RadLex Committee agreed to use a subset of the two-letter DICOM modality codes as the primary modality identifier." ,0 ,0 ,0 ,"IG exists" , , , ,"81220-6;72230-6" ,"1.0l" , "17788-1" ,"Large unstained cells/100 leukocytes" ,"NFr" ,"Pt" ,"Bld" ,"Qn" ,"Automated count","HEM/BC" ,"2.50" ,"MIN" ,"Part of auto diff output of Bayer H*3S; peroxidase negative cells too large to be classified as lymph or basophil" ,"ACTIVE", ,1 , , , , , ,"Y" ,"%" ,"100WBC; Auto; Automated detection; Blood; Cell; Cellularity; Elec; Elect; Electr; HEMATOLOGY/CELL COUNTS; Leuc; Leuk; Leukocyte; Lkcs; LUC; Number Fraction; Percent; Point in time; QNT; Quan; Quant; Quantitative; Random; WB; WBC; WBCs; White blood cell; White blood cells; Whole blood" ,"LUC/leuk NFr Bld Auto" ,"Observation", , , ,"%" ,"Large unstained cells/100 leukocytes in Blood by Automated count" , , ,"%" , , , , ,1894 ,0 ,1894 , , , , , ,"1.0l" , "11488-4" ,"Consultation note" ,"Find" ,"Pt" ,"{Setting}" ,"Doc" ,"{Role}" ,"DOC.ONTOLOGY","2.63" ,"MIN" , ,"ACTIVE", ,2 , , , , , , , ,"Consult note; DOC.ONT; Document; Encounter; Evaluation and management; Evaluation and management note; Finding; Findings; notes; Point in time; Random; Visit note" ,"Consult note" ,"Both" , , , , ,"Consult note" , , , , , , ,"Edit made because this term is conformant to the Document Ontology axis values and therefore are being placed in this class.; Based on Clinical LOINC Committee decision during the September 2014 meeting, {Provider} was changed to {Author Type} to emphasize a greater breadth of potential document authors. At the September 2015 Clinical LOINC Committee meeting, the Committee decided to change {Author Type} to {Role} to align with the 'Role' axis name in the LOINC Document Ontology.; Because it is too difficult to maintain and because the distinction between documents and sections is not clear-cut nor necessary in most cases, the DOCUMENT_SECTION field has been deemed to have little value. The field has been set to null in the December 2017 release in preparation for removal in the December 2018 release. These changes were approved by the Clinical LOINC Committee.",0 ,0 ,0 ,"IG exists" , , , ,"81222-2;72231-4;81243-8","1.0j-a" ,"Y" "47239-9" ,"Reason for stopping HIV Rx" ,"Type" ,"Pt" ,"^Patient" ,"Nom" ,"Reported" ,"ART" ,"2.50" ,"MIN" ,"Reason for stopping antiretroviral therapy" ,"ACTIVE", ,2 , , , , , ,"N" , ,"AIDS; Anti-retroviral therapy; ART; Human immunodeficiency virus; Nominal; Point in time; Random; Treatment; Typ" ,"Reason for stopping HIV Rx" ,"Observation", , ,"Copyright © 2006 World Health Organization. Used with permission. Publications of the World Health Organization can be obtained from WHO Press, World Health Organization, 20 Avenue Appia, 1211 Geneva 27, Switzerland (tel: +41 22 791 2476; fax: +41 22 791 4857; email: bookorders@who.int). Requests for permission to reproduce or translate WHO publications – whether for sale or for noncommercial distribution – should be addressed to WHO Press, at the above address (fax: +41 22 791 4806; email: permissions@who.int). The designations employed and the presentation of the material in this publication do not imply the expression of any opinion whatsoever on the part of the World Health Organization concerning the legal status of any country, territory, city or area or of its authorities, or concerning the delimitation of its frontiers or boundaries. Dotted lines on maps represent approximate border lines for which there may not yet be full agreement. The mention of specific companies or of certain manufacturers’ products does not imply that they are endorsed or recommended by the World Health Organization in preference to others of a similar nature that are not mentioned. Errors and omissions excepted, the names of proprietary products are distinguished by initial capital letters. All reasonable precautions have been taken by WHO to verify the information contained in this publication. However, the published material is being distributed without warranty of any kind, either express or implied. The responsibility for the interpretation and use of the material lies with the reader. In no event shall the World Health Organization be liable for damages arising from its use.", ,"Reason for stopping HIV treatment" , , , , , , , ,0 ,0 ,0 , ,"WHO_HIV" , , , ,"2.22" , diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/LoincTable/Loinc.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/LoincTable/Loinc.csv index c519331fc53..44a9062f695 100644 --- a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/LoincTable/Loinc.csv +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/LoincTable/Loinc.csv @@ -10,7 +10,7 @@ "10020-6" ,"v2.69 R' wave amplitude.lead V5" ,"Elpot" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"Cardiac; ECG; EKG.MEASUREMENTS; Electrical potential; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave Amp L-V5; R wave Amp L-V5; Random; Right; Voltage" ,"R' wave Amp L-V5" ,"Observation", , , ,"mV" ,"R' wave amplitude in lead V5" , , ,"mV" , , , , ,0 ,0 ,0 , , , , , , , "61438-8" ,"v2.69 Each time you ate bread, toast or dinner rolls, how much did you usually eat in the past 30D","Find" ,"Pt" ,"^Patient" ,"Ord" ,"PhenX" ,"PHENX" ,"2.44" ,"MIN" , ,"TRIAL" , ,2 , , , ,"Each time you eat bread, toast or dinner rolls, how much do you usually eat?","PhenX.050201100100","N" , ,"Finding; Findings; How much bread in 30D; Last; Ordinal; Point in time; QL; Qual; Qualitative; Random; Screen" ,"How much bread in 30D PhenX", , , , , ,"Each time you ate bread, toast or dinner rolls, how much did you usually eat in the past 30 days [PhenX]", , , , , , , ,0 ,0 ,0 , , , , , , , "10000-8" ,"v2.69 R wave duration.lead AVR" ,"Time" ,"Pt" ,"Heart" ,"Qn" ,"EKG" ,"EKG.MEAS" ,"2.48" ,"MIN" , ,"ACTIVE", ,2 , , , , , ,"Y" , ,"Cardiac; Durat; ECG; EKG.MEASUREMENTS; Electrocardiogram; Electrocardiograph; Hrt; Painter's colic; PB; Plumbism; Point in time; QNT; Quan; Quant; Quantitative; R prime; R' wave dur L-AVR; R wave dur L-AVR; Random; Right" ,"R wave dur L-AVR" ,"Observation", , , ,"s" ,"R wave duration in lead AVR" , , ,"s" , , , , ,0 ,0 ,0 , , , , , , , -"17787-3" ,"v2.69 Study report" ,"Find" ,"Pt" ,"Neck>Thyroid gland","Doc" ,"NM" ,"RAD" ,"2.61" ,"MIN" , ,"ACTIVE", ,2 , , , , , , , ,"Document; Finding; Findings; Imaging; Point in time; Radiology; Random; Study report; Thy" ,"NM Thyroid Study report" ,"Both" , , , , ,"NM Thyroid gland Study report" , , , , , , ,"Changed System from ""Thyroid"" for conformance with the LOINC/RadLex unified model.; Method of ""Radnuc"" was changed to ""NM"". The LOINC/RadLex Committee agreed to use a subset of the two-letter DICOM modality codes as the primary modality identifier." ,0 ,0 ,0 ,"IG exists" , , , ,"81220-6;72230-6" ,"1.0l" , +"17787-3" ,"v2.69 Study report" ,"Find" ,"Pt" ,"Neck>Thyroid gland","Doc" ,"NM" ,"RAD" ,"2.61" ,"MIN" , ,"ACTIVE", ,2 , , , , , , , ,"Document; Finding; Findings; Imaging; Point in time; Radiology; Random; Study report; Thy" ,"NM Thyroid Study report" ,"Both" , , , , ,"v2.69 NM Thyroid gland Study report" , , , , , , ,"Changed System from ""Thyroid"" for conformance with the LOINC/RadLex unified model.; Method of ""Radnuc"" was changed to ""NM"". The LOINC/RadLex Committee agreed to use a subset of the two-letter DICOM modality codes as the primary modality identifier." ,0 ,0 ,0 ,"IG exists" , , , ,"81220-6;72230-6" ,"1.0l" , "17788-1" ,"v2.69 Large unstained cells/100 leukocytes" ,"NFr" ,"Pt" ,"Bld" ,"Qn" ,"Automated count","HEM/BC" ,"2.50" ,"MIN" ,"Part of auto diff output of Bayer H*3S; peroxidase negative cells too large to be classified as lymph or basophil" ,"ACTIVE", ,1 , , , , , ,"Y" ,"%" ,"100WBC; Auto; Automated detection; Blood; Cell; Cellularity; Elec; Elect; Electr; HEMATOLOGY/CELL COUNTS; Leuc; Leuk; Leukocyte; Lkcs; LUC; Number Fraction; Percent; Point in time; QNT; Quan; Quant; Quantitative; Random; WB; WBC; WBCs; White blood cell; White blood cells; Whole blood" ,"LUC/leuk NFr Bld Auto" ,"Observation", , , ,"%" ,"Large unstained cells/100 leukocytes in Blood by Automated count" , , ,"%" , , , , ,1894 ,0 ,1894 , , , , , ,"1.0l" , "11488-4" ,"v2.69 Consultation note" ,"Find" ,"Pt" ,"{Setting}" ,"Doc" ,"{Role}" ,"DOC.ONTOLOGY","2.63" ,"MIN" , ,"ACTIVE", ,2 , , , , , , , ,"Consult note; DOC.ONT; Document; Encounter; Evaluation and management; Evaluation and management note; Finding; Findings; notes; Point in time; Random; Visit note" ,"Consult note" ,"Both" , , , , ,"Consult note" , , , , , , ,"Edit made because this term is conformant to the Document Ontology axis values and therefore are being placed in this class.; Based on Clinical LOINC Committee decision during the September 2014 meeting, {Provider} was changed to {Author Type} to emphasize a greater breadth of potential document authors. At the September 2015 Clinical LOINC Committee meeting, the Committee decided to change {Author Type} to {Role} to align with the 'Role' axis name in the LOINC Document Ontology.; Because it is too difficult to maintain and because the distinction between documents and sections is not clear-cut nor necessary in most cases, the DOCUMENT_SECTION field has been deemed to have little value. The field has been set to null in the December 2017 release in preparation for removal in the December 2018 release. These changes were approved by the Clinical LOINC Committee.",0 ,0 ,0 ,"IG exists" , , , ,"81222-2;72231-4;81243-8","1.0j-a" ,"Y" "47239-9" ,"v2.69 Reason for stopping HIV Rx" ,"Type" ,"Pt" ,"^Patient" ,"Nom" ,"Reported" ,"ART" ,"2.50" ,"MIN" ,"Reason for stopping antiretroviral therapy" ,"ACTIVE", ,2 , , , , , ,"N" , ,"AIDS; Anti-retroviral therapy; ART; Human immunodeficiency virus; Nominal; Point in time; Random; Treatment; Typ" ,"Reason for stopping HIV Rx" ,"Observation", , ,"Copyright © 2006 World Health Organization. Used with permission. Publications of the World Health Organization can be obtained from WHO Press, World Health Organization, 20 Avenue Appia, 1211 Geneva 27, Switzerland (tel: +41 22 791 2476; fax: +41 22 791 4857; email: bookorders@who.int). Requests for permission to reproduce or translate WHO publications – whether for sale or for noncommercial distribution – should be addressed to WHO Press, at the above address (fax: +41 22 791 4806; email: permissions@who.int). The designations employed and the presentation of the material in this publication do not imply the expression of any opinion whatsoever on the part of the World Health Organization concerning the legal status of any country, territory, city or area or of its authorities, or concerning the delimitation of its frontiers or boundaries. Dotted lines on maps represent approximate border lines for which there may not yet be full agreement. The mention of specific companies or of certain manufacturers’ products does not imply that they are endorsed or recommended by the World Health Organization in preference to others of a similar nature that are not mentioned. Errors and omissions excepted, the names of proprietary products are distinguished by initial capital letters. All reasonable precautions have been taken by WHO to verify the information contained in this publication. However, the published material is being distributed without warranty of any kind, either express or implied. The responsibility for the interpretation and use of the material lies with the reader. In no event shall the World Health Organization be liable for damages arising from its use.", ,"Reason for stopping HIV treatment" , , , , , , , ,0 ,0 ,0 , ,"WHO_HIV" , , , ,"2.22" , From 790023043153f4b3184772a36787574bbcee8631 Mon Sep 17 00:00:00 2001 From: "juan.marchionatto" <juan.marchionatto@smilecdr.com> Date: Wed, 15 Sep 2021 10:29:30 -0400 Subject: [PATCH 08/20] Add version to ValueSet.compose.include when uploading terminology --- .../fhir/jpa/term/BaseTermReadSvcImpl.java | 9 ++- .../uhn/fhir/jpa/term/TermLoaderSvcImpl.java | 2 +- .../fhir/jpa/term/loinc/BaseLoincHandler.java | 4 ++ .../term/loinc/LoincAnswerListHandler.java | 1 + .../term/loinc/LoincRsnaPlaybookHandler.java | 1 + ...erminologySvcImplCurrentVersionR4Test.java | 61 ++++++++++--------- 6 files changed, 47 insertions(+), 31 deletions(-) diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/BaseTermReadSvcImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/BaseTermReadSvcImpl.java index 069117b8ad0..53cccd72a9b 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/BaseTermReadSvcImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/BaseTermReadSvcImpl.java @@ -158,6 +158,7 @@ import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.Objects; import java.util.Optional; @@ -2417,10 +2418,16 @@ public abstract class BaseTermReadSvcImpl implements ITermReadSvc { predicates.add(criteriaBuilder.equal(systemJoin.get("myCodeSystemUri"), theCodeSystemUrl)); } + // for loinc CodeSystem last version is not necessarily the current anymore, so if no version is present + // we need to query for the current, which is that which version is null if (isNoneBlank(theCodeSystemVersion)) { predicates.add(criteriaBuilder.equal(systemVersionJoin.get("myCodeSystemVersionId"), theCodeSystemVersion)); } else { - query.orderBy(criteriaBuilder.desc(root.get("myUpdated"))); + if (theCodeSystemUrl.toLowerCase(Locale.ROOT).contains("loinc")) { + predicates.add(criteriaBuilder.isNull(systemVersionJoin.get("myCodeSystemVersionId"))); + } else { + query.orderBy(criteriaBuilder.desc(root.get("myUpdated"))); + } } Predicate outerPredicate = criteriaBuilder.and(predicates.toArray(new Predicate[0])); diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermLoaderSvcImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermLoaderSvcImpl.java index e750f1fee3d..6f762f15103 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermLoaderSvcImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermLoaderSvcImpl.java @@ -722,7 +722,7 @@ public class TermLoaderSvcImpl implements ITermLoaderSvc { retVal.setPublisher("Regenstrief Institute, Inc."); retVal.setDescription("A value set that includes all LOINC codes"); retVal.setCopyright("This content from LOINC® is copyright © 1995 Regenstrief Institute, Inc. and the LOINC Committee, and available at no cost under the license at https://loinc.org/license/"); - retVal.getCompose().addInclude().setSystem(ITermLoaderSvc.LOINC_URI); + retVal.getCompose().addInclude().setSystem(ITermLoaderSvc.LOINC_URI).setVersion(codeSystemVersionId); return retVal; } diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/loinc/BaseLoincHandler.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/loinc/BaseLoincHandler.java index cba3609fa8b..7cd49e97c45 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/loinc/BaseLoincHandler.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/loinc/BaseLoincHandler.java @@ -22,6 +22,7 @@ package ca.uhn.fhir.jpa.term.loinc; import ca.uhn.fhir.jpa.entity.TermConcept; import ca.uhn.fhir.jpa.term.IZipContentsHandlerCsv; +import org.apache.commons.lang3.StringUtils; import org.hl7.fhir.r4.model.ConceptMap; import org.hl7.fhir.r4.model.ContactPoint; import org.hl7.fhir.r4.model.Enumerations; @@ -74,6 +75,9 @@ public abstract class BaseLoincHandler implements IZipContentsHandlerCsv { if (include == null) { include = theVs.getCompose().addInclude(); include.setSystem(theCodeSystemUrl); + if (StringUtils.isNotBlank(theVs.getVersion())) { + include.setVersion(theVs.getVersion()); + } } boolean found = false; diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/loinc/LoincAnswerListHandler.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/loinc/LoincAnswerListHandler.java index cdb97ca48d8..037a2fb0e6b 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/loinc/LoincAnswerListHandler.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/loinc/LoincAnswerListHandler.java @@ -104,6 +104,7 @@ public class LoincAnswerListHandler extends BaseLoincHandler { .getCompose() .getIncludeFirstRep() .setSystem(ITermLoaderSvc.LOINC_URI) + .setVersion(codeSystemVersionId) .addConcept() .setCode(answerString) .setDisplay(displayText); diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/loinc/LoincRsnaPlaybookHandler.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/loinc/LoincRsnaPlaybookHandler.java index d0b03f0acc9..d81466f5380 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/loinc/LoincRsnaPlaybookHandler.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/loinc/LoincRsnaPlaybookHandler.java @@ -120,6 +120,7 @@ public class LoincRsnaPlaybookHandler extends BaseLoincHandler implements IZipCo .getCompose() .getIncludeFirstRep() .setSystem(ITermLoaderSvc.LOINC_URI) + .setVersion(codeSystemVersionId) .addConcept() .setCode(loincNumber) .setDisplay(longCommonName); diff --git a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/term/TerminologySvcImplCurrentVersionR4Test.java b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/term/TerminologySvcImplCurrentVersionR4Test.java index 21ace9a8c7a..f33e1e17874 100644 --- a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/term/TerminologySvcImplCurrentVersionR4Test.java +++ b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/term/TerminologySvcImplCurrentVersionR4Test.java @@ -22,6 +22,7 @@ import org.hl7.fhir.instance.model.api.IIdType; import org.hl7.fhir.r4.model.CodeSystem; import org.hl7.fhir.r4.model.CodeType; import org.hl7.fhir.r4.model.IdType; +import org.hl7.fhir.r4.model.StringType; import org.hl7.fhir.r4.model.UriType; import org.hl7.fhir.r4.model.ValueSet; import org.junit.jupiter.api.BeforeEach; @@ -187,13 +188,13 @@ public class TerminologySvcImplCurrentVersionR4Test extends BaseJpaR4Test { private void validateValidateCodeForVersion(String theVersion) { IValidationSupport.CodeValidationResult resultNoVersioned = myCodeSystemDao.validateCode(null, - new UriType(BASE_LOINC_URL), null, new CodeType(VS_NO_VERSIONED_ON_UPLOAD_FIRST_CODE), + new UriType(BASE_LOINC_URL), new StringType(theVersion), new CodeType(VS_NO_VERSIONED_ON_UPLOAD_FIRST_CODE), null, null, null, null); assertNotNull(resultNoVersioned); assertEquals(prefixWithVersion(theVersion, VS_NO_VERSIONED_ON_UPLOAD_FIRST_DISPLAY), resultNoVersioned.getDisplay()); IValidationSupport.CodeValidationResult resultVersioned = myCodeSystemDao.validateCode(null, - new UriType(BASE_LOINC_URL), null, new CodeType(VS_VERSIONED_ON_UPLOAD_FIRST_CODE), + new UriType(BASE_LOINC_URL), new StringType(theVersion), new CodeType(VS_VERSIONED_ON_UPLOAD_FIRST_CODE), null, null, null, null); assertNotNull(resultVersioned); assertEquals(prefixWithVersion(theVersion, VS_VERSIONED_ON_UPLOAD_FIRST_DISPLAY), resultVersioned.getDisplay()); @@ -245,10 +246,11 @@ public class TerminologySvcImplCurrentVersionR4Test extends BaseJpaR4Test { ValueSet vs = myValueSetDao.expandByIdentifier(VS_NO_VERSIONED_ON_UPLOAD, null); assertEquals(1, vs.getExpansion().getContains().size()); - // version was added before code display to validate + // version was added prefixing code display to validate assertEquals(prefixWithVersion(currentVersion, VS_NO_VERSIONED_ON_UPLOAD_FIRST_DISPLAY), vs.getExpansion().getContains().iterator().next().getDisplay()); + // for CS ver = null, VS ver != null ValueSet vs1 = myValueSetDao.expandByIdentifier(VS_VERSIONED_ON_UPLOAD + "|" + VS_ANSWER_LIST_VERSION, null); assertEquals(3, vs1.getExpansion().getContains().size()); @@ -256,6 +258,7 @@ public class TerminologySvcImplCurrentVersionR4Test extends BaseJpaR4Test { assertEquals(prefixWithVersion(currentVersion, VS_VERSIONED_ON_UPLOAD_FIRST_DISPLAY), vs1.getExpansion().getContains().iterator().next().getDisplay()); + validateExpandedTermConcepts(currentVersion, theAllVersions); // now for each uploaded version @@ -269,29 +272,33 @@ public class TerminologySvcImplCurrentVersionR4Test extends BaseJpaR4Test { "select tc from TermConcept tc join fetch tc.myCodeSystem tcsv where tc.myCode = '" + VS_NO_VERSIONED_ON_UPLOAD_FIRST_CODE + "' and tcsv.myCodeSystemVersionId is null").getSingleResult(); assertNotNull(termConceptNoVerCsvNoVer); - assertEquals(VS_NO_VERSIONED_ON_UPLOAD_FIRST_DISPLAY, termConceptNoVerCsvNoVer.getDisplay()); + // data should have version because it was loaded with a version + assertEquals(prefixWithVersion(theCurrentVersion, VS_NO_VERSIONED_ON_UPLOAD_FIRST_DISPLAY), termConceptNoVerCsvNoVer.getDisplay()); @SuppressWarnings("unchecked") TermConcept termConceptVerCsvNoVer = (TermConcept) myEntityManager.createQuery( "select tc from TermConcept tc join fetch tc.myCodeSystem tcsv where tc.myCode = '" + VS_VERSIONED_ON_UPLOAD_FIRST_CODE + "' and tcsv.myCodeSystemVersionId is null").getSingleResult(); assertNotNull(termConceptVerCsvNoVer); - assertEquals(VS_VERSIONED_ON_UPLOAD_FIRST_DISPLAY, termConceptVerCsvNoVer.getDisplay()); + // data should have version because it was loaded with a version + assertEquals(prefixWithVersion(theCurrentVersion, VS_VERSIONED_ON_UPLOAD_FIRST_DISPLAY), termConceptVerCsvNoVer.getDisplay()); if (theCurrentVersion != null) { @SuppressWarnings("unchecked") TermConcept termConceptNoVerCsvVer = (TermConcept) myEntityManager.createQuery( "select tc from TermConcept tc join fetch tc.myCodeSystem tcsv where tc.myCode = '" + - VS_NO_VERSIONED_ON_UPLOAD_FIRST_CODE + "' and tcsv.myCodeSystemVersionId is null").getSingleResult(); + VS_NO_VERSIONED_ON_UPLOAD_FIRST_CODE + "' and tcsv.myCodeSystemVersionId = '" + theCurrentVersion + "'").getSingleResult(); assertNotNull(termConceptNoVerCsvVer); - assertEquals(VS_NO_VERSIONED_ON_UPLOAD_FIRST_DISPLAY, termConceptNoVerCsvVer.getDisplay()); + // data should have version because it was loaded with a version + assertEquals(prefixWithVersion(theCurrentVersion, VS_NO_VERSIONED_ON_UPLOAD_FIRST_DISPLAY), termConceptNoVerCsvVer.getDisplay()); @SuppressWarnings("unchecked") TermConcept termConceptVerCsvVer = (TermConcept) myEntityManager.createQuery( "select tc from TermConcept tc join fetch tc.myCodeSystem tcsv where tc.myCode = '" + - VS_VERSIONED_ON_UPLOAD_FIRST_CODE + "' and tcsv.myCodeSystemVersionId is null").getSingleResult(); + VS_VERSIONED_ON_UPLOAD_FIRST_CODE + "' and tcsv.myCodeSystemVersionId = '" + theCurrentVersion + "'").getSingleResult(); assertNotNull(termConceptVerCsvVer); - assertEquals(VS_VERSIONED_ON_UPLOAD_FIRST_DISPLAY, termConceptVerCsvVer.getDisplay()); + // data should have version because it was loaded with a version + assertEquals(prefixWithVersion(theCurrentVersion, VS_VERSIONED_ON_UPLOAD_FIRST_DISPLAY), termConceptVerCsvVer.getDisplay()); } @@ -443,7 +450,7 @@ public class TerminologySvcImplCurrentVersionR4Test extends BaseJpaR4Test { * _ current TVSs with upload version have upload-version with no version append * _ current TVSs with no upload version have null version */ - private void runCommonValidations(String theVersion) { + private void runCommonValidations(List<String> theAllVersions) { // for CodeSystem: // _ current CS is present and has no version @@ -452,8 +459,9 @@ public class TerminologySvcImplCurrentVersionR4Test extends BaseJpaR4Test { ourLog.info("CodeSystem:\n" + csString); HashSet<String> shouldNotBePresentVersions = new HashSet<>(possibleVersions); - shouldNotBePresentVersions.remove(theVersion); - shouldNotBePresentVersions.stream().forEach(vv -> assertFalse(csString.contains(vv))); + shouldNotBePresentVersions.removeAll(theAllVersions); + shouldNotBePresentVersions.stream().forEach(vv -> assertFalse(csString.contains(vv), + "Found version string: '" + vv + "' in CodeSystem: " + csString)); // same reading it from term service CodeSystem cs = myITermReadSvc.fetchCanonicalCodeSystemFromCompleteContext(BASE_LOINC_URL); @@ -489,7 +497,7 @@ public class TerminologySvcImplCurrentVersionR4Test extends BaseJpaR4Test { public void uploadCurrentNoVersion() throws Exception { IIdType csId = uploadLoincCodeSystem(null, true); - runCommonValidations(null); + runCommonValidations(Collections.emptyList()); // validate operation for current (no version parameter) validateOperations(null, Collections.emptySet()); @@ -497,11 +505,11 @@ public class TerminologySvcImplCurrentVersionR4Test extends BaseJpaR4Test { @Test() - public void uploadCurrentWithVersion() throws Exception { + public void uploadWithVersion() throws Exception { String ver = "2.67"; IIdType csId = uploadLoincCodeSystem(ver, true); - runCommonValidations(ver); + runCommonValidations(Collections.singletonList(ver)); // validate operation for specific version validateOperations(ver, Collections.singleton(ver)); @@ -509,15 +517,14 @@ public class TerminologySvcImplCurrentVersionR4Test extends BaseJpaR4Test { @Test - public void uploadCurrentNoVersionThenNoCurrent() throws Exception { + public void uploadNoVersionThenNoCurrent() throws Exception { uploadLoincCodeSystem(null, true); String ver = "2.67"; uploadLoincCodeSystem(ver, false); - myTermSvc.preExpandDeferredValueSetsToTerminologyTables(); - - runCommonValidations(ver); +// myTermSvc.preExpandDeferredValueSetsToTerminologyTables(); + runCommonValidations(Collections.singletonList(ver)); // validate operation for specific version validateOperations(null, Collections.singleton(ver)); @@ -525,15 +532,14 @@ public class TerminologySvcImplCurrentVersionR4Test extends BaseJpaR4Test { @Test - public void uploadFirstCurrentWithVersionThenNoCurrent() throws Exception { + public void uploadWithVersionThenNoCurrent() throws Exception { String firstVer = "2.67"; uploadLoincCodeSystem(firstVer, true); String secondVer = "2.68"; uploadLoincCodeSystem(secondVer, false); - runCommonValidations(firstVer); - runCommonValidations(secondVer); + runCommonValidations(Lists.newArrayList(firstVer, secondVer)); // validate operation for specific version validateOperations(null, Lists.newArrayList(firstVer, secondVer)); @@ -541,7 +547,7 @@ public class TerminologySvcImplCurrentVersionR4Test extends BaseJpaR4Test { @Test - public void uploadFirstCurrentNoVersionThenNoCurrentThenCurrent() throws Exception { + public void uploadNoVersionThenNoCurrentThenCurrent() throws Exception { uploadLoincCodeSystem(null, true); String firstVer = "2.67"; @@ -550,8 +556,7 @@ public class TerminologySvcImplCurrentVersionR4Test extends BaseJpaR4Test { String secondVer = "2.68"; uploadLoincCodeSystem(secondVer, true); - runCommonValidations(firstVer); - runCommonValidations(secondVer); + runCommonValidations(Lists.newArrayList(firstVer, secondVer)); // validate operation for specific version validateOperations(secondVer, Lists.newArrayList(firstVer, secondVer)); @@ -559,7 +564,7 @@ public class TerminologySvcImplCurrentVersionR4Test extends BaseJpaR4Test { @Test - public void uploadFirstCurrentWithVersionThenNoCurrentThenCurrent() throws Exception { + public void uploadWithVersionThenNoCurrentThenCurrent() throws Exception { String firstVer = "2.67"; uploadLoincCodeSystem(firstVer, true); @@ -569,9 +574,7 @@ public class TerminologySvcImplCurrentVersionR4Test extends BaseJpaR4Test { String thirdVer = "2.68"; uploadLoincCodeSystem(thirdVer, true); - runCommonValidations(firstVer); - runCommonValidations(secondVer); - runCommonValidations(thirdVer); + runCommonValidations(Lists.newArrayList(firstVer, secondVer, thirdVer)); // validate operation for specific version validateOperations(thirdVer, Lists.newArrayList(firstVer, secondVer, thirdVer)); From 0dfc716a82a7143577195c0e5f7b301481c7954a Mon Sep 17 00:00:00 2001 From: "juan.marchionatto" <juan.marchionatto@smilecdr.com> Date: Thu, 16 Sep 2021 13:18:49 -0400 Subject: [PATCH 09/20] Adjust code validation to properly obtain CodeSystem's current version --- .../java/ca/uhn/fhir/jpa/term/BaseTermReadSvcImpl.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/BaseTermReadSvcImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/BaseTermReadSvcImpl.java index 069117b8ad0..53cccd72a9b 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/BaseTermReadSvcImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/BaseTermReadSvcImpl.java @@ -158,6 +158,7 @@ import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.Objects; import java.util.Optional; @@ -2417,10 +2418,16 @@ public abstract class BaseTermReadSvcImpl implements ITermReadSvc { predicates.add(criteriaBuilder.equal(systemJoin.get("myCodeSystemUri"), theCodeSystemUrl)); } + // for loinc CodeSystem last version is not necessarily the current anymore, so if no version is present + // we need to query for the current, which is that which version is null if (isNoneBlank(theCodeSystemVersion)) { predicates.add(criteriaBuilder.equal(systemVersionJoin.get("myCodeSystemVersionId"), theCodeSystemVersion)); } else { - query.orderBy(criteriaBuilder.desc(root.get("myUpdated"))); + if (theCodeSystemUrl.toLowerCase(Locale.ROOT).contains("loinc")) { + predicates.add(criteriaBuilder.isNull(systemVersionJoin.get("myCodeSystemVersionId"))); + } else { + query.orderBy(criteriaBuilder.desc(root.get("myUpdated"))); + } } Predicate outerPredicate = criteriaBuilder.and(predicates.toArray(new Predicate[0])); From c9162cba6dc0aa957c2a252434188f6038c71833 Mon Sep 17 00:00:00 2001 From: "juan.marchionatto" <juan.marchionatto@smilecdr.com> Date: Thu, 16 Sep 2021 13:20:00 -0400 Subject: [PATCH 10/20] Merge in fix for ISSUE-2995 --- .../src/main/java/ca/uhn/fhir/jpa/term/TermLoaderSvcImpl.java | 2 +- .../java/ca/uhn/fhir/jpa/term/loinc/BaseLoincHandler.java | 4 ++++ .../ca/uhn/fhir/jpa/term/loinc/LoincAnswerListHandler.java | 1 + .../ca/uhn/fhir/jpa/term/loinc/LoincRsnaPlaybookHandler.java | 1 + 4 files changed, 7 insertions(+), 1 deletion(-) diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermLoaderSvcImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermLoaderSvcImpl.java index e750f1fee3d..6f762f15103 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermLoaderSvcImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermLoaderSvcImpl.java @@ -722,7 +722,7 @@ public class TermLoaderSvcImpl implements ITermLoaderSvc { retVal.setPublisher("Regenstrief Institute, Inc."); retVal.setDescription("A value set that includes all LOINC codes"); retVal.setCopyright("This content from LOINC® is copyright © 1995 Regenstrief Institute, Inc. and the LOINC Committee, and available at no cost under the license at https://loinc.org/license/"); - retVal.getCompose().addInclude().setSystem(ITermLoaderSvc.LOINC_URI); + retVal.getCompose().addInclude().setSystem(ITermLoaderSvc.LOINC_URI).setVersion(codeSystemVersionId); return retVal; } diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/loinc/BaseLoincHandler.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/loinc/BaseLoincHandler.java index cba3609fa8b..7cd49e97c45 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/loinc/BaseLoincHandler.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/loinc/BaseLoincHandler.java @@ -22,6 +22,7 @@ package ca.uhn.fhir.jpa.term.loinc; import ca.uhn.fhir.jpa.entity.TermConcept; import ca.uhn.fhir.jpa.term.IZipContentsHandlerCsv; +import org.apache.commons.lang3.StringUtils; import org.hl7.fhir.r4.model.ConceptMap; import org.hl7.fhir.r4.model.ContactPoint; import org.hl7.fhir.r4.model.Enumerations; @@ -74,6 +75,9 @@ public abstract class BaseLoincHandler implements IZipContentsHandlerCsv { if (include == null) { include = theVs.getCompose().addInclude(); include.setSystem(theCodeSystemUrl); + if (StringUtils.isNotBlank(theVs.getVersion())) { + include.setVersion(theVs.getVersion()); + } } boolean found = false; diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/loinc/LoincAnswerListHandler.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/loinc/LoincAnswerListHandler.java index cdb97ca48d8..037a2fb0e6b 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/loinc/LoincAnswerListHandler.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/loinc/LoincAnswerListHandler.java @@ -104,6 +104,7 @@ public class LoincAnswerListHandler extends BaseLoincHandler { .getCompose() .getIncludeFirstRep() .setSystem(ITermLoaderSvc.LOINC_URI) + .setVersion(codeSystemVersionId) .addConcept() .setCode(answerString) .setDisplay(displayText); diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/loinc/LoincRsnaPlaybookHandler.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/loinc/LoincRsnaPlaybookHandler.java index d0b03f0acc9..d81466f5380 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/loinc/LoincRsnaPlaybookHandler.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/loinc/LoincRsnaPlaybookHandler.java @@ -120,6 +120,7 @@ public class LoincRsnaPlaybookHandler extends BaseLoincHandler implements IZipCo .getCompose() .getIncludeFirstRep() .setSystem(ITermLoaderSvc.LOINC_URI) + .setVersion(codeSystemVersionId) .addConcept() .setCode(loincNumber) .setDisplay(longCommonName); From fbd23498fc78d9cc740703374b5ab0c340701746 Mon Sep 17 00:00:00 2001 From: "juan.marchionatto" <juan.marchionatto@smilecdr.com> Date: Thu, 16 Sep 2021 13:41:05 -0400 Subject: [PATCH 11/20] Adjust test data and fix all test cases implemented so far --- ...erminologySvcImplCurrentVersionR4Test.java | 390 +++++++----------- .../AccessoryFiles/AnswerFile/AnswerList.csv | 2 +- .../PanelsAndForms/AnswerList.csv | 20 +- .../AccessoryFiles/AnswerFile/AnswerList.csv | 22 +- .../PanelsAndForms/AnswerList.csv | 20 +- .../AccessoryFiles/AnswerFile/AnswerList.csv | 22 +- .../PanelsAndForms/AnswerList.csv | 20 +- 7 files changed, 197 insertions(+), 299 deletions(-) diff --git a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/term/TerminologySvcImplCurrentVersionR4Test.java b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/term/TerminologySvcImplCurrentVersionR4Test.java index 21ace9a8c7a..2760086772c 100644 --- a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/term/TerminologySvcImplCurrentVersionR4Test.java +++ b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/term/TerminologySvcImplCurrentVersionR4Test.java @@ -22,6 +22,7 @@ import org.hl7.fhir.instance.model.api.IIdType; import org.hl7.fhir.r4.model.CodeSystem; import org.hl7.fhir.r4.model.CodeType; import org.hl7.fhir.r4.model.IdType; +import org.hl7.fhir.r4.model.StringType; import org.hl7.fhir.r4.model.UriType; import org.hl7.fhir.r4.model.ValueSet; import org.junit.jupiter.api.BeforeEach; @@ -39,6 +40,7 @@ import javax.servlet.http.HttpServletResponse; import java.io.File; import java.io.FileInputStream; import java.io.IOException; +import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashSet; @@ -93,64 +95,55 @@ public class TerminologySvcImplCurrentVersionR4Test extends BaseJpaR4Test { public static final String BASE_LOINC_VS_URL = BASE_LOINC_URL + "/vs/"; // some ValueSets have a version specified independent of the CS version being uploaded. This one doesn't - public static final String VS_NO_VERSIONED_ON_UPLOAD_ID = "loinc-rsna-radiology-playbook"; - public static final String VS_NO_VERSIONED_ON_UPLOAD = BASE_LOINC_VS_URL + VS_NO_VERSIONED_ON_UPLOAD_ID; - public static final String VS_NO_VERSIONED_ON_UPLOAD_FIRST_CODE = "17787-3"; - public static final String VS_NO_VERSIONED_ON_UPLOAD_FIRST_DISPLAY = "NM Thyroid gland Study report"; + public static final String VS_NO_VERSIONED_ON_UPLOAD_ID = "loinc-rsna-radiology-playbook"; + public static final String VS_NO_VERSIONED_ON_UPLOAD = BASE_LOINC_VS_URL + VS_NO_VERSIONED_ON_UPLOAD_ID; + public static final String VS_NO_VERSIONED_ON_UPLOAD_FIRST_CODE = "17787-3"; + public static final String VS_NO_VERSIONED_ON_UPLOAD_FIRST_DISPLAY = "NM Thyroid gland Study report"; // some ValueSets have a version specified independent of the CS version being uploaded. This is one of them - public static final String VS_VERSIONED_ON_UPLOAD_ID = "LL1000-0"; - public static final String VS_VERSIONED_ON_UPLOAD = BASE_LOINC_VS_URL + VS_VERSIONED_ON_UPLOAD_ID; - public static final String VS_VERSIONED_ON_UPLOAD_FIRST_CODE = "LA13825-7"; - public static final String VS_VERSIONED_ON_UPLOAD_FIRST_DISPLAY = "1 slice or 1 dinner roll"; + public static final String VS_VERSIONED_ON_UPLOAD_ID = "LL1000-0"; + public static final String VS_VERSIONED_ON_UPLOAD = BASE_LOINC_VS_URL + VS_VERSIONED_ON_UPLOAD_ID; + public static final String VS_VERSIONED_ON_UPLOAD_FIRST_CODE = "LA13825-7"; + public static final String VS_VERSIONED_ON_UPLOAD_FIRST_DISPLAY = "1 slice or 1 dinner roll"; - public static final String VS_ANSWER_LIST_VERSION = "Beta.1"; + public static final String VS_ANSWER_LIST_VERSION = "Beta.1"; public static final Set<String> possibleVersions = Sets.newHashSet("2.67", "2.68", "2.69"); @Mock - HttpServletResponse mockServletResponse; + private HttpServletResponse mockServletResponse; @Mock(answer = Answers.RETURNS_DEEP_STUBS) - ServletRequestDetails mockRequestDetails; + private ServletRequestDetails mockRequestDetails; - @Autowired private EntityManager myEntityManager; - @Autowired private TermLoaderSvcImpl myTermLoaderSvc; - @Autowired private ITermReadSvc myITermReadSvc; + @Autowired + private EntityManager myEntityManager; + + @Autowired + private TermLoaderSvcImpl myTermLoaderSvc; + + @Autowired + private ITermReadSvc myITermReadSvc; @Autowired @Qualifier(BaseConfig.JPA_VALIDATION_SUPPORT) - private IValidationSupport myJpaPersistedResourceValidationSupport; + private IValidationSupport myJpaPersistedResourceValidationSupport; private ZipCollectionBuilder myFiles; private ServletRequestDetails myRequestDetails = new ServletRequestDetails(); private Properties uploadProperties; - private IFhirResourceDao<ValueSet> dao; + private IFhirResourceDao<ValueSet> myValueSetIFhirResourceDao; - -// @BeforeAll -// public static void beforeAll() throws Exception { -// // remove DB -// Files.deleteIfExists(Paths.get( -// "/Users/juan.marchionattosmilecdr.com/projects/hapi-fhir/hapi-fhir-jpaserver-base/testdb_r4_2.mv.db")); -// } - @BeforeEach public void beforeEach() throws Exception { -// myTermLoaderSvc = TermLoaderSvcImpl.withoutProxyCheck(myTermDeferredStorageSvc, myTermCodeSystemStorageSvc); - - // myTermSvc.preExpandDeferredValueSetsToTerminologyTables(); - - File file = ResourceUtils.getFile("classpath:loinc-ver/" + LOINC_UPLOAD_PROPERTIES_FILE.getCode()); uploadProperties = new Properties(); uploadProperties.load(new FileInputStream(file)); - dao = (IFhirResourceDao<ValueSet>) myDaoRegistry.getResourceDao(ValueSet.class); + myValueSetIFhirResourceDao = myDaoRegistry.getResourceDao(ValueSet.class); when(mockRequestDetails.getServer().getDefaultPageSize()).thenReturn(25); - } @@ -162,9 +155,9 @@ public class TerminologySvcImplCurrentVersionR4Test extends BaseJpaR4Test { validateValueExpand(currentVersion, theExpectedVersions); -// validateValueLookup(currentVersion, theExpectedVersions); -// -// validateValidateCode(currentVersion, theExpectedVersions); + validateValueLookup(currentVersion, theExpectedVersions); + + validateValidateCode(currentVersion, theExpectedVersions); } @@ -187,20 +180,19 @@ public class TerminologySvcImplCurrentVersionR4Test extends BaseJpaR4Test { private void validateValidateCodeForVersion(String theVersion) { IValidationSupport.CodeValidationResult resultNoVersioned = myCodeSystemDao.validateCode(null, - new UriType(BASE_LOINC_URL), null, new CodeType(VS_NO_VERSIONED_ON_UPLOAD_FIRST_CODE), + new UriType(BASE_LOINC_URL), new StringType(theVersion), new CodeType(VS_NO_VERSIONED_ON_UPLOAD_FIRST_CODE), null, null, null, null); assertNotNull(resultNoVersioned); assertEquals(prefixWithVersion(theVersion, VS_NO_VERSIONED_ON_UPLOAD_FIRST_DISPLAY), resultNoVersioned.getDisplay()); IValidationSupport.CodeValidationResult resultVersioned = myCodeSystemDao.validateCode(null, - new UriType(BASE_LOINC_URL), null, new CodeType(VS_VERSIONED_ON_UPLOAD_FIRST_CODE), + new UriType(BASE_LOINC_URL), new StringType(theVersion), new CodeType(VS_VERSIONED_ON_UPLOAD_FIRST_CODE), null, null, null, null); assertNotNull(resultVersioned); assertEquals(prefixWithVersion(theVersion, VS_VERSIONED_ON_UPLOAD_FIRST_DISPLAY), resultVersioned.getDisplay()); } - private void validateValueLookup(String theCurrentVersion, Collection<String> allVersions) { IValidationSupport.LookupCodeResult resultNoVer = myValidationSupport.lookupCode( new ValidationSupportContext(myValidationSupport), BASE_LOINC_URL, VS_NO_VERSIONED_ON_UPLOAD_FIRST_CODE, null); @@ -236,7 +228,7 @@ public class TerminologySvcImplCurrentVersionR4Test extends BaseJpaR4Test { private String prefixWithVersion(String version, String suffix) { - return (version == null ? "" : "v" + version + " ") + suffix; + return (version == null ? "" : "v" + version + " ") + suffix; } @@ -245,17 +237,20 @@ public class TerminologySvcImplCurrentVersionR4Test extends BaseJpaR4Test { ValueSet vs = myValueSetDao.expandByIdentifier(VS_NO_VERSIONED_ON_UPLOAD, null); assertEquals(1, vs.getExpansion().getContains().size()); - // version was added before code display to validate + // version was added prefixing code display to validate assertEquals(prefixWithVersion(currentVersion, VS_NO_VERSIONED_ON_UPLOAD_FIRST_DISPLAY), vs.getExpansion().getContains().iterator().next().getDisplay()); + // for CS ver = null, VS ver != null - ValueSet vs1 = myValueSetDao.expandByIdentifier(VS_VERSIONED_ON_UPLOAD + "|" + VS_ANSWER_LIST_VERSION, null); + ValueSet vs1 = myValueSetDao.expandByIdentifier( + VS_VERSIONED_ON_UPLOAD + "|" + VS_ANSWER_LIST_VERSION, null); assertEquals(3, vs1.getExpansion().getContains().size()); assertEquals(prefixWithVersion(currentVersion, VS_VERSIONED_ON_UPLOAD_FIRST_DISPLAY), vs1.getExpansion().getContains().iterator().next().getDisplay()); + validateExpandedTermConcepts(currentVersion, theAllVersions); // now for each uploaded version @@ -264,34 +259,34 @@ public class TerminologySvcImplCurrentVersionR4Test extends BaseJpaR4Test { private void validateExpandedTermConcepts(String theCurrentVersion, Collection<String> theAllVersions) { - @SuppressWarnings("unchecked") TermConcept termConceptNoVerCsvNoVer = (TermConcept) myEntityManager.createQuery( "select tc from TermConcept tc join fetch tc.myCodeSystem tcsv where tc.myCode = '" + VS_NO_VERSIONED_ON_UPLOAD_FIRST_CODE + "' and tcsv.myCodeSystemVersionId is null").getSingleResult(); assertNotNull(termConceptNoVerCsvNoVer); - assertEquals(VS_NO_VERSIONED_ON_UPLOAD_FIRST_DISPLAY, termConceptNoVerCsvNoVer.getDisplay()); + // data should have version because it was loaded with a version + assertEquals(prefixWithVersion(theCurrentVersion, VS_NO_VERSIONED_ON_UPLOAD_FIRST_DISPLAY), termConceptNoVerCsvNoVer.getDisplay()); - @SuppressWarnings("unchecked") TermConcept termConceptVerCsvNoVer = (TermConcept) myEntityManager.createQuery( "select tc from TermConcept tc join fetch tc.myCodeSystem tcsv where tc.myCode = '" + VS_VERSIONED_ON_UPLOAD_FIRST_CODE + "' and tcsv.myCodeSystemVersionId is null").getSingleResult(); assertNotNull(termConceptVerCsvNoVer); - assertEquals(VS_VERSIONED_ON_UPLOAD_FIRST_DISPLAY, termConceptVerCsvNoVer.getDisplay()); + // data should have version because it was loaded with a version + assertEquals(prefixWithVersion(theCurrentVersion, VS_VERSIONED_ON_UPLOAD_FIRST_DISPLAY), termConceptVerCsvNoVer.getDisplay()); if (theCurrentVersion != null) { - @SuppressWarnings("unchecked") TermConcept termConceptNoVerCsvVer = (TermConcept) myEntityManager.createQuery( "select tc from TermConcept tc join fetch tc.myCodeSystem tcsv where tc.myCode = '" + - VS_NO_VERSIONED_ON_UPLOAD_FIRST_CODE + "' and tcsv.myCodeSystemVersionId is null").getSingleResult(); + VS_NO_VERSIONED_ON_UPLOAD_FIRST_CODE + "' and tcsv.myCodeSystemVersionId = '" + theCurrentVersion + "'").getSingleResult(); assertNotNull(termConceptNoVerCsvVer); - assertEquals(VS_NO_VERSIONED_ON_UPLOAD_FIRST_DISPLAY, termConceptNoVerCsvVer.getDisplay()); + // data should have version because it was loaded with a version + assertEquals(prefixWithVersion(theCurrentVersion, VS_NO_VERSIONED_ON_UPLOAD_FIRST_DISPLAY), termConceptNoVerCsvVer.getDisplay()); - @SuppressWarnings("unchecked") TermConcept termConceptVerCsvVer = (TermConcept) myEntityManager.createQuery( "select tc from TermConcept tc join fetch tc.myCodeSystem tcsv where tc.myCode = '" + - VS_VERSIONED_ON_UPLOAD_FIRST_CODE + "' and tcsv.myCodeSystemVersionId is null").getSingleResult(); + VS_VERSIONED_ON_UPLOAD_FIRST_CODE + "' and tcsv.myCodeSystemVersionId = '" + theCurrentVersion + "'").getSingleResult(); assertNotNull(termConceptVerCsvVer); - assertEquals(VS_VERSIONED_ON_UPLOAD_FIRST_DISPLAY, termConceptVerCsvVer.getDisplay()); + // data should have version because it was loaded with a version + assertEquals(prefixWithVersion(theCurrentVersion, VS_VERSIONED_ON_UPLOAD_FIRST_DISPLAY), termConceptVerCsvVer.getDisplay()); } @@ -300,14 +295,12 @@ public class TerminologySvcImplCurrentVersionR4Test extends BaseJpaR4Test { private void validateExpandedTermConceptsForVersion(String theVersion) { - @SuppressWarnings("unchecked") TermConcept termConceptNoVer = (TermConcept) myEntityManager.createQuery( "select tc from TermConcept tc join fetch tc.myCodeSystem tcsv where tc.myCode = '" + VS_NO_VERSIONED_ON_UPLOAD_FIRST_CODE + "' and tcsv.myCodeSystemVersionId = '" + theVersion + "'").getSingleResult(); assertNotNull(termConceptNoVer); assertEquals(prefixWithVersion(theVersion, VS_NO_VERSIONED_ON_UPLOAD_FIRST_DISPLAY), termConceptNoVer.getDisplay()); - @SuppressWarnings("unchecked") TermConcept termConceptVer = (TermConcept) myEntityManager.createQuery( "select tc from TermConcept tc join fetch tc.myCodeSystem tcsv where tc.myCode = '" + VS_VERSIONED_ON_UPLOAD_FIRST_CODE + "' and tcsv.myCodeSystemVersionId = '" + theVersion + "'").getSingleResult(); @@ -335,7 +328,7 @@ public class TerminologySvcImplCurrentVersionR4Test extends BaseJpaR4Test { assertEquals(3, vs3.getExpansion().getContains().size()); // version was added before code display to validate - assertEquals(prefixWithVersion( theVersion, VS_VERSIONED_ON_UPLOAD_FIRST_DISPLAY), + assertEquals(prefixWithVersion(theVersion, VS_VERSIONED_ON_UPLOAD_FIRST_DISPLAY), vs3.getExpansion().getContains().iterator().next().getDisplay()); } @@ -345,7 +338,7 @@ public class TerminologySvcImplCurrentVersionR4Test extends BaseJpaR4Test { SearchParameterMap paramsNoUploadVer = new SearchParameterMap("url", new UriParam(VS_NO_VERSIONED_ON_UPLOAD)); int expectedResultQty = theExpectedIdVersions.size() + 1; // + 1 because an extra null version (the current) is always present - IBundleProvider noUploadVerResult = dao.search(paramsNoUploadVer, mockRequestDetails, mockServletResponse); + IBundleProvider noUploadVerResult = myValueSetIFhirResourceDao.search(paramsNoUploadVer, mockRequestDetails, mockServletResponse); List<IBaseResource> noUploadVerValueSets = noUploadVerResult.getAllResources(); assertEquals(expectedResultQty, noUploadVerValueSets.size()); @@ -355,12 +348,12 @@ public class TerminologySvcImplCurrentVersionR4Test extends BaseJpaR4Test { SearchParameterMap paramsUploadVer = new SearchParameterMap("url", new UriParam(VS_VERSIONED_ON_UPLOAD)); paramsUploadVer.add("version", new TokenParam(VS_ANSWER_LIST_VERSION)); - IBundleProvider uploadVerResult = dao.search(paramsUploadVer, mockRequestDetails, mockServletResponse); + IBundleProvider uploadVerResult = myValueSetIFhirResourceDao.search(paramsUploadVer, mockRequestDetails, mockServletResponse); List<IBaseResource> uploadVerValueSets = uploadVerResult.getAllResources(); assertEquals(1, uploadVerValueSets.size()); assertEquals(VS_VERSIONED_ON_UPLOAD_ID, uploadVerValueSets.get(0).getIdElement().getIdPart()); - assertEquals( VS_ANSWER_LIST_VERSION, ((ValueSet ) uploadVerValueSets.get(0)).getVersion()); + assertEquals(VS_ANSWER_LIST_VERSION, ((ValueSet) uploadVerValueSets.get(0)).getVersion()); // now validate each specific uploaded version theExpectedIdVersions.forEach(this::validateValueSetSearchForVersion); @@ -378,7 +371,7 @@ public class TerminologySvcImplCurrentVersionR4Test extends BaseJpaR4Test { SearchParameterMap paramsUploadNoVer = new SearchParameterMap("url", new UriParam(VS_NO_VERSIONED_ON_UPLOAD)); paramsUploadNoVer.add("version", new TokenParam(theVersion)); - IBundleProvider uploadNoVerResult = dao.search(paramsUploadNoVer, mockRequestDetails, mockServletResponse); + IBundleProvider uploadNoVerResult = myValueSetIFhirResourceDao.search(paramsUploadNoVer, mockRequestDetails, mockServletResponse); List<IBaseResource> uploadNoVerValueSets = uploadNoVerResult.getAllResources(); assertEquals(1, uploadNoVerValueSets.size()); @@ -392,7 +385,7 @@ public class TerminologySvcImplCurrentVersionR4Test extends BaseJpaR4Test { SearchParameterMap paramsUploadVer = new SearchParameterMap("url", new UriParam(VS_VERSIONED_ON_UPLOAD)); paramsUploadVer.add("version", new TokenParam(VS_ANSWER_LIST_VERSION + "-" + theVersion)); - IBundleProvider uploadVerResult = dao.search(paramsUploadVer, mockRequestDetails, mockServletResponse); + IBundleProvider uploadVerResult = myValueSetIFhirResourceDao.search(paramsUploadVer, mockRequestDetails, mockServletResponse); List<IBaseResource> uploadVerValueSets = uploadVerResult.getAllResources(); assertEquals(1, uploadVerValueSets.size()); @@ -406,7 +399,7 @@ public class TerminologySvcImplCurrentVersionR4Test extends BaseJpaR4Test { * Validates that the collection of unqualified IDs of each element of theValueSets matches the expected * unqualifiedIds corresponding to the uploaded versions plus one with no version * - * @param theValueSets the ValueSet collection + * @param theValueSets the ValueSet collection * @param theExpectedIdVersions the collection of expected versions */ private void matchUnqualifiedIds(List<IBaseResource> theValueSets, Collection<String> theExpectedIdVersions) { @@ -418,33 +411,31 @@ public class TerminologySvcImplCurrentVersionR4Test extends BaseJpaR4Test { // plus one entry for null version expectedNoVersionUnqualifiedIds.add(VS_NO_VERSIONED_ON_UPLOAD_ID); - List <String> resultUnqualifiedIds = theValueSets.stream() + List<String> resultUnqualifiedIds = theValueSets.stream() .map(r -> r.getIdElement().getIdPart()) .collect(Collectors.toList()); assertThat(resultUnqualifiedIds, containsInAnyOrder(resultUnqualifiedIds.toArray())); - List <String> resultVersions = theValueSets.stream() - .map(r -> ((ValueSet) r).getVersion()) - .collect(Collectors.toList()); - Set<String> theExpectedIdVersionsPlusNull = Sets.newHashSet(theExpectedIdVersions); theExpectedIdVersionsPlusNull.add(null); - assertThat(theExpectedIdVersionsPlusNull, containsInAnyOrder(resultVersions.toArray())); + assertThat(theExpectedIdVersionsPlusNull, containsInAnyOrder( + theValueSets.stream().map(r -> ((ValueSet) r).getVersion()).toArray())); + } /** * Validates that: - * for CodeSystem: - * _ current CS has no version - * _ current TCS has no version + * for CodeSystem: + * _ current CS has no version + * _ current TCS has no version * for ValueSet: - * _ current TVSs with upload version have upload-version with no version append - * _ current TVSs with no upload version have null version + * _ current TVSs with upload version have upload-version with no version append + * _ current TVSs with no upload version have null version */ - private void runCommonValidations(String theVersion) { - // for CodeSystem: + private void runCommonValidations(List<String> theAllVersions) { + // for CodeSystem: // _ current CS is present and has no version CodeSystem codeSystem = myCodeSystemDao.read(new IdType("loinc")); @@ -452,8 +443,9 @@ public class TerminologySvcImplCurrentVersionR4Test extends BaseJpaR4Test { ourLog.info("CodeSystem:\n" + csString); HashSet<String> shouldNotBePresentVersions = new HashSet<>(possibleVersions); - shouldNotBePresentVersions.remove(theVersion); - shouldNotBePresentVersions.stream().forEach(vv -> assertFalse(csString.contains(vv))); + theAllVersions.forEach(shouldNotBePresentVersions::remove); + shouldNotBePresentVersions.forEach(vv -> assertFalse(csString.contains(vv), + "Found version string: '" + vv + "' in CodeSystem: " + csString)); // same reading it from term service CodeSystem cs = myITermReadSvc.fetchCanonicalCodeSystemFromCompleteContext(BASE_LOINC_URL); @@ -469,6 +461,7 @@ public class TerminologySvcImplCurrentVersionR4Test extends BaseJpaR4Test { // for ValueSet resource ValueSet vs = (ValueSet) myJpaPersistedResourceValidationSupport.fetchValueSet(VS_NO_VERSIONED_ON_UPLOAD); + assertNotNull(vs); assertEquals(VS_NO_VERSIONED_ON_UPLOAD, vs.getUrl()); assertNull(vs.getVersion()); @@ -489,92 +482,132 @@ public class TerminologySvcImplCurrentVersionR4Test extends BaseJpaR4Test { public void uploadCurrentNoVersion() throws Exception { IIdType csId = uploadLoincCodeSystem(null, true); - runCommonValidations(null); + runCommonValidations(Collections.emptyList()); // validate operation for current (no version parameter) validateOperations(null, Collections.emptySet()); + + // tests conditions which were failing after VS expansion (before fix for issue-2995) + validateTermConcepts(Lists.newArrayList((String) null)); } @Test() - public void uploadCurrentWithVersion() throws Exception { + public void uploadWithVersion() throws Exception { String ver = "2.67"; IIdType csId = uploadLoincCodeSystem(ver, true); - runCommonValidations(ver); + runCommonValidations(Collections.singletonList(ver)); // validate operation for specific version validateOperations(ver, Collections.singleton(ver)); + + // tests conditions which were failing after VS expansion (before fix for issue-2995) + validateTermConcepts(Lists.newArrayList(ver, ver)); } + @Test - public void uploadCurrentNoVersionThenNoCurrent() throws Exception { + public void uploadNoVersionThenNoCurrent() throws Exception { uploadLoincCodeSystem(null, true); String ver = "2.67"; uploadLoincCodeSystem(ver, false); - myTermSvc.preExpandDeferredValueSetsToTerminologyTables(); - - runCommonValidations(ver); +// myTermSvc.preExpandDeferredValueSetsToTerminologyTables(); + runCommonValidations(Collections.singletonList(ver)); // validate operation for specific version validateOperations(null, Collections.singleton(ver)); + + // tests conditions which were failing after VS expansion (before fix for issue-2995) + validateTermConcepts(Lists.newArrayList(null, ver)); } @Test - public void uploadFirstCurrentWithVersionThenNoCurrent() throws Exception { - String firstVer = "2.67"; - uploadLoincCodeSystem(firstVer, true); + public void uploadWithVersionThenNoCurrent() throws Exception { + String currentVer = "2.67"; + uploadLoincCodeSystem(currentVer, true); - String secondVer = "2.68"; - uploadLoincCodeSystem(secondVer, false); + String nonCurrentVer = "2.68"; + uploadLoincCodeSystem(nonCurrentVer, false); - runCommonValidations(firstVer); - runCommonValidations(secondVer); + // myTermSvc.preExpandDeferredValueSetsToTerminologyTables(); + + runCommonValidations(Lists.newArrayList(currentVer, nonCurrentVer)); // validate operation for specific version - validateOperations(null, Lists.newArrayList(firstVer, secondVer)); + validateOperations(currentVer, Lists.newArrayList(currentVer, nonCurrentVer)); + + // tests conditions which were failing after VS expansion (before fix for issue-2995) + validateTermConcepts(Lists.newArrayList(currentVer, currentVer, nonCurrentVer)); + } + + /** + * Validates TermConcepts were created in the sequence indicated by the parameters + * and their displays match the expected versions + */ + private void validateTermConcepts(ArrayList<String> theExpectedVersions) { + @SuppressWarnings("unchecked") + List<TermConcept> termConceptNoVerList = (List<TermConcept>) myEntityManager.createQuery( + "from TermConcept where myCode = '" + VS_NO_VERSIONED_ON_UPLOAD_FIRST_CODE + "' order by myId").getResultList(); + assertEquals(theExpectedVersions.size(), termConceptNoVerList.size()); + for (int i = 0; i < theExpectedVersions.size(); i++) { + assertEquals( prefixWithVersion(theExpectedVersions.get(i), VS_NO_VERSIONED_ON_UPLOAD_FIRST_DISPLAY), + termConceptNoVerList.get(i).getDisplay(), "TermCode with id: " + i + " display"); + } + + @SuppressWarnings("unchecked") + List<TermConcept> termConceptWithVerList = (List<TermConcept>) myEntityManager.createQuery( + "from TermConcept where myCode = '" + VS_VERSIONED_ON_UPLOAD_FIRST_CODE + "' order by myId").getResultList(); + assertEquals(theExpectedVersions.size(), termConceptWithVerList.size()); + for (int i = 0; i < theExpectedVersions.size(); i++) { + assertEquals( prefixWithVersion(theExpectedVersions.get(i), VS_VERSIONED_ON_UPLOAD_FIRST_DISPLAY), + termConceptWithVerList.get(i).getDisplay(), "TermCode with id: " + i + " display"); + } } @Test - public void uploadFirstCurrentNoVersionThenNoCurrentThenCurrent() throws Exception { + public void uploadNoVersionThenNoCurrentThenCurrent() throws Exception { uploadLoincCodeSystem(null, true); - String firstVer = "2.67"; - uploadLoincCodeSystem(firstVer, false); + String nonCurrentVer = "2.67"; + uploadLoincCodeSystem(nonCurrentVer, false); - String secondVer = "2.68"; - uploadLoincCodeSystem(secondVer, true); + String currentVer = "2.68"; + uploadLoincCodeSystem(currentVer, true); - runCommonValidations(firstVer); - runCommonValidations(secondVer); + runCommonValidations(Lists.newArrayList(nonCurrentVer, currentVer)); // validate operation for specific version - validateOperations(secondVer, Lists.newArrayList(firstVer, secondVer)); + validateOperations(currentVer, Lists.newArrayList(nonCurrentVer, currentVer)); + + // tests conditions which were failing after VS expansion (before fix for issue-2995) + validateTermConcepts(Lists.newArrayList(nonCurrentVer, currentVer, currentVer)); } @Test - public void uploadFirstCurrentWithVersionThenNoCurrentThenCurrent() throws Exception { - String firstVer = "2.67"; - uploadLoincCodeSystem(firstVer, true); + public void uploadWithVersionThenNoCurrentThenCurrent() throws Exception { + String firstCurrentVer = "2.67"; + uploadLoincCodeSystem(firstCurrentVer, true); - String secondVer = "2.68"; - uploadLoincCodeSystem(secondVer, false); + String noCurrentVer = "2.68"; + uploadLoincCodeSystem(noCurrentVer, false); - String thirdVer = "2.68"; - uploadLoincCodeSystem(thirdVer, true); + String lastCurrentVer = "2.69"; + uploadLoincCodeSystem(lastCurrentVer, true); - runCommonValidations(firstVer); - runCommonValidations(secondVer); - runCommonValidations(thirdVer); + runCommonValidations(Lists.newArrayList(firstCurrentVer, noCurrentVer, lastCurrentVer)); // validate operation for specific version - validateOperations(thirdVer, Lists.newArrayList(firstVer, secondVer, thirdVer)); + validateOperations(lastCurrentVer, Lists.newArrayList(firstCurrentVer, noCurrentVer, lastCurrentVer)); + + // tests conditions which were failing after VS expansion (before fix for issue-2995) + validateTermConcepts(Lists.newArrayList(firstCurrentVer, noCurrentVer, lastCurrentVer, lastCurrentVer)); } @@ -583,10 +616,8 @@ public class TerminologySvcImplCurrentVersionR4Test extends BaseJpaR4Test { private IIdType uploadLoincCodeSystem(String theVersion, boolean theMakeItCurrent) throws Exception { myFiles = new ZipCollectionBuilder(); - if (! theMakeItCurrent) { - myRequestDetails.getUserData().put(LOINC_CODESYSTEM_MAKE_CURRENT, false); - uploadProperties.put(LOINC_CODESYSTEM_MAKE_CURRENT.getCode(), "false"); - } + myRequestDetails.getUserData().put(LOINC_CODESYSTEM_MAKE_CURRENT, theMakeItCurrent); + uploadProperties.put(LOINC_CODESYSTEM_MAKE_CURRENT.getCode(), Boolean.toString(theMakeItCurrent)); assertTrue( theVersion == null || theVersion.equals("2.67") || theVersion.equals("2.68") || theVersion.equals("2.69"), @@ -625,7 +656,7 @@ public class TerminologySvcImplCurrentVersionR4Test extends BaseJpaR4Test { case "2.67": return "/loinc-ver/v267/"; case "2.68": return "/loinc-ver/v268/"; case "2.69": return "/loinc-ver/v269/"; - }; + } fail("Setup failed. Unexpected version: " + theVersion); return null; @@ -658,144 +689,11 @@ public class TerminologySvcImplCurrentVersionR4Test extends BaseJpaR4Test { } } - private void logAllTermValueSets() { - List<TermValueSet> vsList = myTermValueSetDao.findAll(); - - vsList.forEach(vs -> { - ourLog.info("ValueSet:\n" + vs); - }); - - } - - private TermCodeSystemVersion fetchCurrentCodeSystemVersion() { return (TermCodeSystemVersion) myEntityManager.createQuery( "select tcsv from TermCodeSystemVersion tcsv join fetch tcsv.myCodeSystem tcs " + "where tcs.myCurrentVersion = tcsv" ).getSingleResult(); } - private List<TermValueSet> fetchTermValueSets(String url) { - return myEntityManager.createQuery("from TermValueSet where url = '" + url + "'").getResultList(); - } - - private List<ValueSet> fetchValueSets(Collection<Long> ids) { -// ResourcePersistentId rscIds = myIdHelperService.resolveResourcePersistentIds( -// RequestPartitionId.allPartitions(), "ValueSet", url); -// - return myEntityManager.createQuery("from ResourceTable where myResourceType = 'ValueSet'").getResultList(); - } - - - - - -// @Test -// public void testValidateCodeIsInPreExpandedValueSet() throws Exception { -// myDaoConfig.setPreExpandValueSets(true); -// -// loadAndPersistCodeSystemAndValueSetWithDesignations(HttpVerb.POST); -// -// CodeSystem codeSystem = myCodeSystemDao.read(myExtensionalCsId); -// ourLog.info("CodeSystem:\n" + myFhirCtx.newJsonParser().setPrettyPrint(true).encodeResourceToString(codeSystem)); -// -// ValueSet valueSet = myValueSetDao.read(myExtensionalVsId); -// ourLog.info("ValueSet:\n" + myFhirCtx.newJsonParser().setPrettyPrint(true).encodeResourceToString(valueSet)); -// -// myTermSvc.preExpandDeferredValueSetsToTerminologyTables(); -// -// IValidationSupport.CodeValidationResult result = myTermSvc.validateCodeIsInPreExpandedValueSet(optsNoGuess, valueSet, null, null, null, null, null); -// assertNull(result); -// -// result = myTermSvc.validateCodeIsInPreExpandedValueSet(optsNoGuess, valueSet, null, "BOGUS", null, null, null); -// assertFalse(result.isOk()); -// -// result = myTermSvc.validateCodeIsInPreExpandedValueSet(optsNoGuess, valueSet, null, "11378-7", null, null, null); -// assertFalse(result.isOk()); -// -// result = myTermSvc.validateCodeIsInPreExpandedValueSet(optsGuess, valueSet, null, "11378-7", null, null, null); -// assertTrue(result.isOk()); -// assertEquals("Systolic blood pressure at First encounter", result.getDisplay()); -// -// result = myTermSvc.validateCodeIsInPreExpandedValueSet(optsGuess, valueSet, null, "11378-7", "Systolic blood pressure at First encounter", null, null); -// assertTrue(result.isOk()); -// assertEquals("Systolic blood pressure at First encounter", result.getDisplay()); -// -// result = myTermSvc.validateCodeIsInPreExpandedValueSet(optsNoGuess, valueSet, "http://acme.org", "11378-7", null, null, null); -// assertTrue(result.isOk()); -// assertEquals("Systolic blood pressure at First encounter", result.getDisplay()); -// -// Coding coding = new Coding("http://acme.org", "11378-7", "Systolic blood pressure at First encounter"); -// result = myTermSvc.validateCodeIsInPreExpandedValueSet(optsNoGuess, valueSet, null, null, null, coding, null); -// assertTrue(result.isOk()); -// assertEquals("Systolic blood pressure at First encounter", result.getDisplay()); -// -// CodeableConcept codeableConcept = new CodeableConcept(); -// codeableConcept.addCoding(new Coding("BOGUS", "BOGUS", "BOGUS")); -// codeableConcept.addCoding(coding); -// result = myTermSvc.validateCodeIsInPreExpandedValueSet(optsNoGuess, valueSet, null, null, null, null, codeableConcept); -// assertTrue(result.isOk()); -// assertEquals("Systolic blood pressure at First encounter", result.getDisplay()); -// } - - - -// @Test -// public void testCreateCodeSystemTwoVersions() { -// CodeSystem codeSystem = new CodeSystem(); -// codeSystem.setUrl(CS_URL); -// codeSystem.setContent(CodeSystem.CodeSystemContentMode.COMPLETE); -// codeSystem -// .addConcept().setCode("A").setDisplay("Code A"); -// codeSystem -// .addConcept().setCode("B").setDisplay("Code A"); -// -// codeSystem.setVersion("1"); -// -// IIdType id = myCodeSystemDao.create(codeSystem, mySrd).getId().toUnqualified(); -// -// Set<TermConcept> codes = myTermSvc.findCodesBelow(id.getIdPartAsLong(), id.getVersionIdPartAsLong(), "A"); -// assertThat(toCodes(codes), containsInAnyOrder("A")); -// -// codes = myTermSvc.findCodesBelow(id.getIdPartAsLong(), id.getVersionIdPartAsLong(), "B"); -// assertThat(toCodes(codes), containsInAnyOrder("B")); -// -// runInTransaction(() -> { -// List<TermCodeSystemVersion> termCodeSystemVersions = myTermCodeSystemVersionDao.findAll(); -// assertEquals(termCodeSystemVersions.size(), 1); -// TermCodeSystemVersion termCodeSystemVersion_1 = termCodeSystemVersions.get(0); -// assertEquals(termCodeSystemVersion_1.getConcepts().size(), 2); -// Set<TermConcept> termConcepts = new HashSet<>(termCodeSystemVersion_1.getConcepts()); -// assertThat(toCodes(termConcepts), containsInAnyOrder("A", "B")); -// -// TermCodeSystem termCodeSystem = myTermCodeSystemDao.findByResourcePid(id.getIdPartAsLong()); -// assertEquals("1", termCodeSystem.getCurrentVersion().getCodeSystemVersionId()); -// -// }); -// -// codeSystem.setVersion("2"); -// codeSystem -// .addConcept().setCode("C").setDisplay("Code C"); -// -// IIdType id_v2 = myCodeSystemDao.create(codeSystem, mySrd).getId().toUnqualified(); -// codes = myTermSvc.findCodesBelow(id_v2.getIdPartAsLong(), id_v2.getVersionIdPartAsLong(), "C"); -// assertThat(toCodes(codes), containsInAnyOrder("C")); -// -// runInTransaction(() -> { -// List<TermCodeSystemVersion> termCodeSystemVersions_updated = myTermCodeSystemVersionDao.findAll(); -// assertEquals(termCodeSystemVersions_updated.size(), 2); -// TermCodeSystemVersion termCodeSystemVersion_2 = termCodeSystemVersions_updated.get(1); -// assertEquals(termCodeSystemVersion_2.getConcepts().size(), 3); -// Set<TermConcept> termConcepts_updated = new HashSet<>(termCodeSystemVersion_2.getConcepts()); -// assertThat(toCodes(termConcepts_updated), containsInAnyOrder("A", "B", "C")); -// -// TermCodeSystem termCodeSystem = myTermCodeSystemDao.findByResourcePid(id_v2.getIdPartAsLong()); -// assertEquals("2", termCodeSystem.getCurrentVersion().getCodeSystemVersionId()); -// }); -// } - - - - - } diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/AnswerFile/AnswerList.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/AnswerFile/AnswerList.csv index f07d57edd54..650551cb1be 100644 --- a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/AnswerFile/AnswerList.csv +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/AnswerFile/AnswerList.csv @@ -9,4 +9,4 @@ "LL1001-8" ,"v2.67 PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13860-4" ,"04" , ,5 ,"v2.67 5-6 times per week" , , , , , , , , "LL1001-8" ,"v2.67 PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13827-3" ,"05" , ,6 ,"v2.67 1 time per day" , , , , , , , , "LL1001-8" ,"v2.67 PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA4389-8" ,"97" , ,11 ,"v2.67 Refused" ,"443390004","Refused (qualifier value)","http://snomed.info/sct","http://snomed.info/sct/900000000000207008/version/20170731","This material includes SNOMED Clinical Terms® (SNOMED CT®) which is used by permission of the International Health Terminology Standards Development Organisation (IHTSDO) under license. All rights reserved. SNOMED CT® was originally created by The College", , , -"LL1892-0" ,"v2.67 ICD-9_ICD-10" ,"1.3.6.1.4.1.12009.10.1.1069","Y" , ,"http://www.cdc.gov/nchs/icd.htm", , , , , , , , , , , , , +"LL1892-0" ,"v2.67 ICD-9_ICD-10" ,"1.3.6.1.4.1.12009.10.1.1069","Y" , ,"http://www.cdc.gov/nchs/icd.htm", , , , ,"v2.67 " , , , , , , , , diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/PanelsAndForms/AnswerList.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/PanelsAndForms/AnswerList.csv index a448cf80f2d..12fb5f865de 100644 --- a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/PanelsAndForms/AnswerList.csv +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v267/AccessoryFiles/PanelsAndForms/AnswerList.csv @@ -1,12 +1,12 @@ "AnswerListId","AnswerListName" ,"AnswerListOID" ,"ExtDefinedYN","ExtDefinedAnswerListCodeSystem","ExtDefinedAnswerListLink" ,"AnswerStringId","LocalAnswerCode","LocalAnswerCodeSystem","SequenceNumber","DisplayText" ,"ExtCodeId","ExtCodeDisplayName" ,"ExtCodeSystem" ,"ExtCodeSystemVersion" ,"ExtCodeSystemCopyrightNotice" ,"SubsequentTextPrompt","Description","Score" -"LL1000-0" ,"PhenX05_13_30D bread amt","1.3.6.1.4.1.12009.10.1.165" ,"N" , , ,"LA13825-7" ,"1" , ,1 ,"1 slice or 1 dinner roll" , , , , , , , , -"LL1000-0" ,"PhenX05_13_30D bread amt","1.3.6.1.4.1.12009.10.1.165" ,"N" , , ,"LA13838-0" ,"2" , ,2 ,"2 slices or 2 dinner rolls" , , , , , , , , -"LL1000-0" ,"PhenX05_13_30D bread amt","1.3.6.1.4.1.12009.10.1.165" ,"N" , , ,"LA13892-7" ,"3" , ,3 ,"More than 2 slices or 2 dinner rolls", , , , , , , , -"LL1001-8" ,"PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA6270-8" ,"00" , ,1 ,"Never" , , , , , , , , -"LL1001-8" ,"PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13836-4" ,"01" , ,2 ,"1-3 times per month" , , , , , , , , -"LL1001-8" ,"PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13834-9" ,"02" , ,3 ,"1-2 times per week" , , , , , , , , -"LL1001-8" ,"PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13853-9" ,"03" , ,4 ,"3-4 times per week" , , , , , , , , -"LL1001-8" ,"PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13860-4" ,"04" , ,5 ,"5-6 times per week" , , , , , , , , -"LL1001-8" ,"PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13827-3" ,"05" , ,6 ,"1 time per day" , , , , , , , , -"LL1001-8" ,"PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA4389-8" ,"97" , ,11 ,"Refused" ,"443390004","Refused (qualifier value)","http://snomed.info/sct","http://snomed.info/sct/900000000000207008/version/20170731","This material includes SNOMED Clinical Terms® (SNOMED CT®) which is used by permission of the International Health Terminology Standards Development Organisation (IHTSDO) under license. All rights reserved. SNOMED CT® was originally created by The College", , , +"LL1000-0" ,"PhenX05_13_30D bread amt","1.3.6.1.4.1.12009.10.1.165" ,"N" , , ,"LA13825-7" ,"1" , ,1 ,"v2.67 1 slice or 1 dinner roll" , , , , , , , , +"LL1000-0" ,"PhenX05_13_30D bread amt","1.3.6.1.4.1.12009.10.1.165" ,"N" , , ,"LA13838-0" ,"2" , ,2 ,"v2.67 2 slices or 2 dinner rolls" , , , , , , , , +"LL1000-0" ,"PhenX05_13_30D bread amt","1.3.6.1.4.1.12009.10.1.165" ,"N" , , ,"LA13892-7" ,"3" , ,3 ,"v2.67 More than 2 slices or 2 dinner rolls", , , , , , , , +"LL1001-8" ,"PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA6270-8" ,"00" , ,1 ,"v2.67 Never" , , , , , , , , +"LL1001-8" ,"PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13836-4" ,"01" , ,2 ,"v2.67 1-3 times per month" , , , , , , , , +"LL1001-8" ,"PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13834-9" ,"02" , ,3 ,"v2.67 1-2 times per week" , , , , , , , , +"LL1001-8" ,"PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13853-9" ,"03" , ,4 ,"v2.67 3-4 times per week" , , , , , , , , +"LL1001-8" ,"PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13860-4" ,"04" , ,5 ,"v2.67 5-6 times per week" , , , , , , , , +"LL1001-8" ,"PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13827-3" ,"05" , ,6 ,"v2.67 1 time per day" , , , , , , , , +"LL1001-8" ,"PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA4389-8" ,"97" , ,11 ,"v2.67 Refused" ,"443390004","Refused (qualifier value)","http://snomed.info/sct","http://snomed.info/sct/900000000000207008/version/20170731","This material includes SNOMED Clinical Terms® (SNOMED CT®) which is used by permission of the International Health Terminology Standards Development Organisation (IHTSDO) under license. All rights reserved. SNOMED CT® was originally created by The College", , , "LL1892-0" ,"ICD-9_ICD-10" ,"1.3.6.1.4.1.12009.10.1.1069","Y" , ,"http://www.cdc.gov/nchs/icd.htm", , , , , , , , , , , , , diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/AnswerFile/AnswerList.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/AnswerFile/AnswerList.csv index d82c5b4ad6a..de4bcdc652e 100644 --- a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/AnswerFile/AnswerList.csv +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/AnswerFile/AnswerList.csv @@ -1,12 +1,12 @@ "AnswerListId","AnswerListName" ,"AnswerListOID" ,"ExtDefinedYN","ExtDefinedAnswerListCodeSystem","ExtDefinedAnswerListLink" ,"AnswerStringId","LocalAnswerCode","LocalAnswerCodeSystem","SequenceNumber","DisplayText" ,"ExtCodeId","ExtCodeDisplayName" ,"ExtCodeSystem" ,"ExtCodeSystemVersion" ,"ExtCodeSystemCopyrightNotice" ,"SubsequentTextPrompt","Description","Score" -"LL1000-0" ,"v2.68 PhenX05_13_30D bread amt","1.3.6.1.4.1.12009.10.1.165" ,"N" , , ,"LA13825-7" ,"1" , ,1 ,"1 slice or 1 dinner roll" , , , , , , , , -"LL1000-0" ,"v2.68 PhenX05_13_30D bread amt","1.3.6.1.4.1.12009.10.1.165" ,"N" , , ,"LA13838-0" ,"2" , ,2 ,"2 slices or 2 dinner rolls" , , , , , , , , -"LL1000-0" ,"v2.68 PhenX05_13_30D bread amt","1.3.6.1.4.1.12009.10.1.165" ,"N" , , ,"LA13892-7" ,"3" , ,3 ,"More than 2 slices or 2 dinner rolls", , , , , , , , -"LL1001-8" ,"v2.68 PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA6270-8" ,"00" , ,1 ,"Never" , , , , , , , , -"LL1001-8" ,"v2.68 PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13836-4" ,"01" , ,2 ,"1-3 times per month" , , , , , , , , -"LL1001-8" ,"v2.68 PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13834-9" ,"02" , ,3 ,"1-2 times per week" , , , , , , , , -"LL1001-8" ,"v2.68 PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13853-9" ,"03" , ,4 ,"3-4 times per week" , , , , , , , , -"LL1001-8" ,"v2.68 PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13860-4" ,"04" , ,5 ,"5-6 times per week" , , , , , , , , -"LL1001-8" ,"v2.68 PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13827-3" ,"05" , ,6 ,"1 time per day" , , , , , , , , -"LL1001-8" ,"v2.68 PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA4389-8" ,"97" , ,11 ,"Refused" ,"443390004","Refused (qualifier value)","http://snomed.info/sct","http://snomed.info/sct/900000000000207008/version/20170731","This material includes SNOMED Clinical Terms® (SNOMED CT®) which is used by permission of the International Health Terminology Standards Development Organisation (IHTSDO) under license. All rights reserved. SNOMED CT® was originally created by The College", , , -"LL1892-0" ,"v2.68 ICD-9_ICD-10" ,"1.3.6.1.4.1.12009.10.1.1069","Y" , ,"http://www.cdc.gov/nchs/icd.htm", , , , , , , , , , , , , +"LL1000-0" ,"v2.68 PhenX05_13_30D bread amt","1.3.6.1.4.1.12009.10.1.165" ,"N" , , ,"LA13825-7" ,"1" , ,1 ,"v2.68 1 slice or 1 dinner roll" , , , , , , , , +"LL1000-0" ,"v2.68 PhenX05_13_30D bread amt","1.3.6.1.4.1.12009.10.1.165" ,"N" , , ,"LA13838-0" ,"2" , ,2 ,"v2.68 2 slices or 2 dinner rolls" , , , , , , , , +"LL1000-0" ,"v2.68 PhenX05_13_30D bread amt","1.3.6.1.4.1.12009.10.1.165" ,"N" , , ,"LA13892-7" ,"3" , ,3 ,"v2.68 More than 2 slices or 2 dinner rolls", , , , , , , , +"LL1001-8" ,"v2.68 PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA6270-8" ,"00" , ,1 ,"v2.68 Never" , , , , , , , , +"LL1001-8" ,"v2.68 PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13836-4" ,"01" , ,2 ,"v2.68 1-3 times per month" , , , , , , , , +"LL1001-8" ,"v2.68 PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13834-9" ,"02" , ,3 ,"v2.68 1-2 times per week" , , , , , , , , +"LL1001-8" ,"v2.68 PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13853-9" ,"03" , ,4 ,"v2.68 3-4 times per week" , , , , , , , , +"LL1001-8" ,"v2.68 PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13860-4" ,"04" , ,5 ,"v2.68 5-6 times per week" , , , , , , , , +"LL1001-8" ,"v2.68 PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13827-3" ,"05" , ,6 ,"v2.68 1 time per day" , , , , , , , , +"LL1001-8" ,"v2.68 PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA4389-8" ,"97" , ,11 ,"v2.68 Refused" ,"443390004","Refused (qualifier value)","http://snomed.info/sct","http://snomed.info/sct/900000000000207008/version/20170731","This material includes SNOMED Clinical Terms® (SNOMED CT®) which is used by permission of the International Health Terminology Standards Development Organisation (IHTSDO) under license. All rights reserved. SNOMED CT® was originally created by The College", , , +"LL1892-0" ,"v2.68 ICD-9_ICD-10" ,"1.3.6.1.4.1.12009.10.1.1069","Y" , ,"http://www.cdc.gov/nchs/icd.htm", , , , ,"v2.68 " , , , , , , , , diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/PanelsAndForms/AnswerList.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/PanelsAndForms/AnswerList.csv index a448cf80f2d..4d8aaaac004 100644 --- a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/PanelsAndForms/AnswerList.csv +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v268/AccessoryFiles/PanelsAndForms/AnswerList.csv @@ -1,12 +1,12 @@ "AnswerListId","AnswerListName" ,"AnswerListOID" ,"ExtDefinedYN","ExtDefinedAnswerListCodeSystem","ExtDefinedAnswerListLink" ,"AnswerStringId","LocalAnswerCode","LocalAnswerCodeSystem","SequenceNumber","DisplayText" ,"ExtCodeId","ExtCodeDisplayName" ,"ExtCodeSystem" ,"ExtCodeSystemVersion" ,"ExtCodeSystemCopyrightNotice" ,"SubsequentTextPrompt","Description","Score" -"LL1000-0" ,"PhenX05_13_30D bread amt","1.3.6.1.4.1.12009.10.1.165" ,"N" , , ,"LA13825-7" ,"1" , ,1 ,"1 slice or 1 dinner roll" , , , , , , , , -"LL1000-0" ,"PhenX05_13_30D bread amt","1.3.6.1.4.1.12009.10.1.165" ,"N" , , ,"LA13838-0" ,"2" , ,2 ,"2 slices or 2 dinner rolls" , , , , , , , , -"LL1000-0" ,"PhenX05_13_30D bread amt","1.3.6.1.4.1.12009.10.1.165" ,"N" , , ,"LA13892-7" ,"3" , ,3 ,"More than 2 slices or 2 dinner rolls", , , , , , , , -"LL1001-8" ,"PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA6270-8" ,"00" , ,1 ,"Never" , , , , , , , , -"LL1001-8" ,"PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13836-4" ,"01" , ,2 ,"1-3 times per month" , , , , , , , , -"LL1001-8" ,"PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13834-9" ,"02" , ,3 ,"1-2 times per week" , , , , , , , , -"LL1001-8" ,"PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13853-9" ,"03" , ,4 ,"3-4 times per week" , , , , , , , , -"LL1001-8" ,"PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13860-4" ,"04" , ,5 ,"5-6 times per week" , , , , , , , , -"LL1001-8" ,"PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13827-3" ,"05" , ,6 ,"1 time per day" , , , , , , , , -"LL1001-8" ,"PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA4389-8" ,"97" , ,11 ,"Refused" ,"443390004","Refused (qualifier value)","http://snomed.info/sct","http://snomed.info/sct/900000000000207008/version/20170731","This material includes SNOMED Clinical Terms® (SNOMED CT®) which is used by permission of the International Health Terminology Standards Development Organisation (IHTSDO) under license. All rights reserved. SNOMED CT® was originally created by The College", , , +"LL1000-0" ,"PhenX05_13_30D bread amt","1.3.6.1.4.1.12009.10.1.165" ,"N" , , ,"LA13825-7" ,"1" , ,1 ,"v2.68 1 slice or 1 dinner roll" , , , , , , , , +"LL1000-0" ,"PhenX05_13_30D bread amt","1.3.6.1.4.1.12009.10.1.165" ,"N" , , ,"LA13838-0" ,"2" , ,2 ,"v2.68 2 slices or 2 dinner rolls" , , , , , , , , +"LL1000-0" ,"PhenX05_13_30D bread amt","1.3.6.1.4.1.12009.10.1.165" ,"N" , , ,"LA13892-7" ,"3" , ,3 ,"v2.68 More than 2 slices or 2 dinner rolls", , , , , , , , +"LL1001-8" ,"PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA6270-8" ,"00" , ,1 ,"v2.68 Never" , , , , , , , , +"LL1001-8" ,"PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13836-4" ,"01" , ,2 ,"v2.68 1-3 times per month" , , , , , , , , +"LL1001-8" ,"PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13834-9" ,"02" , ,3 ,"v2.68 1-2 times per week" , , , , , , , , +"LL1001-8" ,"PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13853-9" ,"03" , ,4 ,"v2.68 3-4 times per week" , , , , , , , , +"LL1001-8" ,"PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13860-4" ,"04" , ,5 ,"v2.68 5-6 times per week" , , , , , , , , +"LL1001-8" ,"PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13827-3" ,"05" , ,6 ,"v2.68 1 time per day" , , , , , , , , +"LL1001-8" ,"PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA4389-8" ,"97" , ,11 ,"v2.68 Refused" ,"443390004","Refused (qualifier value)","http://snomed.info/sct","http://snomed.info/sct/900000000000207008/version/20170731","This material includes SNOMED Clinical Terms® (SNOMED CT®) which is used by permission of the International Health Terminology Standards Development Organisation (IHTSDO) under license. All rights reserved. SNOMED CT® was originally created by The College", , , "LL1892-0" ,"ICD-9_ICD-10" ,"1.3.6.1.4.1.12009.10.1.1069","Y" , ,"http://www.cdc.gov/nchs/icd.htm", , , , , , , , , , , , , diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/AnswerFile/AnswerList.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/AnswerFile/AnswerList.csv index ec157fd70fe..31600cdab70 100644 --- a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/AnswerFile/AnswerList.csv +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/AnswerFile/AnswerList.csv @@ -1,12 +1,12 @@ "AnswerListId","AnswerListName" ,"AnswerListOID" ,"ExtDefinedYN","ExtDefinedAnswerListCodeSystem","ExtDefinedAnswerListLink" ,"AnswerStringId","LocalAnswerCode","LocalAnswerCodeSystem","SequenceNumber","DisplayText" ,"ExtCodeId","ExtCodeDisplayName" ,"ExtCodeSystem" ,"ExtCodeSystemVersion" ,"ExtCodeSystemCopyrightNotice" ,"SubsequentTextPrompt","Description","Score" -"LL1000-0" ,"v2.69 PhenX05_13_30D bread amt","1.3.6.1.4.1.12009.10.1.165" ,"N" , , ,"LA13825-7" ,"1" , ,1 ,"1 slice or 1 dinner roll" , , , , , , , , -"LL1000-0" ,"v2.69 PhenX05_13_30D bread amt","1.3.6.1.4.1.12009.10.1.165" ,"N" , , ,"LA13838-0" ,"2" , ,2 ,"2 slices or 2 dinner rolls" , , , , , , , , -"LL1000-0" ,"v2.69 PhenX05_13_30D bread amt","1.3.6.1.4.1.12009.10.1.165" ,"N" , , ,"LA13892-7" ,"3" , ,3 ,"More than 2 slices or 2 dinner rolls", , , , , , , , -"LL1001-8" ,"v2.69 PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA6270-8" ,"00" , ,1 ,"Never" , , , , , , , , -"LL1001-8" ,"v2.69 PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13836-4" ,"01" , ,2 ,"1-3 times per month" , , , , , , , , -"LL1001-8" ,"v2.69 PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13834-9" ,"02" , ,3 ,"1-2 times per week" , , , , , , , , -"LL1001-8" ,"v2.69 PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13853-9" ,"03" , ,4 ,"3-4 times per week" , , , , , , , , -"LL1001-8" ,"v2.69 PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13860-4" ,"04" , ,5 ,"5-6 times per week" , , , , , , , , -"LL1001-8" ,"v2.69 PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13827-3" ,"05" , ,6 ,"1 time per day" , , , , , , , , -"LL1001-8" ,"v2.69 PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA4389-8" ,"97" , ,11 ,"Refused" ,"443390004","Refused (qualifier value)","http://snomed.info/sct","http://snomed.info/sct/900000000000207008/version/20170731","This material includes SNOMED Clinical Terms® (SNOMED CT®) which is used by permission of the International Health Terminology Standards Development Organisation (IHTSDO) under license. All rights reserved. SNOMED CT® was originally created by The College", , , -"LL1892-0" ,"v2.69 ICD-9_ICD-10" ,"1.3.6.1.4.1.12009.10.1.1069","Y" , ,"http://www.cdc.gov/nchs/icd.htm", , , , , , , , , , , , , +"LL1000-0" ,"v2.69 PhenX05_13_30D bread amt","1.3.6.1.4.1.12009.10.1.165" ,"N" , , ,"LA13825-7" ,"1" , ,1 ,"v2.69 1 slice or 1 dinner roll" , , , , , , , , +"LL1000-0" ,"v2.69 PhenX05_13_30D bread amt","1.3.6.1.4.1.12009.10.1.165" ,"N" , , ,"LA13838-0" ,"2" , ,2 ,"v2.69 2 slices or 2 dinner rolls" , , , , , , , , +"LL1000-0" ,"v2.69 PhenX05_13_30D bread amt","1.3.6.1.4.1.12009.10.1.165" ,"N" , , ,"LA13892-7" ,"3" , ,3 ,"v2.69 More than 2 slices or 2 dinner rolls", , , , , , , , +"LL1001-8" ,"v2.69 PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA6270-8" ,"00" , ,1 ,"v2.69 Never" , , , , , , , , +"LL1001-8" ,"v2.69 PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13836-4" ,"01" , ,2 ,"v2.69 1-3 times per month" , , , , , , , , +"LL1001-8" ,"v2.69 PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13834-9" ,"02" , ,3 ,"v2.69 1-2 times per week" , , , , , , , , +"LL1001-8" ,"v2.69 PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13853-9" ,"03" , ,4 ,"v2.69 3-4 times per week" , , , , , , , , +"LL1001-8" ,"v2.69 PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13860-4" ,"04" , ,5 ,"v2.69 5-6 times per week" , , , , , , , , +"LL1001-8" ,"v2.69 PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13827-3" ,"05" , ,6 ,"v2.69 1 time per day" , , , , , , , , +"LL1001-8" ,"v2.69 PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA4389-8" ,"97" , ,11 ,"v2.69 Refused" ,"443390004","Refused (qualifier value)","http://snomed.info/sct","http://snomed.info/sct/900000000000207008/version/20170731","This material includes SNOMED Clinical Terms® (SNOMED CT®) which is used by permission of the International Health Terminology Standards Development Organisation (IHTSDO) under license. All rights reserved. SNOMED CT® was originally created by The College", , , +"LL1892-0" ,"v2.69 ICD-9_ICD-10" ,"1.3.6.1.4.1.12009.10.1.1069","Y" , ,"http://www.cdc.gov/nchs/icd.htm", , , , ,"v2.69 " , , , , , , , , diff --git a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/PanelsAndForms/AnswerList.csv b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/PanelsAndForms/AnswerList.csv index a448cf80f2d..82330d220c1 100644 --- a/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/PanelsAndForms/AnswerList.csv +++ b/hapi-fhir-jpaserver-base/src/test/resources/loinc-ver/v269/AccessoryFiles/PanelsAndForms/AnswerList.csv @@ -1,12 +1,12 @@ "AnswerListId","AnswerListName" ,"AnswerListOID" ,"ExtDefinedYN","ExtDefinedAnswerListCodeSystem","ExtDefinedAnswerListLink" ,"AnswerStringId","LocalAnswerCode","LocalAnswerCodeSystem","SequenceNumber","DisplayText" ,"ExtCodeId","ExtCodeDisplayName" ,"ExtCodeSystem" ,"ExtCodeSystemVersion" ,"ExtCodeSystemCopyrightNotice" ,"SubsequentTextPrompt","Description","Score" -"LL1000-0" ,"PhenX05_13_30D bread amt","1.3.6.1.4.1.12009.10.1.165" ,"N" , , ,"LA13825-7" ,"1" , ,1 ,"1 slice or 1 dinner roll" , , , , , , , , -"LL1000-0" ,"PhenX05_13_30D bread amt","1.3.6.1.4.1.12009.10.1.165" ,"N" , , ,"LA13838-0" ,"2" , ,2 ,"2 slices or 2 dinner rolls" , , , , , , , , -"LL1000-0" ,"PhenX05_13_30D bread amt","1.3.6.1.4.1.12009.10.1.165" ,"N" , , ,"LA13892-7" ,"3" , ,3 ,"More than 2 slices or 2 dinner rolls", , , , , , , , -"LL1001-8" ,"PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA6270-8" ,"00" , ,1 ,"Never" , , , , , , , , -"LL1001-8" ,"PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13836-4" ,"01" , ,2 ,"1-3 times per month" , , , , , , , , -"LL1001-8" ,"PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13834-9" ,"02" , ,3 ,"1-2 times per week" , , , , , , , , -"LL1001-8" ,"PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13853-9" ,"03" , ,4 ,"3-4 times per week" , , , , , , , , -"LL1001-8" ,"PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13860-4" ,"04" , ,5 ,"5-6 times per week" , , , , , , , , -"LL1001-8" ,"PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13827-3" ,"05" , ,6 ,"1 time per day" , , , , , , , , -"LL1001-8" ,"PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA4389-8" ,"97" , ,11 ,"Refused" ,"443390004","Refused (qualifier value)","http://snomed.info/sct","http://snomed.info/sct/900000000000207008/version/20170731","This material includes SNOMED Clinical Terms® (SNOMED CT®) which is used by permission of the International Health Terminology Standards Development Organisation (IHTSDO) under license. All rights reserved. SNOMED CT® was originally created by The College", , , +"LL1000-0" ,"PhenX05_13_30D bread amt","1.3.6.1.4.1.12009.10.1.165" ,"N" , , ,"LA13825-7" ,"1" , ,1 ,"v2.69 1 slice or 1 dinner roll" , , , , , , , , +"LL1000-0" ,"PhenX05_13_30D bread amt","1.3.6.1.4.1.12009.10.1.165" ,"N" , , ,"LA13838-0" ,"2" , ,2 ,"v2.69 2 slices or 2 dinner rolls" , , , , , , , , +"LL1000-0" ,"PhenX05_13_30D bread amt","1.3.6.1.4.1.12009.10.1.165" ,"N" , , ,"LA13892-7" ,"3" , ,3 ,"v2.69 More than 2 slices or 2 dinner rolls", , , , , , , , +"LL1001-8" ,"PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA6270-8" ,"00" , ,1 ,"v2.69 Never" , , , , , , , , +"LL1001-8" ,"PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13836-4" ,"01" , ,2 ,"v2.69 1-3 times per month" , , , , , , , , +"LL1001-8" ,"PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13834-9" ,"02" , ,3 ,"v2.69 1-2 times per week" , , , , , , , , +"LL1001-8" ,"PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13853-9" ,"03" , ,4 ,"v2.69 3-4 times per week" , , , , , , , , +"LL1001-8" ,"PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13860-4" ,"04" , ,5 ,"v2.69 5-6 times per week" , , , , , , , , +"LL1001-8" ,"PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA13827-3" ,"05" , ,6 ,"v2.69 1 time per day" , , , , , , , , +"LL1001-8" ,"PhenX05_14_30D freq amts","1.3.6.1.4.1.12009.10.1.166" ,"N" , , ,"LA4389-8" ,"97" , ,11 ,"v2.69 Refused" ,"443390004","Refused (qualifier value)","http://snomed.info/sct","http://snomed.info/sct/900000000000207008/version/20170731","This material includes SNOMED Clinical Terms® (SNOMED CT®) which is used by permission of the International Health Terminology Standards Development Organisation (IHTSDO) under license. All rights reserved. SNOMED CT® was originally created by The College", , , "LL1892-0" ,"ICD-9_ICD-10" ,"1.3.6.1.4.1.12009.10.1.1069","Y" , ,"http://www.cdc.gov/nchs/icd.htm", , , , , , , , , , , , , From 18e3ed68eb4b0056a27a2ea56a100c7e9cf166dc Mon Sep 17 00:00:00 2001 From: "juan.marchionatto" <juan.marchionatto@smilecdr.com> Date: Thu, 16 Sep 2021 15:14:43 -0400 Subject: [PATCH 12/20] Revert loinc.xml deletion until current work gets completed --- .../uhn/fhir/jpa/term/TermLoaderSvcImpl.java | 5 +- .../ca/uhn/fhir/jpa/term/loinc/loinc.xml | 548 ++++++++++++++++++ 2 files changed, 551 insertions(+), 2 deletions(-) create mode 100644 hapi-fhir-jpaserver-base/src/main/resources/ca/uhn/fhir/jpa/term/loinc/loinc.xml diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermLoaderSvcImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermLoaderSvcImpl.java index 6f762f15103..be31eb190c3 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermLoaderSvcImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermLoaderSvcImpl.java @@ -40,6 +40,7 @@ import ca.uhn.fhir.rest.api.EncodingEnum; import ca.uhn.fhir.rest.api.server.RequestDetails; import ca.uhn.fhir.rest.server.exceptions.InternalErrorException; import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException; +import ca.uhn.fhir.util.ClasspathUtil; import ca.uhn.fhir.util.ValidateUtil; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Charsets; @@ -562,9 +563,9 @@ public class TermLoaderSvcImpl implements ITermLoaderSvc { String loincCsString = loincXmlHandler.getContents(); if (isBlank(loincCsString)) { - throw new InvalidRequestException("Did not find loinc.xml in the ZIP distribution."); + ourLog.warn("Did not find loinc.xml in the ZIP distribution. Using built-in copy"); + loincCsString = ClasspathUtil.loadResource("/ca/uhn/fhir/jpa/term/loinc/loinc.xml"); } - CodeSystem loincCs = FhirContext.forR4().newXmlParser().parseResource(CodeSystem.class, loincCsString); String codeSystemVersionId = theUploadProperties.getProperty(LOINC_CODESYSTEM_VERSION.getCode()); if (codeSystemVersionId != null) { diff --git a/hapi-fhir-jpaserver-base/src/main/resources/ca/uhn/fhir/jpa/term/loinc/loinc.xml b/hapi-fhir-jpaserver-base/src/main/resources/ca/uhn/fhir/jpa/term/loinc/loinc.xml new file mode 100644 index 00000000000..efe4184e99b --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/main/resources/ca/uhn/fhir/jpa/term/loinc/loinc.xml @@ -0,0 +1,548 @@ +<!-- +LOINC is a freely available international standard for tests, measurements, and observations. It is a well maintained, version independent code system. + +Use of LOINC is governed by the LOINC License: https://loinc.org/license/ + +This CodeSystem resource describes 'LOINC' independent of any particular version. There are notes about changes for version specific LOINC code system resources. + +Note that the following set of codes are defined by the LOINC code systems: + - the main LOINC codes + - the LOINC Answer codes (LA-) and the LOINC Answer list codes (LL-) + - the LOINC Part codes (LP-) in the Multiaxial Hierarchy + - the LOINC Part codes (LP-) for the properties + Note: there are license restrictions on the use of LOINC Part codes + - the LOINC Group codes (LG-) + Note: presently the LOINC Group codes are used to identify these roll-up groups as ValueSets, but are not yet loaded as codes in the CodeSystem + +Servers may generate variants of this for the LOINC version(s) and features they support. + +File Version: 0.6 +--> + +<CodeSystem xmlns="http://hl7.org/fhir"> + <id value="loinc"/> + + <!-- + This url is unchanged for all versions of LOINC. There can only be one correct Code System resource for each value of the version attribute (at least, only one per server). + --> + <url value="http://loinc.org"/> + + <!-- the HL7 v3 OID assigned to LOINC --> + <identifier> + <system value="urn:ietf:rfc:3986"/> + <value value="urn:oid:2.16.840.1.113883.6.1"/> + </identifier> + + <!-- + If a version is specified: + <version value="2.68"/> + --> + + <!-- + If a specific version is specified, the name should carry this information (e.g. LOINC_268). + --> + <name value="LOINC"/> + <title value="LOINC Code System"/> + <status value="active"/> + <experimental value="false"/> + + <publisher value="Regenstrief Institute, Inc."/> + <contact> + <telecom> + <value value="http://loinc.org"/> + </telecom> + </contact> + + <!-- + <date value=2020-06/> + --> + <description value="LOINC is a freely available international standard for tests, measurements, and observations"/> + <copyright value="This material contains content from LOINC (http://loinc.org). LOINC is copyright ©1995-2020, Regenstrief Institute, Inc. and the Logical Observation Identifiers Names and Codes (LOINC) Committee and is available at no cost under the license at http://loinc.org/license. LOINC® is a registered United States trademark of Regenstrief Institute, Inc."/> + <caseSensitive value="false"/> + + <valueSet value=" http://loinc.org/vs"/> + <!-- + For a version specific reference: + <valueSet value="http://loinc.org/2.68/vs"/> + --> + + <!-- + It's at the discretion of servers whether to present fragments of LOINC hierarchically or not, when using the code system resource. But, if they are hierarchical, the Hierarchy SHALL be based on the is-a relationship that is derived from the LOINC Multiaxial Hierarchy. + --> + <hierarchyMeaning value="is-a"/> + <compositional value="false"/> <!-- no compositional grammar in LOINC --> + <versionNeeded value="false"/> + + <!-- + This canonical definition of LOINC does not include the LOINC content, which is distributed separately for portability. + + Servers may choose to include fragments of LOINC for illustration purposes. + --> + <content value="not-present"/> + + <!-- + <count value="65000"/> + If working with a specific version, you could nominate a count of the total number of concepts (including the answers, Hierarchy, etc.). In this canonical definition we do not. + --> + + <!-- + FILTERS + Generally defined filters for specifying value sets + In LOINC, all the properties can also be used as filters, but they are not defined explicitly as filters. + Parent/child properties are as defined by FHIR. Note that at this time the LOINC code system resource does not support ancestor/descendant relationships. + + For illustration purposes, consider this slice of the LOINC Multiaxial Hierarchy when reading the descriptions below: + + Microbiology [LP7819-8] + Microorganism [LP14559-6] + Virus [LP14855-8] + Zika virus [LP200137-0] + Zika virus RNA | XXX [LP203271-4] + Zika virus RNA | XXX | Microbiology [LP379670-5] + Zika virus RNA [Presence] in Unspecified specimen by Probe and target amplification method [79190-5] + + Language Note: The filters defined here are specified using the default LOINC language - English (US). Requests are meant to be specified and interpreted on the English version. The return can be in a specified language (if supported by the server). But note that not all filters/properties have language translations available. + --> + <filter> + <code value="parent"/> + <description value="Allows for the selection of a set of codes based on their appearance in the LOINC Multiaxial Hierarchy. Parent selects immediate parent only. For example, the code '79190-5' has the parent 'LP379670-5'"/> + <operator value="="/> + <value value="A Part code"/> + </filter> + <filter> + <code value="child"/> + <description value="Allows for the selection of a set of codes based on their appearance in the LOINC Multiaxial Hierarchy. Child selects immediate children only. For example, the code 'LP379670-5' has the child '79190-5'. Only LOINC Parts have children; LOINC codes do not have any children because they are leaf nodes."/> + <operator value="="/> + <value value="A comma separated list of Part or LOINC codes"/> + </filter> + <filter> + <code value="copyright"/> + <description value="Allows for the inclusion or exclusion of LOINC codes that include 3rd party copyright notices. LOINC = only codes with a sole copyright by Regenstrief. 3rdParty = only codes with a 3rd party copyright in addition to the one from Regenstrief"/> + <operator value="="/> + <value value="LOINC | 3rdParty"/> + </filter> + + <!-- + PROPERTIES + There are 4 kinds of properties that apply to all LOINC codes: + 1. FHIR: display, designation; these are not described here since they are inherent in the specification + 2. Infrastructural: defined by FHIR, but documented here for the LOINC Multiaxial Hierarchy + 3. Primary LOINC properties: defined by the main LOINC table + 4. Secondary LOINC properties: defined by the LoincPartLink table + Additionally, there are 2 kinds of properties specific to Document ontology and Radiology codes, respectively: + 1. LOINC/RSNA Radiology Playbook properties + 2. Document Ontology properties + --> + <!-- + Infrastructural properties - inherited from FHIR, but documented here for the LOINC Multiaxial Hierarchy. + --> + + <property> + <code value="parent"/> + <uri value="http://hl7.org/fhir/concept-properties#parent"/> + <description value="A parent code in the Multiaxial Hierarchy"/> + <type value=""/> + </property> + <property> + <code value="child"/> + <uri value="http://hl7.org/fhir/concept-properties#child"/> + <description value="A child code in the Multiaxial Hierarchy"/> + <type value=""/> + </property> + + <!-- + Primary LOINC properties. + These apply to the main LOINC codes, but not the Multiaxial Hierarchy, Answer lists, or the Part codes. + Notes: + In the LOINC code system resource, the display element = LONG_COMMON_NAME + Many properties are specified as type "coding", which allows use of LOINC Part codes (LP-) and the display text. LOINC Parts and their associations to LOINC terms are published in the LOINC Part File. + The properties defined here follow the guidance of the LOINC Users' Manual, which states that they should be expressed with the LOINC attributes contained in the LOINC Table. Properties that are not defined in the LOINC Table use FHIR-styled names. + --> + + <property> + <code value="STATUS"/> + <uri value="http://loinc.org/property/STATUS"/> + <description value="Status of the term. Within LOINC, codes with STATUS=DEPRECATED are considered inactive. Current values: ACTIVE, TRIAL, DISCOURAGED, and DEPRECATED"/> + <type value="string"/> + </property> + <property> + <code value="COMPONENT"/> + <uri value="http://loinc.org/property/COMPONENT"/> + <description value="First major axis-component or analyte: Analyte Name, Analyte sub-class, Challenge"/> + <type value="Coding"/> + </property> + <property> + <code value="PROPERTY"/> + <uri value="http://loinc.org/property/PROPERTY"/> + <description value="Second major axis-property observed: Kind of Property (also called kind of quantity)"/> + <type value="Coding"/> + </property> + <property> + <code value="TIME_ASPCT"/> + <uri value="http://loinc.org/property/TIME_ASPCT"/> + <description value="Third major axis-timing of the measurement: Time Aspect (Point or moment in time vs. time interval)"/> + <type value="Coding"/> + </property> + <property> + <code value="SYSTEM"/> + <uri value="http://loinc.org/property/SYSTEM"/> + <description value="Fourth major axis-type of specimen or system: System (Sample) Type"/> + <type value="Coding"/> + </property> + <property> + <code value="SCALE_TYP"/> + <uri value="http://loinc.org/property/SCALE_TYP"/> + <description value="Fifth major axis-scale of measurement: Type of Scale"/> + <type value="Coding"/> + </property> + <property> + <code value="METHOD_TYP"/> + <uri value="http://loinc.org/property/METHOD_TYP"/> + <description value="Sixth major axis-method of measurement: Type of Method"/> + <type value="Coding"/> + </property> + <property> + <code value="CLASS"/> + <uri value="http://loinc.org/property/CLASS"/> + <description value="An arbitrary classification of the terms for grouping related observations together"/> + <type value="Coding"/> + </property> + <property> + <code value="VersionLastChanged"/> + <uri value="http://loinc.org/property/VersionLastChanged"/> + <description value="The LOINC version number in which the record has last changed. For new records, this field contains the same value as the VersionFirstReleased property."/> + <type value="string"/> + </property> + <property> + <code value="CLASSTYPE"/> + <uri value="http://loinc.org/property/CLASSTYPE"/> + <description value="1=Laboratory class; 2=Clinical class; 3=Claims attachments; 4=Surveys"/> + <type value="string"/> + </property> + <property> + <code value="ORDER_OBS"/> + <uri value="http://loinc.org/property/ORDER_OBS"/> + <description value="Provides users with an idea of the intended use of the term by categorizing it as an order only, observation only, or both"/> + <type value="string"/> + </property> + <property> + <code value="HL7_ATTACHMENT_STRUCTURE"/> + <uri value="http://loinc.org/property/HL7_ATTACHMENT_STRUCTURE"/> + <description value="This property is populated in collaboration with the HL7 Attachments Work Group as described in the HL7 Attachment Specification: Supplement to Consolidated CDA Templated Guide."/> + <type value="string"/> + </property> + <property> + <code value="VersionFirstReleased"/> + <uri value="http://loinc.org/property/VersionFirstReleased"/> + <description value="This is the LOINC version number in which this LOINC term was first published."/> + <type value="string"/> + </property> + <property> + <code value="PanelType"/> + <uri value="http://loinc.org/property/PanelType"/> + <description value="For LOINC terms that are panels, this attribute classifies them as a 'Convenience group', 'Organizer', or 'Panel'"/> + <type value="string"/> + </property> + <property> + <code value="ValidHL7AttachmentRequest"/> + <uri value="http://loinc.org/property/ValidHL7AttachmentRequest"/> + <description value="A value of Y in this field indicates that this LOINC code can be sent by a payer as part of an HL7 Attachment request for additional information."/> + <type value="string"/> + </property> + <property> + <code value="DisplayName"/> + <uri value="http://loinc.org/property/DisplayName"/> + <description value="A name that is more 'clinician-friendly' compared to the current LOINC Short Name, Long Common Name, and Fully Specified Name. It is created algorithmically from the manually crafted display text for each Part and is generally more concise than the Long Common Name."/> + <type value="string"/> + </property> + <property> + <code value="answer-list"/> + <uri value="http://loinc.org/property/answer-list"/> + <description value="An answer list associated with this LOINC code (if there are matching answer lists defined)."/> + <type value="Coding"/> + </property> + + <!-- + Secondary LOINC properties. + These properties also apply to the main LOINC codes, but not the Multiaxial Hierarchy, Answer lists, or the Part codes. + Notes: + These properties are defined in the LoincPartLink table. + --> + + <property> + <code value="analyte"/> + <uri value="http://loinc.org/property/analyte"/> + <description value="First sub-part of the Component, i.e., the part of the Component before the first carat"/> + <type value="Coding"/> + </property> + <property> + <code value="analyte-core"/> + <uri value="http://loinc.org/property/analyte-core"/> + <description value="The primary part of the analyte without the suffix"/> + <type value="Coding"/> + </property> + <property> + <code value="analyte-suffix"/> + <uri value="http://loinc.org/property/analyte-suffix"/> + <description value="The suffix part of the analyte, if present, e.g., Ab or DNA"/> + <type value="Coding"/> + </property> + <property> + <code value="analyte-numerator"/> + <uri value="http://loinc.org/property/analyte-numerator"/> + <description value="The numerator part of the analyte, i.e., everything before the slash in analytes that contain a divisor"/> + <type value="Coding"/> + </property> + <property> + <code value="analyte-divisor"/> + <uri value="http://loinc.org/property/analyte-divisor"/> + <description value="The divisor part of the analyte, if present, i.e., after the slash and before the first carat"/> + <type value="Coding"/> + </property> + <property> + <code value="analyte-divisor-suffix"/> + <uri value="http://loinc.org/property/analyte-divisor-suffix"/> + <description value="The suffix part of the divisor, if present"/> + <type value="Coding"/> + </property> + <property> + <code value="challenge"/> + <uri value="http://loinc.org/property/challenge"/> + <description value="Second sub-part of the Component, i.e., after the first carat"/> + <type value="Coding"/> + </property> + <property> + <code value="adjustment"/> + <uri value="http://loinc.org/property/adjustment"/> + <description value="Third sub-part of the Component, i.e., after the second carat"/> + <type value="Coding"/> + </property> + <property> + <code value="count"/> + <uri value="http://loinc.org/property/count"/> + <description value="Fourth sub-part of the Component, i.e., after the third carat"/> + <type value="Coding"/> + </property> + <property> + <code value="time-core"/> + <uri value="http://loinc.org/property/time-core"/> + <description value="The primary part of the Time"/> + <type value="Coding"/> + </property> + <property> + <code value="time-modifier"/> + <uri value="http://loinc.org/property/time-modifier"/> + <description value="The modifier of the Time value, such as mean or max"/> + <type value="Coding"/> + </property> + <property> + <code value="system-core"/> + <uri value="http://loinc.org/property/system-core"/> + <description value="The primary part of the System, i.e., without the super system"/> + <type value="Coding"/> + </property> + <property> + <code value="super-system"/> + <uri value="http://loinc.org/property/super-system"/> + <description value="The super system part of the System, if present. The super system represents the source of the specimen when the source is someone or something other than the patient whose chart the result will be stored in. For example, fetus is the super system for measurements done on obstetric ultrasounds, because the fetus is being measured and that measurement is being recorded in the patient's (mother's) chart."/> + <type value="Coding"/> + </property> + <property> + <code value="analyte-gene"/> + <uri value="http://loinc.org/property/analyte-gene"/> + <description value="The specific gene represented in the analyte"/> + <type value="Coding"/> + </property> + <property> + <code value="category"/> + <uri value="http://loinc.org/property/category"/> + <description value="A single LOINC term can be assigned one or more categories based on both programmatic and manual tagging. Category properties also utilize LOINC Class Parts."/> + <type value="Coding"/> + </property> + <property> + <code value="search"/> + <uri value="http://loinc.org/property/search"/> + <description value="Synonyms, fragments, and other Parts that are linked to a term to enable more encompassing search results."/> + <type value="Coding"/> + </property> + + <!-- + LOINC/RSNA Radiology Playbook properties. These apply only to terms in the LOINC/RSNA Radiology Playbook File. + Notes: + Properties are specified as type "coding", which are represented by LOINC Part codes (LP-) and their display names. + The attribute names here use FHIR styled names rather than their original LOINC style names because the original names contain periods. + --> + + <property> + <code value="rad-modality-modality-type"/> + <uri value="http://loinc.org/property/rad-modality-modality-type"/> + <description value="Modality is used to represent the device used to acquire imaging information."/> + <type value="Coding"/> + </property> + <property> + <code value="rad-modality-modality-subtype"/> + <uri value="http://loinc.org/property/rad-modality-modality-subtype"/> + <description value="Modality subtype may be optionally included to signify a particularly common or evocative configuration of the modality."/> + <type value="Coding"/> + </property> + <property> + <code value="rad-anatomic-location-region-imaged"/> + <uri value="http://loinc.org/property/rad-anatomic-location-region-imaged"/> + <description value="The Anatomic Location Region Imaged attribute is used in two ways: as a coarse-grained descriptor of the area imaged and a grouper for finding related imaging exams; or, it is used just as a grouper."/> + <type value="Coding"/> + </property> + <property> + <code value="rad-anatomic-location-imaging-focus"/> + <uri value="http://loinc.org/property/rad-anatomic-location-imaging-focus"/> + <description value="The Anatomic Location Imaging Focus is a more fine-grained descriptor of the specific target structure of an imaging exam. In many areas, the focus should be a specific organ."/> + <type value="Coding"/> + </property> + <property> + <code value="rad-anatomic-location-laterality-presence"/> + <uri value="http://loinc.org/property/rad-anatomic-location-laterality-presence"/> + <description value="Radiology Exams that require laterality to be specified in order to be performed are signified with an Anatomic Location Laterality Presence attribute set to 'True'"/> + <type value="Coding"/> + </property> + <property> + <code value="rad-anatomic-location-laterality"/> + <uri value="http://loinc.org/property/rad-anatomic-location-laterality"/> + <description value="Radiology exam Laterality is specified as one of: Left, Right, Bilateral, Unilateral, Unspecified"/> + <type value="Coding"/> + </property> + <property> + <code value="rad-view-aggregation"/> + <uri value="http://loinc.org/property/rad-view-aggregation"/> + <description value="Aggregation describes the extent of the imaging performed, whether in quantitative terms (e.g., '3 or more views') or subjective terms (e.g., 'complete')."/> + <type value="Coding"/> + </property> + <property> + <code value="rad-view-view-type"/> + <uri value="http://loinc.org/property/rad-view-view-type"/> + <description value="View type names specific views, such as 'lateral' or 'AP'."/> + <type value="Coding"/> + </property> + <property> + <code value="rad-maneuver-maneuver-type"/> + <uri value="http://loinc.org/property/rad-maneuver-maneuver-type"/> + <description value="Maneuver type indicates an action taken with the goal of elucidating or testing a dynamic aspect of the anatomy."/> + <type value="Coding"/> + </property> + <property> + <code value="rad-timing"/> + <uri value="http://loinc.org/property/rad-timing"/> + <description value="The Timing/Existence property used in conjunction with pharmaceutical and maneuver properties. It specifies whether or not the imaging occurs in the presence of the administered pharmaceutical or a maneuver designed to test some dynamic aspect of anatomy or physiology ."/> + <type value="Coding"/> + </property> + <property> + <code value="rad-pharmaceutical-substance-given"/> + <uri value="http://loinc.org/property/rad-pharmaceutical-substance-given"/> + <description value="The Pharmaceutical Substance Given specifies administered contrast agents, radiopharmaceuticals, medications, or other clinically important agents and challenges during the imaging procedure."/> + <type value="Coding"/> + </property> + <property> + <code value="rad-pharmaceutical-route"/> + <uri value="http://loinc.org/property/rad-pharmaceutical-route"/> + <description value="Route specifies the route of administration of the pharmaceutical."/> + <type value="Coding"/> + </property> + <property> + <code value="rad-reason-for-exam"/> + <uri value="http://loinc.org/property/rad-reason-for-exam"/> + <description value="Reason for exam is used to describe a clinical indication or a purpose for the study."/> + <type value="Coding"/> + </property> + <property> + <code value="rad-guidance-for-presence"/> + <uri value="http://loinc.org/property/rad-guidance-for-presence"/> + <description value="Guidance for.Presence indicates when a procedure is guided by imaging."/> + <type value="Coding"/> + </property> + <property> + <code value="rad-guidance-for-approach"/> + <uri value="http://loinc.org/property/rad-guidance-for-approach"/> + <description value="Guidance for.Approach refers to the primary route of access used, such as percutaneous, transcatheter, or transhepatic."/> + <type value="Coding"/> + </property> + <property> + <code value="rad-guidance-for-action"/> + <uri value="http://loinc.org/property/rad-guidance-for-action"/> + <description value="Guidance for.Action indicates the intervention performed, such as biopsy, aspiration, or ablation."/> + <type value="Coding"/> + </property> + <property> + <code value="rad-guidance-for-object"/> + <uri value="http://loinc.org/property/rad-guidance-for-object"/> + <description value="Guidance for.Object specifies the target of the action, such as mass, abscess or cyst."/> + <type value="Coding"/> + </property> + <property> + <code value="rad-subject"/> + <uri value="http://loinc.org/property/rad-subject"/> + <description value="Subject is intended for use when there is a need to distinguish between the patient associated with an imaging study, and the target of the study."/> + <type value="Coding"/> + </property> + + <!-- + Document Ontology properties. + These apply only to terms in the LOINC Document Ontology File + Notes + Properties are specified as type "coding", which are represented by LOINC Part codes (LP-) and their display names. + The attribute names here use FHIR styled names rather than their original LOINC style names because those contain periods. + --> + + <property> + <code value="document-kind"/> + <uri value="http://loinc.org/property/document-kind"/> + <description value="Characterizes the general structure of the document at a macro level."/> + <type value="Coding"/> + </property> + <property> + <code value="document-role"/> + <uri value="http://loinc.org/property/document-role"/> + <description value="Characterizes the training or professional level of the author of the document, but does not break down to specialty or subspecialty."/> + <type value="Coding"/> + </property> + <property> + <code value="document-setting"/> + <uri value="http://loinc.org/property/document-setting"/> + <description value="Setting is a modest extension of CMS’s coarse definition of care settings, such as outpatient, hospital, etc. Setting is not equivalent to location, which typically has more locally defined meanings."/> + <type value="Coding"/> + </property> + <property> + <code value="document-subject-matter-domain"/> + <uri value="http://loinc.org/property/document-subject-matter-domain"/> + <description value="Characterizes the clinical domain that is the subject of the document. For example, Internal Medicine, Neurology, Physical Therapy, etc."/> + <type value="Coding"/> + </property> + <property> + <code value="document-type-of-service"/> + <uri value="http://loinc.org/property/document-type-of-service"/> + <description value="Characterizes the kind of service or activity provided to/for the patient (or other subject of the service) that is described in the document."/> + <type value="Coding"/> + </property> + + <!-- Answer list related properties --> + <property> + <code value="answers-for"/> + <uri value="http://loinc.org/property/answers-for"/> + <description value="A LOINC Code for which this answer list is used."/> + <type value="Coding"/> + </property> + + <!-- Note for future consideration. These are properties of LA codes in the context of a particular list. Not global properties. + <property> + <code value="sequence"/> + <uri value="http://loinc.org/property/sequence"/> + <description value="Sequence Number of a answer in a set of answers (LA- codes only)"/> + <type value="integer"/> + </property> + <property> + <code value="score"/> + <uri value="http://loinc.org/property/score"/> + <description value="Score assigned to an answer (LA- codes only)"/> + <type value="integer"/> + </property> + --> +</CodeSystem> + + From d372371f364bd2be97da0b5222526aef2f85fb68 Mon Sep 17 00:00:00 2001 From: "juan.marchionatto" <juan.marchionatto@smilecdr.com> Date: Mon, 20 Sep 2021 08:51:51 -0400 Subject: [PATCH 13/20] Make sure a loinc CodeSystem always has a ForcedId --- .../fhir/jpa/dao/BaseHapiFhirResourceDao.java | 5 ++--- .../JpaPersistedResourceValidationSupport.java | 17 ++++++++++++++--- .../jpa/dao/r4/FhirResourceDaoCodeSystemR4.java | 16 ++++++++++++++++ .../jpa/term/TermCodeSystemStorageSvcImpl.java | 4 ++++ .../fhir/jpa/term/TermVersionAdapterSvcR4.java | 5 +++++ .../dao/r4/FhirResourceDaoR4ValidateTest.java | 13 ++++++++----- 6 files changed, 49 insertions(+), 11 deletions(-) diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/BaseHapiFhirResourceDao.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/BaseHapiFhirResourceDao.java index 2d2911b9f92..08bb18ae835 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/BaseHapiFhirResourceDao.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/BaseHapiFhirResourceDao.java @@ -51,7 +51,6 @@ import ca.uhn.fhir.jpa.partition.SystemRequestDetails; import ca.uhn.fhir.jpa.patch.FhirPatch; import ca.uhn.fhir.jpa.patch.JsonPatchUtils; 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.cache.SearchCacheStatusEnum; import ca.uhn.fhir.jpa.search.reindex.IResourceReindexingSvc; @@ -169,7 +168,7 @@ public abstract class BaseHapiFhirResourceDao<T extends IBaseResource> extends B @Autowired private IRequestPartitionHelperSvc myRequestPartitionHelperService; @Autowired - private HapiTransactionService myTransactionService; + protected HapiTransactionService myTransactionService; @Autowired private MatchUrlService myMatchUrlService; @Autowired @@ -221,7 +220,7 @@ public abstract class BaseHapiFhirResourceDao<T extends IBaseResource> extends B /** * Called for FHIR create (POST) operations */ - private DaoMethodOutcome doCreateForPost(T theResource, String theIfNoneExist, boolean thePerformIndexing, TransactionDetails theTransactionDetails, RequestDetails theRequestDetails) { + protected DaoMethodOutcome doCreateForPost(T theResource, String theIfNoneExist, boolean thePerformIndexing, TransactionDetails theTransactionDetails, RequestDetails theRequestDetails) { if (theResource == null) { String msg = getContext().getLocalizer().getMessage(BaseHapiFhirResourceDao.class, "missingBody"); throw new InvalidRequestException(msg); diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/JpaPersistedResourceValidationSupport.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/JpaPersistedResourceValidationSupport.java index 44b0b2582e2..06ede2ad0da 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/JpaPersistedResourceValidationSupport.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/JpaPersistedResourceValidationSupport.java @@ -109,8 +109,10 @@ public class JpaPersistedResourceValidationSupport implements IValidationSupport public IBaseResource fetchCodeSystem(String theSystem) { if (myTermReadSvc.isLoincNotGenericUnversionedCodeSystem(theSystem)) { Optional<IBaseResource> currentCSOpt = getCodeSystemCurrentVersion(new UriType(theSystem)); - return currentCSOpt.orElseThrow(() -> new ResourceNotFoundException( - "Couldn't find current version CodeSystem for url: " + theSystem)); + if (! currentCSOpt.isPresent()) { + ourLog.info("Couldn't find current version of CodeSystem: " + theSystem); + } + return currentCSOpt.orElse(null); } return fetchResource(myCodeSystemType, theSystem); @@ -125,7 +127,16 @@ public class JpaPersistedResourceValidationSupport implements IValidationSupport IFhirResourceDao<? extends IBaseResource> valueSetResourceDao = myDaoRegistry.getResourceDao(myCodeSystemType); String forcedId = "loinc"; - IBaseResource codeSystem = valueSetResourceDao.read(new IdDt("CodeSystem", forcedId)); + + // try/catch ignores exception because we need code to fall back to other options + IBaseResource codeSystem; + try { + codeSystem = valueSetResourceDao.read(new IdDt("CodeSystem", forcedId)); + + } catch (Exception theE) { + return Optional.empty(); + } + return Optional.ofNullable(codeSystem); } diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/r4/FhirResourceDaoCodeSystemR4.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/r4/FhirResourceDaoCodeSystemR4.java index 37ec5745cf4..305b8a1c8fb 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/r4/FhirResourceDaoCodeSystemR4.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/r4/FhirResourceDaoCodeSystemR4.java @@ -25,6 +25,7 @@ import ca.uhn.fhir.context.support.IValidationSupport; import ca.uhn.fhir.context.support.IValidationSupport.CodeValidationResult; import ca.uhn.fhir.context.support.ValidationSupportContext; import ca.uhn.fhir.jpa.api.dao.IFhirResourceDaoCodeSystem; +import ca.uhn.fhir.jpa.api.model.DaoMethodOutcome; import ca.uhn.fhir.jpa.dao.BaseHapiFhirResourceDao; import ca.uhn.fhir.jpa.model.cross.IBasePersistedResource; import ca.uhn.fhir.jpa.model.entity.ResourceTable; @@ -46,12 +47,14 @@ import org.hl7.fhir.r4.model.Coding; import org.springframework.beans.factory.annotation.Autowired; import javax.annotation.Nonnull; +import java.security.InvalidParameterException; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Set; import static ca.uhn.fhir.jpa.dao.FhirResourceDaoValueSetDstu2.toStringOrNull; +import static org.apache.commons.lang3.StringUtils.isBlank; import static org.apache.commons.lang3.StringUtils.isNotBlank; public class FhirResourceDaoCodeSystemR4 extends BaseHapiFhirResourceDao<CodeSystem> implements IFhirResourceDaoCodeSystem<CodeSystem, Coding, CodeableConcept> { @@ -173,4 +176,17 @@ public class FhirResourceDaoCodeSystemR4 extends BaseHapiFhirResourceDao<CodeSys } + + @Override + public DaoMethodOutcome create(CodeSystem theResource, String theIfNoneExist, boolean thePerformIndexing, + @Nonnull TransactionDetails theTransactionDetails, RequestDetails theRequestDetails) { + // loinc CodeSystem must have an ID + if (isNotBlank(theResource.getUrl()) && theResource.getUrl().contains("loinc") + && isBlank(theResource.getIdElement().getIdPart())) { + throw new InvalidParameterException("'loinc' CodeSystem must have an ID"); + } + return myTransactionService.execute(theRequestDetails, theTransactionDetails, + tx -> doCreateForPost(theResource, theIfNoneExist, thePerformIndexing, theTransactionDetails, theRequestDetails)); + } + } diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermCodeSystemStorageSvcImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermCodeSystemStorageSvcImpl.java index 6a4d72c0337..525eb9717e7 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermCodeSystemStorageSvcImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermCodeSystemStorageSvcImpl.java @@ -86,6 +86,7 @@ import java.util.UUID; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; +import static org.apache.commons.lang3.StringUtils.isBlank; import static org.apache.commons.lang3.StringUtils.isNotBlank; public class TermCodeSystemStorageSvcImpl implements ITermCodeSystemStorageSvc { @@ -139,6 +140,9 @@ public class TermCodeSystemStorageSvcImpl implements ITermCodeSystemStorageSvc { CodeSystem codeSystemResource = new CodeSystem(); codeSystemResource.setUrl(theSystem); codeSystemResource.setContent(CodeSystem.CodeSystemContentMode.NOTPRESENT); + if (isBlank(codeSystemResource.getIdElement().getIdPart()) && theSystem.contains("loinc")) { + codeSystemResource.setId("loinc"); + } myTerminologyVersionAdapterSvc.createOrUpdateCodeSystem(codeSystemResource); cs = myCodeSystemDao.findByCodeSystemUri(theSystem); diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermVersionAdapterSvcR4.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermVersionAdapterSvcR4.java index be3cf92be7e..5326b1b49ac 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermVersionAdapterSvcR4.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermVersionAdapterSvcR4.java @@ -33,6 +33,8 @@ import org.springframework.context.ApplicationContext; import org.springframework.context.event.ContextRefreshedEvent; import org.springframework.context.event.EventListener; +import java.security.InvalidParameterException; + import static org.apache.commons.lang3.StringUtils.isBlank; public class TermVersionAdapterSvcR4 extends BaseTermVersionAdapterSvcImpl implements ITermVersionAdapterSvc { @@ -63,6 +65,9 @@ public class TermVersionAdapterSvcR4 extends BaseTermVersionAdapterSvcImpl imple public IIdType createOrUpdateCodeSystem(org.hl7.fhir.r4.model.CodeSystem theCodeSystemResource, RequestDetails theRequestDetails) { validateCodeSystemForStorage(theCodeSystemResource); if (isBlank(theCodeSystemResource.getIdElement().getIdPart())) { + if (theCodeSystemResource.getUrl().contains("loinc")) { + throw new InvalidParameterException("LOINC CodeSystem must have an 'ID' element"); + } String matchUrl = "CodeSystem?url=" + UrlUtil.escapeUrlParam(theCodeSystemResource.getUrl()); return myCodeSystemResourceDao.update(theCodeSystemResource, matchUrl, theRequestDetails).getId(); } else { diff --git a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/r4/FhirResourceDaoR4ValidateTest.java b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/r4/FhirResourceDaoR4ValidateTest.java index 9925ea61f49..459e8f6af85 100644 --- a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/r4/FhirResourceDaoR4ValidateTest.java +++ b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/r4/FhirResourceDaoR4ValidateTest.java @@ -501,7 +501,8 @@ public class FhirResourceDaoR4ValidateTest extends BaseJpaR4Test { cs.setContent(CodeSystem.CodeSystemContentMode.COMPLETE); cs.setUrl("http://loinc.org"); cs.addConcept().setCode("123-4").setDisplay("Code 123 4"); - myCodeSystemDao.create(cs); + cs.setId("loinc"); + myCodeSystemDao.update(cs); Group group = new Group(); group.setId("ABC"); @@ -567,8 +568,8 @@ public class FhirResourceDaoR4ValidateTest extends BaseJpaR4Test { CodeSystem cs = new CodeSystem(); cs.setContent(CodeSystem.CodeSystemContentMode.COMPLETE); cs.setUrl("http://loinc.org"); - cs.addConcept().setCode("123-4").setDisplay("Code 123 4"); - myCodeSystemDao.create(cs); + cs.addConcept().setCode("123-4").setDisplay("Code 123 4").setId("loinc"); + myCodeSystemDao.update(cs); Group group = new Group(); group.setId("ABC"); @@ -628,14 +629,15 @@ public class FhirResourceDaoR4ValidateTest extends BaseJpaR4Test { ValueSet vs = new ValueSet(); vs.setUrl("http://example.com/fhir/ValueSet/observation-vitalsignresult"); - vs.getCompose().addInclude().setSystem("http://loinc.org"); + vs.getCompose().addInclude().setSystem("http://loinc.org").setId("loinc"); myValueSetDao.create(vs); CodeSystem cs = new CodeSystem(); cs.setContent(CodeSystem.CodeSystemContentMode.COMPLETE); cs.setUrl("http://loinc.org"); cs.addConcept().setCode("123-4").setDisplay("Code 123 4"); - myCodeSystemDao.create(cs); + cs.setId("loinc"); + myCodeSystemDao.update(cs); Group group = new Group(); group.setId("ABC"); @@ -936,6 +938,7 @@ public class FhirResourceDaoR4ValidateTest extends BaseJpaR4Test { // Valid code obs.getText().setStatus(Narrative.NarrativeStatus.GENERATED); obs.getCode().getCodingFirstRep().setSystem("http://loinc.org").setCode("CODE3").setDisplay("Display 3"); + obs.getCode().getCodingFirstRep().setId("loinc"); oo = validateAndReturnOutcome(obs); assertEquals("No issues detected during validation", oo.getIssueFirstRep().getDiagnostics(), encode(oo)); From 1492b9220a0170a4a491c83a2b22432e44cbc16e Mon Sep 17 00:00:00 2001 From: "juan.marchionatto" <juan.marchionatto@smilecdr.com> Date: Mon, 20 Sep 2021 11:15:53 -0400 Subject: [PATCH 14/20] Add test comment --- .../fhir/jpa/term/TerminologySvcImplCurrentVersionR4Test.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/term/TerminologySvcImplCurrentVersionR4Test.java b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/term/TerminologySvcImplCurrentVersionR4Test.java index 2760086772c..9e4057fd1a0 100644 --- a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/term/TerminologySvcImplCurrentVersionR4Test.java +++ b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/term/TerminologySvcImplCurrentVersionR4Test.java @@ -158,6 +158,8 @@ public class TerminologySvcImplCurrentVersionR4Test extends BaseJpaR4Test { validateValueLookup(currentVersion, theExpectedVersions); validateValidateCode(currentVersion, theExpectedVersions); + + // nothing to test for subsumes operation as it works only for concepts which share CodeSystem and version } From 8a1d95f348b2f03d2da802dcce3b11a517eb2bcb Mon Sep 17 00:00:00 2001 From: "juan.marchionatto" <juan.marchionatto@smilecdr.com> Date: Mon, 20 Sep 2021 17:14:42 -0400 Subject: [PATCH 15/20] Add service to get CodeSystem from its forcedId without forcing rollback by ResourceNotFoundException in case not found --- ...JpaPersistedResourceValidationSupport.java | 14 +----------- .../fhir/jpa/term/BaseTermReadSvcImpl.java | 22 +++++++++++++++++++ .../uhn/fhir/jpa/term/api/ITermReadSvc.java | 2 ++ 3 files changed, 25 insertions(+), 13 deletions(-) diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/JpaPersistedResourceValidationSupport.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/JpaPersistedResourceValidationSupport.java index 06ede2ad0da..f6234960c7f 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/JpaPersistedResourceValidationSupport.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/JpaPersistedResourceValidationSupport.java @@ -125,19 +125,7 @@ public class JpaPersistedResourceValidationSupport implements IValidationSupport private Optional<IBaseResource> getCodeSystemCurrentVersion(UriType theUrl) { if (! theUrl.getValueAsString().contains("loinc")) return Optional.empty(); - IFhirResourceDao<? extends IBaseResource> valueSetResourceDao = myDaoRegistry.getResourceDao(myCodeSystemType); - String forcedId = "loinc"; - - // try/catch ignores exception because we need code to fall back to other options - IBaseResource codeSystem; - try { - codeSystem = valueSetResourceDao.read(new IdDt("CodeSystem", forcedId)); - - } catch (Exception theE) { - return Optional.empty(); - } - - return Optional.ofNullable(codeSystem); + return myTermReadSvc.readByForcedId("loinc"); } diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/BaseTermReadSvcImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/BaseTermReadSvcImpl.java index 10cbc569fdc..cd15e180327 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/BaseTermReadSvcImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/BaseTermReadSvcImpl.java @@ -28,6 +28,7 @@ import ca.uhn.fhir.context.support.ValueSetExpansionOptions; import ca.uhn.fhir.jpa.api.config.DaoConfig; import ca.uhn.fhir.jpa.api.dao.DaoRegistry; import ca.uhn.fhir.jpa.api.dao.IDao; +import ca.uhn.fhir.jpa.api.dao.IFhirResourceDao; import ca.uhn.fhir.jpa.api.dao.IFhirResourceDaoCodeSystem; import ca.uhn.fhir.jpa.config.HibernatePropertiesProvider; import ca.uhn.fhir.jpa.dao.IFulltextSearchSvc; @@ -54,6 +55,7 @@ import ca.uhn.fhir.jpa.entity.TermConceptPropertyTypeEnum; import ca.uhn.fhir.jpa.entity.TermValueSet; import ca.uhn.fhir.jpa.entity.TermValueSetConcept; import ca.uhn.fhir.jpa.entity.TermValueSetPreExpansionStatusEnum; +import ca.uhn.fhir.jpa.model.entity.ForcedId; import ca.uhn.fhir.jpa.model.entity.ResourceTable; import ca.uhn.fhir.jpa.model.sched.HapiJob; import ca.uhn.fhir.jpa.model.sched.ISchedulerService; @@ -139,6 +141,7 @@ import javax.annotation.Nonnull; import javax.annotation.Nullable; import javax.annotation.PostConstruct; import javax.persistence.EntityManager; +import javax.persistence.NonUniqueResultException; import javax.persistence.PersistenceContext; import javax.persistence.PersistenceContextType; import javax.persistence.TypedQuery; @@ -2552,4 +2555,23 @@ public abstract class BaseTermReadSvcImpl implements ITermReadSvc { return theReqLang.equalsIgnoreCase(theStoredLang); } + + + @Override + public Optional<IBaseResource> readByForcedId(String theForcedId) { + @SuppressWarnings("unchecked") + List<ResourceTable> resultList = (List<ResourceTable>) myEntityManager.createQuery( + "select f.myResource from ForcedId f " + + "where f.myResourceType = 'CodeSystem' and f.myForcedId = '" + theForcedId + "'").getResultList(); + if (resultList.isEmpty()) return Optional.empty(); + + if (resultList.size() > 1) throw new NonUniqueResultException( + "More than one CodeSystem is pointed by forcedId: " + theForcedId + ". Was constraint " + + ForcedId.IDX_FORCEDID_TYPE_FID + " removed?"); + + IFhirResourceDao<CodeSystem> csDao = myDaoRegistry.getResourceDao("CodeSystem"); + IBaseResource cs = csDao.toResource(resultList.get(0), false); + return Optional.of(cs ); + } + } diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/api/ITermReadSvc.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/api/ITermReadSvc.java index 43c4ab902cc..fe6adeffee9 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/api/ITermReadSvc.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/api/ITermReadSvc.java @@ -136,4 +136,6 @@ public interface ITermReadSvc extends IValidationSupport { */ boolean isLoincNotGenericUnversionedValueSet(String theUrl); + Optional<IBaseResource> readByForcedId(String theForcedId); + } From 9c790a73741d019158aa025711209c37d32628dd Mon Sep 17 00:00:00 2001 From: "juan.marchionatto" <juan.marchionatto@smilecdr.com> Date: Mon, 20 Sep 2021 17:18:11 -0400 Subject: [PATCH 16/20] Revert creation of test utility class finally not needed --- .../uhn/fhir/jpa/dao/dstu3/BaseJpaDstu3Test.java | 3 --- ...irResourceDaoDstu3ValueSetMultiVersionTest.java | 14 +++++++------- .../java/ca/uhn/fhir/jpa/dao/r4/BaseJpaR4Test.java | 5 +---- .../FhirResourceDaoR4ValueSetMultiVersionTest.java | 14 +++++++------- .../java/ca/uhn/fhir/jpa/dao/r5/BaseJpaR5Test.java | 3 --- .../FhirResourceDaoR5ValueSetMultiVersionTest.java | 14 +++++++------- 6 files changed, 22 insertions(+), 31 deletions(-) diff --git a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/dstu3/BaseJpaDstu3Test.java b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/dstu3/BaseJpaDstu3Test.java index b5d3282435e..9c60bafa905 100644 --- a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/dstu3/BaseJpaDstu3Test.java +++ b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/dstu3/BaseJpaDstu3Test.java @@ -30,7 +30,6 @@ import ca.uhn.fhir.jpa.dao.data.ITermConceptDao; import ca.uhn.fhir.jpa.dao.data.ITermConceptMapDao; import ca.uhn.fhir.jpa.dao.data.ITermConceptMapGroupElementTargetDao; import ca.uhn.fhir.jpa.dao.data.ITermValueSetDao; -import ca.uhn.fhir.jpa.dao.data.ITermValueSetDaoTestUtil; import ca.uhn.fhir.jpa.dao.dstu2.FhirResourceDaoDstu2SearchNoFtTest; import ca.uhn.fhir.jpa.dao.r4.BaseJpaR4Test; import ca.uhn.fhir.jpa.model.entity.ModelConfig; @@ -355,8 +354,6 @@ public abstract class BaseJpaDstu3Test extends BaseJpaTest { private IBulkDataExportSvc myBulkDataExportSvc; @Autowired protected ITermValueSetDao myTermValueSetDao; - @Autowired - protected ITermValueSetDaoTestUtil myTermValueSetDaoTestUtil; @AfterEach() public void afterCleanupDao() { diff --git a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/dstu3/FhirResourceDaoDstu3ValueSetMultiVersionTest.java b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/dstu3/FhirResourceDaoDstu3ValueSetMultiVersionTest.java index b57671507ce..25bb507169c 100644 --- a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/dstu3/FhirResourceDaoDstu3ValueSetMultiVersionTest.java +++ b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/dstu3/FhirResourceDaoDstu3ValueSetMultiVersionTest.java @@ -82,7 +82,7 @@ public class FhirResourceDaoDstu3ValueSetMultiVersionTest extends BaseJpaDstu3Te public void testCreateVersionedValueSets() { Map<ValueSetVersions, DaoMethodOutcome> myValueSets = createVersionedValueSets(); - assertEquals(3, myTermValueSetDaoTestUtil.findTermValueSetByUrl(PageRequest.of(0, 10), URL_MY_VALUE_SET).size()); + assertEquals(3, myTermValueSetDao.findTermValueSetByUrl(PageRequest.of(0, 10), URL_MY_VALUE_SET).size()); Optional<TermValueSet> optionalTermValueSet = myTermValueSetDao.findTermValueSetByUrlAndNullVersion(URL_MY_VALUE_SET); assertTrue(optionalTermValueSet.isPresent()); @@ -114,7 +114,7 @@ public class FhirResourceDaoDstu3ValueSetMultiVersionTest extends BaseJpaDstu3Te public void testUpdateVersionedValueSets() { Map<ValueSetVersions, DaoMethodOutcome> myValueSets = createVersionedValueSets(); - assertEquals(3, myTermValueSetDaoTestUtil.findTermValueSetByUrl(PageRequest.of(0, 10), URL_MY_VALUE_SET).size()); + assertEquals(3, myTermValueSetDao.findTermValueSetByUrl(PageRequest.of(0, 10), URL_MY_VALUE_SET).size()); TermValueSet termValueSet = myTermValueSetDao.findTermValueSetByUrlAndNullVersion(URL_MY_VALUE_SET).orElseThrow(() -> new IllegalArgumentException("No TerValueSet found for " + URL_MY_VALUE_SET + " with null version")); assertEquals("ValueSet_noVersion", termValueSet.getName()); @@ -142,7 +142,7 @@ public class FhirResourceDaoDstu3ValueSetMultiVersionTest extends BaseJpaDstu3Te Long v2Version_resid = ((ResourceTable)v2Version_update_outcome.getEntity()).getId(); // Verify that ValueSets were updated. - assertEquals(3, myTermValueSetDaoTestUtil.findTermValueSetByUrl(PageRequest.of(0, 10), URL_MY_VALUE_SET).size()); + assertEquals(3, myTermValueSetDao.findTermValueSetByUrl(PageRequest.of(0, 10), URL_MY_VALUE_SET).size()); termValueSet = myTermValueSetDao.findTermValueSetByUrlAndNullVersion(URL_MY_VALUE_SET).orElseThrow(() -> new IllegalArgumentException("No TerValueSet found for " + URL_MY_VALUE_SET + " with null version")); assertNotNull(nullVersion_resid); @@ -168,7 +168,7 @@ public class FhirResourceDaoDstu3ValueSetMultiVersionTest extends BaseJpaDstu3Te public void testDeleteVersionedValueSets() { Map<ValueSetVersions, DaoMethodOutcome> myValueSets = createVersionedValueSets(); - assertEquals(3, myTermValueSetDaoTestUtil.findTermValueSetByUrl(PageRequest.of(0, 10), URL_MY_VALUE_SET).size()); + assertEquals(3, myTermValueSetDao.findTermValueSetByUrl(PageRequest.of(0, 10), URL_MY_VALUE_SET).size()); TermValueSet termValueSet = myTermValueSetDao.findTermValueSetByUrlAndNullVersion(URL_MY_VALUE_SET).orElseThrow(() -> new IllegalArgumentException("No TerValueSet found for " + URL_MY_VALUE_SET + " with null version")); assertEquals("ValueSet_noVersion", termValueSet.getName()); @@ -181,7 +181,7 @@ public class FhirResourceDaoDstu3ValueSetMultiVersionTest extends BaseJpaDstu3Te // Delete ValueSets myValueSetDao.delete(myValueSets.get(ValueSetVersions.NULL).getResource().getIdElement()); - assertEquals(2, myTermValueSetDaoTestUtil.findTermValueSetByUrl(PageRequest.of(0, 10), URL_MY_VALUE_SET).size()); + assertEquals(2, myTermValueSetDao.findTermValueSetByUrl(PageRequest.of(0, 10), URL_MY_VALUE_SET).size()); Optional<TermValueSet> optionalTermValueSet = myTermValueSetDao.findTermValueSetByUrlAndNullVersion(URL_MY_VALUE_SET); if (optionalTermValueSet.isPresent()) { fail(); @@ -190,7 +190,7 @@ public class FhirResourceDaoDstu3ValueSetMultiVersionTest extends BaseJpaDstu3Te assertNotNull(myTermValueSetDao.findTermValueSetByUrlAndVersion(URL_MY_VALUE_SET, "v2").orElseThrow(() -> new IllegalArgumentException("No TerValueSet found for " + URL_MY_VALUE_SET + " version v2"))); myValueSetDao.delete(myValueSets.get(ValueSetVersions.V1).getResource().getIdElement()); - assertEquals(1, myTermValueSetDaoTestUtil.findTermValueSetByUrl(PageRequest.of(0, 10), URL_MY_VALUE_SET).size()); + assertEquals(1, myTermValueSetDao.findTermValueSetByUrl(PageRequest.of(0, 10), URL_MY_VALUE_SET).size()); optionalTermValueSet = myTermValueSetDao.findTermValueSetByUrlAndNullVersion(URL_MY_VALUE_SET); if (optionalTermValueSet.isPresent()) { fail(); @@ -202,7 +202,7 @@ public class FhirResourceDaoDstu3ValueSetMultiVersionTest extends BaseJpaDstu3Te myTermValueSetDao.findTermValueSetByUrlAndVersion(URL_MY_VALUE_SET, "v2").orElseThrow(() -> new IllegalArgumentException("No TerValueSet found for " + URL_MY_VALUE_SET + " version v2")); myValueSetDao.delete(myValueSets.get(ValueSetVersions.V2).getResource().getIdElement()); - assertEquals(0, myTermValueSetDaoTestUtil.findTermValueSetByUrl(PageRequest.of(0, 10), URL_MY_VALUE_SET).size()); + assertEquals(0, myTermValueSetDao.findTermValueSetByUrl(PageRequest.of(0, 10), URL_MY_VALUE_SET).size()); optionalTermValueSet = myTermValueSetDao.findTermValueSetByUrlAndNullVersion(URL_MY_VALUE_SET); if (optionalTermValueSet.isPresent()) { fail(); diff --git a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/r4/BaseJpaR4Test.java b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/r4/BaseJpaR4Test.java index 295b8950700..95a9732fed5 100644 --- a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/r4/BaseJpaR4Test.java +++ b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/r4/BaseJpaR4Test.java @@ -51,7 +51,6 @@ import ca.uhn.fhir.jpa.dao.data.ITermConceptPropertyDao; import ca.uhn.fhir.jpa.dao.data.ITermValueSetConceptDao; import ca.uhn.fhir.jpa.dao.data.ITermValueSetConceptDesignationDao; import ca.uhn.fhir.jpa.dao.data.ITermValueSetDao; -import ca.uhn.fhir.jpa.dao.data.ITermValueSetDaoTestUtil; import ca.uhn.fhir.jpa.dao.index.IdHelperService; import ca.uhn.fhir.jpa.entity.TermCodeSystem; import ca.uhn.fhir.jpa.entity.TermCodeSystemVersion; @@ -472,8 +471,6 @@ public abstract class BaseJpaR4Test extends BaseJpaTest implements ITestDataBuil @Autowired protected ITermValueSetDao myTermValueSetDao; @Autowired - protected ITermValueSetDaoTestUtil myTermValueSetDaoTestUtil; - @Autowired protected ITermValueSetConceptDao myTermValueSetConceptDao; @Autowired protected ITermValueSetConceptDesignationDao myTermValueSetConceptDesignationDao; @@ -836,7 +833,7 @@ public abstract class BaseJpaR4Test extends BaseJpaTest implements ITestDataBuil public List<String> getExpandedConceptsByValueSetUrl(String theValuesetUrl) { return runInTransaction(() -> { - List<TermValueSet> valueSets = myTermValueSetDaoTestUtil.findTermValueSetByUrl(Pageable.unpaged(), theValuesetUrl); + List<TermValueSet> valueSets = myTermValueSetDao.findTermValueSetByUrl(Pageable.unpaged(), theValuesetUrl); assertEquals(1, valueSets.size()); TermValueSet valueSet = valueSets.get(0); List<TermValueSetConcept> concepts = valueSet.getConcepts(); diff --git a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/r4/FhirResourceDaoR4ValueSetMultiVersionTest.java b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/r4/FhirResourceDaoR4ValueSetMultiVersionTest.java index 612ba35d8be..82face9d5ad 100644 --- a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/r4/FhirResourceDaoR4ValueSetMultiVersionTest.java +++ b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/r4/FhirResourceDaoR4ValueSetMultiVersionTest.java @@ -83,7 +83,7 @@ public class FhirResourceDaoR4ValueSetMultiVersionTest extends BaseJpaR4Test { public void testCreateVersionedValueSets() { Map<ValueSetVersions, DaoMethodOutcome> myValueSets = createVersionedValueSets(); - assertEquals(3, myTermValueSetDaoTestUtil.findTermValueSetByUrl(PageRequest.of(0, 10), URL_MY_VALUE_SET).size()); + assertEquals(3, myTermValueSetDao.findTermValueSetByUrl(PageRequest.of(0, 10), URL_MY_VALUE_SET).size()); Optional<TermValueSet> optionalTermValueSet = myTermValueSetDao.findTermValueSetByUrlAndNullVersion(URL_MY_VALUE_SET); assertTrue(optionalTermValueSet.isPresent()); @@ -115,7 +115,7 @@ public class FhirResourceDaoR4ValueSetMultiVersionTest extends BaseJpaR4Test { public void testUpdateVersionedValueSets() { Map<ValueSetVersions, DaoMethodOutcome> myValueSets = createVersionedValueSets(); - assertEquals(3, myTermValueSetDaoTestUtil.findTermValueSetByUrl(PageRequest.of(0, 10), URL_MY_VALUE_SET).size()); + assertEquals(3, myTermValueSetDao.findTermValueSetByUrl(PageRequest.of(0, 10), URL_MY_VALUE_SET).size()); TermValueSet termValueSet = myTermValueSetDao.findTermValueSetByUrlAndNullVersion(URL_MY_VALUE_SET).orElseThrow(() -> new IllegalArgumentException("No TerValueSet found for " + URL_MY_VALUE_SET + " with null version")); assertEquals("ValueSet_noVersion", termValueSet.getName()); @@ -143,7 +143,7 @@ public class FhirResourceDaoR4ValueSetMultiVersionTest extends BaseJpaR4Test { Long v2Version_resid = ((ResourceTable)v2Version_update_outcome.getEntity()).getId(); // Verify that ValueSets were updated. - assertEquals(3, myTermValueSetDaoTestUtil.findTermValueSetByUrl(PageRequest.of(0, 10), URL_MY_VALUE_SET).size()); + assertEquals(3, myTermValueSetDao.findTermValueSetByUrl(PageRequest.of(0, 10), URL_MY_VALUE_SET).size()); termValueSet = myTermValueSetDao.findTermValueSetByUrlAndNullVersion(URL_MY_VALUE_SET).orElseThrow(() -> new IllegalArgumentException("No TerValueSet found for " + URL_MY_VALUE_SET + " with null version")); assertNotNull(nullVersion_resid); @@ -169,7 +169,7 @@ public class FhirResourceDaoR4ValueSetMultiVersionTest extends BaseJpaR4Test { public void testDeleteVersionedValueSets() { Map<ValueSetVersions, DaoMethodOutcome> myValueSets = createVersionedValueSets(); - assertEquals(3, myTermValueSetDaoTestUtil.findTermValueSetByUrl(PageRequest.of(0, 10), URL_MY_VALUE_SET).size()); + assertEquals(3, myTermValueSetDao.findTermValueSetByUrl(PageRequest.of(0, 10), URL_MY_VALUE_SET).size()); TermValueSet termValueSet = myTermValueSetDao.findTermValueSetByUrlAndNullVersion(URL_MY_VALUE_SET).orElseThrow(() -> new IllegalArgumentException("No TerValueSet found for " + URL_MY_VALUE_SET + " with null version")); assertEquals("ValueSet_noVersion", termValueSet.getName()); @@ -182,7 +182,7 @@ public class FhirResourceDaoR4ValueSetMultiVersionTest extends BaseJpaR4Test { // Delete ValueSets myValueSetDao.delete(myValueSets.get(ValueSetVersions.NULL).getResource().getIdElement()); - assertEquals(2, myTermValueSetDaoTestUtil.findTermValueSetByUrl(PageRequest.of(0, 10), URL_MY_VALUE_SET).size()); + assertEquals(2, myTermValueSetDao.findTermValueSetByUrl(PageRequest.of(0, 10), URL_MY_VALUE_SET).size()); Optional<TermValueSet> optionalTermValueSet = myTermValueSetDao.findTermValueSetByUrlAndNullVersion(URL_MY_VALUE_SET); if (optionalTermValueSet.isPresent()) { fail(); @@ -191,7 +191,7 @@ public class FhirResourceDaoR4ValueSetMultiVersionTest extends BaseJpaR4Test { assertNotNull(myTermValueSetDao.findTermValueSetByUrlAndVersion(URL_MY_VALUE_SET, "v2").orElseThrow(() -> new IllegalArgumentException("No TerValueSet found for " + URL_MY_VALUE_SET + " version v2"))); myValueSetDao.delete(myValueSets.get(ValueSetVersions.V1).getResource().getIdElement()); - assertEquals(1, myTermValueSetDaoTestUtil.findTermValueSetByUrl(PageRequest.of(0, 10), URL_MY_VALUE_SET).size()); + assertEquals(1, myTermValueSetDao.findTermValueSetByUrl(PageRequest.of(0, 10), URL_MY_VALUE_SET).size()); optionalTermValueSet = myTermValueSetDao.findTermValueSetByUrlAndNullVersion(URL_MY_VALUE_SET); if (optionalTermValueSet.isPresent()) { fail(); @@ -203,7 +203,7 @@ public class FhirResourceDaoR4ValueSetMultiVersionTest extends BaseJpaR4Test { assertNotNull(myTermValueSetDao.findTermValueSetByUrlAndVersion(URL_MY_VALUE_SET, "v2").orElseThrow(() -> new IllegalArgumentException("No TerValueSet found for " + URL_MY_VALUE_SET + " version v2"))); myValueSetDao.delete(myValueSets.get(ValueSetVersions.V2).getResource().getIdElement()); - assertEquals(0, myTermValueSetDaoTestUtil.findTermValueSetByUrl(PageRequest.of(0, 10), URL_MY_VALUE_SET).size()); + assertEquals(0, myTermValueSetDao.findTermValueSetByUrl(PageRequest.of(0, 10), URL_MY_VALUE_SET).size()); optionalTermValueSet = myTermValueSetDao.findTermValueSetByUrlAndNullVersion(URL_MY_VALUE_SET); if (optionalTermValueSet.isPresent()) { fail(); diff --git a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/r5/BaseJpaR5Test.java b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/r5/BaseJpaR5Test.java index cafcb1ef39d..0ab9e18c19c 100644 --- a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/r5/BaseJpaR5Test.java +++ b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/r5/BaseJpaR5Test.java @@ -44,7 +44,6 @@ import ca.uhn.fhir.jpa.dao.data.ITermConceptParentChildLinkDao; import ca.uhn.fhir.jpa.dao.data.ITermValueSetConceptDao; import ca.uhn.fhir.jpa.dao.data.ITermValueSetConceptDesignationDao; import ca.uhn.fhir.jpa.dao.data.ITermValueSetDao; -import ca.uhn.fhir.jpa.dao.data.ITermValueSetDaoTestUtil; import ca.uhn.fhir.jpa.dao.dstu2.FhirResourceDaoDstu2SearchNoFtTest; import ca.uhn.fhir.jpa.entity.TermValueSet; import ca.uhn.fhir.jpa.entity.TermValueSetConcept; @@ -392,8 +391,6 @@ public abstract class BaseJpaR5Test extends BaseJpaTest implements ITestDataBuil @Autowired protected ITermValueSetDao myTermValueSetDao; @Autowired - protected ITermValueSetDaoTestUtil myTermValueSetDaoTestUtil; - @Autowired protected ITermValueSetConceptDao myTermValueSetConceptDao; @Autowired protected ITermValueSetConceptDesignationDao myTermValueSetConceptDesignationDao; diff --git a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/r5/FhirResourceDaoR5ValueSetMultiVersionTest.java b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/r5/FhirResourceDaoR5ValueSetMultiVersionTest.java index a3372dcf5b1..d19800e7c7a 100644 --- a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/r5/FhirResourceDaoR5ValueSetMultiVersionTest.java +++ b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/r5/FhirResourceDaoR5ValueSetMultiVersionTest.java @@ -82,7 +82,7 @@ public class FhirResourceDaoR5ValueSetMultiVersionTest extends BaseJpaR5Test { public void testCreateVersionedValueSets() { Map<ValueSetVersions, DaoMethodOutcome> myValueSets = createVersionedValueSets(); - assertEquals(3, myTermValueSetDaoTestUtil.findTermValueSetByUrl(PageRequest.of(0, 10), URL_MY_VALUE_SET).size()); + assertEquals(3, myTermValueSetDao.findTermValueSetByUrl(PageRequest.of(0, 10), URL_MY_VALUE_SET).size()); Optional<TermValueSet> optionalTermValueSet = myTermValueSetDao.findTermValueSetByUrlAndNullVersion(URL_MY_VALUE_SET); assertTrue(optionalTermValueSet.isPresent()); @@ -114,7 +114,7 @@ public class FhirResourceDaoR5ValueSetMultiVersionTest extends BaseJpaR5Test { public void testUpdateVersionedValueSets() { Map<ValueSetVersions, DaoMethodOutcome> myValueSets = createVersionedValueSets(); - assertEquals(3, myTermValueSetDaoTestUtil.findTermValueSetByUrl(PageRequest.of(0, 10), URL_MY_VALUE_SET).size()); + assertEquals(3, myTermValueSetDao.findTermValueSetByUrl(PageRequest.of(0, 10), URL_MY_VALUE_SET).size()); TermValueSet termValueSet = myTermValueSetDao.findTermValueSetByUrlAndNullVersion(URL_MY_VALUE_SET).orElseThrow(() -> new IllegalArgumentException("No TerValueSet found for " + URL_MY_VALUE_SET + " with null version")); assertEquals("ValueSet_noVersion", termValueSet.getName()); @@ -142,7 +142,7 @@ public class FhirResourceDaoR5ValueSetMultiVersionTest extends BaseJpaR5Test { Long v2Version_resid = ((ResourceTable)v2Version_update_outcome.getEntity()).getId(); // Verify that ValueSets were updated. - assertEquals(3, myTermValueSetDaoTestUtil.findTermValueSetByUrl(PageRequest.of(0, 10), URL_MY_VALUE_SET).size()); + assertEquals(3, myTermValueSetDao.findTermValueSetByUrl(PageRequest.of(0, 10), URL_MY_VALUE_SET).size()); termValueSet = myTermValueSetDao.findTermValueSetByUrlAndNullVersion(URL_MY_VALUE_SET).orElseThrow(() -> new IllegalArgumentException("No TerValueSet found for " + URL_MY_VALUE_SET + " with null version")); assertNotNull(nullVersion_resid); @@ -168,7 +168,7 @@ public class FhirResourceDaoR5ValueSetMultiVersionTest extends BaseJpaR5Test { public void testDeleteVersionedValueSets() { Map<ValueSetVersions, DaoMethodOutcome> myValueSets = createVersionedValueSets(); - assertEquals(3, myTermValueSetDaoTestUtil.findTermValueSetByUrl(PageRequest.of(0, 10), URL_MY_VALUE_SET).size()); + assertEquals(3, myTermValueSetDao.findTermValueSetByUrl(PageRequest.of(0, 10), URL_MY_VALUE_SET).size()); TermValueSet termValueSet = myTermValueSetDao.findTermValueSetByUrlAndNullVersion(URL_MY_VALUE_SET).orElseThrow(() -> new IllegalArgumentException("No TerValueSet found for " + URL_MY_VALUE_SET + " with null version")); assertEquals("ValueSet_noVersion", termValueSet.getName()); @@ -181,7 +181,7 @@ public class FhirResourceDaoR5ValueSetMultiVersionTest extends BaseJpaR5Test { // Delete ValueSets myValueSetDao.delete(myValueSets.get(ValueSetVersions.NULL).getResource().getIdElement()); - assertEquals(2, myTermValueSetDaoTestUtil.findTermValueSetByUrl(PageRequest.of(0, 10), URL_MY_VALUE_SET).size()); + assertEquals(2, myTermValueSetDao.findTermValueSetByUrl(PageRequest.of(0, 10), URL_MY_VALUE_SET).size()); Optional<TermValueSet> optionalTermValueSet = myTermValueSetDao.findTermValueSetByUrlAndNullVersion(URL_MY_VALUE_SET); if (optionalTermValueSet.isPresent()) { fail(); @@ -190,7 +190,7 @@ public class FhirResourceDaoR5ValueSetMultiVersionTest extends BaseJpaR5Test { assertNotNull(myTermValueSetDao.findTermValueSetByUrlAndVersion(URL_MY_VALUE_SET, "v2").orElseThrow(() -> new IllegalArgumentException("No TerValueSet found for " + URL_MY_VALUE_SET + " version v2"))); myValueSetDao.delete(myValueSets.get(ValueSetVersions.V1).getResource().getIdElement()); - assertEquals(1, myTermValueSetDaoTestUtil.findTermValueSetByUrl(PageRequest.of(0, 10), URL_MY_VALUE_SET).size()); + assertEquals(1, myTermValueSetDao.findTermValueSetByUrl(PageRequest.of(0, 10), URL_MY_VALUE_SET).size()); optionalTermValueSet = myTermValueSetDao.findTermValueSetByUrlAndNullVersion(URL_MY_VALUE_SET); if (optionalTermValueSet.isPresent()) { fail(); @@ -202,7 +202,7 @@ public class FhirResourceDaoR5ValueSetMultiVersionTest extends BaseJpaR5Test { assertNotNull(myTermValueSetDao.findTermValueSetByUrlAndVersion(URL_MY_VALUE_SET, "v2").orElseThrow(() -> new IllegalArgumentException("No TerValueSet found for " + URL_MY_VALUE_SET + " version v2"))); myValueSetDao.delete(myValueSets.get(ValueSetVersions.V2).getResource().getIdElement()); - assertEquals(0, myTermValueSetDaoTestUtil.findTermValueSetByUrl(PageRequest.of(0, 10), URL_MY_VALUE_SET).size()); + assertEquals(0, myTermValueSetDao.findTermValueSetByUrl(PageRequest.of(0, 10), URL_MY_VALUE_SET).size()); optionalTermValueSet = myTermValueSetDao.findTermValueSetByUrlAndNullVersion(URL_MY_VALUE_SET); if (optionalTermValueSet.isPresent()) { fail(); From 3d5c863276375a1ccdf83bc52242c4ee29982d29 Mon Sep 17 00:00:00 2001 From: "juan.marchionatto" <juan.marchionatto@smilecdr.com> Date: Mon, 20 Sep 2021 17:18:45 -0400 Subject: [PATCH 17/20] Revert creation of test utility class finally not needed --- .../dao/data/ITermValueSetDaoTestUtil.java | 41 ------------------- .../jpa/term/ValueSetExpansionR4Test.java | 2 +- 2 files changed, 1 insertion(+), 42 deletions(-) delete mode 100644 hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/data/ITermValueSetDaoTestUtil.java diff --git a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/data/ITermValueSetDaoTestUtil.java b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/data/ITermValueSetDaoTestUtil.java deleted file mode 100644 index 91c361217f3..00000000000 --- a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/data/ITermValueSetDaoTestUtil.java +++ /dev/null @@ -1,41 +0,0 @@ -package ca.uhn.fhir.jpa.dao.data; - -/* - * #%L - * HAPI FHIR JPA Server - * %% - * Copyright (C) 2014 - 2021 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% - */ - -import ca.uhn.fhir.jpa.entity.TermValueSet; -import org.springframework.data.domain.Pageable; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; - -import java.util.List; - -/** - * Class includes a method which we wanted removed from DAO in production code, - * but was heavily used in tests, where it is OK as they test limited use cases. - */ -public interface ITermValueSetDaoTestUtil extends JpaRepository<TermValueSet, Long> { - - // todo: JM can this be just replaced by new class method? - @Query(value="SELECT vs FROM TermValueSet vs INNER JOIN ResourceTable r ON r.myId = vs.myResourcePid WHERE vs.myUrl = :url ORDER BY r.myUpdated DESC") - List<TermValueSet> findTermValueSetByUrl(Pageable thePage, @Param("url") String theUrl); - -} diff --git a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/term/ValueSetExpansionR4Test.java b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/term/ValueSetExpansionR4Test.java index cc2c8790d3c..a9062d7dcd5 100644 --- a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/term/ValueSetExpansionR4Test.java +++ b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/term/ValueSetExpansionR4Test.java @@ -408,7 +408,7 @@ public class ValueSetExpansionR4Test extends BaseTermR4Test { // Confirm we pre-expanded successfully runInTransaction(() -> { Pageable page = Pageable.unpaged(); - List<TermValueSet> valueSets = myTermValueSetDaoTestUtil.findTermValueSetByUrl(page, "http://foo/vs"); + List<TermValueSet> valueSets = myTermValueSetDao.findTermValueSetByUrl(page, "http://foo/vs"); assertEquals(1, valueSets.size()); assertEquals(TermValueSetPreExpansionStatusEnum.EXPANDED, valueSets.get(0).getExpansionStatus()); }); From 371484a4eaf294e3c98787bf339a2561e4510ab5 Mon Sep 17 00:00:00 2001 From: "juan.marchionatto" <juan.marchionatto@smilecdr.com> Date: Mon, 20 Sep 2021 17:19:31 -0400 Subject: [PATCH 18/20] Fix test to add now required id to loinc CodeSystem creation --- .../fhir/jpa/dao/r4/FhirResourceDaoR4ValidateTest.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/r4/FhirResourceDaoR4ValidateTest.java b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/r4/FhirResourceDaoR4ValidateTest.java index 459e8f6af85..351b384c5eb 100644 --- a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/r4/FhirResourceDaoR4ValidateTest.java +++ b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/r4/FhirResourceDaoR4ValidateTest.java @@ -568,7 +568,8 @@ public class FhirResourceDaoR4ValidateTest extends BaseJpaR4Test { CodeSystem cs = new CodeSystem(); cs.setContent(CodeSystem.CodeSystemContentMode.COMPLETE); cs.setUrl("http://loinc.org"); - cs.addConcept().setCode("123-4").setDisplay("Code 123 4").setId("loinc"); + cs.addConcept().setCode("123-4").setDisplay("Code 123 4"); + cs.setId("loinc"); myCodeSystemDao.update(cs); Group group = new Group(); @@ -629,7 +630,7 @@ public class FhirResourceDaoR4ValidateTest extends BaseJpaR4Test { ValueSet vs = new ValueSet(); vs.setUrl("http://example.com/fhir/ValueSet/observation-vitalsignresult"); - vs.getCompose().addInclude().setSystem("http://loinc.org").setId("loinc"); + vs.getCompose().addInclude().setSystem("http://loinc.org"); myValueSetDao.create(vs); CodeSystem cs = new CodeSystem(); @@ -938,7 +939,6 @@ public class FhirResourceDaoR4ValidateTest extends BaseJpaR4Test { // Valid code obs.getText().setStatus(Narrative.NarrativeStatus.GENERATED); obs.getCode().getCodingFirstRep().setSystem("http://loinc.org").setCode("CODE3").setDisplay("Display 3"); - obs.getCode().getCodingFirstRep().setId("loinc"); oo = validateAndReturnOutcome(obs); assertEquals("No issues detected during validation", oo.getIssueFirstRep().getDiagnostics(), encode(oo)); @@ -1713,7 +1713,8 @@ public class FhirResourceDaoR4ValidateTest extends BaseJpaR4Test { cs.setUrl(ITermLoaderSvc.LOINC_URI); cs.setContent(CodeSystem.CodeSystemContentMode.COMPLETE); cs.addConcept().setCode("10013-1"); - myCodeSystemDao.create(cs); + cs.setId("loinc"); + myCodeSystemDao.update(cs); IValidationSupport.CodeValidationResult result = myValueSetDao.validateCode(new UriType("http://fooVs"), null, new StringType("10013-1"), new StringType(ITermLoaderSvc.LOINC_URI), null, null, null, mySrd); From 81a4f0c78f34c9bfd71fdbdea366510ddcd9c93a Mon Sep 17 00:00:00 2001 From: "juan.marchionatto" <juan.marchionatto@smilecdr.com> Date: Wed, 22 Sep 2021 09:40:25 -0400 Subject: [PATCH 19/20] Rename method for clarity. Increase test coverage. --- ...JpaPersistedResourceValidationSupport.java | 2 +- .../fhir/jpa/term/BaseTermReadSvcImpl.java | 2 +- .../uhn/fhir/jpa/term/api/ITermReadSvc.java | 2 +- ...ersistedResourceValidationSupportTest.java | 135 +++++++++++ .../jpa/term/TermVersionAdapterSvcR4Test.java | 77 +++++++ .../fhir/jpa/term/api/ITermReadSvcTest.java | 218 ++++++++++++++++++ 6 files changed, 433 insertions(+), 3 deletions(-) create mode 100644 hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/JpaPersistedResourceValidationSupportTest.java create mode 100644 hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/term/TermVersionAdapterSvcR4Test.java create mode 100644 hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/term/api/ITermReadSvcTest.java diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/JpaPersistedResourceValidationSupport.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/JpaPersistedResourceValidationSupport.java index f6234960c7f..d755a9cb9ba 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/JpaPersistedResourceValidationSupport.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/JpaPersistedResourceValidationSupport.java @@ -125,7 +125,7 @@ public class JpaPersistedResourceValidationSupport implements IValidationSupport private Optional<IBaseResource> getCodeSystemCurrentVersion(UriType theUrl) { if (! theUrl.getValueAsString().contains("loinc")) return Optional.empty(); - return myTermReadSvc.readByForcedId("loinc"); + return myTermReadSvc.readCodeSystemByForcedId("loinc"); } diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/BaseTermReadSvcImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/BaseTermReadSvcImpl.java index cd15e180327..e403fe0717c 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/BaseTermReadSvcImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/BaseTermReadSvcImpl.java @@ -2558,7 +2558,7 @@ public abstract class BaseTermReadSvcImpl implements ITermReadSvc { @Override - public Optional<IBaseResource> readByForcedId(String theForcedId) { + public Optional<IBaseResource> readCodeSystemByForcedId(String theForcedId) { @SuppressWarnings("unchecked") List<ResourceTable> resultList = (List<ResourceTable>) myEntityManager.createQuery( "select f.myResource from ForcedId f " + diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/api/ITermReadSvc.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/api/ITermReadSvc.java index fe6adeffee9..c619deb8f0e 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/api/ITermReadSvc.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/api/ITermReadSvc.java @@ -136,6 +136,6 @@ public interface ITermReadSvc extends IValidationSupport { */ boolean isLoincNotGenericUnversionedValueSet(String theUrl); - Optional<IBaseResource> readByForcedId(String theForcedId); + Optional<IBaseResource> readCodeSystemByForcedId(String theForcedId); } diff --git a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/JpaPersistedResourceValidationSupportTest.java b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/JpaPersistedResourceValidationSupportTest.java new file mode 100644 index 00000000000..20250d77327 --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/JpaPersistedResourceValidationSupportTest.java @@ -0,0 +1,135 @@ +package ca.uhn.fhir.jpa.dao; + +/*- + * #%L + * HAPI FHIR JPA Server + * %% + * Copyright (C) 2014 - 2021 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% + */ + +import ca.uhn.fhir.context.FhirContext; +import ca.uhn.fhir.context.support.IValidationSupport; +import ca.uhn.fhir.jpa.api.dao.DaoRegistry; +import ca.uhn.fhir.jpa.api.dao.IFhirResourceDao; +import ca.uhn.fhir.jpa.term.api.ITermReadSvc; +import ca.uhn.fhir.rest.server.exceptions.ResourceNotFoundException; +import com.github.benmanes.caffeine.cache.Cache; +import org.hl7.fhir.instance.model.api.IBaseResource; +import org.hl7.fhir.r4.model.CodeSystem; +import org.hl7.fhir.r4.model.ValueSet; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.test.util.ReflectionTestUtils; + +import java.util.function.Function; + +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.isA; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +@ExtendWith(MockitoExtension.class) +class JpaPersistedResourceValidationSupportTest { + + private FhirContext theFhirContext = FhirContext.forR4(); + + @Mock private ITermReadSvc myTermReadSvc; + @Mock private DaoRegistry myDaoRegistry; + @Mock private Cache<String, IBaseResource> myLoadCache; + @Mock private IFhirResourceDao<ValueSet> myValueSetResourceDao; + + + private IValidationSupport testedClass = + new JpaPersistedResourceValidationSupport(theFhirContext); + + private Class<? extends IBaseResource> myCodeSystemType = CodeSystem.class; + private Class<? extends IBaseResource> myValueSetType = ValueSet.class; + + + @BeforeEach + public void setup() { + ReflectionTestUtils.setField(testedClass, "myTermReadSvc", myTermReadSvc); + ReflectionTestUtils.setField(testedClass, "myDaoRegistry", myDaoRegistry); + ReflectionTestUtils.setField(testedClass, "myLoadCache", myLoadCache); + ReflectionTestUtils.setField(testedClass, "myCodeSystemType", myCodeSystemType); + ReflectionTestUtils.setField(testedClass, "myValueSetType", myValueSetType); + } + + + @Nested + public class FetchCodeSystemTests { + + @Test + void fetchCodeSystemMustUseForcedId() { + when(myTermReadSvc.isLoincNotGenericUnversionedCodeSystem(anyString())).thenReturn(true); + + testedClass.fetchCodeSystem("string-containing-loinc"); + + verify(myTermReadSvc, times(1)).readCodeSystemByForcedId("loinc"); + verify(myLoadCache, never()).get(anyString(), isA(Function.class)); + } + + + @Test + void fetchCodeSystemMustNotUseForcedId() { + when(myTermReadSvc.isLoincNotGenericUnversionedCodeSystem(anyString())).thenReturn(false); + + testedClass.fetchCodeSystem("string-not-containing-l-o-i-n-c"); + + verify(myTermReadSvc, never()).readCodeSystemByForcedId("loinc"); + verify(myLoadCache, times(1)).get(anyString(), isA(Function.class)); + } + + } + + + @Nested + public class FetchValueSetTests { + + @Test + void fetchValueSetMustUseForcedId() { + when(myTermReadSvc.isLoincNotGenericUnversionedValueSet(anyString())).thenReturn(true); + when(myDaoRegistry.getResourceDao(ValueSet.class)).thenReturn(myValueSetResourceDao); + + ResourceNotFoundException thrown = assertThrows( + ResourceNotFoundException.class, + () -> testedClass.fetchValueSet("string-containing-loinc")); + + assertTrue(thrown.getMessage().contains("Couldn't find current version ValueSet for url")); + } + + + @Test + void fetchValueSetMustNotUseForcedId() { + when(myTermReadSvc.isLoincNotGenericUnversionedValueSet(anyString())).thenReturn(false); + + testedClass.fetchValueSet("string-not-containing-l-o-i-n-c"); + + verify(myLoadCache, times(1)).get(anyString(), isA(Function.class)); + } + + } + + +} diff --git a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/term/TermVersionAdapterSvcR4Test.java b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/term/TermVersionAdapterSvcR4Test.java new file mode 100644 index 00000000000..f942f1df0a2 --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/term/TermVersionAdapterSvcR4Test.java @@ -0,0 +1,77 @@ +package ca.uhn.fhir.jpa.term; + +/*- + * #%L + * HAPI FHIR JPA Server + * %% + * Copyright (C) 2014 - 2021 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% + */ + +import ca.uhn.fhir.jpa.api.dao.IFhirResourceDao; +import ca.uhn.fhir.jpa.api.model.DaoMethodOutcome; +import ca.uhn.fhir.rest.server.servlet.ServletRequestDetails; +import org.hl7.fhir.r4.model.CodeSystem; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.test.util.ReflectionTestUtils; + +import java.security.InvalidParameterException; + +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + + +@ExtendWith(MockitoExtension.class) +class TermVersionAdapterSvcR4Test { + + private final TermVersionAdapterSvcR4 testedClass = new TermVersionAdapterSvcR4(); + + @Mock private IFhirResourceDao<CodeSystem> myCodeSystemResourceDao; + @Mock ServletRequestDetails theRequestDetails; + @Mock DaoMethodOutcome theDaoMethodOutcome; + + @Test + void createOrUpdateCodeSystemMustHaveId() { + org.hl7.fhir.r4.model.CodeSystem codeSystem = new CodeSystem(); + codeSystem.setUrl("a-loinc-system"); + + InvalidParameterException thrown = assertThrows( + InvalidParameterException.class, + () -> testedClass.createOrUpdateCodeSystem(codeSystem, new ServletRequestDetails())); + + assertTrue(thrown.getMessage().contains("LOINC CodeSystem must have an 'ID' element")); + } + + + @Test + void createOrUpdateCodeSystemWithIdNoException() { + ReflectionTestUtils.setField(testedClass, "myCodeSystemResourceDao", myCodeSystemResourceDao); + + org.hl7.fhir.r4.model.CodeSystem codeSystem = new CodeSystem(); + codeSystem.setUrl("a-loinc-system").setId("loinc"); + + when(myCodeSystemResourceDao.update(codeSystem, theRequestDetails)).thenReturn(theDaoMethodOutcome); + + testedClass.createOrUpdateCodeSystem(codeSystem, theRequestDetails); + + verify(myCodeSystemResourceDao, Mockito.times(1)).update(codeSystem, theRequestDetails); + } +} diff --git a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/term/api/ITermReadSvcTest.java b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/term/api/ITermReadSvcTest.java new file mode 100644 index 00000000000..d47e53736ec --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/term/api/ITermReadSvcTest.java @@ -0,0 +1,218 @@ +package ca.uhn.fhir.jpa.term.api; + +import ca.uhn.fhir.jpa.api.dao.DaoRegistry; +import ca.uhn.fhir.jpa.api.dao.IFhirResourceDao; +import ca.uhn.fhir.jpa.dao.data.ITermValueSetDao; +import ca.uhn.fhir.jpa.model.entity.ResourceTable; +import ca.uhn.fhir.jpa.term.TermReadSvcR4; +import ca.uhn.fhir.rest.server.exceptions.InternalErrorException; +import com.google.common.collect.Lists; +import org.hl7.fhir.instance.model.api.IBaseResource; +import org.hl7.fhir.r4.model.CodeSystem; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Answers; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.data.domain.Pageable; +import org.springframework.test.util.ReflectionTestUtils; + +import javax.persistence.EntityManager; +import javax.persistence.NonUniqueResultException; +import java.util.Collections; +import java.util.Optional; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.ArgumentMatchers.isA; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +@ExtendWith(MockitoExtension.class) +class ITermReadSvcTest { + + private final ITermReadSvc testedClass = new TermReadSvcR4(); + + @Mock private ITermValueSetDao myTermValueSetDao; + @Mock private DaoRegistry myDaoRegistry; + @Mock private IFhirResourceDao<CodeSystem> myFhirResourceDao; + + + @Nested + public class FindCurrentTermValueSet { + + @BeforeEach + public void setup() { + ReflectionTestUtils.setField(testedClass, "myTermValueSetDao", myTermValueSetDao); + } + + @Test + void forLoinc() { + String valueSetId = "a-loinc-value-set"; + testedClass.findCurrentTermValueSet("http://loinc.org/vs/" + valueSetId); + + verify(myTermValueSetDao, times(1)).findTermValueSetByForcedId(valueSetId); + verify(myTermValueSetDao, never()).findTermValueSetByUrl(isA(Pageable.class), anyString()); + } + + @Test + void forNotLoinc() { + String valueSetId = "not-a-loin-c-value-set"; + testedClass.findCurrentTermValueSet("http://not-loin-c.org/vs/" + valueSetId); + + verify(myTermValueSetDao, never()).findTermValueSetByForcedId(valueSetId); + verify(myTermValueSetDao, times(1)).findTermValueSetByUrl(isA(Pageable.class), anyString()); + } + } + + + @Nested + public class MustReturnEmptyValueSet { + + @Test + void doesntStartWithGenericVSReturnsTrue() { + boolean ret = testedClass.mustReturnEmptyValueSet("http://boing.org"); + assertTrue(ret); + } + + @Test + void doesntStartWithGenericVSPlusSlashThrows() { + InternalErrorException thrown = assertThrows( + InternalErrorException.class, + () -> testedClass.mustReturnEmptyValueSet("http://loinc.org/vs-no-slash-after-vs")); + + assertTrue(thrown.getMessage().contains("Don't know how to extract ForcedId from url:")); + } + + @Test + void blankVsIdReturnsTrue() { + boolean ret = testedClass.mustReturnEmptyValueSet("http://loinc.org/vs/"); + assertTrue(ret); + } + + @Test + void startsWithGenericPlusSlashPlusIdReturnsFalse() { + boolean ret = testedClass.mustReturnEmptyValueSet("http://loinc.org/vs/some-vs-id"); + assertFalse(ret); + } + + } + + + @Nested + public class IsLoincNotGenericUnversionedCodeSystem { + + @Test + void doesntContainLoincReturnsFalse() { + boolean ret = testedClass.isLoincNotGenericUnversionedCodeSystem("http://boing.org"); + assertFalse(ret); + } + + @Test + void hasVersionReturnsFalse() { + boolean ret = testedClass.isLoincNotGenericUnversionedCodeSystem("http://boing.org|v2.68"); + assertFalse(ret); + } + + @Test + void containsLoincAndNoVersionReturnsTrue() { + boolean ret = testedClass.isLoincNotGenericUnversionedCodeSystem("http://anything-plus-loinc.org"); + assertTrue(ret); + } + } + + @Nested + public class IsLoincNotGenericUnversionedValueSet { + + @Test + void notLoincReturnsFalse() { + boolean ret = testedClass.isLoincNotGenericUnversionedValueSet("http://anything-but-loin-c.org"); + assertFalse(ret); + } + + @Test + void isLoincAndHasVersionReturnsFalse() { + boolean ret = testedClass.isLoincNotGenericUnversionedValueSet("http://loinc.org|v2.67"); + assertFalse(ret); + } + + @Test + void isLoincNoVersionButEqualsGenericValueSetUrlReturnsFalse() { + boolean ret = testedClass.isLoincNotGenericUnversionedValueSet("http://loinc.org/vs"); + assertFalse(ret); + } + + @Test + void isLoincNoVersionStartsWithGenericValueSetPlusSlashPlusIdReturnsTrue() { + boolean ret = testedClass.isLoincNotGenericUnversionedValueSet("http://loinc.org/vs/vs-id"); + assertTrue(ret); + } + + } + + + @Nested + public class ReadByForcedId { + + @Mock(answer = Answers.RETURNS_DEEP_STUBS) + private EntityManager myEntityManager; + + @Mock private ResourceTable resource1; + @Mock private ResourceTable resource2; + @Mock private IBaseResource myCodeSystemResource; + + + @BeforeEach + public void setup() { + ReflectionTestUtils.setField(testedClass, "myEntityManager", myEntityManager); + } + + + @Test + void getNoneReturnsOptionalEmpty() { + when(myEntityManager.createQuery(anyString()).getResultList()) + .thenReturn(Collections.emptyList()); + + Optional<IBaseResource> result = testedClass.readCodeSystemByForcedId("a-cs-id"); + assertFalse(result.isPresent()); + } + + @Test + void getMultipleThrows() { + when(myEntityManager.createQuery(anyString()).getResultList()) + .thenReturn(Lists.newArrayList(resource1, resource2)); + + NonUniqueResultException thrown = assertThrows( + NonUniqueResultException.class, + () -> testedClass.readCodeSystemByForcedId("a-cs-id")); + + assertTrue(thrown.getMessage().contains("More than one CodeSystem is pointed by forcedId:")); + } + + @Test + void getOneConvertToResource() { + ReflectionTestUtils.setField(testedClass, "myDaoRegistry", myDaoRegistry); + + when(myEntityManager.createQuery(anyString()).getResultList()) + .thenReturn(Lists.newArrayList(resource1)); + when(myDaoRegistry.getResourceDao("CodeSystem")).thenReturn(myFhirResourceDao); + when(myFhirResourceDao.toResource(resource1, false)).thenReturn(myCodeSystemResource); + + + testedClass.readCodeSystemByForcedId("a-cs-id"); + + + verify(myFhirResourceDao, times(1)).toResource(any(), eq(false)); + } + + } + +} From 751c5d0d057c8b2dcf44dba6617ac88fbf1357d5 Mon Sep 17 00:00:00 2001 From: "juan.marchionatto" <juan.marchionatto@smilecdr.com> Date: Thu, 23 Sep 2021 11:55:50 -0400 Subject: [PATCH 20/20] Implement revision suggestions. Add changelog. --- ...erminology-valueset-parallel-versions.yaml | 4 ++ ...JpaPersistedResourceValidationSupport.java | 19 +++--- .../dao/r4/FhirResourceDaoCodeSystemR4.java | 3 +- .../fhir/jpa/term/BaseTermReadSvcImpl.java | 44 ++----------- .../term/TermCodeSystemStorageSvcImpl.java | 5 +- .../ca/uhn/fhir/jpa/term/TermReadSvcUtil.java | 62 +++++++++++++++++++ .../jpa/term/TermVersionAdapterSvcR4.java | 5 +- .../uhn/fhir/jpa/term/api/ITermReadSvc.java | 12 ---- ...ersistedResourceValidationSupportTest.java | 27 +++----- .../dao/r4/FhirResourceDaoR4ValidateTest.java | 9 +-- .../jpa/term/TermVersionAdapterSvcR4Test.java | 9 +-- .../term/TerminologyLoaderSvcLoincTest.java | 4 +- ...erminologySvcImplCurrentVersionR4Test.java | 3 +- .../jpa/term/TerminologySvcImplDstu3Test.java | 5 +- .../fhir/jpa/term/api/ITermReadSvcTest.java | 45 ++++++++++---- .../support/ValidationConstants.java | 32 ++++++++++ 16 files changed, 179 insertions(+), 109 deletions(-) create mode 100644 hapi-fhir-docs/src/main/resources/ca/uhn/hapi/fhir/changelog/5_6_0/2851-updated-terminology-valueset-parallel-versions.yaml create mode 100644 hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermReadSvcUtil.java create mode 100644 hapi-fhir-validation/src/main/java/org/hl7/fhir/common/hapi/validation/support/ValidationConstants.java diff --git a/hapi-fhir-docs/src/main/resources/ca/uhn/hapi/fhir/changelog/5_6_0/2851-updated-terminology-valueset-parallel-versions.yaml b/hapi-fhir-docs/src/main/resources/ca/uhn/hapi/fhir/changelog/5_6_0/2851-updated-terminology-valueset-parallel-versions.yaml new file mode 100644 index 00000000000..0ed0e3d4237 --- /dev/null +++ b/hapi-fhir-docs/src/main/resources/ca/uhn/hapi/fhir/changelog/5_6_0/2851-updated-terminology-valueset-parallel-versions.yaml @@ -0,0 +1,4 @@ +--- +type: add +issue: 2851 +title: "Allows to upload not-current version of LOINC ValueSet(s)." diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/JpaPersistedResourceValidationSupport.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/JpaPersistedResourceValidationSupport.java index d755a9cb9ba..bb27591070a 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/JpaPersistedResourceValidationSupport.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/JpaPersistedResourceValidationSupport.java @@ -26,6 +26,7 @@ import ca.uhn.fhir.context.support.IValidationSupport; import ca.uhn.fhir.jpa.api.dao.DaoRegistry; import ca.uhn.fhir.jpa.api.dao.IFhirResourceDao; import ca.uhn.fhir.jpa.searchparam.SearchParameterMap; +import ca.uhn.fhir.jpa.term.TermReadSvcUtil; import ca.uhn.fhir.jpa.term.api.ITermReadSvc; import ca.uhn.fhir.model.primitive.IdDt; import ca.uhn.fhir.rest.api.SortOrderEnum; @@ -62,6 +63,8 @@ import java.util.concurrent.TimeUnit; import java.util.function.Supplier; import static org.apache.commons.lang3.StringUtils.isBlank; +import static org.hl7.fhir.common.hapi.validation.support.ValidationConstants.LOINC_GENERIC_VALUESET_URL_PLUS_SLASH; +import static org.hl7.fhir.common.hapi.validation.support.ValidationConstants.LOINC_LOW; /** * This class is a {@link IValidationSupport Validation support} module that loads @@ -73,10 +76,6 @@ public class JpaPersistedResourceValidationSupport implements IValidationSupport private static final Logger ourLog = LoggerFactory.getLogger(JpaPersistedResourceValidationSupport.class); - public static final String LOINC_GENERIC_CODE_SYSTEM_URL = "http://loinc.org"; - public static final String LOINC_GENERIC_VALUESET_URL = LOINC_GENERIC_CODE_SYSTEM_URL + "/vs"; - public static final String LOINC_GENERIC_VALUESET_URL_PLUS_SLASH = LOINC_GENERIC_VALUESET_URL + "/"; - private final FhirContext myFhirContext; private final IBaseResource myNoMatch; @@ -107,7 +106,7 @@ public class JpaPersistedResourceValidationSupport implements IValidationSupport @Override public IBaseResource fetchCodeSystem(String theSystem) { - if (myTermReadSvc.isLoincNotGenericUnversionedCodeSystem(theSystem)) { + if (TermReadSvcUtil.isLoincNotGenericUnversionedCodeSystem(theSystem)) { Optional<IBaseResource> currentCSOpt = getCodeSystemCurrentVersion(new UriType(theSystem)); if (! currentCSOpt.isPresent()) { ourLog.info("Couldn't find current version of CodeSystem: " + theSystem); @@ -123,18 +122,18 @@ public class JpaPersistedResourceValidationSupport implements IValidationSupport * version is always pointed by the ForcedId for the no-versioned CS */ private Optional<IBaseResource> getCodeSystemCurrentVersion(UriType theUrl) { - if (! theUrl.getValueAsString().contains("loinc")) return Optional.empty(); + if (! theUrl.getValueAsString().contains(LOINC_LOW)) return Optional.empty(); - return myTermReadSvc.readCodeSystemByForcedId("loinc"); + return myTermReadSvc.readCodeSystemByForcedId(LOINC_LOW); } @Override public IBaseResource fetchValueSet(String theSystem) { - if (myTermReadSvc.isLoincNotGenericUnversionedValueSet(theSystem)) { + if (TermReadSvcUtil.isLoincNotGenericUnversionedValueSet(theSystem)) { Optional<IBaseResource> currentVSOpt = getValueSetCurrentVersion(new UriType(theSystem)); return currentVSOpt.orElseThrow(() -> new ResourceNotFoundException( - "Couldn't find current version ValueSet for url: " + theSystem)); + "Unable to find current version of ValueSet for url: " + theSystem)); } return fetchResource(myValueSetType, theSystem); @@ -145,7 +144,7 @@ public class JpaPersistedResourceValidationSupport implements IValidationSupport * version is always pointed by the ForcedId for the no-versioned VS */ private Optional<IBaseResource> getValueSetCurrentVersion(UriType theUrl) { - if (myTermReadSvc.mustReturnEmptyValueSet(theUrl.getValueAsString())) return Optional.empty(); + if (TermReadSvcUtil.mustReturnEmptyValueSet(theUrl.getValueAsString())) return Optional.empty(); String forcedId = theUrl.getValue().substring(LOINC_GENERIC_VALUESET_URL_PLUS_SLASH.length()); if (StringUtils.isBlank(forcedId)) return Optional.empty(); diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/r4/FhirResourceDaoCodeSystemR4.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/r4/FhirResourceDaoCodeSystemR4.java index 305b8a1c8fb..b639c026754 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/r4/FhirResourceDaoCodeSystemR4.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/r4/FhirResourceDaoCodeSystemR4.java @@ -56,6 +56,7 @@ import java.util.Set; import static ca.uhn.fhir.jpa.dao.FhirResourceDaoValueSetDstu2.toStringOrNull; import static org.apache.commons.lang3.StringUtils.isBlank; import static org.apache.commons.lang3.StringUtils.isNotBlank; +import static org.hl7.fhir.common.hapi.validation.support.ValidationConstants.LOINC_LOW; public class FhirResourceDaoCodeSystemR4 extends BaseHapiFhirResourceDao<CodeSystem> implements IFhirResourceDaoCodeSystem<CodeSystem, Coding, CodeableConcept> { @@ -181,7 +182,7 @@ public class FhirResourceDaoCodeSystemR4 extends BaseHapiFhirResourceDao<CodeSys public DaoMethodOutcome create(CodeSystem theResource, String theIfNoneExist, boolean thePerformIndexing, @Nonnull TransactionDetails theTransactionDetails, RequestDetails theRequestDetails) { // loinc CodeSystem must have an ID - if (isNotBlank(theResource.getUrl()) && theResource.getUrl().contains("loinc") + if (isNotBlank(theResource.getUrl()) && theResource.getUrl().contains(LOINC_LOW) && isBlank(theResource.getIdElement().getIdPart())) { throw new InvalidParameterException("'loinc' CodeSystem must have an ID"); } diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/BaseTermReadSvcImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/BaseTermReadSvcImpl.java index e403fe0717c..5b185c5726d 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/BaseTermReadSvcImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/BaseTermReadSvcImpl.java @@ -173,8 +173,6 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Supplier; import java.util.stream.Collectors; -import static ca.uhn.fhir.jpa.dao.JpaPersistedResourceValidationSupport.LOINC_GENERIC_VALUESET_URL; -import static ca.uhn.fhir.jpa.dao.JpaPersistedResourceValidationSupport.LOINC_GENERIC_VALUESET_URL_PLUS_SLASH; import static org.apache.commons.lang3.ObjectUtils.defaultIfNull; import static org.apache.commons.lang3.StringUtils.defaultString; import static org.apache.commons.lang3.StringUtils.isBlank; @@ -183,6 +181,8 @@ import static org.apache.commons.lang3.StringUtils.isNoneBlank; import static org.apache.commons.lang3.StringUtils.isNotBlank; import static org.apache.commons.lang3.StringUtils.lowerCase; import static org.apache.commons.lang3.StringUtils.startsWithIgnoreCase; +import static org.hl7.fhir.common.hapi.validation.support.ValidationConstants.LOINC_GENERIC_VALUESET_URL_PLUS_SLASH; +import static org.hl7.fhir.common.hapi.validation.support.ValidationConstants.LOINC_LOW; public abstract class BaseTermReadSvcImpl implements ITermReadSvc { public static final int DEFAULT_FETCH_SIZE = 250; @@ -2342,14 +2342,14 @@ public abstract class BaseTermReadSvcImpl implements ITermReadSvc { /** - * When the search is for no-version loinc system it uses the forcedId to obtain the current + * When the search is for unversioned loinc system it uses the forcedId to obtain the current * version, as it is not necessarily the last one anymore. * For other cases it keeps on considering the last uploaded as the current */ @Override public Optional<TermValueSet> findCurrentTermValueSet(String theUrl) { - if (isLoincNotGenericUnversionedValueSet(theUrl)) { - if (mustReturnEmptyValueSet(theUrl)) return Optional.empty(); + if (TermReadSvcUtil.isLoincNotGenericUnversionedValueSet(theUrl)) { + if (TermReadSvcUtil.mustReturnEmptyValueSet(theUrl)) return Optional.empty(); String forcedId = theUrl.substring(LOINC_GENERIC_VALUESET_URL_PLUS_SLASH.length()); if (StringUtils.isBlank(forcedId)) return Optional.empty(); @@ -2363,38 +2363,6 @@ public abstract class BaseTermReadSvcImpl implements ITermReadSvc { } - @Override - public boolean mustReturnEmptyValueSet(String theUrl) { - if (! theUrl.startsWith(LOINC_GENERIC_VALUESET_URL)) return true; - - if (! theUrl.startsWith(LOINC_GENERIC_VALUESET_URL_PLUS_SLASH)) { - throw new InternalErrorException("Don't know how to extract ForcedId from url: " + theUrl); - } - - String forcedId = theUrl.substring(LOINC_GENERIC_VALUESET_URL_PLUS_SLASH.length()); - return StringUtils.isBlank(forcedId); - } - - - @Override - public boolean isLoincNotGenericUnversionedValueSet(String theUrl) { - boolean isLoincCodeSystem = StringUtils.containsIgnoreCase(theUrl, "loinc"); - boolean isNoVersion = ! theUrl.contains("|"); - boolean isNotLoincGenericValueSet = ! theUrl.equals(LOINC_GENERIC_VALUESET_URL); - - return isLoincCodeSystem && isNoVersion && isNotLoincGenericValueSet; - } - - - @Override - public boolean isLoincNotGenericUnversionedCodeSystem(String theUrl) { - boolean isLoincCodeSystem = StringUtils.containsIgnoreCase(theUrl, "loinc"); - boolean isNoVersion = ! theUrl.contains("|"); - - return isLoincCodeSystem && isNoVersion; - } - - @SuppressWarnings("unchecked") private CodeValidationResult codeSystemValidateCode(String theCodeSystemUrl, String theCodeSystemVersion, String theCode, String theDisplay) { @@ -2426,7 +2394,7 @@ public abstract class BaseTermReadSvcImpl implements ITermReadSvc { if (isNoneBlank(theCodeSystemVersion)) { predicates.add(criteriaBuilder.equal(systemVersionJoin.get("myCodeSystemVersionId"), theCodeSystemVersion)); } else { - if (theCodeSystemUrl.toLowerCase(Locale.ROOT).contains("loinc")) { + if (theCodeSystemUrl.toLowerCase(Locale.ROOT).contains(LOINC_LOW)) { predicates.add(criteriaBuilder.isNull(systemVersionJoin.get("myCodeSystemVersionId"))); } else { query.orderBy(criteriaBuilder.desc(root.get("myUpdated"))); diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermCodeSystemStorageSvcImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermCodeSystemStorageSvcImpl.java index 525eb9717e7..10b50bccab5 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermCodeSystemStorageSvcImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermCodeSystemStorageSvcImpl.java @@ -88,6 +88,7 @@ import java.util.stream.Collectors; import static org.apache.commons.lang3.StringUtils.isBlank; import static org.apache.commons.lang3.StringUtils.isNotBlank; +import static org.hl7.fhir.common.hapi.validation.support.ValidationConstants.LOINC_LOW; public class TermCodeSystemStorageSvcImpl implements ITermCodeSystemStorageSvc { private static final Logger ourLog = LoggerFactory.getLogger(TermCodeSystemStorageSvcImpl.class); @@ -140,8 +141,8 @@ public class TermCodeSystemStorageSvcImpl implements ITermCodeSystemStorageSvc { CodeSystem codeSystemResource = new CodeSystem(); codeSystemResource.setUrl(theSystem); codeSystemResource.setContent(CodeSystem.CodeSystemContentMode.NOTPRESENT); - if (isBlank(codeSystemResource.getIdElement().getIdPart()) && theSystem.contains("loinc")) { - codeSystemResource.setId("loinc"); + if (isBlank(codeSystemResource.getIdElement().getIdPart()) && theSystem.contains(LOINC_LOW)) { + codeSystemResource.setId(LOINC_LOW); } myTerminologyVersionAdapterSvc.createOrUpdateCodeSystem(codeSystemResource); diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermReadSvcUtil.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermReadSvcUtil.java new file mode 100644 index 00000000000..d45872a048e --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermReadSvcUtil.java @@ -0,0 +1,62 @@ +package ca.uhn.fhir.jpa.term; + +/*- + * #%L + * HAPI FHIR JPA Server + * %% + * Copyright (C) 2014 - 2021 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% + */ + +import ca.uhn.fhir.rest.server.exceptions.InternalErrorException; +import org.apache.commons.lang3.StringUtils; + +import static org.hl7.fhir.common.hapi.validation.support.ValidationConstants.LOINC_GENERIC_VALUESET_URL; +import static org.hl7.fhir.common.hapi.validation.support.ValidationConstants.LOINC_GENERIC_VALUESET_URL_PLUS_SLASH; +import static org.hl7.fhir.common.hapi.validation.support.ValidationConstants.LOINC_LOW; + +public class TermReadSvcUtil { + + public static boolean mustReturnEmptyValueSet(String theUrl) { + if (! theUrl.startsWith(LOINC_GENERIC_VALUESET_URL)) return true; + + if (! theUrl.startsWith(LOINC_GENERIC_VALUESET_URL_PLUS_SLASH)) { + throw new InternalErrorException("Don't know how to extract ValueSet's ForcedId from url: " + theUrl); + } + + String forcedId = theUrl.substring(LOINC_GENERIC_VALUESET_URL_PLUS_SLASH.length()); + return StringUtils.isBlank(forcedId); + } + + + public static boolean isLoincNotGenericUnversionedValueSet(String theUrl) { + boolean isLoincCodeSystem = StringUtils.containsIgnoreCase(theUrl, LOINC_LOW); + boolean isNoVersion = ! theUrl.contains("|"); + boolean isNotLoincGenericValueSet = ! theUrl.equals(LOINC_GENERIC_VALUESET_URL); + + return isLoincCodeSystem && isNoVersion && isNotLoincGenericValueSet; + } + + + public static boolean isLoincNotGenericUnversionedCodeSystem(String theUrl) { + boolean isLoincCodeSystem = StringUtils.containsIgnoreCase(theUrl, LOINC_LOW); + boolean isNoVersion = ! theUrl.contains("|"); + + return isLoincCodeSystem && isNoVersion; + } + + + +} diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermVersionAdapterSvcR4.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermVersionAdapterSvcR4.java index 5326b1b49ac..38fbbd7a6d4 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermVersionAdapterSvcR4.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermVersionAdapterSvcR4.java @@ -36,6 +36,7 @@ import org.springframework.context.event.EventListener; import java.security.InvalidParameterException; import static org.apache.commons.lang3.StringUtils.isBlank; +import static org.hl7.fhir.common.hapi.validation.support.ValidationConstants.LOINC_LOW; public class TermVersionAdapterSvcR4 extends BaseTermVersionAdapterSvcImpl implements ITermVersionAdapterSvc { private IFhirResourceDao<ConceptMap> myConceptMapResourceDao; @@ -65,8 +66,8 @@ public class TermVersionAdapterSvcR4 extends BaseTermVersionAdapterSvcImpl imple public IIdType createOrUpdateCodeSystem(org.hl7.fhir.r4.model.CodeSystem theCodeSystemResource, RequestDetails theRequestDetails) { validateCodeSystemForStorage(theCodeSystemResource); if (isBlank(theCodeSystemResource.getIdElement().getIdPart())) { - if (theCodeSystemResource.getUrl().contains("loinc")) { - throw new InvalidParameterException("LOINC CodeSystem must have an 'ID' element"); + if (theCodeSystemResource.getUrl().contains(LOINC_LOW)) { + throw new InvalidParameterException("'loinc' CodeSystem must have an 'ID' element"); } String matchUrl = "CodeSystem?url=" + UrlUtil.escapeUrlParam(theCodeSystemResource.getUrl()); return myCodeSystemResourceDao.update(theCodeSystemResource, matchUrl, theRequestDetails).getId(); diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/api/ITermReadSvc.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/api/ITermReadSvc.java index c619deb8f0e..b02ffa30740 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/api/ITermReadSvc.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/api/ITermReadSvc.java @@ -124,18 +124,6 @@ public interface ITermReadSvc extends IValidationSupport { /** * Version independent */ - boolean mustReturnEmptyValueSet(String theUrl); - - /** - * Version independent - */ - boolean isLoincNotGenericUnversionedCodeSystem(String theSystem); - - /** - * Version independent - */ - boolean isLoincNotGenericUnversionedValueSet(String theUrl); - Optional<IBaseResource> readCodeSystemByForcedId(String theForcedId); } diff --git a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/JpaPersistedResourceValidationSupportTest.java b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/JpaPersistedResourceValidationSupportTest.java index 20250d77327..8be940c8dae 100644 --- a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/JpaPersistedResourceValidationSupportTest.java +++ b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/JpaPersistedResourceValidationSupportTest.java @@ -34,12 +34,14 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.test.util.ReflectionTestUtils; import java.util.function.Function; +import static org.hl7.fhir.common.hapi.validation.support.ValidationConstants.LOINC_LOW; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.anyString; @@ -47,7 +49,6 @@ import static org.mockito.ArgumentMatchers.isA; import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; @ExtendWith(MockitoExtension.class) class JpaPersistedResourceValidationSupportTest { @@ -59,7 +60,7 @@ class JpaPersistedResourceValidationSupportTest { @Mock private Cache<String, IBaseResource> myLoadCache; @Mock private IFhirResourceDao<ValueSet> myValueSetResourceDao; - + @InjectMocks private IValidationSupport testedClass = new JpaPersistedResourceValidationSupport(theFhirContext); @@ -69,10 +70,6 @@ class JpaPersistedResourceValidationSupportTest { @BeforeEach public void setup() { - ReflectionTestUtils.setField(testedClass, "myTermReadSvc", myTermReadSvc); - ReflectionTestUtils.setField(testedClass, "myDaoRegistry", myDaoRegistry); - ReflectionTestUtils.setField(testedClass, "myLoadCache", myLoadCache); - ReflectionTestUtils.setField(testedClass, "myCodeSystemType", myCodeSystemType); ReflectionTestUtils.setField(testedClass, "myValueSetType", myValueSetType); } @@ -82,22 +79,18 @@ class JpaPersistedResourceValidationSupportTest { @Test void fetchCodeSystemMustUseForcedId() { - when(myTermReadSvc.isLoincNotGenericUnversionedCodeSystem(anyString())).thenReturn(true); - testedClass.fetchCodeSystem("string-containing-loinc"); - verify(myTermReadSvc, times(1)).readCodeSystemByForcedId("loinc"); + verify(myTermReadSvc, times(1)).readCodeSystemByForcedId(LOINC_LOW); verify(myLoadCache, never()).get(anyString(), isA(Function.class)); } @Test void fetchCodeSystemMustNotUseForcedId() { - when(myTermReadSvc.isLoincNotGenericUnversionedCodeSystem(anyString())).thenReturn(false); - testedClass.fetchCodeSystem("string-not-containing-l-o-i-n-c"); - verify(myTermReadSvc, never()).readCodeSystemByForcedId("loinc"); + verify(myTermReadSvc, never()).readCodeSystemByForcedId(LOINC_LOW); verify(myLoadCache, times(1)).get(anyString(), isA(Function.class)); } @@ -109,21 +102,17 @@ class JpaPersistedResourceValidationSupportTest { @Test void fetchValueSetMustUseForcedId() { - when(myTermReadSvc.isLoincNotGenericUnversionedValueSet(anyString())).thenReturn(true); - when(myDaoRegistry.getResourceDao(ValueSet.class)).thenReturn(myValueSetResourceDao); - + final String valueSetId = "string-containing-loinc"; ResourceNotFoundException thrown = assertThrows( ResourceNotFoundException.class, - () -> testedClass.fetchValueSet("string-containing-loinc")); + () -> testedClass.fetchValueSet(valueSetId)); - assertTrue(thrown.getMessage().contains("Couldn't find current version ValueSet for url")); + assertTrue(thrown.getMessage().contains("Unable to find current version of ValueSet for url: " + valueSetId)); } @Test void fetchValueSetMustNotUseForcedId() { - when(myTermReadSvc.isLoincNotGenericUnversionedValueSet(anyString())).thenReturn(false); - testedClass.fetchValueSet("string-not-containing-l-o-i-n-c"); verify(myLoadCache, times(1)).get(anyString(), isA(Function.class)); diff --git a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/r4/FhirResourceDaoR4ValidateTest.java b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/r4/FhirResourceDaoR4ValidateTest.java index 351b384c5eb..ae1488533af 100644 --- a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/r4/FhirResourceDaoR4ValidateTest.java +++ b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/r4/FhirResourceDaoR4ValidateTest.java @@ -81,6 +81,7 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.not; +import static org.hl7.fhir.common.hapi.validation.support.ValidationConstants.LOINC_LOW; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.fail; @@ -501,7 +502,7 @@ public class FhirResourceDaoR4ValidateTest extends BaseJpaR4Test { cs.setContent(CodeSystem.CodeSystemContentMode.COMPLETE); cs.setUrl("http://loinc.org"); cs.addConcept().setCode("123-4").setDisplay("Code 123 4"); - cs.setId("loinc"); + cs.setId(LOINC_LOW); myCodeSystemDao.update(cs); Group group = new Group(); @@ -569,7 +570,7 @@ public class FhirResourceDaoR4ValidateTest extends BaseJpaR4Test { cs.setContent(CodeSystem.CodeSystemContentMode.COMPLETE); cs.setUrl("http://loinc.org"); cs.addConcept().setCode("123-4").setDisplay("Code 123 4"); - cs.setId("loinc"); + cs.setId(LOINC_LOW); myCodeSystemDao.update(cs); Group group = new Group(); @@ -637,7 +638,7 @@ public class FhirResourceDaoR4ValidateTest extends BaseJpaR4Test { cs.setContent(CodeSystem.CodeSystemContentMode.COMPLETE); cs.setUrl("http://loinc.org"); cs.addConcept().setCode("123-4").setDisplay("Code 123 4"); - cs.setId("loinc"); + cs.setId(LOINC_LOW); myCodeSystemDao.update(cs); Group group = new Group(); @@ -1713,7 +1714,7 @@ public class FhirResourceDaoR4ValidateTest extends BaseJpaR4Test { cs.setUrl(ITermLoaderSvc.LOINC_URI); cs.setContent(CodeSystem.CodeSystemContentMode.COMPLETE); cs.addConcept().setCode("10013-1"); - cs.setId("loinc"); + cs.setId(LOINC_LOW); myCodeSystemDao.update(cs); IValidationSupport.CodeValidationResult result = myValueSetDao.validateCode(new UriType("http://fooVs"), null, new StringType("10013-1"), new StringType(ITermLoaderSvc.LOINC_URI), null, null, null, mySrd); diff --git a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/term/TermVersionAdapterSvcR4Test.java b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/term/TermVersionAdapterSvcR4Test.java index f942f1df0a2..915ead7dcf1 100644 --- a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/term/TermVersionAdapterSvcR4Test.java +++ b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/term/TermVersionAdapterSvcR4Test.java @@ -33,6 +33,7 @@ import org.springframework.test.util.ReflectionTestUtils; import java.security.InvalidParameterException; +import static org.hl7.fhir.common.hapi.validation.support.ValidationConstants.LOINC_LOW; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.Mockito.verify; @@ -50,14 +51,14 @@ class TermVersionAdapterSvcR4Test { @Test void createOrUpdateCodeSystemMustHaveId() { - org.hl7.fhir.r4.model.CodeSystem codeSystem = new CodeSystem(); + CodeSystem codeSystem = new CodeSystem(); codeSystem.setUrl("a-loinc-system"); InvalidParameterException thrown = assertThrows( InvalidParameterException.class, () -> testedClass.createOrUpdateCodeSystem(codeSystem, new ServletRequestDetails())); - assertTrue(thrown.getMessage().contains("LOINC CodeSystem must have an 'ID' element")); + assertTrue(thrown.getMessage().contains("'loinc' CodeSystem must have an 'ID' element")); } @@ -65,8 +66,8 @@ class TermVersionAdapterSvcR4Test { void createOrUpdateCodeSystemWithIdNoException() { ReflectionTestUtils.setField(testedClass, "myCodeSystemResourceDao", myCodeSystemResourceDao); - org.hl7.fhir.r4.model.CodeSystem codeSystem = new CodeSystem(); - codeSystem.setUrl("a-loinc-system").setId("loinc"); + CodeSystem codeSystem = new CodeSystem(); + codeSystem.setUrl("a-loinc-system").setId(LOINC_LOW); when(myCodeSystemResourceDao.update(codeSystem, theRequestDetails)).thenReturn(theDaoMethodOutcome); diff --git a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/term/TerminologyLoaderSvcLoincTest.java b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/term/TerminologyLoaderSvcLoincTest.java index 23feac7194b..8d30f018d32 100644 --- a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/term/TerminologyLoaderSvcLoincTest.java +++ b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/term/TerminologyLoaderSvcLoincTest.java @@ -25,7 +25,6 @@ import org.hl7.fhir.r4.model.CodeSystem; import org.hl7.fhir.r4.model.ConceptMap; import org.hl7.fhir.r4.model.Enumerations; import org.hl7.fhir.r4.model.ValueSet; -import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; @@ -75,6 +74,7 @@ import static org.hamcrest.Matchers.containsString; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.fail; import static org.mockito.ArgumentMatchers.any; @@ -930,7 +930,7 @@ public class TerminologyLoaderSvcLoincTest extends BaseLoaderTest { testProps.put(LOINC_CODESYSTEM_MAKE_CURRENT.getCode(), "false"); doReturn(mockFileDescriptors).when(testedSvc).getLoadedFileDescriptors(mockFileDescriptorList); - InvalidRequestException thrown = Assertions.assertThrows(InvalidRequestException.class, + InvalidRequestException thrown = assertThrows(InvalidRequestException.class, () -> testedSvc.loadLoinc(mockFileDescriptorList, mySrd) ); assertEquals("'" + LOINC_CODESYSTEM_VERSION.getCode() + "' property is required when '" + diff --git a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/term/TerminologySvcImplCurrentVersionR4Test.java b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/term/TerminologySvcImplCurrentVersionR4Test.java index 9e4057fd1a0..b34d1e008de 100644 --- a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/term/TerminologySvcImplCurrentVersionR4Test.java +++ b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/term/TerminologySvcImplCurrentVersionR4Test.java @@ -77,6 +77,7 @@ import static ca.uhn.fhir.jpa.term.loinc.LoincUploadPropertiesEnum.LOINC_UPLOAD_ import static ca.uhn.fhir.jpa.term.loinc.LoincUploadPropertiesEnum.LOINC_XML_FILE; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsInAnyOrder; +import static org.hl7.fhir.common.hapi.validation.support.ValidationConstants.LOINC_LOW; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; @@ -440,7 +441,7 @@ public class TerminologySvcImplCurrentVersionR4Test extends BaseJpaR4Test { // for CodeSystem: // _ current CS is present and has no version - CodeSystem codeSystem = myCodeSystemDao.read(new IdType("loinc")); + CodeSystem codeSystem = myCodeSystemDao.read(new IdType(LOINC_LOW)); String csString = myFhirCtx.newJsonParser().setPrettyPrint(true).encodeResourceToString(codeSystem); ourLog.info("CodeSystem:\n" + csString); diff --git a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/term/TerminologySvcImplDstu3Test.java b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/term/TerminologySvcImplDstu3Test.java index 5d29b99a1d4..34d94192a4c 100644 --- a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/term/TerminologySvcImplDstu3Test.java +++ b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/term/TerminologySvcImplDstu3Test.java @@ -42,6 +42,7 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsInAnyOrder; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.empty; +import static org.hl7.fhir.common.hapi.validation.support.ValidationConstants.LOINC_LOW; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertSame; @@ -406,7 +407,7 @@ public class TerminologySvcImplDstu3Test extends BaseJpaDstu3Test { .addFilter() .setProperty("copyright") .setOp(ValueSet.FilterOperator.EQUAL) - .setValue("loinc"); + .setValue(LOINC_LOW); outcome = myTermSvc.expandValueSet(null, vs); codes = toCodesContains(outcome.getExpansion().getContains()); assertThat(codes, containsInAnyOrder("47239-9")); @@ -478,7 +479,7 @@ public class TerminologySvcImplDstu3Test extends BaseJpaDstu3Test { .addFilter() .setProperty("copyright") .setOp(ValueSet.FilterOperator.EQUAL) - .setValue("loinc"); + .setValue(LOINC_LOW); outcome = myTermSvc.expandValueSet(null, vs); codes = toCodesContains(outcome.getExpansion().getContains()); assertThat(codes, containsInAnyOrder("50015-7", "43343-3", "43343-4")); diff --git a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/term/api/ITermReadSvcTest.java b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/term/api/ITermReadSvcTest.java index d47e53736ec..c695bf8c0aa 100644 --- a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/term/api/ITermReadSvcTest.java +++ b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/term/api/ITermReadSvcTest.java @@ -1,10 +1,31 @@ package ca.uhn.fhir.jpa.term.api; +/*- + * #%L + * HAPI FHIR JPA Server + * %% + * Copyright (C) 2014 - 2021 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% + */ + import ca.uhn.fhir.jpa.api.dao.DaoRegistry; import ca.uhn.fhir.jpa.api.dao.IFhirResourceDao; import ca.uhn.fhir.jpa.dao.data.ITermValueSetDao; import ca.uhn.fhir.jpa.model.entity.ResourceTable; import ca.uhn.fhir.jpa.term.TermReadSvcR4; +import ca.uhn.fhir.jpa.term.TermReadSvcUtil; import ca.uhn.fhir.rest.server.exceptions.InternalErrorException; import com.google.common.collect.Lists; import org.hl7.fhir.instance.model.api.IBaseResource; @@ -79,7 +100,7 @@ class ITermReadSvcTest { @Test void doesntStartWithGenericVSReturnsTrue() { - boolean ret = testedClass.mustReturnEmptyValueSet("http://boing.org"); + boolean ret = TermReadSvcUtil.mustReturnEmptyValueSet("http://boing.org"); assertTrue(ret); } @@ -87,20 +108,20 @@ class ITermReadSvcTest { void doesntStartWithGenericVSPlusSlashThrows() { InternalErrorException thrown = assertThrows( InternalErrorException.class, - () -> testedClass.mustReturnEmptyValueSet("http://loinc.org/vs-no-slash-after-vs")); + () -> TermReadSvcUtil.mustReturnEmptyValueSet("http://loinc.org/vs-no-slash-after-vs")); - assertTrue(thrown.getMessage().contains("Don't know how to extract ForcedId from url:")); + assertTrue(thrown.getMessage().contains("Don't know how to extract ValueSet's ForcedId from url:")); } @Test void blankVsIdReturnsTrue() { - boolean ret = testedClass.mustReturnEmptyValueSet("http://loinc.org/vs/"); + boolean ret = TermReadSvcUtil.mustReturnEmptyValueSet("http://loinc.org/vs/"); assertTrue(ret); } @Test void startsWithGenericPlusSlashPlusIdReturnsFalse() { - boolean ret = testedClass.mustReturnEmptyValueSet("http://loinc.org/vs/some-vs-id"); + boolean ret = TermReadSvcUtil.mustReturnEmptyValueSet("http://loinc.org/vs/some-vs-id"); assertFalse(ret); } @@ -112,19 +133,19 @@ class ITermReadSvcTest { @Test void doesntContainLoincReturnsFalse() { - boolean ret = testedClass.isLoincNotGenericUnversionedCodeSystem("http://boing.org"); + boolean ret = TermReadSvcUtil.isLoincNotGenericUnversionedCodeSystem("http://boing.org"); assertFalse(ret); } @Test void hasVersionReturnsFalse() { - boolean ret = testedClass.isLoincNotGenericUnversionedCodeSystem("http://boing.org|v2.68"); + boolean ret = TermReadSvcUtil.isLoincNotGenericUnversionedCodeSystem("http://boing.org|v2.68"); assertFalse(ret); } @Test void containsLoincAndNoVersionReturnsTrue() { - boolean ret = testedClass.isLoincNotGenericUnversionedCodeSystem("http://anything-plus-loinc.org"); + boolean ret = TermReadSvcUtil.isLoincNotGenericUnversionedCodeSystem("http://anything-plus-loinc.org"); assertTrue(ret); } } @@ -134,25 +155,25 @@ class ITermReadSvcTest { @Test void notLoincReturnsFalse() { - boolean ret = testedClass.isLoincNotGenericUnversionedValueSet("http://anything-but-loin-c.org"); + boolean ret = TermReadSvcUtil.isLoincNotGenericUnversionedValueSet("http://anything-but-loin-c.org"); assertFalse(ret); } @Test void isLoincAndHasVersionReturnsFalse() { - boolean ret = testedClass.isLoincNotGenericUnversionedValueSet("http://loinc.org|v2.67"); + boolean ret = TermReadSvcUtil.isLoincNotGenericUnversionedValueSet("http://loinc.org|v2.67"); assertFalse(ret); } @Test void isLoincNoVersionButEqualsGenericValueSetUrlReturnsFalse() { - boolean ret = testedClass.isLoincNotGenericUnversionedValueSet("http://loinc.org/vs"); + boolean ret = TermReadSvcUtil.isLoincNotGenericUnversionedValueSet("http://loinc.org/vs"); assertFalse(ret); } @Test void isLoincNoVersionStartsWithGenericValueSetPlusSlashPlusIdReturnsTrue() { - boolean ret = testedClass.isLoincNotGenericUnversionedValueSet("http://loinc.org/vs/vs-id"); + boolean ret = TermReadSvcUtil.isLoincNotGenericUnversionedValueSet("http://loinc.org/vs/vs-id"); assertTrue(ret); } diff --git a/hapi-fhir-validation/src/main/java/org/hl7/fhir/common/hapi/validation/support/ValidationConstants.java b/hapi-fhir-validation/src/main/java/org/hl7/fhir/common/hapi/validation/support/ValidationConstants.java new file mode 100644 index 00000000000..27a3b266f44 --- /dev/null +++ b/hapi-fhir-validation/src/main/java/org/hl7/fhir/common/hapi/validation/support/ValidationConstants.java @@ -0,0 +1,32 @@ +package org.hl7.fhir.common.hapi.validation.support; + +/*- + * #%L + * HAPI FHIR JPA Server + * %% + * Copyright (C) 2014 - 2021 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% + */ + +public class ValidationConstants { + + public static final String LOINC_LOW = "loinc"; + public static final String LOINC_GENERIC_CODE_SYSTEM_URL = "http://loinc.org"; + public static final String LOINC_GENERIC_VALUESET_URL = LOINC_GENERIC_CODE_SYSTEM_URL + "/vs"; + public static final String LOINC_GENERIC_VALUESET_URL_PLUS_SLASH = LOINC_GENERIC_VALUESET_URL + "/"; + + // not to be instantiated + private ValidationConstants() { } +}