An error occurred while loading the file. Please try again.
-
Darshan M N authored7bb90598
package com.tarento.analytics.dao.impl;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.stream.Collectors;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.HttpHost;
import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.search.MultiSearchRequest;
import org.elasticsearch.action.search.MultiSearchResponse;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.ExistsQueryBuilder;
import org.elasticsearch.index.query.MatchQueryBuilder;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.RangeQueryBuilder;
import org.elasticsearch.index.query.TermQueryBuilder;
import org.elasticsearch.index.query.TermsQueryBuilder;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.aggregations.AggregationBuilder;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.BucketOrder;
import org.elasticsearch.search.aggregations.PipelineAggregationBuilder;
import org.elasticsearch.search.aggregations.bucket.histogram.DateHistogramAggregationBuilder;
import org.elasticsearch.search.aggregations.bucket.histogram.DateHistogramInterval;
import org.elasticsearch.search.aggregations.bucket.histogram.ExtendedBounds;
import org.elasticsearch.search.aggregations.bucket.nested.NestedAggregationBuilder;
import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder;
import org.elasticsearch.search.aggregations.metrics.avg.AvgAggregationBuilder;
import org.elasticsearch.search.aggregations.metrics.sum.SumAggregationBuilder;
import org.elasticsearch.search.aggregations.metrics.valuecount.ValueCountAggregationBuilder;
import org.elasticsearch.search.aggregations.pipeline.cumulativesum.CumulativeSumPipelineAggregationBuilder;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.sort.SortBuilder;
import org.elasticsearch.search.sort.SortBuilders;
import org.elasticsearch.search.sort.SortOrder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.tarento.analytics.constant.ElasticSearchConstants;
import com.tarento.analytics.dao.ElasticSearchDao;
import com.tarento.analytics.dto.AggregateRequestDto;
import com.tarento.analytics.dto.SearchDto;
import com.tarento.analytics.model.ElasticSearchDictator;
import com.tarento.analytics.utils.ElasticProperties;
import com.tarento.analytics.utils.ElasticSearchClient;
@Component
public class ElasticSearchDaoImpl implements ElasticSearchDao {
7172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
@Autowired
private ElasticSearchClient elasticSearchClient;
@Autowired
public ObjectMapper mapper;
private static String elasticHost;
private static int elasticPort;
private static final String REST_SCHEME = "http";
private static final String REST_SCHEME2 = "https";
private static RestHighLevelClient client;
private static RestHighLevelClient alternateClient;
private String indexName;
private String docType;
public String getIndexName() {
return indexName;
}
public void setIndexName(String indexName) {
this.indexName = indexName;
}
public String getDocType() {
return docType;
}
public void setDocType(String docType) {
this.docType = docType;
}
public static final Logger logger = LoggerFactory.getLogger(ElasticSearchDaoImpl.class);
public ElasticSearchDaoImpl(@Value("${services.esindexer.primary.host.name}") String elasticsearchHost,
@Value("${services.esindexer.primary.host.port}") int elasticsearchPort) {
elasticHost = elasticsearchHost;
elasticPort = elasticsearchPort;
client = getClientForElastic();
}
@Override
public Map<String, Object> getDataByIdentifier(String index, String type, String identifier) {
RestHighLevelClient restHighLevelClient = elasticSearchClient.getClient();
long startTime = System.currentTimeMillis();
logger.info("ElasticSearchUtil getDataByIdentifier method started at == {} for Type {} ", startTime, type);
GetResponse response = null;
try {
if (StringUtils.isBlank(index) || StringUtils.isBlank(identifier)) {
logger.error("Invalid request is coming.");
return new HashMap<>();
} else if (StringUtils.isBlank(type)) {
response = restHighLevelClient.get(new GetRequest(index).type(type));
} else {
response = restHighLevelClient.get(new GetRequest(index, type, identifier));
}
if (response == null || null == response.getSource()) {
return new HashMap<>();
}
long stopTime = System.currentTimeMillis();
long elapsedTime = stopTime - startTime;
logger.info(
"ElasticSearchUtil getDataByIdentifier method end at == {} for Type {} , Total time elapsed = {} ",
stopTime, type, elapsedTime);
return response.getSource();
} catch (IOException ex) {
logger.error("Exception in getDataByIdentifier {} ", ex.getMessage());
} finally {
141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
try {
restHighLevelClient.close();
} catch (IOException e) {
logger.error("Exception in getDataByIdentifier {} ", e.getMessage());
}
}
return null;
}
@Override
public Map<String, Object> searchData(String index, String type, Map<String, Object> searchData) {
RestHighLevelClient client = elasticSearchClient.getClient();
long startTime = System.currentTimeMillis();
logger.info("ElasticSearchUtil searchData method started at == {} for Type {} ", startTime, type);
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
Iterator<Entry<String, Object>> itr = searchData.entrySet().iterator();
while (itr.hasNext()) {
Entry<String, Object> entry = itr.next();
sourceBuilder.query(QueryBuilders.commonTermsQuery(entry.getKey(), entry.getValue()));
}
SearchResponse sr = null;
try {
sr = client.search(new SearchRequest(index).types(type).source(sourceBuilder));
} catch (IOException ex) {
logger.error("Error while execution in Elasticsearch", ex);
}
if (sr != null && (sr.getHits() == null || sr.getHits().getTotalHits() == 0)) {
return new HashMap<>();
}
sr.getHits().getAt(0).getSourceAsMap();
long stopTime = System.currentTimeMillis();
long elapsedTime = stopTime - startTime;
logger.info("ElasticSearchUtil searchData method end at == {} for Type {} ,Total time elapsed = {} ",
stopTime, type, elapsedTime);
try {
client.close();
} catch (IOException e) {
logger.error("Error while closing the client");
}
return sr.getAggregations().asList().get(0).getMetaData();
}
@SuppressWarnings("rawtypes")
@Override
public Map<String, Object> complexSearch(SearchDto searchDTO, String index, String... type) {
RestHighLevelClient restHighLevelClient = elasticSearchClient.getClient();
long startTime = System.currentTimeMillis();
logger.info("ElasticSearchUtil complexSearch method started at == {} ", startTime);
// Map<String, Float> constraintsMap = getConstraints(searchDTO);
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder().size(0);
BoolQueryBuilder query = new BoolQueryBuilder();
if (!StringUtils.isBlank(searchDTO.getQuery())) {
query.must(QueryBuilders.simpleQueryStringQuery(searchDTO.getQuery()).field("all_fields"));
}
// apply sorting
if (searchDTO.getSortBy() != null && searchDTO.getSortBy().size() > 0) {
for (Map.Entry<String, String> entry : searchDTO.getSortBy().entrySet()) {
SortBuilder sortB = SortBuilders.fieldSort(entry.getKey()).order(getSortOrder(entry.getValue()));
searchSourceBuilder.sort(sortB);
211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
}
}
// apply the fields filter
searchSourceBuilder.fetchSource(
searchDTO.getFields() != null ? searchDTO.getFields().stream().toArray(String[]::new) : null,
searchDTO.getExcludedFields() != null ? searchDTO.getExcludedFields().stream().toArray(String[]::new)
: null);
// setting the offset
if (searchDTO.getOffset() != null) {
searchSourceBuilder.from(searchDTO.getOffset());
}
// setting the limit
if (searchDTO.getLimit() != null) {
searchSourceBuilder.size(searchDTO.getLimit());
}
// apply additional properties
if (searchDTO.getAdditionalProperties() != null && searchDTO.getAdditionalProperties().size() > 0) {
for (Map.Entry<String, Object> entry : searchDTO.getAdditionalProperties().entrySet()) {
addAdditionalProperties(query, entry);
}
}
searchSourceBuilder.query(query);
if (null != searchDTO.getFacets() && !searchDTO.getFacets().isEmpty()) {
// addAggregations(searchSourceBuilder, searchDTO.getFacets());
}
logger.info("calling search builder====== {} ", searchSourceBuilder);
SearchResponse response = null;
SearchRequest searchReq = new SearchRequest(index).types(type).source(searchSourceBuilder);
List<Map<String, Object>> esSource = new ArrayList<>();
try {
response = restHighLevelClient.search(searchReq);
if (response != null) {
SearchHits hits = response.getHits();
for (SearchHit hit : hits) {
esSource.add(hit.getSourceAsMap());
}
}
} catch (IOException e) {
logger.error("Exception in complexSearch {} ", e.getMessage());
}
return null;
}
@SuppressWarnings("unchecked")
private void addAggregations(SearchSourceBuilder searchSourceBuilder, Map<String, Object> aggregations) {
long startTime = System.currentTimeMillis();
logger.info("ElasticSearchUtil addAggregations method started at == {} ", startTime);
for (Map.Entry<String, Object> entry : aggregations.entrySet()) {
String key = entry.getKey();
String interval = "interval";
for (Map.Entry<String, Object> en : aggregations.entrySet()) {
if ("DATE_HISTOGRAM".equalsIgnoreCase(en.getKey())) {
Map<String, String> aggsVal = (Map<String, String>) en.getValue();
DateHistogramInterval dateHistogramInterval = null;
if (aggsVal.get(interval).equals("day")) {
dateHistogramInterval = DateHistogramInterval.DAY;
} else if (aggsVal.get(interval).equals("hour")) {
dateHistogramInterval = DateHistogramInterval.HOUR;
} else if (aggsVal.get(interval).equals("month")) {
281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350
dateHistogramInterval = DateHistogramInterval.MONTH;
} else if (aggsVal.get(interval).equals("year")) {
dateHistogramInterval = DateHistogramInterval.YEAR;
}
searchSourceBuilder.aggregation(AggregationBuilders.dateHistogram(key).field(aggsVal.get("field"))
.dateHistogramInterval(dateHistogramInterval));
}
/*
* else if ("TERMS".equalsIgnoreCase(en.getKey())) { Map<String, String> aggVal
* = (Map<String, String>) en.getValue(); for (Map.Entry<String, String> entryS
* : aggVal.entrySet()) { searchSourceBuilder.aggregation(AggregationBuilders.
* dateHistogram(key).field(aggsVal.get("field")) .dateHistogramInterval(Date));
* } }
*/
}
}
long stopTime = System.currentTimeMillis();
long elapsedTime = stopTime - startTime;
logger.info("ElasticSearchUtil addAggregations method end at == {} ,Total time elapsed = {} ", stopTime,
elapsedTime);
}
@SuppressWarnings("unchecked")
private void addAdditionalProperties(BoolQueryBuilder query, Entry<String, Object> entry) {
long startTime = System.currentTimeMillis();
logger.info("ElasticSearchUtil addAdditionalProperties method started at == {} ", startTime);
String key = entry.getKey();
if (key.equalsIgnoreCase("FILTERS")) {
Map<String, Object> filters = (Map<String, Object>) entry.getValue();
for (Map.Entry<String, Object> en : filters.entrySet()) {
createFilterESOpperation(en, query);
}
} else if (key.equalsIgnoreCase("EXISTS") || key.equalsIgnoreCase("NOT_EXISTS")) {
createESOpperation(entry, query);
}
long stopTime = System.currentTimeMillis();
long elapsedTime = stopTime - startTime;
logger.info("ElasticSearchUtil addAdditionalProperties method end at == {} ,Total time elapsed = {}", stopTime,
elapsedTime);
}
/** Method to create EXISTS and NOT EXIST FILTER QUERY . */
@SuppressWarnings("unchecked")
private void createESOpperation(Entry<String, Object> entry, BoolQueryBuilder query) {
String operation = entry.getKey();
List<String> existsList = (List<String>) entry.getValue();
if (operation.equalsIgnoreCase("EXISTS")) {
for (String name : existsList) {
query.must(createExistQuery(name));
}
} else if (operation.equalsIgnoreCase("NOT_EXISTS")) {
for (String name : existsList) {
query.mustNot(createExistQuery(name));
}
}
}
/** Method to create CommonTermQuery , multimatch and Range Query. */
@SuppressWarnings("unchecked")
private void createFilterESOpperation(Entry<String, Object> entry, BoolQueryBuilder query) {
String key = entry.getKey();
351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420
Object val = entry.getValue();
if (val instanceof List) {
if (!((List) val).isEmpty()) {
if (((List) val).get(0) instanceof String) {
((List<String>) val).replaceAll(String::toLowerCase);
query.must(createTermsQuery(key, (List<String>) val));
} else {
query.must(createTermsQuery(key, (List) val));
}
}
} else if (val instanceof Map) {
Map<String, Object> value = (Map<String, Object>) val;
Map<String, Object> rangeOperation = new HashMap<>();
Map<String, Object> lexicalOperation = new HashMap<>();
for (Map.Entry<String, Object> it : value.entrySet()) {
String operation = it.getKey();
if (operation.startsWith(ElasticSearchConstants.LT)
|| operation.startsWith(ElasticSearchConstants.GT)) {
rangeOperation.put(operation, it.getValue());
} else if (operation.startsWith(ElasticSearchConstants.STARTS_WITH)
|| operation.startsWith(ElasticSearchConstants.ENDS_WITH)) {
lexicalOperation.put(operation, it.getValue());
}
}
if (!(rangeOperation.isEmpty())) {
query.must(createRangeQuery(key, rangeOperation));
}
if (!(lexicalOperation.isEmpty())) {
query.must(createLexicalQuery(key, lexicalOperation));
}
} else if (val instanceof String) {
query.must(createTermQuery(key, ((String) val).toLowerCase()));
} else {
query.must(createTermQuery(key, val));
}
}
private static TermQueryBuilder createTermQuery(String name, Object text) {
return QueryBuilders.termQuery(name, text);
}
@SuppressWarnings("unchecked")
private static TermsQueryBuilder createTermsQuery(String key, List values) {
return QueryBuilders.termsQuery(key, (values).stream().toArray(Object[]::new));
}
private static Map<String, Float> getConstraints(SearchDto searchDTO) {
if (null != searchDTO.getSoftConstraints() && !searchDTO.getSoftConstraints().isEmpty()) {
return searchDTO.getSoftConstraints().entrySet().stream()
.collect(Collectors.toMap(e -> e.getKey(), e -> e.getValue().floatValue()));
}
return Collections.emptyMap();
}
@Override
public boolean healthCheck() {
return false;
}
/// New Methods for Elastic Search Query Builders
private RangeQueryBuilder createRangeQuery(String name, Map<String, Object> rangeOperation) {
RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery(name);
for (Map.Entry<String, Object> it : rangeOperation.entrySet()) {
421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490
if (it.getKey().equalsIgnoreCase(ElasticSearchConstants.LTE)) {
rangeQueryBuilder.lte(it.getValue());
} else if (it.getKey().equalsIgnoreCase(ElasticSearchConstants.LT)) {
rangeQueryBuilder.lt(it.getValue());
} else if (it.getKey().equalsIgnoreCase(ElasticSearchConstants.GTE)) {
rangeQueryBuilder.gte(it.getValue());
} else if (it.getKey().equalsIgnoreCase(ElasticSearchConstants.GT)) {
rangeQueryBuilder.gt(it.getValue());
}
}
return rangeQueryBuilder;
}
private SortOrder getSortOrder(String value) {
return value.equalsIgnoreCase(ElasticSearchConstants.ASC_ORDER) ? SortOrder.ASC : SortOrder.DESC;
}
private QueryBuilder createLexicalQuery(String key, Map<String, Object> rangeOperation) {
QueryBuilder queryBuilder = null;
for (Map.Entry<String, Object> it : rangeOperation.entrySet()) {
if (it.getKey().equalsIgnoreCase(ElasticSearchConstants.STARTS_WITH)) {
queryBuilder = QueryBuilders.prefixQuery(key, (String) it.getValue());
} else if (it.getKey().equalsIgnoreCase(ElasticSearchConstants.ENDS_WITH)) {
String endsWithRegex = "~" + it.getValue();
queryBuilder = QueryBuilders.regexpQuery(key, endsWithRegex);
}
}
return queryBuilder;
}
private ExistsQueryBuilder createExistQuery(String name) {
return QueryBuilders.existsQuery(name);
}
/*
*
* @SuppressWarnings("unchecked")
*
* @Override public ElasticSearchDictator
* createSearchDictator(AggregateRequestDto dto, String tenant) throws Exception
* { ElasticSearchDictator dictator = new ElasticSearchDictator(); if
* (dto.getServiceApi().equals(ServiceApiConstants.CSAT_STORE_WRT_TIME) ||
* dto.getServiceApi().equals(ServiceApiConstants.CSAT_DAY_WISE) ||
* dto.getServiceApi().equals(ServiceApiConstants.CSAT_STORE) ||
* dto.getServiceApi().equals(ServiceApiConstants.CSAT_STORE_REASON) ||
* dto.getServiceApi().equals(ServiceApiConstants.CSAT_GENDER) ||
* dto.getServiceApi().equals(ServiceApiConstants.CSAT_AGEGROUP) ||
* dto.getServiceApi().equals(ServiceApiConstants.CSAT_STORE_TIME) ||
* dto.getServiceApi().equals(ServiceApiConstants.CSAT_TOP_PERFORMING) ||
* dto.getServiceApi().equals(ServiceApiConstants.CSAT_LEAST_PERFORMING)) {
* dictator.setIndexName(tenant + ratingElasticIndexName);
* dictator.setDocumentType(ratingElasticDocType); } else {
* dictator.setIndexName(tenant + transactionElasticIndexName);
* dictator.setDocumentType(transactionElasticDocType); } if
* (StringUtils.isNotBlank(dto.getServiceApi())) {
* dictator.setVisualisationName(dto.getServiceApi()); } Map<String, Map<String,
* List<Object>>> queryMap = new HashMap<>(); if (dto.getCustomData() != null) {
* for (Map.Entry<String, Object> entry : dto.getCustomData().entrySet()) { if
* (StringUtils.isNotBlank(entry.getKey()) && entry.getValue() != null) {
* List<Object> valueList = new ArrayList<>();
*
* if (entry.getValue() instanceof ArrayList) {
*
* List<Object> valueArray = (ArrayList<Object>) entry.getValue();
*
* for (Object value : valueArray) { valueList.add(value); } } else {
* valueList.add(entry.getValue()); } if (!valueList.isEmpty()) { String
* entryKey = entry.getKey(); if
* (dto.getServiceApi().equals(ServiceApiConstants.CSAT_STORE_WRT_TIME) ||
491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560
* dto.getServiceApi().equals(ServiceApiConstants.CSAT_DAY_WISE) ||
* dto.getServiceApi().equals(ServiceApiConstants.CSAT_STORE) ||
* dto.getServiceApi().equals(ServiceApiConstants.CSAT_STORE_REASON) ||
* dto.getServiceApi().equals(ServiceApiConstants.CSAT_GENDER) ||
* dto.getServiceApi().equals(ServiceApiConstants.CSAT_AGEGROUP) ||
* dto.getServiceApi().equals(ServiceApiConstants.CSAT_STORE_TIME) ||
* dto.getServiceApi().equals(ServiceApiConstants.CSAT_TOP_PERFORMING) ||
* dto.getServiceApi().equals(ServiceApiConstants.CSAT_LEAST_PERFORMING)) {
*
* entryKey = "storeId"; } if
* (queryMap.containsKey(ElasticProperties.Query.MATCH_CONDITION)) { Map<String,
* List<Object>> queryInnerMap = queryMap
* .get(ElasticProperties.Query.MATCH_CONDITION); queryInnerMap.put(entryKey,
* valueList); } else { Map<String, List<Object>> queryInnerMap = new
* HashMap<>(); queryInnerMap.put(entryKey, valueList);
* queryMap.put(ElasticProperties.Query.MATCH_CONDITION, queryInnerMap); } } } }
* }
*
* if (dto.getDates() != null) { if
* (StringUtils.isNotBlank(dto.getDates().getStartDate()) &&
* StringUtils.isNotBlank(dto.getDates().getEndDate())) { List<Object> valueList
* = new ArrayList<>();
*
* valueList.add(dto.getDates().getStartDate());
* valueList.add(dto.getDates().getEndDate()); Map<String, List<Object>>
* queryInnerMap = new HashMap<>(); if
* (dto.getServiceApi().equals(ServiceApiConstants.CSAT_STORE_WRT_TIME) ||
* dto.getServiceApi().equals(ServiceApiConstants.CSAT_STORE) ||
* dto.getServiceApi().equals(ServiceApiConstants.CSAT_STORE_REASON) ||
* dto.getServiceApi().equals(ServiceApiConstants.CSAT_GENDER) ||
* dto.getServiceApi().equals(ServiceApiConstants.CSAT_AGEGROUP) ||
* dto.getServiceApi().equals(ServiceApiConstants.CSAT_STORE_TIME) ||
* dto.getServiceApi().equals(ServiceApiConstants.CSAT_TOP_PERFORMING) ||
* dto.getServiceApi().equals(ServiceApiConstants.CSAT_LEAST_PERFORMING) ||
* dto.getServiceApi().equals(ServiceApiConstants.CSAT_DAY_WISE)) {
* queryInnerMap.put(ElasticProperties.Query.FEEDBACK_DATE_TIME, valueList); }
* else { queryInnerMap.put(ElasticProperties.Query.TRANSACTION_DATE_FIELD,
* valueList); }
*
* queryMap.put(ElasticProperties.Query.RANGE_CONDITION, queryInnerMap); } }
* dictator.setQueryMap(queryMap);
*
*/
/*
* Map<String,Map<String,Map<String,Object>>> aggregationMap = new HashMap<>();
* Map<String,Map<String, String>> innerMap = new HashMap<>(); Map<String,
* String> deepInnerMap = new HashMap<>();
*//*
*
*
* return dictator;
*
* }
*/
@SuppressWarnings("unchecked")
@Override
public SearchRequest buildElasticSearchQuery(ElasticSearchDictator dictator) {
SearchSourceBuilder searchBuilder = buildSearchSourceBuilder();
BoolQueryBuilder boolQuery = buildBoolQuery();
String localDateStartRange = null;
String localDateEndRange = null;
if (dictator.getQueryMap().containsKey(ElasticProperties.Query.RANGE_CONDITION)) {
String searchParamRange = null;
Map<String, List<Object>> innerMap = dictator.getQueryMap().get(ElasticProperties.Query.RANGE_CONDITION);
for (Entry<String, List<Object>> en : innerMap.entrySet()) {
searchParamRange = en.getKey();
localDateStartRange = (String) en.getValue().get(0);
localDateEndRange = (String) en.getValue().get(1);
561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630
}
addMustOnBoolQuery(boolQuery, buildRangeQuery(searchParamRange, localDateStartRange, localDateEndRange));
}
if (dictator.getQueryMap().containsKey(ElasticProperties.Query.MATCH_CONDITION)) {
String searchTermField = null;
Map<String, List<Object>> innerMap = dictator.getQueryMap().get(ElasticProperties.Query.MATCH_CONDITION);
for (Entry<String, List<Object>> en : innerMap.entrySet()) {
searchTermField = en.getKey();
addFilterTermsOnBoolQuery(boolQuery, buildTermsQuery(searchTermField, en.getValue()));
}
}
addQueryToSearchBuilder(searchBuilder, boolQuery);
DateHistogramAggregationBuilder dateAggBuilder = null;
AvgAggregationBuilder avgAggBuilder = null;
SumAggregationBuilder sumAggBuilder = null;
TermsAggregationBuilder termsAggBuilder = null;
NestedAggregationBuilder nestedAggBuilder = null;
ValueCountAggregationBuilder valueCountAggBuilder = null;
if (dictator.getQueryAggregationMap() == null) {
return new SearchRequest(dictator.getIndexName()).types(dictator.getDocumentType()).source(searchBuilder);
}
for (Map.Entry<String, Object> itr : dictator.getQueryAggregationMap().entrySet()) {
String aggregationType = itr.getKey();
Object value = itr.getValue();
if (ElasticProperties.Query.NESTED.equalsIgnoreCase(aggregationType)) {
Map<String, Object> nestedMap = null;
if (value instanceof HashMap) {
nestedMap = (HashMap<String, Object>) value;
} else if (value instanceof LinkedHashMap) {
nestedMap = (LinkedHashMap<String, Object>) value;
}
if (nestedMap != null) {
String aggregationName = String.valueOf(nestedMap.get(ElasticProperties.Query.LABEL.toLowerCase()));
nestedAggBuilder = buildNestedAggregationBuilder(aggregationName, nestedMap);
}
} else if (ElasticProperties.Query.SUM.equalsIgnoreCase(aggregationType)) {
Map<String, Object> sumMap = null;
if (value instanceof HashMap) {
sumMap = (HashMap<String, Object>) value;
} else if (value instanceof LinkedHashMap) {
sumMap = (LinkedHashMap<String, Object>) value;
}
if (sumMap != null) {
String aggregationName = String.valueOf(sumMap.get(ElasticProperties.Query.LABEL.toLowerCase()));
sumAggBuilder = buildSumAggregation(aggregationName,
String.valueOf(sumMap.get(ElasticProperties.Query.FIELD.toLowerCase())));
}
} else if (ElasticProperties.Query.TERM.equalsIgnoreCase(aggregationType)) {
Map<String, Object> termMap = null;
if (value instanceof HashMap) {
termMap = (HashMap<String, Object>) value;
} else if (value instanceof LinkedHashMap) {
termMap = (LinkedHashMap<String, Object>) value;
}
if (termMap != null) {
String aggregationName = String.valueOf(termMap.get(ElasticProperties.Query.LABEL.toLowerCase()));
termsAggBuilder = buildTermAggregation(aggregationName, termMap);
}
} else if (ElasticProperties.Query.DATE_HISTOGRAM.equalsIgnoreCase(aggregationType)) {
Map<String, Object> histogramMap = null;
631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700
if (value instanceof HashMap) {
histogramMap = (HashMap<String, Object>) value;
} else if (value instanceof LinkedHashMap) {
histogramMap = (LinkedHashMap<String, Object>) value;
}
if (histogramMap != null) {
String aggregationName = String
.valueOf(histogramMap.get(ElasticProperties.Query.LABEL.toLowerCase()));
dateAggBuilder = buildDateHistogramAggregation(aggregationName,
histogramMap.get(ElasticProperties.Query.FIELD.toLowerCase()).toString(),
histogramMap.get(ElasticProperties.Query.INTERVAL.toLowerCase()).toString().toUpperCase(),
Long.parseLong(localDateStartRange), Long.parseLong(localDateEndRange));
}
} else if (ElasticProperties.Query.COUNT.equalsIgnoreCase(aggregationType)) {
Map<String, Object> countAggMap = null;
if (value instanceof HashMap) {
countAggMap = (HashMap<String, Object>) value;
} else if (value instanceof LinkedHashMap) {
countAggMap = (LinkedHashMap<String, Object>) value;
}
if (countAggMap != null) {
String countField = countAggMap.get(ElasticProperties.Query.FIELD.toLowerCase()).toString();
String countAggName = String.valueOf(countAggMap.get(ElasticProperties.Query.LABEL.toLowerCase()));
valueCountAggBuilder = buildCountsAggregationQuery(countAggName, countField);
}
} else if (ElasticProperties.Query.AGGREGATION_CONDITION.equalsIgnoreCase(aggregationType)) {
Map<String, Object> firstLevelAggMap = (LinkedHashMap<String, Object>) value;
for (Map.Entry<String, Object> firstLevelItrEntry : firstLevelAggMap.entrySet()) {
String firstLevelEntryKey = firstLevelItrEntry.getKey();
Object firstLevelEntryValue = firstLevelItrEntry.getValue();
if (ElasticProperties.Query.SUM.equalsIgnoreCase(firstLevelEntryKey)) {
Map<String, Object> sumAggMap = (LinkedHashMap<String, Object>) firstLevelEntryValue;
String sumField = sumAggMap.get(ElasticProperties.Query.FIELD.toLowerCase()).toString();
String sumAggName = String.valueOf(sumAggMap.get(ElasticProperties.Query.LABEL.toLowerCase()));
if (termsAggBuilder != null) {
termsAggBuilder = buildSubSumAggreationForTerms(termsAggBuilder, sumAggName, sumField);
} else if (dateAggBuilder != null) {
dateAggBuilder = buildSubSumAggreationForDateHistogram(dateAggBuilder, sumAggName,
sumField);
}
} else if (ElasticProperties.Query.AVG.equalsIgnoreCase(firstLevelEntryKey)) {
Map<String, Object> avgAggMap = (LinkedHashMap<String, Object>) firstLevelEntryValue;
String avgField = avgAggMap.get(ElasticProperties.Query.FIELD.toLowerCase()).toString();
String avgAggName = String.valueOf(avgAggMap.get(ElasticProperties.Query.LABEL.toLowerCase()));
if (termsAggBuilder != null) {
termsAggBuilder = buildSubAvgAggreationForTerms(termsAggBuilder, avgAggName, avgField);
} else if (dateAggBuilder != null) {
dateAggBuilder = buildSubSumAggreationForDateHistogram(dateAggBuilder, avgAggName,
avgField);
}
} else if (ElasticProperties.Query.COUNT.equalsIgnoreCase(firstLevelEntryKey)) {
Map<String, Object> countAggMap = (LinkedHashMap<String, Object>) firstLevelEntryValue;
String countField = countAggMap.get(ElasticProperties.Query.FIELD.toLowerCase()).toString();
String countAggName = String
.valueOf(countAggMap.get(ElasticProperties.Query.LABEL.toLowerCase()));
if (termsAggBuilder != null) {
termsAggBuilder = buildSubCountAggregationForTerms(termsAggBuilder, countAggName,
countField);
} else if (dateAggBuilder != null) {
dateAggBuilder = buildSubCountAggregationForDateHistogram(dateAggBuilder, countAggName,
countField);
}
} else if (ElasticProperties.Query.TERM.equalsIgnoreCase(firstLevelEntryKey)) {
701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770
Map<String, Object> subTermAggMap = (LinkedHashMap<String, Object>) firstLevelEntryValue;
String subTermAggName = String
.valueOf(subTermAggMap.get(ElasticProperties.Query.LABEL.toLowerCase()));
if (nestedAggBuilder != null) {
buildSubTermsAggregationForNested(nestedAggBuilder, subTermAggName,
subTermAggMap.get(ElasticProperties.Query.FIELD.toLowerCase()).toString());
} else if (dateAggBuilder != null) {
buildSubTermsAggregationForHistogram(dateAggBuilder, subTermAggName,
subTermAggMap.get(ElasticProperties.Query.FIELD.toLowerCase()).toString());
} else if (termsAggBuilder != null) {
buildSubTermsAggregationForTerms(termsAggBuilder, subTermAggName,
subTermAggMap.get(ElasticProperties.Query.FIELD.toLowerCase()).toString());
}
} else if (ElasticProperties.Query.AGGREGATION_CONDITION.equals(firstLevelEntryKey.toUpperCase())) {
Map<String, Object> secondLevelAggMap = (LinkedHashMap<String, Object>) firstLevelEntryValue;
for (Map.Entry<String, Object> secondLevelItrEntry : secondLevelAggMap.entrySet()) {
String secondLevelItrEntryKey = secondLevelItrEntry.getKey();
Object secondLevelItrEntryValue = secondLevelItrEntry.getValue();
if (ElasticProperties.Query.SUM.equalsIgnoreCase(secondLevelItrEntryKey)) {
Map<String, Object> subSumAggMap = (LinkedHashMap<String, Object>) secondLevelItrEntryValue;
String subSumField = subSumAggMap.get(ElasticProperties.Query.FIELD.toLowerCase())
.toString();
String subSumAggName = String
.valueOf(subSumAggMap.get(ElasticProperties.Query.LABEL.toLowerCase()));
if (nestedAggBuilder != null) {
List<AggregationBuilder> aggBuilders = nestedAggBuilder.getSubAggregations();
for (AggregationBuilder aggregationBuilder : aggBuilders) {
if (aggregationBuilder instanceof TermsAggregationBuilder) {
TermsAggregationBuilder subTermAggBuilder = (TermsAggregationBuilder) aggregationBuilder;
subTermAggBuilder = buildSubSumAggreationForTerms(subTermAggBuilder,
subSumAggName, subSumField);
}
}
}
} else if (ElasticProperties.Query.COUNT.equalsIgnoreCase(secondLevelItrEntryKey)) {
Map<String, Object> subCountAggMap = (LinkedHashMap<String, Object>) secondLevelItrEntryValue;
String subCountField = subCountAggMap.get(ElasticProperties.Query.FIELD.toLowerCase())
.toString();
String subCountAggName = String
.valueOf(subCountAggMap.get(ElasticProperties.Query.LABEL.toLowerCase()));
if (dateAggBuilder != null) {
List<AggregationBuilder> aggBuilders = dateAggBuilder.getSubAggregations();
for (AggregationBuilder aggregationBuilder : aggBuilders) {
if (aggregationBuilder instanceof TermsAggregationBuilder) {
TermsAggregationBuilder subTermAggBuilder = (TermsAggregationBuilder) aggregationBuilder;
subTermAggBuilder = buildSubCountAggregationForTerms(subTermAggBuilder,
subCountAggName, subCountField);
}
}
}
}
}
}
}
}
}
if (dateAggBuilder != null) {
addAggregationToSearchBuilder(searchBuilder, dateAggBuilder);
}
if (sumAggBuilder != null) {
771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840
addSumAggregationToSearchBuilder(searchBuilder, sumAggBuilder);
}
if (avgAggBuilder != null) {
addAvgAggregationToSearchBuilder(searchBuilder, avgAggBuilder);
}
if (valueCountAggBuilder != null) {
addValueCountAggregationToSearchBuilder(searchBuilder, valueCountAggBuilder);
}
if (termsAggBuilder != null) {
addTermsAggregationToSearchBuilder(searchBuilder, termsAggBuilder);
}
if (nestedAggBuilder != null) {
addNestedAggregationToSearchBuilder(searchBuilder, nestedAggBuilder);
}
return new SearchRequest(dictator.getIndexName()).types(dictator.getDocumentType()).source(searchBuilder);
}
private NestedAggregationBuilder buildSubTermsAggregationForNested(NestedAggregationBuilder nestedAggBuilder,
String subAggregationName, String fieldName) {
return nestedAggBuilder.subAggregation(AggregationBuilders.terms(subAggregationName).field(fieldName));
}
private void addNestedAggregationToSearchBuilder(SearchSourceBuilder searchBuilder,
NestedAggregationBuilder nestedAggBuilder) {
searchBuilder.aggregation(nestedAggBuilder);
}
private RangeQueryBuilder buildRangeQuery(String fieldName, Object startRange, Object endRange) {
return QueryBuilders.rangeQuery(fieldName).gte(startRange).lte(endRange);
}
private TermQueryBuilder buildTermQuery(String fieldName, Object fieldValue) {
return QueryBuilders.termQuery(fieldName, fieldValue);
}
private TermsQueryBuilder buildTermsQuery(String fieldName, List<Object> fieldValue) {
return QueryBuilders.termsQuery(fieldName, fieldValue);
}
private MatchQueryBuilder buildMatchQuery(String fieldName, Object fieldValue) {
return QueryBuilders.matchQuery(fieldName, fieldValue);
}
private ValueCountAggregationBuilder buildCountsAggregationQuery(String aggregationName, String fieldName) {
return AggregationBuilders.count(aggregationName).field(fieldName);
}
private SumAggregationBuilder buildSumAggregation(String aggregationName, String fieldName) {
return AggregationBuilders.sum(aggregationName).field(fieldName);
}
@SuppressWarnings("unchecked")
private TermsAggregationBuilder buildTermAggregation(String aggregationName, Map<String, Object> paramMap) {
TermsAggregationBuilder aggBuilder = AggregationBuilders.terms(aggregationName);
for (Map.Entry<String, Object> param : paramMap.entrySet()) {
if (param.getKey().equalsIgnoreCase(ElasticProperties.Query.FIELD)) {
aggBuilder = aggBuilder.field((String) param.getValue());
} else if (param.getKey().equalsIgnoreCase(ElasticProperties.Query.SIZE)) {
aggBuilder = aggBuilder.size((Integer) param.getValue());
} else if (param.getKey().equalsIgnoreCase(ElasticProperties.Query.ORDER)) {
Map<String, Object> keyMap = (HashMap<String, Object>) param.getValue();
BucketOrder order = null;
for (Map.Entry<String, Object> valueMap : keyMap.entrySet()) {
Map<String, String> orderMap = (HashMap<String, String>) valueMap.getValue();
String key = valueMap.getKey() + "of" + orderMap.get(ElasticProperties.Query.FIELD.toLowerCase());
order = BucketOrder.aggregation(key,
orderMap.get("orderBy").equalsIgnoreCase(ElasticProperties.Query.ASC) ? true : false);
841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910
}
aggBuilder = aggBuilder.order(order);
}
}
return aggBuilder;
}
private AvgAggregationBuilder buildAvgAggregation(String aggregationName, String fieldName) {
return AggregationBuilders.avg(aggregationName).field(fieldName);
}
private NestedAggregationBuilder buildNestedAggregationBuilder(String aggregationName,
Map<String, Object> paramMap) {
String pathName = paramMap.get(ElasticProperties.Query.PATH.toLowerCase()).toString();
return AggregationBuilders.nested(aggregationName, pathName);
}
private AggregationBuilder buildSubTermForNestedAggregation(NestedAggregationBuilder nestedBuilder,
String aggregationName, Map<String, Object> paramMap) {
return nestedBuilder.subAggregation(buildTermAggregation(aggregationName, paramMap));
}
private DateHistogramAggregationBuilder buildDateHistogramAggregation(String aggregationName, String fieldName,
String interval, Long boundMin, Long boundMax) {
DateHistogramInterval dateHistogramInterval = null;
if (ElasticProperties.Query.HOUR.equals(interval)) {
dateHistogramInterval = DateHistogramInterval.HOUR;
} else if (ElasticProperties.Query.DAY.equals(interval)) {
dateHistogramInterval = DateHistogramInterval.DAY;
} else if (ElasticProperties.Query.MINUTE.equals(interval)) {
dateHistogramInterval = DateHistogramInterval.MINUTE;
} else if (ElasticProperties.Query.MONTH.equals(interval)) {
dateHistogramInterval = DateHistogramInterval.MONTH;
}
return AggregationBuilders.dateHistogram(aggregationName).field(fieldName)
.dateHistogramInterval(dateHistogramInterval).format("epoch_millis")
.extendedBounds(new ExtendedBounds(boundMin, boundMax));
}
private DateHistogramAggregationBuilder buildSubSumAggreationForDateHistogram(
DateHistogramAggregationBuilder builder, String aggregationName, String fieldName) {
return builder.subAggregation(AggregationBuilders.sum(aggregationName).field(fieldName));
}
private DateHistogramAggregationBuilder buildSubCummulativeSumAggreationForDateHistogram(
DateHistogramAggregationBuilder builder, String aggregationName, String fieldName) {
PipelineAggregationBuilder pipeLineAggregation = new CumulativeSumPipelineAggregationBuilder(aggregationName,
fieldName);
return builder.subAggregation(pipeLineAggregation);
}
private DateHistogramAggregationBuilder buildSubAvgAggreationForDateHistogram(
DateHistogramAggregationBuilder builder, String aggregationName, String fieldName) {
return builder.subAggregation(AggregationBuilders.avg(aggregationName).field(fieldName));
}
private DateHistogramAggregationBuilder buildSubCountAggregationForDateHistogram(
DateHistogramAggregationBuilder builder, String aggregationName, String fieldName) {
return builder.subAggregation(AggregationBuilders.count(aggregationName).field(fieldName));
}
private TermsAggregationBuilder buildSubCountAggregationForTerms(TermsAggregationBuilder builder,
String aggregationName, String fieldName) {
return builder.subAggregation(AggregationBuilders.count(aggregationName).field(fieldName));
}
private TermsAggregationBuilder buildSubTermsAggregationForTerms(TermsAggregationBuilder builder,
911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980
String aggregationName, String fieldName) {
return builder.subAggregation(AggregationBuilders.terms(aggregationName).field(fieldName));
}
private DateHistogramAggregationBuilder buildSubTermsAggregationForHistogram(
DateHistogramAggregationBuilder builder, String aggregationName, String fieldName) {
return builder.subAggregation(AggregationBuilders.terms(aggregationName).field(fieldName));
}
private TermsAggregationBuilder buildSubSumAggreationForTerms(TermsAggregationBuilder builder,
String aggregationName, String fieldName) {
return builder.subAggregation(AggregationBuilders.sum(aggregationName).field(fieldName));
}
private TermsAggregationBuilder buildSubAvgAggreationForTerms(TermsAggregationBuilder builder,
String aggregationName, String fieldName) {
return builder.subAggregation(AggregationBuilders.avg(aggregationName).field(fieldName));
}
private SumAggregationBuilder buildSubSumAggregation(SumAggregationBuilder builder, String aggregationName,
String fieldName) {
return builder.subAggregation(AggregationBuilders.sum(aggregationName).field(fieldName));
}
private AvgAggregationBuilder buildSubAvgAggregation(AvgAggregationBuilder builder, String aggregationName,
String fieldName) {
return builder.subAggregation(AggregationBuilders.avg(aggregationName).field(fieldName));
}
private BoolQueryBuilder buildBoolQuery() {
return QueryBuilders.boolQuery();
}
private BoolQueryBuilder addMustOnBoolQuery(BoolQueryBuilder builder, RangeQueryBuilder rangeBuilder) {
return builder.must(rangeBuilder);
}
private BoolQueryBuilder addFilterOnBoolQuery(BoolQueryBuilder builder, TermQueryBuilder termBuilder) {
return builder.filter(termBuilder);
}
private BoolQueryBuilder addFilterTermsOnBoolQuery(BoolQueryBuilder builder, TermsQueryBuilder termBuilder) {
return builder.filter(termBuilder);
}
private BoolQueryBuilder addMatchOnBoolQuery(BoolQueryBuilder builder, MatchQueryBuilder matchBuilder) {
return builder.filter(matchBuilder);
}
private SearchSourceBuilder buildSearchSourceBuilder() {
return new SearchSourceBuilder().size(0);
}
private SearchSourceBuilder addQueryToSearchBuilder(SearchSourceBuilder builder, BoolQueryBuilder queryBuilder) {
return builder.query(queryBuilder);
}
private SearchSourceBuilder addAggregationToSearchBuilder(SearchSourceBuilder builder,
DateHistogramAggregationBuilder aggBuilder) {
return builder.aggregation(aggBuilder);
}
private SearchSourceBuilder addSumAggregationToSearchBuilder(SearchSourceBuilder builder,
SumAggregationBuilder aggBuilder) {
return builder.aggregation(aggBuilder);
}
private SearchSourceBuilder addAvgAggregationToSearchBuilder(SearchSourceBuilder builder,
AvgAggregationBuilder aggBuilder) {
return builder.aggregation(aggBuilder);
981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050
}
private SearchSourceBuilder addValueCountAggregationToSearchBuilder(SearchSourceBuilder builder,
ValueCountAggregationBuilder aggBuilder) {
return builder.aggregation(aggBuilder);
}
private SearchSourceBuilder addTermsAggregationToSearchBuilder(SearchSourceBuilder builder,
TermsAggregationBuilder aggBuilder) {
return builder.aggregation(aggBuilder);
}
@Override
public MultiSearchResponse executeMultiSearchRequest(List<SearchRequest> searchRequestList, String tenant) {
MultiSearchRequest multiRequest = new MultiSearchRequest();
MultiSearchResponse response = null;
for (SearchRequest request : searchRequestList) {
logger.info("ES Query is : " + request.source());
multiRequest.add(request);
}
try {
response = client.multiSearch(multiRequest);
} catch (IOException e) {
logger.error("Encountered an error while connecting : " + e);
logger.error("Error Message to report : " + e.getMessage());
}
return response;
}
private RestHighLevelClient getClientForElastic() {
return new RestHighLevelClient(RestClient.builder(new HttpHost(elasticHost, elasticPort, REST_SCHEME)));
}
private RestHighLevelClient getClientForAlternate() throws MalformedURLException {
URL url = new URL("https://egov-micro-dev.egovernments.org/elasticsearch/");
return new RestHighLevelClient(RestClient.builder(new HttpHost(url.getHost(), url.getPort(), REST_SCHEME2)));
}
/*
* @SuppressWarnings("unchecked")
*
* @Override public ElasticSearchDictator createSearchDictator(String indexName,
* String documentType, CummulativeDataRequestDto dto, String dateField) throws
* Exception { ElasticSearchDictator dictator = new ElasticSearchDictator();
*
* dictator.setIndexName(indexName); dictator.setDocumentType(documentType);
*
* Map<String, Map<String, List<Object>>> queryMap = new HashMap<>(); if
* (dto.getCustomData() != null) { for (Map.Entry<String, Object> entry :
* dto.getCustomData().entrySet()) { if (StringUtils.isNotBlank(entry.getKey())
* && entry.getValue() != null) { List<Object> valueList = new ArrayList<>();
*
* if (entry.getValue() instanceof ArrayList) {
*
* List<Object> valueArray = (ArrayList<Object>) entry.getValue();
*
* for (Object value : valueArray) { valueList.add(value); } } else {
* valueList.add(entry.getValue()); } if (!valueList.isEmpty()) { String
* entryKey = entry.getKey(); if
* (queryMap.containsKey(ElasticProperties.Query.MATCH_CONDITION)) { Map<String,
* List<Object>> queryInnerMap = queryMap
* .get(ElasticProperties.Query.MATCH_CONDITION); queryInnerMap.put(entryKey,
* valueList); } else { Map<String, List<Object>> queryInnerMap = new
* HashMap<>(); queryInnerMap.put(entryKey, valueList);
* queryMap.put(ElasticProperties.Query.MATCH_CONDITION, queryInnerMap); } } } }
* }
*
1051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120
* if (dto.getDates() != null) { if
* (StringUtils.isNotBlank(dto.getDates().getStartDate()) &&
* StringUtils.isNotBlank(dto.getDates().getEndDate())) { List<Object> valueList
* = new ArrayList<>();
*
* valueList.add(dto.getDates().getStartDate());
* valueList.add(dto.getDates().getEndDate()); Map<String, List<Object>>
* queryInnerMap = new HashMap<>(); queryInnerMap.put(dateField, valueList);
* queryMap.put(ElasticProperties.Query.RANGE_CONDITION, queryInnerMap); } }
* dictator.setQueryMap(queryMap);
*
*//*
* Map<String,Map<String,Map<String,Object>>> aggregationMap = new HashMap<>();
* Map<String,Map<String, String>> innerMap = new HashMap<>(); Map<String,
* String> deepInnerMap = new HashMap<>();
*//*
*
* return dictator; }
*
* @Override public ElasticSearchDictator
* createSearchDictator(AggregateRequestDto dto, String indexName, String
* documentType, String filterDateField) throws Exception {
* ElasticSearchDictator dictator = new ElasticSearchDictator();
*
* dictator.setIndexName(indexName); dictator.setDocumentType(documentType); if
* (StringUtils.isNotBlank(dto.getServiceApi())) {
* dictator.setVisualisationName(dto.getServiceApi()); }
*
* Map<String, Map<String, List<Object>>> queryMap = new HashMap<>(); if
* (dto.getCustomData() != null) { for (Map.Entry<String, Object> entry :
* dto.getCustomData().entrySet()) { if (StringUtils.isNotBlank(entry.getKey())
* && entry.getValue() != null) { List<Object> valueList = new ArrayList<>();
*
* if (entry.getValue() instanceof ArrayList) {
*
* List<Object> valueArray = (ArrayList<Object>) entry.getValue();
*
* for (Object value : valueArray) { valueList.add(value); } } else {
* valueList.add(entry.getValue()); } if (!valueList.isEmpty()) { String
* entryKey = entry.getKey(); if
* (queryMap.containsKey(ElasticProperties.Query.MATCH_CONDITION)) { Map<String,
* List<Object>> queryInnerMap = queryMap
* .get(ElasticProperties.Query.MATCH_CONDITION); queryInnerMap.put(entryKey,
* valueList); } else { Map<String, List<Object>> queryInnerMap = new
* HashMap<>(); queryInnerMap.put(entryKey, valueList);
* queryMap.put(ElasticProperties.Query.MATCH_CONDITION, queryInnerMap); } } } }
* }
*
* if (dto.getDates() != null) { if
* (StringUtils.isNotBlank(dto.getDates().getStartDate()) &&
* StringUtils.isNotBlank(dto.getDates().getEndDate())) { List<Object> valueList
* = new ArrayList<>();
*
* valueList.add(dto.getDates().getStartDate());
* valueList.add(dto.getDates().getEndDate()); Map<String, List<Object>>
* queryInnerMap = new HashMap<>();
*
* queryInnerMap.put(filterDateField, valueList);
*
* queryMap.put(ElasticProperties.Query.RANGE_CONDITION, queryInnerMap); } }
* dictator.setQueryMap(queryMap); return dictator; }
*/
@Override
public ElasticSearchDictator createSearchDictatorV2(AggregateRequestDto dto, String indexName, String documentType,
String filterDateField) {
ElasticSearchDictator dictator = new ElasticSearchDictator();
try {
dictator.setIndexName(indexName);
1121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190
dictator.setDocumentType(documentType);
Map<String, Map<String, List<Object>>> queryMap = new HashMap<>();
if (dto.getEsFilters() != null && !dto.getEsFilters().isEmpty()) {
for (Map.Entry<String, Object> entry : dto.getEsFilters().entrySet()) {
if (StringUtils.isNotBlank(entry.getKey()) && entry.getValue() != null) {
List<Object> valueList = new ArrayList<>();
if (entry.getValue() instanceof ArrayList) {
List<Object> valueArray = (ArrayList<Object>) entry.getValue();
for (Object value : valueArray) {
String valueString = "";
if (entry.getKey().equals("dataObject.tenantId")) {
valueString = String.valueOf(value);
valueString = valueString.replace("uat: ", "");
}
if (StringUtils.isBlank(valueString))
valueList.add(value);
else
valueList.add(valueString);
}
} else {
String valueString = "";
if (entry.getKey().equals("dataObject.tenantId")) {
valueString = String.valueOf(entry.getValue());
valueString = valueString.replace("uat: ", "");
}
if (StringUtils.isBlank(valueString))
valueList.add(entry.getValue());
else
valueList.add(valueString);
}
if (!valueList.isEmpty()) {
String entryKey = entry.getKey();
if (queryMap.containsKey(ElasticProperties.Query.MATCH_CONDITION)) {
Map<String, List<Object>> queryInnerMap = queryMap
.get(ElasticProperties.Query.MATCH_CONDITION);
queryInnerMap.put(entryKey, valueList);
} else {
Map<String, List<Object>> queryInnerMap = new HashMap<>();
queryInnerMap.put(entryKey, valueList);
queryMap.put(ElasticProperties.Query.MATCH_CONDITION, queryInnerMap);
}
}
}
}
}
Map<String, Object> queryAggregationMap = new HashMap<>();
if (dto.getAggregationFactors() != null && !dto.getAggregationFactors().isEmpty()) {
for (Map.Entry<String, Object> entry : dto.getAggregationFactors().entrySet()) {
if (StringUtils.isNotBlank(entry.getKey()) && entry.getValue() != null) {
Map<String, Object> innerAggregationMap = new HashMap<>();
innerAggregationMap.put("field", entry.getValue());
queryAggregationMap.put(entry.getKey(), innerAggregationMap);
}
}
}
dictator.setQueryAggregationMap(queryAggregationMap);
if (dto.getRequestDate() != null) {
if (StringUtils.isNotBlank(dto.getRequestDate().getStartDate())
&& StringUtils.isNotBlank(dto.getRequestDate().getEndDate())) {
List<Object> valueList = new ArrayList<>();
valueList.add(dto.getRequestDate().getStartDate());
valueList.add(dto.getRequestDate().getEndDate());
Map<String, List<Object>> queryInnerMap = new HashMap<>();
119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229
if (StringUtils.isNotBlank(filterDateField)) {
queryInnerMap.put(filterDateField, valueList);
queryMap.put(ElasticProperties.Query.RANGE_CONDITION, queryInnerMap);
}
}
}
dictator.setQueryMap(queryMap);
return dictator;
} catch (Exception e) {
logger.info("Exception in createSearchDictatorV2 : {} ", e.getMessage());
return null;
}
}
@Override
public MultiSearchResponse executeMultiSearchRequest(List<SearchRequest> searchRequestList, Boolean primaryOrNot) {
MultiSearchRequest multiRequest = new MultiSearchRequest();
MultiSearchResponse response = null;
for (SearchRequest request : searchRequestList) {
logger.info("ES Query is : " + request.source());
multiRequest.add(request);
}
try {
if (primaryOrNot) {
response = client.multiSearch(multiRequest);
} else {
logger.info("Alternate Client URL : " + alternateClient.toString());
response = alternateClient.multiSearch(multiRequest);
}
} catch (IOException e) {
logger.error("Encountered an error while connecting : " + e);
logger.error("Error Message to report : " + e.getMessage());
}
return response;
}
}