package edu.gatech.i3l.fhir.jpa.dao; import java.util.Calendar; import java.util.Date; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.From; import javax.persistence.criteria.Predicate; import ca.uhn.fhir.model.api.IQueryParameterType; import ca.uhn.fhir.model.dstu2.resource.Patient; import ca.uhn.fhir.model.dstu2.resource.Practitioner; import ca.uhn.fhir.rest.param.DateRangeParam; import edu.gatech.i3l.fhir.dstu2.entities.Provider; import edu.gatech.i3l.fhir.jpa.entity.IResourceEntity; import edu.gatech.i3l.fhir.jpa.query.AbstractPredicateBuilder; import edu.gatech.i3l.fhir.jpa.query.PredicateBuilder; public class PractitionerFhirResourceDao extends BaseFhirResourceDao<Practitioner> { public PractitionerFhirResourceDao() { super(); setResourceEntity(Provider.class); setValidateBean(true); } @Override public PredicateBuilder getPredicateBuilder() { return new AbstractPredicateBuilder() { @Override public Predicate translatePredicateString(Class<? extends IResourceEntity> entity, String theParamName, String likeExpression, From<? extends IResourceEntity, ? extends IResourceEntity> from, CriteriaBuilder theBuilder) { Predicate singleCode = null; switch (theParamName) { // case Patient.SP_ADDRESS: // Predicate lc1 = theBuilder.like(from.get("location").get("address1").as(String.class), likeExpression); // Predicate lc2 = theBuilder.like(from.get("location").get("address2").as(String.class), likeExpression); // Predicate lc3 = theBuilder.like(from.get("location").get("city").as(String.class), likeExpression); // Predicate lc4 = theBuilder.like(from.get("location").get("state").as(String.class), likeExpression); // Predicate lc5 = theBuilder.like(from.get("location").get("zipCode").as(String.class), likeExpression); // Predicate lc6 = theBuilder.like(from.get("location").get("country").as(String.class), likeExpression); // singleCode = theBuilder.or(lc1, lc2, lc3, lc4, lc5, lc6); // break; case Patient.SP_NAME: singleCode = theBuilder.like(from.get("providerName").as(String.class), likeExpression); break; default: break; } return singleCode; } @Override public Predicate translatePredicateDate(Class<? extends IResourceEntity> entity, CriteriaBuilder theBuilder, From<? extends IResourceEntity, ? extends IResourceEntity> from, DateRangeParam theRange, String theParamName, IQueryParameterType theParam) { Date lowerBound = theRange.getLowerBoundAsInstant(); Date upperBound = theRange.getUpperBoundAsInstant(); Calendar c = Calendar.getInstance(); Predicate ub = null; Predicate lb = null; switch (theParamName) { case Patient.SP_BIRTHDATE: if (lowerBound != null) { c.setTime(lowerBound); lb = theBuilder.greaterThan(from.get("yearOfBirth").as(Integer.class), c.get(Calendar.YEAR)); } if (upperBound != null) { c.setTime(upperBound); ub = theBuilder.lessThan(from.get("yearOfBirth").as(Integer.class), c.get(Calendar.YEAR)); } break; default: break; } if (lb != null && ub != null) { return (theBuilder.and(lb, ub)); } else if (lb != null) { return (lb); } else { return (ub); } } }; } }