diff --git a/src/main/java/org/upsmf/grievance/dto/SearchDateRange.java b/src/main/java/org/upsmf/grievance/dto/SearchDateRange.java new file mode 100644 index 0000000000000000000000000000000000000000..3f9dac9e4756a338d2a60280bab10129bfe54440 --- /dev/null +++ b/src/main/java/org/upsmf/grievance/dto/SearchDateRange.java @@ -0,0 +1,14 @@ +package org.upsmf.grievance.dto; + +import lombok.*; + +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +@ToString +@Builder +public class SearchDateRange { + private Long to; + private Long from; +} diff --git a/src/main/java/org/upsmf/grievance/dto/SearchRequest.java b/src/main/java/org/upsmf/grievance/dto/SearchRequest.java index 5a889cad4de77b0c5eee8cf1bd2afe25f56a7f79..38d999c93440545fb8c5110b2f1582bdc7f1ee18 100644 --- a/src/main/java/org/upsmf/grievance/dto/SearchRequest.java +++ b/src/main/java/org/upsmf/grievance/dto/SearchRequest.java @@ -20,9 +20,9 @@ public class SearchRequest { private List<String> status; - private String cc; + private Long cc; - private Timestamp date; + private SearchDateRange date; private Boolean isJunk; diff --git a/src/main/java/org/upsmf/grievance/service/impl/SearchServiceImpl.java b/src/main/java/org/upsmf/grievance/service/impl/SearchServiceImpl.java index 617935e08cc6c0398734aa431f6f4a5246a2b47c..08df1bfada3fb131a794a1793978add3a004a492 100644 --- a/src/main/java/org/upsmf/grievance/service/impl/SearchServiceImpl.java +++ b/src/main/java/org/upsmf/grievance/service/impl/SearchServiceImpl.java @@ -6,6 +6,7 @@ import org.elasticsearch.client.RequestOptions; import org.elasticsearch.index.query.BoolQueryBuilder; import org.elasticsearch.index.query.MatchQueryBuilder; import org.elasticsearch.index.query.QueryBuilders; +import org.elasticsearch.index.query.RangeQueryBuilder; import org.elasticsearch.search.SearchHit; import org.elasticsearch.search.SearchHits; import org.elasticsearch.search.builder.SearchSourceBuilder; @@ -44,30 +45,29 @@ public class SearchServiceImpl implements SearchService { public TicketResponse search(SearchRequest searchRequest) { //Calculate String keyValue = searchRequest.getSort().keySet().iterator().next(); - Pageable pageable = PageRequest.of(searchRequest.getPage(), searchRequest.getSize(), Sort.Direction.valueOf(searchRequest.getSort().get(keyValue).toUpperCase()),keyValue); + Pageable pageable = PageRequest.of(searchRequest.getPage(), searchRequest.getSize(), Sort.Direction.valueOf(searchRequest.getSort().get(keyValue).toUpperCase()), keyValue); Page<Ticket> page = esTicketRepository.findAll(pageable); return TicketResponse.builder().count(page.getTotalElements()).data(page.getContent()).build(); } + @Override public Map<String, Object> searchTickets(SearchRequest searchRequest) { //Create query for search by keyword SearchResponse searchResponse = null; String keyValue = searchRequest.getSort().keySet().iterator().next(); - if(searchRequest.getSearchKeyword()!=null && !searchRequest.getSearchKeyword().isBlank()){ - SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder() - .query(createTicketSearchQuery(searchRequest)) - .from(searchRequest.getPage()) - .size(searchRequest.getSize()) - .sort(keyValue, SortOrder.valueOf(searchRequest.getSort().get(keyValue).toUpperCase())); + SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder() + .query(createTicketSearchQuery(searchRequest)) + .from(searchRequest.getPage()) + .size(searchRequest.getSize()) + .sort(keyValue, SortOrder.valueOf(searchRequest.getSort().get(keyValue).toUpperCase())); - org.elasticsearch.action.search.SearchRequest search = new org.elasticsearch.action.search.SearchRequest("ticket"); - search.searchType(SearchType.QUERY_THEN_FETCH); - search.source(searchSourceBuilder); - try { - searchResponse = esConfig.elasticsearchClient().search(search, RequestOptions.DEFAULT); - } catch (IOException e) { - throw new RuntimeException(e); - } + org.elasticsearch.action.search.SearchRequest search = new org.elasticsearch.action.search.SearchRequest("ticket"); + search.searchType(SearchType.QUERY_THEN_FETCH); + search.source(searchSourceBuilder); + try { + searchResponse = esConfig.elasticsearchClient().search(search, RequestOptions.DEFAULT); + } catch (IOException e) { + throw new RuntimeException(e); } Map<String, Object> response = new HashMap<>(); List<Object> results = getDocumentsFromSearchResult(searchResponse); @@ -88,10 +88,11 @@ public class SearchServiceImpl implements SearchService { } return documents; } + private BoolQueryBuilder createTicketSearchQuery(SearchRequest searchRequest) { BoolQueryBuilder finalQuery = QueryBuilders.boolQuery(); // search by keyword - if(searchRequest.getSearchKeyword() != null && !searchRequest.getSearchKeyword().isBlank()) { + if (searchRequest.getSearchKeyword() != null && !searchRequest.getSearchKeyword().isBlank()) { MatchQueryBuilder firstNameKeywordMatchQuery = QueryBuilders.matchQuery("requester_first_name", searchRequest.getSearchKeyword()); MatchQueryBuilder phoneKeywordMatchQuery = QueryBuilders.matchQuery("requester_phone", searchRequest.getSearchKeyword()); MatchQueryBuilder emailKeywordMatchQuery = QueryBuilders.matchQuery("requester_email", searchRequest.getSearchKeyword()); @@ -99,32 +100,48 @@ public class SearchServiceImpl implements SearchService { keywordSearchQuery.should(firstNameKeywordMatchQuery).should(phoneKeywordMatchQuery).should(emailKeywordMatchQuery); finalQuery.must(keywordSearchQuery); } - if(searchRequest.getCc() != null && !searchRequest.getCc().isBlank()) { - MatchQueryBuilder ccMatchQuery = QueryBuilders.matchQuery("assigned_to_id", searchRequest.getCc()); + if (searchRequest.getDate() != null && searchRequest.getDate().getFrom() != null && searchRequest.getDate().getFrom() > 0) { + RangeQueryBuilder fromTimestampMatchQuery = QueryBuilders.rangeQuery("created_date_ts").gte(searchRequest.getDate().getFrom()); + if (searchRequest.getDate().getTo() != null && searchRequest.getDate().getTo() > 0) { + fromTimestampMatchQuery.lt(searchRequest.getDate().getTo()); + } + BoolQueryBuilder timestampSearchQuery = QueryBuilders.boolQuery(); + timestampSearchQuery.must(fromTimestampMatchQuery); + finalQuery.must(timestampSearchQuery); + } + + if (searchRequest.getFilter().get("cc") != null) { + MatchQueryBuilder ccMatchQuery = QueryBuilders.matchQuery("assigned_to_id", searchRequest.getFilter().get("cc")); BoolQueryBuilder ccSearchQuery = QueryBuilders.boolQuery(); ccSearchQuery.must(ccMatchQuery); finalQuery.must(ccSearchQuery); } - if(searchRequest.getStatus() != null && !searchRequest.getStatus().isEmpty()) { - MatchQueryBuilder statusMatchQuery = QueryBuilders.matchQuery("status", searchRequest.getStatus()); - BoolQueryBuilder statusSearchQuery = QueryBuilders.boolQuery(); - statusSearchQuery.must(statusMatchQuery); - finalQuery.must(statusSearchQuery); + if (searchRequest.getFilter().get("status") != null ) { + List list = (List) searchRequest.getFilter().get("status"); + if(list.size()>1) { + MatchQueryBuilder statusMatchQuery = null; + BoolQueryBuilder statusSearchQuery = QueryBuilders.boolQuery(); + for(int i=0;i<list.size();i++){ + statusMatchQuery = QueryBuilders.matchQuery("status", list.get(i)); + statusSearchQuery.should(statusMatchQuery); + } + finalQuery.must(statusSearchQuery); + } } - if(searchRequest.getIsJunk() != null) { - MatchQueryBuilder junkMatchQuery = QueryBuilders.matchQuery("is_junk", searchRequest.getStatus()); + if (searchRequest.getIsJunk() != null) { + MatchQueryBuilder junkMatchQuery = QueryBuilders.matchQuery("is_junk", searchRequest.getIsJunk()); BoolQueryBuilder junkSearchQuery = QueryBuilders.boolQuery(); junkSearchQuery.must(junkMatchQuery); finalQuery.must(junkSearchQuery); } - if(searchRequest.getPriority() != null) { - MatchQueryBuilder priorityMatchQuery = QueryBuilders.matchQuery("priority", searchRequest.getStatus()); + if (searchRequest.getPriority() != null) { + MatchQueryBuilder priorityMatchQuery = QueryBuilders.matchQuery("priority", searchRequest.getPriority()); BoolQueryBuilder prioritySearchQuery = QueryBuilders.boolQuery(); prioritySearchQuery.must(priorityMatchQuery); finalQuery.must(prioritySearchQuery); } - if(searchRequest.getIsEscalated() != null) { - MatchQueryBuilder esclatedMatchQuery = QueryBuilders.matchQuery("is_escalated", searchRequest.getStatus()); + if (searchRequest.getIsEscalated() != null) { + MatchQueryBuilder esclatedMatchQuery = QueryBuilders.matchQuery("is_escalated", searchRequest.getIsEscalated()); BoolQueryBuilder esclatedSearchQuery = QueryBuilders.boolQuery(); esclatedSearchQuery.must(esclatedMatchQuery); finalQuery.must(esclatedSearchQuery);