package com.yihu.wlyy.util; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.expr.SQLQueryExpr; import com.alibaba.druid.sql.parser.SQLExprParser; import com.yihu.wlyy.config.es.ElasticFactory; import org.elasticsearch.action.search.SearchResponse; import org.nlpcn.es4sql.domain.Select; import org.nlpcn.es4sql.jdbc.ObjectResult; import org.nlpcn.es4sql.jdbc.ObjectResultsExtractor; import org.nlpcn.es4sql.parse.ElasticSqlExprParser; import org.nlpcn.es4sql.parse.SqlParser; import org.nlpcn.es4sql.query.AggregationQueryAction; import org.nlpcn.es4sql.query.DefaultQueryAction; import org.nlpcn.es4sql.query.SqlElasticSearchRequestBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.ArrayList; import java.util.List; /** * Created by chenweida on 2017/7/17. * SELECT town,townName,sum(result1) result1 FROM wlyy_quota_test * where quotaCode='1' * group by town,townName , date_histogram(field='quotaDate','interval'='week') */ @Component public class ElasticsearchUtil { private Logger logger = LoggerFactory.getLogger(ElasticsearchUtil.class); @Autowired private ElasticFactory elasticFactory; public List excute(String sql, Class clazz, String esType, String esIndex) { List saveModels = new ArrayList<>(); try { SQLExprParser parser = new ElasticSqlExprParser(sql); SQLExpr expr = parser.expr(); SQLQueryExpr queryExpr = (SQLQueryExpr) expr; Select select = null; select = new SqlParser().parseSelect(queryExpr); //通过抽象语法树,封装成自定义的Select,包含了select、from、where group、limit等 AggregationQueryAction action = null; DefaultQueryAction queryAction = null; SqlElasticSearchRequestBuilder requestBuilder = null; if (select.isAgg) { //包含计算的的排序分组的 action = new AggregationQueryAction(elasticFactory.getTransportClient(), select); requestBuilder = action.explain(); } else { //封装成自己的Select对象 queryAction = new DefaultQueryAction(elasticFactory.getTransportClient(), select); requestBuilder = queryAction.explain(); } SearchResponse response = (SearchResponse) requestBuilder.get(); ObjectResult temp = new ObjectResultsExtractor(true, true, true).extractResults(response.getAggregations(), true); List heads = temp.getHeaders(); temp.getLines().stream().forEach(one -> { Object saveModel = null; try { saveModel = clazz.newInstance(); } catch (Exception e) { logger.error(e.getMessage()); } for (int i = 0; i < one.size(); i++) { try { String key = null; Object value = one.get(i); if (heads.get(i).contains("date_histogram")) { key = "setQuotaDate"; value = DateUtil.strToDate(String.valueOf(value), "yyyy-MM-dd HH:mm:ss"); } else { key = "set" + UpFirstStr(heads.get(i)); } if (value instanceof String) { clazz.getMethod(key, String.class).invoke(saveModel, value); } else if (value instanceof Integer) { clazz.getMethod(key, Integer.class).invoke(saveModel, value); } else if (value instanceof Double) { clazz.getMethod(key, Integer.class).invoke(saveModel, ((Double) value).intValue()); } else if (value instanceof java.util.Date) { clazz.getMethod(key, java.util.Date.class).invoke(saveModel, value); } } catch (Exception e) { logger.warn(e.getMessage()); } } saveModels.add(saveModel); }); } catch (Exception e) { logger.error(e.getMessage()); } return saveModels; } public Long excuteForLong(String sql, String esType, String esIndex) { try { SQLExprParser parser = new ElasticSqlExprParser(sql); SQLExpr expr = parser.expr(); SQLQueryExpr queryExpr = (SQLQueryExpr) expr; Select select = null; select = new SqlParser().parseSelect(queryExpr); //通过抽象语法树,封装成自定义的Select,包含了select、from、where group、limit等 AggregationQueryAction action = null; DefaultQueryAction queryAction = null; SqlElasticSearchRequestBuilder requestBuilder = null; if (select.isAgg) { //包含计算的的排序分组的 action = new AggregationQueryAction(elasticFactory.getTransportClient(), select); requestBuilder = action.explain(); } else { //封装成自己的Select对象 queryAction = new DefaultQueryAction(elasticFactory.getTransportClient(), select); requestBuilder = queryAction.explain(); } SearchResponse response = (SearchResponse) requestBuilder.get(); ObjectResult temp = new ObjectResultsExtractor(true, true, true).extractResults(response.getAggregations(), true); Long Longvalue = ((Double) temp.getLines().get(0).get(1)).longValue(); return Longvalue; } catch (Exception e) { logger.error(e.getMessage()); } return 0L; } /** * 首字母大写 * * @param str * @return */ private String UpFirstStr(String str) { return str.replaceFirst(str.substring(0, 1), str.substring(0, 1).toUpperCase()); } public Object excuteOneObject(String sql, Class clazz, String esType, String esIndex) { try { SQLExprParser parser = new ElasticSqlExprParser(sql); SQLExpr expr = parser.expr(); SQLQueryExpr queryExpr = (SQLQueryExpr) expr; Select select = null; select = new SqlParser().parseSelect(queryExpr); //通过抽象语法树,封装成自定义的Select,包含了select、from、where group、limit等 AggregationQueryAction action = null; DefaultQueryAction queryAction = null; SqlElasticSearchRequestBuilder requestBuilder = null; if (select.isAgg) { //包含计算的的排序分组的 action = new AggregationQueryAction(elasticFactory.getTransportClient(), select); requestBuilder = action.explain(); } else { //封装成自己的Select对象 queryAction = new DefaultQueryAction(elasticFactory.getTransportClient(), select); requestBuilder = queryAction.explain(); } SearchResponse response = (SearchResponse) requestBuilder.get(); ObjectResult temp = new ObjectResultsExtractor(true, true, true).extractResults(response.getHits(), true); List heads = temp.getHeaders(); Object saveModel = clazz.newInstance(); try { for (int i = 0; i < temp.getLines().get(0).size(); i++) { String key = null; Object value = temp.getLines().get(0).get(i); if (heads.get(i).contains("createTime")) { key = "setCreateTime"; value = DateUtil.strToDate(String.valueOf(value).replace("+0800","").replace("T"," "), "yyyy-MM-dd HH:mm:ss"); } else { key = "set" + UpFirstStr(heads.get(i)); } if (value instanceof String) { clazz.getMethod(key, String.class).invoke(saveModel, value); } else if (value instanceof Integer) { clazz.getMethod(key, Integer.class).invoke(saveModel, value); } else if (value instanceof Double) { clazz.getMethod(key, Integer.class).invoke(saveModel, ((Double) value).intValue()); } else if (value instanceof java.util.Date) { clazz.getMethod(key, java.util.Date.class).invoke(saveModel, value); } } } catch (Exception e) { logger.warn(e.getMessage()); } return saveModel; } catch (Exception e) { logger.error(e.getMessage()); } return null; } }