123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371 |
- package com.yihu.wlyy.statistics.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.statistics.etl.save.es.ElasticFactory;
- import com.yihu.wlyy.statistics.vo.SaveModel;
- 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.springframework.beans.factory.annotation.Autowired;
- import org.springframework.beans.factory.annotation.Value;
- import org.springframework.stereotype.Component;
- import org.springframework.util.StringUtils;
- 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 {
- @Autowired
- private ElasticFactory elasticFactory;
- @Value("${es.type}")
- private String esType;
- @Value("${es.index}")
- private String esIndex;
- /**
- * 折线图
- *
- * @param quotaCode 指标quotacode
- * @param code 机构code,或者区code或者团队code或者城市code
- * @param startDate 开始日期 yyyy-MM-dd
- * @param endDate 结束日期 yyyy-MM-dd
- * @param timeLevel 1增量 2到达量
- * @param areaLevel 1 省 2 市 3 区县 4 机构 5团队
- * @param interval 1日 2周 3月
- * @return
- */
- public List<SaveModel> findQuotaLines(String quotaCode,
- String code,
- String startDate,
- String endDate,
- String timeLevel,
- String areaLevel,
- String interval) {
- //时间格式转换 yyyy-MM-dd转成 2017-07-17T00:00:00+0800
- startDate = changeDate(startDate);
- //时间格式转换 yyyy-MM-dd转成 2017-07-17T00:00:00+0800
- endDate = changeDate(endDate);
- StringBuffer sql = new StringBuffer();
- StringBuffer groupBy = new StringBuffer();
- if (SaveModel.teamLevel.equals(areaLevel)) {
- sql.append("select team,teamName,result1,result2 from wlyy_quota_test where team='" + code + "'");
- } else if (SaveModel.OrgLevel.equals(areaLevel)) {
- sql.append("select hospital,hospitalName,sum(result1) result1,sum(result2) result2 from wlyy_quota_test where hospital='" + code + "'");
- groupBy.append(" group by hospital,hospitalName");
- } else if (SaveModel.townLevel.equals(areaLevel)) {
- sql.append("select town,townName,sum(result1) result1,sum(result2) result2 from wlyy_quota_test where town='" + code + "'");
- groupBy.append(" group by town,townName");
- } else if (SaveModel.cityLevel.equals(areaLevel)) {
- sql.append("select city,cityName,sum(result1) result1,sum(result2) result2 from wlyy_quota_test where city='" + code + "'");
- groupBy.append(" group by city,cityName");
- }
- sql.append(" and quotaCode='" + quotaCode + "' ");
- sql.append(" and timeLevel='" + timeLevel + "' ");
- sql.append(" and areaLevel='5'");
- sql.append(" and quotaDate >='" + startDate + "' ");
- sql.append(" and quotaDate <='" + endDate + "' ");
- //根据时间维度分组
- if (SaveModel.interval_month.equals(interval)) {
- groupBy.append(" ,date_histogram(field='quotaDate','interval'='month') ");
- } else if (SaveModel.interval_week.equals(interval)) {
- groupBy.append(" ,date_histogram(field='quotaDate','interval'='week') ");
- } else if (SaveModel.interval_day.equals(interval)) {
- groupBy.append(" ,date_histogram(field='quotaDate','interval'='1d') ");
- }
- sql.append(groupBy);
- return excute(sql.toString());
- }
- /**
- * 查询某个指标某一天的量
- *
- * @param quotaCode 指标quotacode
- * @param quotaDate 时间 yyyy-MM-dd
- * @param timeLevel 1增量 2到达量
- * @param areaLevel 1 省 2 市 3 区县 4 机构 5团队
- * @return
- */
- public List<SaveModel> findOneDateQuota(String quotaCode,
- String code,
- String quotaDate,
- String timeLevel,
- String areaLevel) {
- //时间格式转换 yyyy-MM-dd转成 2017-07-17T00:00:00+0800
- quotaDate = changeDate(quotaDate);
- StringBuffer sql = new StringBuffer();
- StringBuffer groupBy = new StringBuffer();
- if (SaveModel.teamLevel.equals(areaLevel)) {
- sql.append("select team,teamName,result1,result2 from wlyy_quota_test where team='" + code + "'");
- } else if (SaveModel.OrgLevel.equals(areaLevel)) {
- sql.append("select hospital,hospitalName,sum(result1) result1,sum(result2) result2 from wlyy_quota_test where hospital='" + code + "'");
- groupBy.append(" group by hospital,hospitalName");
- } else if (SaveModel.townLevel.equals(areaLevel)) {
- sql.append("select town,townName,sum(result1) result1,sum(result2) result2 from wlyy_quota_test where town='" + code + "'");
- groupBy.append(" group by town,townName");
- } else if (SaveModel.cityLevel.equals(areaLevel)) {
- sql.append("select city,cityName,sum(result1) result1,sum(result2) result2 from wlyy_quota_test where city='" + code + "'");
- groupBy.append(" group by city,cityName");
- }
- sql.append(" and quotaCode='" + quotaCode + "' ");
- sql.append(" and timeLevel='" + timeLevel + "' ");
- sql.append(" and areaLevel='5'");
- sql.append(" and quotaDate='" + quotaDate + "'");
- sql.append(groupBy);
- return excute(sql.toString());
- }
- /**
- * 查询某个2级维度指标某一天的数据
- *
- * @param quotaCode 指标quotacode
- * @param quotaDate 时间 yyyy-MM-dd
- * @param code 机构code或者团队code或者town code或者city code
- * @param timeLevel 1增量 2到达量
- * @param areaLevel 1 省 2 市 3 区县 4 机构 5团队
- * @return
- */
- public List<SaveModel> findOneDateQuotaLevel2(String quotaCode,
- String code,
- String quotaDate,
- String timeLevel,
- String areaLevel) {
- //时间格式转换 yyyy-MM-dd转成 2017-07-17T00:00:00+0800
- quotaDate = changeDate(quotaDate);
- StringBuffer sql = new StringBuffer();
- StringBuffer groupBy = new StringBuffer();
- if (SaveModel.teamLevel.equals(areaLevel)) {
- sql.append("select team,teamName,slaveKey1,slaveKey1Name,slaveKey2,slaveKey2Name,result1,result2 from wlyy_quota_test where team='" + code + "'");
- groupBy.append(" group by slaveKey1,slaveKey1Name,slaveKey2,slaveKey2Name");
- } else if (SaveModel.OrgLevel.equals(areaLevel)) {
- sql.append("select hospital,hospitalName,slaveKey1,slaveKey1Name,slaveKey2,slaveKey2Name,sum(result1) result1,sum(result2) result2 from wlyy_quota_test where hospital='" + code + "'");
- groupBy.append(" group by slaveKey1,slaveKey1Name,slaveKey2,slaveKey2Name");
- } else if (SaveModel.townLevel.equals(areaLevel)) {
- sql.append("select town,townName,slaveKey1,slaveKey1Name,slaveKey2,slaveKey2Name,sum(result1) result1,sum(result2) result2 from wlyy_quota_test where town='" + code + "'");
- groupBy.append(" group by slaveKey1,slaveKey1Name,slaveKey2,slaveKey2Name");
- } else if (SaveModel.cityLevel.equals(areaLevel)) {
- sql.append("select city,cityName,slaveKey1,slaveKey1Name,slaveKey2,slaveKey2Name,sum(result1) result1,sum(result2) result2 from wlyy_quota_test where city='" + code + "'");
- groupBy.append(" group by slaveKey1,slaveKey1Name,slaveKey2,slaveKey2Name");
- }
- sql.append(" and quotaCode='" + quotaCode + "' ");
- sql.append(" and timeLevel='" + timeLevel + "' ");
- sql.append(" and areaLevel='5'");
- sql.append(" and quotaDate='" + quotaDate + "'");
- sql.append(groupBy);
- return excute(sql.toString());
- }
- /**
- * 查询某个一级维度指标某一天的数据
- *
- * @param quotaCode 指标quotacode
- * @param quotaDate 时间 yyyy-MM-dd
- * @param code 机构code或者团队code或者town code或者city code
- * @param timeLevel 1增量 2到达量
- * @param areaLevel 1 省 2 市 3 区县 4 机构 5团队
- * @return
- */
- public List<SaveModel> findOneDateQuotaLevel1(String quotaCode,
- String code,
- String quotaDate,
- String timeLevel,
- String areaLevel) {
- //时间格式转换 yyyy-MM-dd转成 2017-07-17T00:00:00+0800
- quotaDate = changeDate(quotaDate);
- StringBuffer sql = new StringBuffer();
- StringBuffer groupBy = new StringBuffer();
- if (SaveModel.teamLevel.equals(areaLevel)) {
- sql.append("select team,teamName,slaveKey1,slaveKey1Name,result1,result2 from wlyy_quota_test where team='" + code + "'");
- groupBy.append(" group by team,teamName,slaveKey1,slaveKey1Name");
- } else if (SaveModel.OrgLevel.equals(areaLevel)) {
- sql.append("select hospital,hospitalName,slaveKey1,slaveKey1Name,sum(result1) result1,sum(result2) result2 from wlyy_quota_test where hospital='" + code + "'");
- groupBy.append(" group by hospital,hospitalName,slaveKey1,slaveKey1Name");
- } else if (SaveModel.townLevel.equals(areaLevel)) {
- sql.append("select town,townName,slaveKey1,slaveKey1Name,sum(result1) result1,sum(result2) result2 from wlyy_quota_test where town='" + code + "'");
- groupBy.append(" group by town,townName,slaveKey1,slaveKey1Name");
- } else if (SaveModel.cityLevel.equals(areaLevel)) {
- sql.append("select city,cityName,slaveKey1,slaveKey1Name,sum(result1) result1,sum(result2) result2 from wlyy_quota_test where city='" + code + "'");
- groupBy.append(" group by city,cityName,slaveKey1,slaveKey1Name");
- }
- sql.append(" and quotaCode='" + quotaCode + "' ");
- sql.append(" and timeLevel='" + timeLevel + "' ");
- sql.append(" and areaLevel='5'");
- sql.append(" and quotaDate='" + quotaDate + "'");
- sql.append(groupBy);
- return excute(sql.toString());
- }
- /**
- * 查询某一天父level下的子level 例如 查询市下面的团队,或者区下面的团队
- *
- * @param quotaCode 指标code
- * @param code 机构code或者团队code或者town code或者city code
- * @param quotaDate 指标code
- * @param timeLevel 1增量 2到达量
- * @param areaLevel 父arealevel
- * @param childAreaLevel 子arealevel
- * @return
- */
- public List<SaveModel> findOneDateQuotaByChllevel(String quotaCode,
- String code,
- String quotaDate,
- String timeLevel,
- String areaLevel,
- String childAreaLevel) {
- //时间格式转换 yyyy-MM-dd转成 2017-07-17T00:00:00+0800
- quotaDate = changeDate(quotaDate);
- StringBuffer sql = new StringBuffer();
- StringBuffer groupBy = new StringBuffer();
- //根据 childAreaLevel group by
- if (SaveModel.teamLevel.equals(childAreaLevel)) {
- sql.append("select team,teamName,result1,result2 from wlyy_quota_test where '");
- } else if (SaveModel.OrgLevel.equals(childAreaLevel)) {
- sql.append("select hospital,hospitalName,sum(result1) result1,sum(result2) result2 from wlyy_quota_test where ");
- groupBy.append(" group by hospital,hospitalName");
- } else if (SaveModel.townLevel.equals(childAreaLevel)) {
- sql.append("select town,townName,sum(result1) result1,sum(result2) result2 from wlyy_quota_test where ");
- groupBy.append(" group by town,townName");
- } else if (SaveModel.cityLevel.equals(childAreaLevel)) {
- sql.append("select city,cityName,sum(result1) result1,sum(result2) result2 from wlyy_quota_test where ");
- groupBy.append(" group by city,cityName");
- }
- sql.append(" quotaCode='" + quotaCode + "' ");
- sql.append(" and timeLevel='" + timeLevel + "' ");
- sql.append(" and areaLevel='5'");
- sql.append(" and quotaDate='" + quotaDate + "'");
- //查询code
- if (SaveModel.teamLevel.equals(areaLevel)) {
- sql.append(" and team='" + code + "'");
- } else if (SaveModel.OrgLevel.equals(areaLevel)) {
- sql.append(" and hospital='" + code + "'");
- } else if (SaveModel.townLevel.equals(areaLevel)) {
- sql.append(" and town='" + code + "'");
- } else if (SaveModel.cityLevel.equals(areaLevel)) {
- sql.append(" and city='" + code + "'");
- }
- sql.append(groupBy);
- return excute(sql.toString());
- }
- /**
- * 时间格式转换 yyyy-MM-dd转成 2017-07-17T00:00:00+0800
- *
- * @param quotaDate
- */
- private String changeDate(String quotaDate) {
- return quotaDate + "T00:00:00+0800";
- }
- /**
- * 执行sql查询es
- *
- * @param sql
- * @return
- */
- public List<SaveModel> excute(String sql) {
- List<SaveModel> 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<String> heads = temp.getHeaders();
- temp.getLines().stream().forEach(one -> {
- try {
- SaveModel saveModel = new SaveModel();
- for (int i = 0; i < one.size(); i++) {
- 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) {
- SaveModel.class.getMethod(key, String.class).invoke(saveModel, value);
- } else if (value instanceof Integer) {
- SaveModel.class.getMethod(key, Integer.class).invoke(saveModel, value);
- } else if (value instanceof Double) {
- SaveModel.class.getMethod(key, Integer.class).invoke(saveModel, ((Double) value).intValue());
- } else if (value instanceof java.util.Date) {
- SaveModel.class.getMethod(key, java.util.Date.class).invoke(saveModel, value);
- }
- }
- saveModels.add(saveModel);
- } catch (Exception e) {
- e.printStackTrace();
- }
- });
- } catch (Exception e) {
- e.printStackTrace();
- }
- return saveModels;
- }
- /**
- * 首字母大写
- *
- * @param str
- * @return
- */
- private String UpFirstStr(String str) {
- return str.replaceFirst(str.substring(0, 1), str.substring(0, 1).toUpperCase());
- }
- }
|