diff --git a/api/src/main/java/org/openmrs/module/fhir2/api/dao/impl/FhirQuestionnaireDaoImpl.java b/api/src/main/java/org/openmrs/module/fhir2/api/dao/impl/FhirQuestionnaireDaoImpl.java index 49405fbbb..ac05c1f5d 100644 --- a/api/src/main/java/org/openmrs/module/fhir2/api/dao/impl/FhirQuestionnaireDaoImpl.java +++ b/api/src/main/java/org/openmrs/module/fhir2/api/dao/impl/FhirQuestionnaireDaoImpl.java @@ -63,31 +63,32 @@ public List
getQuestionnairesByIds(@Nonnull Collection ids) { public List getSearchResults(@Nonnull SearchParameterMap theParams) { Session session = sessionFactory.openSession(); session.beginTransaction(); - + // Create CriteriaBuilder CriteriaBuilder builder = session.getCriteriaBuilder(); - + // Create CriteriaQuery for main query CriteriaQuery query = builder.createQuery(Form.class); Root formRoot = query.from(Form.class); formRoot.alias("f"); - + // Create Subquery for FormResource Subquery subquery = query.subquery(Long.class); Root 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 subqueryPredicates = new ArrayList<>(); - //subqueryPredicates.add(builder.equal(resourceRoot.get("form").get("formId"), formRoot.get("formId"))); + 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 mainPredicates = new ArrayList<>(); + setupSearchParams(mainPredicates, builder, formRoot, theParams); 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]))); @@ -104,20 +105,19 @@ private Criteria getSearchResultCriteria(SearchParameterMap theParams) { return criteria; } - - @Override - protected void setupSearchParams(Criteria criteria, SearchParameterMap theParams) { + + protected void setupSearchParams(List predicates, CriteriaBuilder builder, Root root, + SearchParameterMap theParams) { theParams.getParameters().forEach(entry -> { switch (entry.getKey()) { case FhirConstants.NAME_SEARCH_HANDLER: - entry.getValue().forEach(param -> handleName(criteria, (StringAndListParam) param.getParam())); + entry.getValue().forEach(param -> { + ((StringAndListParam) param.getParam()).getValuesAsQueryTokens().stream().forEach(l -> l.getValuesAsQueryTokens().stream().forEach(v -> { + predicates.add(builder.equal(root.get("name"), v.getValue())); + })); + }); break; } }); } - - private void handleName(Criteria criteria, StringAndListParam namePattern) { - handleAndListParam(namePattern, (name) -> propertyLike("name", name)).ifPresent(criteria::add); - } - }