Skip to content

Commit

Permalink
HCMPRE-2212 making facilityId in plan search a set for multiple drop …
Browse files Browse the repository at this point in the history
…down search, changes filterMap signature.
  • Loading branch information
Priyanka-eGov committed Jan 28, 2025
1 parent fcce569 commit 06f635d
Show file tree
Hide file tree
Showing 5 changed files with 70 additions and 24 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,7 @@ private List<String> queryDatabaseForPlanIds(PlanSearchCriteria planSearchCriter
List<Object> preparedStmtList = new ArrayList<>();
String query = planQueryBuilder.getPlanSearchQuery(planSearchCriteria, preparedStmtList);
log.info("Plan search query: " + query);
log.info("PreparedStatment List " + preparedStmtList);
return jdbcTemplate.query(query, new SingleColumnRowMapper<>(String.class), preparedStmtList.toArray());
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,7 @@
import org.springframework.util.CollectionUtils;
import org.springframework.util.ObjectUtils;

import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.*;

@Component
public class PlanQueryBuilder {
Expand Down Expand Up @@ -172,13 +169,22 @@ private String buildPlanSearchQuery(PlanSearchCriteria planSearchCriteria, List<
queryUtil.addToPreparedStatement(preparedStmtList, planSearchCriteria.getJurisdiction());
}

if(!CollectionUtils.isEmpty(planSearchCriteria.getFiltersMap())) {
queryUtil.addClauseIfRequired(builder, preparedStmtList);
builder.append(" additional_details @> CAST( ? AS jsonb )");
String partialQueryJsonString = queryUtil.preparePartialJsonStringFromFilterMap(planSearchCriteria.getFiltersMap());
preparedStmtList.add(partialQueryJsonString);
if (!CollectionUtils.isEmpty(planSearchCriteria.getFiltersMap())) {
Map<String, Set<String>> filtersMap = planSearchCriteria.getFiltersMap();
for (String key : filtersMap.keySet()) {
if ("facilityId".equals(key)) {
String partialQueryJsonString = queryUtil.preparePartialJsonStringFromFilterMap(planSearchCriteria.getFiltersMap(), preparedStmtList);
builder.append(partialQueryJsonString);
} else {
queryUtil.addClauseIfRequired(builder, preparedStmtList);
builder.append(" additional_details @> CAST( ? AS jsonb )");
String partialQueryJsonString = queryUtil.preparePartialJsonStringFromFilterMap(planSearchCriteria.getFiltersMap(), preparedStmtList);
preparedStmtList.add(partialQueryJsonString);
}
}
}


StringBuilder countQuery = new StringBuilder();
if (isCount) {

Expand All @@ -191,7 +197,7 @@ private String buildPlanSearchQuery(PlanSearchCriteria planSearchCriteria, List<
if (isStatusCount) {
return PLAN_STATUS_COUNT_QUERY.replace("{INTERNAL_QUERY}", builder);
}

System.out.println(preparedStmtList);
return builder.toString();
}

Expand All @@ -205,7 +211,7 @@ private String getPaginatedQuery(String query, PlanSearchCriteria planSearchCrit
// Append limit
paginatedQuery.append(" LIMIT ? ");
preparedStmtList.add(ObjectUtils.isEmpty(planSearchCriteria.getLimit()) ? config.getDefaultLimit() : planSearchCriteria.getLimit());

System.out.println(preparedStmtList);
return paginatedQuery.toString();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -192,16 +192,16 @@ public void enrichSearchRequest(PlanFacilitySearchRequest planFacilitySearchRequ
PlanFacilitySearchCriteria planFacilitySearchCriteria = planFacilitySearchRequest.getPlanFacilitySearchCriteria();

// Filter map for filtering facility meta data present in additional details
Map<String, Set<String>> filtersMap = new LinkedHashMap<>();
Map<String, String> filtersMap = new LinkedHashMap<>();

// Add facility status as a filter if present in search criteria
if(!ObjectUtils.isEmpty(planFacilitySearchCriteria.getFacilityStatus())) {
filtersMap.put(FACILITY_STATUS_SEARCH_PARAMETER_KEY, Collections.singleton(planFacilitySearchCriteria.getFacilityStatus()));
filtersMap.put(FACILITY_STATUS_SEARCH_PARAMETER_KEY, planFacilitySearchCriteria.getFacilityStatus());
}

// Add facility type as a filter if present in search criteria
if(!ObjectUtils.isEmpty(planFacilitySearchCriteria.getFacilityType())) {
filtersMap.put(FACILITY_TYPE_SEARCH_PARAMETER_KEY, Collections.singleton(planFacilitySearchCriteria.getFacilityType()));
filtersMap.put(FACILITY_TYPE_SEARCH_PARAMETER_KEY, planFacilitySearchCriteria.getFacilityType());
}

if(!CollectionUtils.isEmpty(filtersMap))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,7 @@
import org.springframework.util.ObjectUtils;

import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.*;
import java.util.stream.IntStream;

import static digit.config.ServiceConstants.DOT_REGEX;
Expand Down Expand Up @@ -102,7 +99,7 @@ public String addOrderByClause(String query, String orderByClause) {
* @param filterMap
* @return
*/
public String preparePartialJsonStringFromFilterMap(Map<String, Set<String>> filterMap) {
public String preparePartialJsonStringFromFilterMap(Map<String, String> filterMap) {
Map<String, Object> queryMap = new HashMap<>();

filterMap.keySet().forEach(key -> {
Expand All @@ -121,6 +118,48 @@ public String preparePartialJsonStringFromFilterMap(Map<String, Set<String>> fil
return partialJsonQueryString;
}

public String preparePartialJsonStringFromFilterMap(Map<String, Set<String>> filterMap, List<Object> preparedStmtList) {
Map<String, Object> queryMap = new HashMap<>();
StringBuilder finalJsonQuery = new StringBuilder();

for (String key : filterMap.keySet()) {
// Handle nested keys (dot separator)
if (key.contains(DOT_SEPARATOR)) {
String[] keyArray = key.split(DOT_REGEX);
Map<String, Object> nestedQueryMap = new HashMap<>();
prepareNestedQueryMap(0, keyArray, nestedQueryMap, String.valueOf(filterMap.get(key)));
queryMap.put(keyArray[0], nestedQueryMap.get(keyArray[0]));
return gson.toJson(queryMap);
} else if ("facilityId".equals(key)) {
Set<String> values = filterMap.get(key);
if (values != null && !values.isEmpty()) {
StringBuilder orClauseBuilder = new StringBuilder();

// For each value, add an OR condition with a placeholder for the value
for (String value : values) {
if (orClauseBuilder.length() > 0) {
orClauseBuilder.append(" OR ");
}
// Add the condition for the key-value pair
orClauseBuilder.append("additional_details @> ?::jsonb");
// Add the actual value in the format { "facilityId": "value" }
preparedStmtList.add("{\"" + key + "\": \"" + value + "\"}");
}

// Append the OR clause as part of the AND conditions
finalJsonQuery.append(" AND (").append(orClauseBuilder.toString()).append(") ");
return finalJsonQuery.toString(); // Return the query with OR conditions for facilityId
}
} else {
queryMap.put(key, filterMap.get(key).toString());
}
}

return gson.toJson(queryMap);
// Return the dynamically constructed query string
}


/**
* Tail recursive method to prepare n-level nested partial json for queries on nested data in
* master data. For e.g. , if the key is in the format a.b.c, it will construct a nested json
Expand All @@ -129,24 +168,24 @@ public String preparePartialJsonStringFromFilterMap(Map<String, Set<String>> fil
* @param index
* @param nestedKeyArray
* @param currentQueryMap
* @param values
* @param value
*/
private void prepareNestedQueryMap(int index, String[] nestedKeyArray, Map<String, Object> currentQueryMap, Set<String> values) {
private void prepareNestedQueryMap(int index, String[] nestedKeyArray, Map<String, Object> currentQueryMap, String value) {
// Return when all levels have been reached.
if (index == nestedKeyArray.length)
return;

// For the final level simply put the value in the map.
else if (index == nestedKeyArray.length - 1) {
currentQueryMap.put(nestedKeyArray[index], values);
currentQueryMap.put(nestedKeyArray[index], value);
return;
}

// For non terminal levels, add a child map.
currentQueryMap.put(nestedKeyArray[index], new HashMap<>());

// Make a recursive call to enrich data in next level.
prepareNestedQueryMap(index + 1, nestedKeyArray, (Map<String, Object>) currentQueryMap.get(nestedKeyArray[index]), values);
prepareNestedQueryMap(index + 1, nestedKeyArray, (Map<String, Object>) currentQueryMap.get(nestedKeyArray[index]), value);
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,6 @@ public class PlanFacilitySearchCriteria {
private Integer limit = null;

@JsonIgnore
private Map<String, Set<String>> filtersMap = null;
private Map<String, String> filtersMap = null;

}

0 comments on commit 06f635d

Please sign in to comment.