Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update InboxQueryBuilder.java for ethopia staging #658

Open
wants to merge 16 commits into
base: hcm-mdms-v2
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@

import static org.egov.inbox.util.InboxConstants.*;


@Slf4j
@Component
public class InboxQueryBuilder implements QueryBuilderInterface {
Expand All @@ -31,62 +30,76 @@ public class InboxQueryBuilder implements QueryBuilderInterface {
@Autowired
private MDMSUtil mdmsUtil;


@Override
public Map<String, Object> getESQuery(InboxRequest inboxRequest, Boolean isPaginationRequired) {

InboxQueryConfiguration configuration = mdmsUtil.getConfigFromMDMS(inboxRequest.getInbox().getTenantId(), inboxRequest.getInbox().getProcessSearchCriteria().getModuleName());
InboxQueryConfiguration configuration = mdmsUtil.getConfigFromMDMS(inboxRequest.getInbox().getTenantId(),
inboxRequest.getInbox().getProcessSearchCriteria().getModuleName());
Map<String, Object> params = inboxRequest.getInbox().getModuleSearchCriteria();
Map<String, Object> baseEsQuery = getBaseESQueryBody(inboxRequest, isPaginationRequired);

if(isPaginationRequired) {
// Adds sort clause to the inbox ES query only in case pagination is present, else not
if (isPaginationRequired) {
// Adds sort clause to the inbox ES query only in case pagination is present,
// else not
String sortClauseFieldPath = configuration.getSortParam().getPath();
SortParam.Order sortOrder = inboxRequest.getInbox().getModuleSearchCriteria().containsKey(SORT_ORDER_CONSTANT) ? SortParam.Order.valueOf((String) inboxRequest.getInbox().getModuleSearchCriteria().get(SORT_ORDER_CONSTANT)) : configuration.getSortParam().getOrder();
SortParam.Order sortOrder = inboxRequest.getInbox().getModuleSearchCriteria()
.containsKey(SORT_ORDER_CONSTANT)
? SortParam.Order.valueOf(
(String) inboxRequest.getInbox().getModuleSearchCriteria().get(SORT_ORDER_CONSTANT))
: configuration.getSortParam().getOrder();
addSortClauseToBaseQuery(baseEsQuery, sortClauseFieldPath, sortOrder);

// Adds source filter only when requesting for inbox items.
List<String> sourceFilterPathList = configuration.getSourceFilterPathList();
addSourceFilterToBaseQuery(baseEsQuery, sourceFilterPathList);
}

Map<String, Object> innerBoolClause = (HashMap<String, Object>) ((HashMap<String, Object>) baseEsQuery.get(QUERY_KEY)).get(BOOL_KEY);
Map<String, Object> innerBoolClause = (HashMap<String, Object>) ((HashMap<String, Object>) baseEsQuery
.get(QUERY_KEY)).get(BOOL_KEY);
List<Object> mustClauseList = (ArrayList<Object>) innerBoolClause.get(MUST_KEY);

Map<String, String> nameToPathMap = new HashMap<>();
Map<String, SearchParam.Operator> nameToOperator = new HashMap<>();

System.out.println(baseEsQuery.toString());
configuration.getAllowedSearchCriteria().forEach(searchParam -> {
nameToPathMap.put(searchParam.getName(), searchParam.getPath());
nameToOperator.put(searchParam.getName(), searchParam.getOperator());
});

addModuleSearchCriteriaToBaseQuery(params, nameToPathMap, nameToOperator, mustClauseList);
addProcessSearchCriteriaToBaseQuery(inboxRequest.getInbox().getProcessSearchCriteria(), nameToPathMap, nameToOperator, mustClauseList);
addProcessSearchCriteriaToBaseQuery(inboxRequest.getInbox().getProcessSearchCriteria(),
nameToPathMap,
nameToOperator, mustClauseList);

innerBoolClause.put(MUST_KEY, mustClauseList);

log.info("Final ES Query after adding must clause: " + baseEsQuery.toString());
return baseEsQuery;
}

public Map<String, Object> getESQueryForSimpleSearch(SearchRequest searchRequest, Boolean isPaginationRequired) {

InboxQueryConfiguration configuration = mdmsUtil.getConfigFromMDMS(searchRequest.getIndexSearchCriteria().getTenantId(), searchRequest.getIndexSearchCriteria().getModuleName());
InboxQueryConfiguration configuration = mdmsUtil.getConfigFromMDMS(
searchRequest.getIndexSearchCriteria().getTenantId(),
searchRequest.getIndexSearchCriteria().getModuleName());
Map<String, Object> params = searchRequest.getIndexSearchCriteria().getModuleSearchCriteria();
Map<String, Object> baseEsQuery = getBaseESQueryBody(searchRequest, isPaginationRequired);

if(isPaginationRequired) {
// Adds sort clause to the inbox ES query only in case pagination is present, else not
if (isPaginationRequired) {
// Adds sort clause to the inbox ES query only in case pagination is present,
// else not
String sortClauseFieldPath = configuration.getSortParam().getPath();
SortParam.Order sortOrder = searchRequest.getIndexSearchCriteria().getModuleSearchCriteria().containsKey(SORT_ORDER_CONSTANT) ? SortParam.Order.valueOf((String) searchRequest.getIndexSearchCriteria().getModuleSearchCriteria().get(SORT_ORDER_CONSTANT)) : configuration.getSortParam().getOrder();
SortParam.Order sortOrder = searchRequest.getIndexSearchCriteria().getModuleSearchCriteria()
.containsKey(SORT_ORDER_CONSTANT)
? SortParam.Order.valueOf((String) searchRequest.getIndexSearchCriteria()
.getModuleSearchCriteria().get(SORT_ORDER_CONSTANT))
: configuration.getSortParam().getOrder();
addSortClauseToBaseQuery(baseEsQuery, sortClauseFieldPath, sortOrder);

// Adds source filter only when requesting for inbox items.
List<String> sourceFilterPathList = configuration.getSourceFilterPathList();
addSourceFilterToBaseQuery(baseEsQuery, sourceFilterPathList);
}

Map<String, Object> innerBoolClause = (HashMap<String, Object>) ((HashMap<String, Object>) baseEsQuery.get(QUERY_KEY)).get(BOOL_KEY);
Map<String, Object> innerBoolClause = (HashMap<String, Object>) ((HashMap<String, Object>) baseEsQuery
.get(QUERY_KEY)).get(BOOL_KEY);
List<Object> mustClauseList = (ArrayList<Object>) innerBoolClause.get(MUST_KEY);

Map<String, String> nameToPathMap = new HashMap<>();
Expand All @@ -105,11 +118,12 @@ public Map<String, Object> getESQueryForSimpleSearch(SearchRequest searchRequest
}

private void addSourceFilterToBaseQuery(Map<String, Object> baseEsQuery, List<String> sourceFilterPathList) {
if(!CollectionUtils.isEmpty(sourceFilterPathList))
if (!CollectionUtils.isEmpty(sourceFilterPathList))
baseEsQuery.put(SOURCE_KEY, sourceFilterPathList);
}

private void addSortClauseToBaseQuery(Map<String, Object> baseEsQuery, String sortClauseFieldPath, SortParam.Order sortOrder) {
private void addSortClauseToBaseQuery(Map<String, Object> baseEsQuery, String sortClauseFieldPath,
SortParam.Order sortOrder) {
List<Map> sortClause = new ArrayList<>();
Map<String, Object> innerSortOrderClause = new HashMap<>();
innerSortOrderClause.put(ORDER_KEY, sortOrder);
Expand All @@ -119,82 +133,78 @@ private void addSortClauseToBaseQuery(Map<String, Object> baseEsQuery, String so
baseEsQuery.put(SORT_KEY, sortClause);
}

private void addProcessSearchCriteriaToBaseQuery(ProcessInstanceSearchCriteria processSearchCriteria, Map<String, String> nameToPathMap, Map<String, SearchParam.Operator> nameToOperator, List<Object> mustClauseList) {
if(!ObjectUtils.isEmpty(processSearchCriteria.getTenantId())){
String key = "tenantId";
Map<String, Object> mustClauseChild = null;
Map<String, Object> params = new HashMap<>();
params.put(key, processSearchCriteria.getTenantId());
mustClauseChild = (Map<String, Object>) prepareMustClauseChild(params, key, nameToPathMap, nameToOperator);
if(CollectionUtils.isEmpty(mustClauseChild)){
log.info("Error occurred while preparing filter for must clause. Filter for key " + key + " will not be added.");
}else {
mustClauseList.add(mustClauseChild);
}
}
private void addProcessSearchCriteriaToBaseQuery(ProcessInstanceSearchCriteria processSearchCriteria,
Map<String, String> nameToPathMap, Map<String, SearchParam.Operator> nameToOperator,
List<Object> mustClauseList) {

if(!ObjectUtils.isEmpty(processSearchCriteria.getStatus())){
if (!ObjectUtils.isEmpty(processSearchCriteria.getStatus())) {
String key = "status";
Map<String, Object> mustClauseChild = null;
Map<String, Object> params = new HashMap<>();
params.put(key, processSearchCriteria.getStatus());
mustClauseChild = (Map<String, Object>) prepareMustClauseChild(params, key, nameToPathMap, nameToOperator);
if(CollectionUtils.isEmpty(mustClauseChild)){
log.info("Error occurred while preparing filter for must clause. Filter for key " + key + " will not be added.");
}else {
if (CollectionUtils.isEmpty(mustClauseChild)) {
log.info("Error occurred while preparing filter for must clause. Filter for key " + key
+ " will not be added.");
} else {
mustClauseList.add(mustClauseChild);
}
}

if(!ObjectUtils.isEmpty(processSearchCriteria.getAssignee())){
if (!ObjectUtils.isEmpty(processSearchCriteria.getAssignee())) {
String key = "assignee";
Map<String, Object> mustClauseChild = null;
Map<String, Object> params = new HashMap<>();
params.put(key, processSearchCriteria.getAssignee());
mustClauseChild = (Map<String, Object>) prepareMustClauseChild(params, key, nameToPathMap, nameToOperator);
if(CollectionUtils.isEmpty(mustClauseChild)){
log.info("Error occurred while preparing filter for must clause. Filter for key " + key + " will not be added.");
}else {
if (CollectionUtils.isEmpty(mustClauseChild)) {
log.info("Error occurred while preparing filter for must clause. Filter for key " + key
+ " will not be added.");
} else {
mustClauseList.add(mustClauseChild);
}
}

if(!ObjectUtils.isEmpty(processSearchCriteria.getFromDate())){
if (!ObjectUtils.isEmpty(processSearchCriteria.getFromDate())) {
String key = "fromDate";
Map<String, Object> mustClauseChild = null;
Map<String, Object> params = new HashMap<>();
params.put(key, processSearchCriteria.getFromDate());
mustClauseChild = (Map<String, Object>) prepareMustClauseChild(params, key, nameToPathMap, nameToOperator);
if(CollectionUtils.isEmpty(mustClauseChild)){
log.info("Error occurred while preparing filter for must clause. Filter for key " + key + " will not be added.");
}else {
if (CollectionUtils.isEmpty(mustClauseChild)) {
log.info("Error occurred while preparing filter for must clause. Filter for key " + key
+ " will not be added.");
} else {
mustClauseList.add(mustClauseChild);
}
}

if(!ObjectUtils.isEmpty(processSearchCriteria.getToDate())){
if (!ObjectUtils.isEmpty(processSearchCriteria.getToDate())) {
String key = "toDate";
Map<String, Object> mustClauseChild = null;
Map<String, Object> params = new HashMap<>();
params.put(key, processSearchCriteria.getToDate());
mustClauseChild = (Map<String, Object>) prepareMustClauseChild(params, key, nameToPathMap, nameToOperator);
if(CollectionUtils.isEmpty(mustClauseChild)){
log.info("Error occurred while preparing filter for must clause. Filter for key " + key + " will not be added.");
}else {
if (CollectionUtils.isEmpty(mustClauseChild)) {
log.info("Error occurred while preparing filter for must clause. Filter for key " + key
+ " will not be added.");
} else {
mustClauseList.add(mustClauseChild);
}
}

}


private void addModuleSearchCriteriaToBaseQuery(Map<String, Object> params, Map<String, String> nameToPathMap, Map<String, SearchParam.Operator> nameToOperator, List<Object> mustClauseList) {
private void addModuleSearchCriteriaToBaseQuery(Map<String, Object> params, Map<String, String> nameToPathMap,
Map<String, SearchParam.Operator> nameToOperator, List<Object> mustClauseList) {
params.keySet().forEach(key -> {
if(!(key.equals(SORT_ORDER_CONSTANT) || key.equals(SORT_BY_CONSTANT))) {
if (!(key.equals(SORT_ORDER_CONSTANT) || key.equals(SORT_BY_CONSTANT))) {
Map<String, Object> mustClauseChild = null;
mustClauseChild = (Map<String, Object>) prepareMustClauseChild(params, key, nameToPathMap, nameToOperator);
mustClauseChild = (Map<String, Object>) prepareMustClauseChild(params, key, nameToPathMap,
nameToOperator);
if (CollectionUtils.isEmpty(mustClauseChild)) {
log.info("Error occurred while preparing filter for must clause. Filter for key " + key + " will not be added.");
log.info("Error occurred while preparing filter for must clause. Filter for key " + key
+ " will not be added.");
} else {
mustClauseList.add(mustClauseChild);
}
Expand All @@ -214,7 +224,7 @@ public Map<String, Object> getNearingSlaCountQuery(InboxRequest inboxRequest, Lo
Map<String, Object> baseEsQuery = getESQuery(inboxRequest, Boolean.FALSE);
Long currenTimeInMillis = System.currentTimeMillis();
Long lteParam = currenTimeInMillis;
Long slotLimit = businessServiceSla - 40 * (businessServiceSla/100);
Long slotLimit = businessServiceSla - 40 * (businessServiceSla / 100);
Long gteParam = currenTimeInMillis - slotLimit;

appendNearingSlaCountClause(baseEsQuery, gteParam, lteParam);
Expand Down Expand Up @@ -243,7 +253,7 @@ private void appendStatusCountAggsNode(Map<String, Object> baseEsQuery) {
baseEsQuery.put("aggs", aggsNode);
}

private Map<String, Object> getBaseESQueryBody(InboxRequest inboxRequest, Boolean isPaginationRequired){
private Map<String, Object> getBaseESQueryBody(InboxRequest inboxRequest, Boolean isPaginationRequired) {
Map<String, Object> baseEsQuery = new HashMap<>();
Map<String, Object> boolQuery = new HashMap<>();
Map<String, Object> mustClause = new HashMap<>();
Expand All @@ -254,7 +264,7 @@ private Map<String, Object> getBaseESQueryBody(InboxRequest inboxRequest, Boolea
innerBoolBody.put("must", new ArrayList<>());

// Prepare base ES query
if(isPaginationRequired) {
if (isPaginationRequired) {
baseEsQuery.put("from", inboxRequest.getInbox().getOffset());
baseEsQuery.put("size", inboxRequest.getInbox().getLimit());
}
Expand All @@ -263,7 +273,7 @@ private Map<String, Object> getBaseESQueryBody(InboxRequest inboxRequest, Boolea
return baseEsQuery;
}

private Map<String, Object> getBaseESQueryBody(SearchRequest searchRequest, Boolean isPaginationRequired){
private Map<String, Object> getBaseESQueryBody(SearchRequest searchRequest, Boolean isPaginationRequired) {
Map<String, Object> baseEsQuery = new HashMap<>();
Map<String, Object> boolQuery = new HashMap<>();

Expand All @@ -273,7 +283,7 @@ private Map<String, Object> getBaseESQueryBody(SearchRequest searchRequest, Bool
innerBoolBody.put("must", new ArrayList<>());

// Prepare base ES query
if(isPaginationRequired) {
if (isPaginationRequired) {
baseEsQuery.put("from", searchRequest.getIndexSearchCriteria().getOffset());
baseEsQuery.put("size", searchRequest.getIndexSearchCriteria().getLimit());
}
Expand All @@ -282,46 +292,45 @@ private Map<String, Object> getBaseESQueryBody(SearchRequest searchRequest, Bool
return baseEsQuery;
}

private Object prepareMustClauseChild(Map<String, Object> params, String key, Map<String, String> nameToPathMap, Map<String, SearchParam.Operator> nameToOperatorMap){
private Object prepareMustClauseChild(Map<String, Object> params, String key, Map<String, String> nameToPathMap,
Map<String, SearchParam.Operator> nameToOperatorMap) {

SearchParam.Operator operator = nameToOperatorMap.get(key);
if(operator == null || operator.equals(SearchParam.Operator.EQUAL)){
if (operator == null || operator.equals(SearchParam.Operator.EQUAL)) {
// Add terms clause in case the search criteria has a list of values
if(params.get(key) instanceof List){
if (params.get(key) instanceof List) {
Map<String, Object> termsClause = new HashMap<>();
termsClause.put("terms", new HashMap<>());
Map<String, Object> innerTermsClause = (Map<String, Object>) termsClause.get("terms");
innerTermsClause.put(addDataPathToSearchParamKey(key, nameToPathMap), params.get(key));
return termsClause;
}
// Add term clause in case the search criteria has a single value
else{
else {
Map<String, Object> termClause = new HashMap<>();
termClause.put("term", new HashMap<>());
Map<String, Object> innerTermClause = (Map<String, Object>) termClause.get("term");
innerTermClause.put(addDataPathToSearchParamKey(key, nameToPathMap), params.get(key));
return termClause;
}
}
else {
} else {
Map<String, Object> rangeClause = new HashMap<>();
rangeClause.put("range", new HashMap<>());
Map<String, Object> innerTermClause = (Map<String, Object>) rangeClause.get("range");
Map<String, Object> comparatorMap = new HashMap<>();

if (operator.equals(SearchParam.Operator.LTE)){
comparatorMap.put("lte",params.get(key));
}
else if (operator.equals(SearchParam.Operator.GTE)){
comparatorMap.put("gte",params.get(key));
if (operator.equals(SearchParam.Operator.LTE)) {
comparatorMap.put("lte", params.get(key));
} else if (operator.equals(SearchParam.Operator.GTE)) {
comparatorMap.put("gte", params.get(key));
}
innerTermClause.put(addDataPathToSearchParamKey(key, nameToPathMap), comparatorMap);
return rangeClause;
}

}

private String addDataPathToSearchParamKey(String key, Map<String, String> nameToPathMap){
private String addDataPathToSearchParamKey(String key, Map<String, String> nameToPathMap) {

String path = nameToPathMap.get(key);

Expand Down
Loading