package edu.gatech.i3l.fhir.jpa.dao; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.From; import javax.persistence.criteria.Path; import javax.persistence.criteria.Predicate; import org.apache.commons.lang3.StringUtils; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import ca.uhn.fhir.model.dstu2.resource.MedicationDispense; import edu.gatech.i3l.fhir.jpa.entity.IResourceEntity; import edu.gatech.i3l.fhir.jpa.query.AbstractPredicateBuilder; import edu.gatech.i3l.fhir.jpa.query.PredicateBuilder; @Transactional(propagation = Propagation.REQUIRED) public class MedicationDispenseFhirResourceDao extends BaseFhirResourceDao<MedicationDispense> { public MedicationDispenseFhirResourceDao() { super(); setResourceEntity(edu.gatech.i3l.fhir.dstu2.entities.DrugExposureDispensed.class); setValidateBean(true); } @Override public PredicateBuilder getPredicateBuilder() { return new AbstractPredicateBuilder() { private static final String LOINC = "loinc"; private static final String SNOMED = "snomed"; private static final String ICD_9 = "icd-9"; private static final String RXNORM = "rxnorm"; private static final String UCUM = "ucum"; private static final String ICD_10 = "icd-10"; @Override public Predicate translatePredicateTokenSystem(Class<? extends IResourceEntity> entity, String theParamName, String system, From<? extends IResourceEntity, ? extends IResourceEntity> from, CriteriaBuilder theBuilder) { Predicate predicate = null; if (system == null) { return null; } system = getVocabularyName(system); Path<Object> path = null; switch (theParamName) { case MedicationDispense.SP_MEDICATION: path = from.get("medication").get("vocabulary").get("name"); break; default: break; } if (StringUtils.isNotBlank(system)) { predicate = theBuilder.like(path.as(String.class), system + "%"); } // else { // return theBuilder.isNull(path); //WARNING originally, if the // system is empty, then it would be checked for null systems // } return predicate; } private String getVocabularyName(String system) { if (system.contains(SNOMED)) { return SNOMED; } else if (system.contains(LOINC)) { return LOINC; } else if (system.contains(ICD_10)) { return ICD_10; } else if (system.contains(ICD_9)) { return ICD_9; } else if (system.contains(RXNORM)) { return RXNORM; } else if (system.contains(UCUM)) { return UCUM; } return ""; } @Override public Predicate translatePredicateTokenCode(Class<? extends IResourceEntity> entity, String theParamName, String code, From<? extends IResourceEntity, ? extends IResourceEntity> from, CriteriaBuilder theBuilder) { Predicate predicate = null; Path<Object> path = null; switch (theParamName) { case MedicationDispense.SP_MEDICATION: path = from.get("medication").get("conceptCode"); break; default: break; } if (StringUtils.isNotBlank(code)) { predicate = theBuilder.equal(path, code); } // else { // return theBuilder.isNull(path); // } return predicate; } }; } }