ElasticsearchUtil.java 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. package com.yihu.wlyy.statistics.controller;
  2. import com.alibaba.druid.sql.ast.SQLExpr;
  3. import com.alibaba.druid.sql.ast.expr.SQLQueryExpr;
  4. import com.alibaba.druid.sql.parser.SQLExprParser;
  5. import com.yihu.wlyy.statistics.etl.save.es.ElasticFactory;
  6. import com.yihu.wlyy.statistics.vo.SaveModel;
  7. import org.elasticsearch.action.search.SearchResponse;
  8. import org.nlpcn.es4sql.domain.Select;
  9. import org.nlpcn.es4sql.jdbc.ObjectResult;
  10. import org.nlpcn.es4sql.jdbc.ObjectResultsExtractor;
  11. import org.nlpcn.es4sql.parse.ElasticSqlExprParser;
  12. import org.nlpcn.es4sql.parse.SqlParser;
  13. import org.nlpcn.es4sql.query.AggregationQueryAction;
  14. import org.nlpcn.es4sql.query.DefaultQueryAction;
  15. import org.nlpcn.es4sql.query.SqlElasticSearchRequestBuilder;
  16. import org.springframework.beans.factory.annotation.Autowired;
  17. import org.springframework.beans.factory.annotation.Value;
  18. import org.springframework.stereotype.Component;
  19. import org.springframework.util.StringUtils;
  20. import java.util.ArrayList;
  21. import java.util.List;
  22. /**
  23. * Created by chenweida on 2017/7/17.
  24. * SELECT town,townName,sum(result1) result1 FROM wlyy_quota_test
  25. where quotaCode='1'
  26. group by town,townName , date_histogram(field='quotaDate','interval'='week')
  27. */
  28. @Component
  29. public class ElasticsearchUtil {
  30. @Autowired
  31. private ElasticFactory elasticFactory;
  32. @Value("${es.type}")
  33. private String esType;
  34. @Value("${es.index}")
  35. private String esIndex;
  36. /**
  37. *
  38. * @param quotaCode 指标quotacode
  39. * @param startDate 开始日期 yyyy-MM-dd
  40. * @param endDate 结束日期 yyyy-MM-dd
  41. * @param timeLevel 1增量 2到达量
  42. * @param areaLevel 1 省 2 市 3 区县 4 机构 5团队
  43. * @param interval 1日 2周 3月
  44. * @return
  45. */
  46. public List<SaveModel> findQuotas(String quotaCode,
  47. String startDate,
  48. String endDate,
  49. String timeLevel,
  50. String areaLevel,
  51. String interval) {
  52. StringBuffer sql = new StringBuffer();
  53. StringBuffer groupBy = new StringBuffer();
  54. if (SaveModel.teamLevel.equals(areaLevel)) {
  55. sql.append("select team,teamName,result1,result2 from wlyy_quota_test where ");
  56. } else if (SaveModel.OrgLevel.equals(areaLevel)) {
  57. sql.append("select hospital,hospitalName,sum(result1) result1,sum(result2) result2 from wlyy_quota_test where ");
  58. groupBy.append(" group by hospital,hospitalName");
  59. } else if (SaveModel.townLevel.equals(areaLevel)) {
  60. sql.append("select town,townName,sum(result1) result1,sum(result2) result2 from wlyy_quota_test where ");
  61. groupBy.append(" group by town,townName");
  62. } else if (SaveModel.cityLevel.equals(areaLevel)) {
  63. sql.append("select city,cityName,sum(result1) result1,sum(result2) result2 from wlyy_quota_test where");
  64. groupBy.append(" group by city,cityName");
  65. }
  66. sql.append(" quotaCode='" + quotaCode + "' ");
  67. sql.append(" and timeLevel='" + timeLevel + "' ");
  68. sql.append(" and areaLevel='5' ");
  69. sql.append(" and quotaDate >='" + startDate + "' ");
  70. sql.append(" and quotaDate <='" + endDate + "' ");
  71. sql.append(groupBy);
  72. return excute(sql.toString());
  73. }
  74. public List<SaveModel> findQuotas(String quotaCode,
  75. String quotaDate,
  76. String timeLevel,
  77. String areaLevel) {
  78. return null;
  79. }
  80. public List<SaveModel> findQuotasByChllevel(String quotaCode,
  81. String startDate,
  82. String endDate,
  83. String timeLevel,
  84. String areaLevel,
  85. String childAreaLevel) {
  86. return null;
  87. }
  88. public List<SaveModel> findQuotasByChllevel(String quotaCode,
  89. String quotaDate,
  90. String timeLevel,
  91. String areaLevel,
  92. String childAreaLevel) {
  93. return null;
  94. }
  95. /**
  96. * 执行sql查询es
  97. *
  98. * @param sql
  99. * @return
  100. */
  101. public List<SaveModel> excute(String sql) {
  102. List<SaveModel> saveModels = new ArrayList<>();
  103. try {
  104. SQLExprParser parser = new ElasticSqlExprParser(sql);
  105. SQLExpr expr = parser.expr();
  106. SQLQueryExpr queryExpr = (SQLQueryExpr) expr;
  107. Select select = null;
  108. select = new SqlParser().parseSelect(queryExpr);
  109. //通过抽象语法树,封装成自定义的Select,包含了select、from、where group、limit等
  110. AggregationQueryAction action = null;
  111. DefaultQueryAction queryAction = null;
  112. SqlElasticSearchRequestBuilder requestBuilder = null;
  113. if (select.isAgg) {
  114. //包含计算的的排序分组的
  115. action = new AggregationQueryAction(elasticFactory.getTransportClient(), select);
  116. requestBuilder = action.explain();
  117. } else {
  118. //封装成自己的Select对象
  119. queryAction = new DefaultQueryAction(elasticFactory.getTransportClient(), select);
  120. requestBuilder = queryAction.explain();
  121. }
  122. SearchResponse response = (SearchResponse) requestBuilder.get();
  123. ObjectResult temp = new ObjectResultsExtractor(true, true, true).extractResults(response.getAggregations(), true);
  124. List<String> heads = temp.getHeaders();
  125. temp.getLines().stream().forEach(one -> {
  126. try {
  127. SaveModel saveModel = new SaveModel();
  128. for (int i = 0; i < one.size(); i++) {
  129. String key = "set" + UpFirstStr(heads.get(i));
  130. Object value = one.get(i);
  131. if (value instanceof String) {
  132. SaveModel.class.getMethod(key, String.class).invoke(saveModel, value);
  133. } else if (value instanceof Integer) {
  134. SaveModel.class.getMethod(key, Integer.class).invoke(saveModel, value);
  135. } else if (value instanceof Double) {
  136. SaveModel.class.getMethod(key, Integer.class).invoke(saveModel, ((Double) value).intValue());
  137. }
  138. }
  139. saveModels.add(saveModel);
  140. } catch (Exception e) {
  141. e.printStackTrace();
  142. }
  143. });
  144. } catch (Exception e) {
  145. e.printStackTrace();
  146. }
  147. return saveModels;
  148. }
  149. /**
  150. * 首字母大写
  151. *
  152. * @param str
  153. * @return
  154. */
  155. public String UpFirstStr(String str) {
  156. return str.replaceFirst(str.substring(0, 1), str.substring(0, 1).toUpperCase());
  157. }
  158. }