Skip to content

Commit

Permalink
Added support to questionnaires search
Browse files Browse the repository at this point in the history
  • Loading branch information
icrc-loliveira committed Jul 11, 2024
1 parent a4a7f9a commit 0fb444e
Showing 1 changed file with 64 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -9,28 +9,43 @@
*/
package org.openmrs.module.fhir2.api.dao.impl;

import static org.hibernate.criterion.Restrictions.eq;
import static org.hibernate.criterion.Restrictions.in;
import static org.hibernate.criterion.Restrictions.*;

import javax.annotation.Nonnull;
import javax.persistence.criteria.*;
import javax.persistence.criteria.CriteriaBuilder;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.stream.Collectors;

import ca.uhn.fhir.rest.param.StringAndListParam;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.Setter;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.openmrs.Form;
import org.openmrs.FormResource;
import org.openmrs.module.fhir2.FhirConstants;
import org.openmrs.module.fhir2.api.dao.FhirQuestionnaireDao;
import org.openmrs.module.fhir2.api.search.param.SearchParameterMap;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

@Component
@Setter(AccessLevel.PACKAGE)
public class FhirQuestionnaireDaoImpl extends BaseFhirDao<Form> implements FhirQuestionnaireDao {

@Autowired
@Getter(AccessLevel.PUBLIC)
@Setter(AccessLevel.PUBLIC)
@Qualifier("sessionFactory")
private SessionFactory sessionFactory;

@Override
public Form getQuestionnaireById(@Nonnull Integer id) {
return (Form) getSessionFactory().getCurrentSession().createCriteria(Form.class).add(eq("formId", id))
Expand All @@ -43,6 +58,53 @@ public List<Form> getQuestionnairesByIds(@Nonnull Collection<Integer> ids) {
return getSessionFactory().getCurrentSession().createCriteria(Form.class).add(in("id", ids)).list();
}

@SuppressWarnings("unchecked")
@Override
public List<Form> getSearchResults(@Nonnull SearchParameterMap theParams) {
Session session = sessionFactory.openSession();
session.beginTransaction();

// Create CriteriaBuilder
CriteriaBuilder builder = session.getCriteriaBuilder();

// Create CriteriaQuery for main query
CriteriaQuery<Form> query = builder.createQuery(Form.class);
Root<Form> formRoot = query.from(Form.class);
formRoot.alias("f");

// Create Subquery for FormResource
Subquery<Long> subquery = query.subquery(Long.class);
Root<FormResource> resourceRoot = subquery.from(FormResource.class);
subquery.select(resourceRoot.get("form").get("formId")); // Selecting formId to match in main query

// Add predicates to the subquery
List<Predicate> subqueryPredicates = new ArrayList<>();
//subqueryPredicates.add(builder.equal(resourceRoot.get("form").get("formId"), formRoot.get("formId")));
subqueryPredicates.add(builder.equal(resourceRoot.get("name"), FhirConstants.FHIR_QUESTIONNAIRE_TYPE));
subquery.where(builder.and(subqueryPredicates.toArray(new Predicate[0])));

// Main query predicates
List<Predicate> mainPredicates = new ArrayList<>();
mainPredicates.add(builder.equal(formRoot.get("retired"), false));
mainPredicates.add(builder.exists(subquery));

// Add predicates to the query
query.select(formRoot).where(builder.and(mainPredicates.toArray(new Predicate[0])));

List<Form> results = session.createQuery(query).getResultList();
return results.stream().map(this::deproxyResult).collect(Collectors.toList());
}

private Criteria getSearchResultCriteria(SearchParameterMap theParams) {
Criteria criteria = sessionFactory.getCurrentSession().createCriteria(typeToken.getRawType());

handleRetireable(criteria);

setupSearchParams(criteria, theParams);

return criteria;
}

@Override
protected void setupSearchParams(Criteria criteria, SearchParameterMap theParams) {
theParams.getParameters().forEach(entry -> {
Expand Down

0 comments on commit 0fb444e

Please sign in to comment.