|
@ -0,0 +1,606 @@
|
|
|
package com.yihu.jw.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.jw.statistics.etl.save.es.ElasticFactory;
|
|
|
import com.yihu.jw.statistics.vo.DataModel;
|
|
|
import com.yihu.jw.statistics.vo.SaveModel;
|
|
|
import org.elasticsearch.action.search.SearchResponse;
|
|
|
import org.elasticsearch.client.Client;
|
|
|
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.beans.factory.annotation.Value;
|
|
|
import org.springframework.stereotype.Component;
|
|
|
|
|
|
import java.lang.reflect.Field;
|
|
|
import java.sql.Timestamp;
|
|
|
import java.text.SimpleDateFormat;
|
|
|
import java.util.*;
|
|
|
|
|
|
/**
|
|
|
* 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;
|
|
|
@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科室 6医生
|
|
|
* @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.doctorLevel.equals(areaLevel)) {
|
|
|
sql.append("select doctor,doctorName,result1,result2 from "+esType+" where doctor='" + code + "'");
|
|
|
}else if (SaveModel.deptLevel.equals(areaLevel)) {
|
|
|
sql.append("select dept,deptName,sum(result1),sum(result2) from "+esType+" where dept='" + code + "'");
|
|
|
} else if (SaveModel.OrgLevel.equals(areaLevel)) {
|
|
|
sql.append("select hospital,hospitalName,sum(result1) result1,sum(result2) result2 from "+esType+" 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 "+esType+" 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 "+esType+" 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科室 6医生
|
|
|
* @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.doctorLevel.equals(areaLevel)) {
|
|
|
sql.append("select doctor,doctprName,result1,result2 from "+esType+" where doctor='" + code + "'");
|
|
|
}else if (SaveModel.deptLevel.equals(areaLevel)) {
|
|
|
sql.append("select dept,deptName,sum(result1),sum(result2) from "+esType+" where dept='" + code + "'");
|
|
|
} else if (SaveModel.OrgLevel.equals(areaLevel)) {
|
|
|
sql.append("select hospital,hospitalName,sum(result1) result1,sum(result2) result2 from "+esType+" 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 "+esType+" 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 "+esType+" 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 或者医生code
|
|
|
* @param timeLevel 1增量 2到达量
|
|
|
* @param areaLevel 1 省 2 市 3 区县 4 机构 5科室6医生
|
|
|
* @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.doctorLevel.equals(areaLevel)) {
|
|
|
sql.append("select doctor,doctorName,slaveKey1,slaveKey1Name,slaveKey2,slaveKey2Name,result1,result2 from "+esType+" where doctor='" + code + "'");
|
|
|
groupBy.append(" group by slaveKey1,slaveKey1Name,slaveKey2,slaveKey2Name");
|
|
|
}else if (SaveModel.deptLevel.equals(areaLevel)) {
|
|
|
sql.append("select dept,deptName,slaveKey1,slaveKey1Name,slaveKey2,slaveKey2Name,sum(result1),sum(result2) from "+esType+" where dept='" + 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 "+esType+" 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 "+esType+" 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 "+esType+" 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 或者医生code
|
|
|
* @param timeLevel 1增量 2到达量
|
|
|
* @param areaLevel 1 省 2 市 3 区县 4 机构 5科室 6医生
|
|
|
* @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.doctorLevel.equals(areaLevel)) {
|
|
|
sql.append("select doctor,doctorName,slaveKey1,slaveKey1Name,result1,result2 from "+esType+" where doctor='" + code + "'");
|
|
|
groupBy.append(" group by doctor,doctorName,slaveKey1,slaveKey1Name");
|
|
|
}else if (SaveModel.deptLevel.equals(areaLevel)) {
|
|
|
sql.append("select dept,deptName,slaveKey1,slaveKey1Name,sum(result1),sum(result2) from "+esType+" where dept='" + code + "'");
|
|
|
groupBy.append(" group by dept,deptName,slaveKey1,slaveKey1Name");
|
|
|
} else if (SaveModel.OrgLevel.equals(areaLevel)) {
|
|
|
sql.append("select hospital,hospitalName,slaveKey1,slaveKey1Name,sum(result1) result1,sum(result2) result2 from "+esType+" 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 "+esType+" 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 "+esType+" 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或者医生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.doctorLevel.equals(childAreaLevel)) {
|
|
|
sql.append("select doctor,doctorName,result1,result2 from "+esType+" where ");
|
|
|
}else if (SaveModel.deptLevel.equals(childAreaLevel)) {
|
|
|
sql.append("select dept,deptName,sum(result1),sum(result2) from "+esType+" where ");
|
|
|
} else if (SaveModel.OrgLevel.equals(childAreaLevel)) {
|
|
|
sql.append("select hospital,hospitalName,sum(result1) result1,sum(result2) result2 from "+esType+" 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 "+esType+" 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 "+esType+" 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.doctorLevel.equals(areaLevel)) {
|
|
|
sql.append(" and dcotor='" + code + "'");
|
|
|
}else if (SaveModel.deptLevel.equals(areaLevel)) {
|
|
|
sql.append(" and dept='" + 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;
|
|
|
// if (parser.getLexer().token() != Token.EOF) {
|
|
|
// throw new ParserException("illegal sql expr : " + sql);
|
|
|
// }
|
|
|
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对象
|
|
|
Client client = elasticFactory.getTransportClient();
|
|
|
queryAction = new DefaultQueryAction(client, select);
|
|
|
requestBuilder = queryAction.explain();
|
|
|
}
|
|
|
SearchResponse response = (SearchResponse) requestBuilder.get();
|
|
|
Object queryResult = null;
|
|
|
if(sql.toUpperCase().indexOf("GROUP")!=-1||sql.toUpperCase().indexOf("SUM")!=-1){
|
|
|
queryResult = response.getAggregations();
|
|
|
}else{
|
|
|
queryResult = response.getHits();
|
|
|
}
|
|
|
ObjectResult temp = new ObjectResultsExtractor(true, true, true).extractResults(queryResult, 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).startsWith("_")){
|
|
|
continue;
|
|
|
}
|
|
|
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;
|
|
|
}
|
|
|
|
|
|
public<T> List<T> excute(String sql, Class<T> clazz) {
|
|
|
List saveModels = new ArrayList<>();
|
|
|
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXX");
|
|
|
SimpleDateFormat dateFormat1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
|
|
|
|
try {
|
|
|
//解决 group by之后默认是200的问题
|
|
|
if (sql.toLowerCase().contains("group by")) {
|
|
|
sql = sql + " limit 0,2000";
|
|
|
}
|
|
|
|
|
|
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();
|
|
|
Object queryResult = null;
|
|
|
if (sql.toUpperCase().indexOf("GROUP") != -1 || sql.toUpperCase().indexOf("SUM") != -1 || select.isAgg) {
|
|
|
queryResult = response.getAggregations();
|
|
|
} else {
|
|
|
queryResult = response.getHits();
|
|
|
}
|
|
|
ObjectResult temp = new ObjectResultsExtractor(true, true, true).extractResults(queryResult, true);
|
|
|
List<String> heads = temp.getHeaders();
|
|
|
temp.getLines().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).startsWith("_")) {
|
|
|
continue;
|
|
|
}
|
|
|
key = "set" + UpFirstStr(heads.get(i));
|
|
|
if (heads.get(i).contains("quotaDate") || heads.get(i).contains("createTime") || heads.get(i).contains("date_histogram")) {
|
|
|
if (heads.get(i).contains("date_histogram")) {
|
|
|
key = "setQuotaDate";
|
|
|
}
|
|
|
|
|
|
try {
|
|
|
//yyyy-MM-dd'T'HH:mm:ssXX
|
|
|
value = dateFormat.parse(String.valueOf(one.get(i)));
|
|
|
} catch (Exception e) {
|
|
|
//yyyy-MM-dd HH:mm:ss
|
|
|
try {
|
|
|
value = dateFormat1.parse(String.valueOf(one.get(i)));
|
|
|
}catch (Exception e1){
|
|
|
Timestamp ts = new Timestamp(Long.parseLong(String.valueOf(one.get(i))));
|
|
|
try {
|
|
|
Date date = new Date();
|
|
|
date = ts;
|
|
|
value =date;
|
|
|
|
|
|
} catch (Exception e2) {
|
|
|
value = String.valueOf(one.get(i));
|
|
|
}
|
|
|
}
|
|
|
|
|
|
}
|
|
|
// value = DateUtil.strToDate(String.valueOf(value).replace("T00:00:00+0800", " 00:00:00"), "yyyy-MM-dd HH:mm:ss");
|
|
|
}
|
|
|
|
|
|
|
|
|
if (value instanceof String) {
|
|
|
clazz.getMethod(key, String.class).invoke(saveModel, value);
|
|
|
} else if (value instanceof Integer) {
|
|
|
Field field = clazz.getDeclaredField(heads.get(i));
|
|
|
if(field.getGenericType().getTypeName().equals("java.lang.Long")) {
|
|
|
clazz.getMethod(key, Long.class).invoke(saveModel, Long.valueOf(value + ""));
|
|
|
} else {
|
|
|
clazz.getMethod(key, Integer.class).invoke(saveModel, value);
|
|
|
}
|
|
|
} else if (value instanceof Double) {
|
|
|
clazz.getMethod(key, Double.class).invoke(saveModel, value);
|
|
|
} else if (value instanceof java.util.Date) {
|
|
|
clazz.getMethod(key, java.util.Date.class).invoke(saveModel, value);
|
|
|
} else if (value instanceof java.util.List) {
|
|
|
Field field = clazz.getDeclaredField(heads.get(i));
|
|
|
if(field.getGenericType().getTypeName().equals("java.util.Set<java.lang.String>")){
|
|
|
Set<String> set = new HashSet<>();
|
|
|
for(Object s : (ArrayList) value){
|
|
|
set.add(s + "");
|
|
|
}
|
|
|
clazz.getMethod(key, java.util.Set.class).invoke(saveModel, set);
|
|
|
}else {
|
|
|
clazz.getMethod(key, java.util.List.class).invoke(saveModel, value);
|
|
|
}
|
|
|
}
|
|
|
} catch (Exception e) {
|
|
|
logger.warn(e.getMessage());
|
|
|
}
|
|
|
}
|
|
|
saveModels.add(saveModel);
|
|
|
});
|
|
|
} catch (Exception e) {
|
|
|
logger.error(e.getMessage());
|
|
|
}
|
|
|
return saveModels;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 执行sql查询es
|
|
|
*
|
|
|
* @param sql
|
|
|
* @return
|
|
|
*/
|
|
|
public List<DataModel> excuteDataModel(String sql) {
|
|
|
List<DataModel> saveModels = new ArrayList<>();
|
|
|
try {
|
|
|
SQLExprParser parser = new ElasticSqlExprParser(sql);
|
|
|
SQLExpr expr = parser.expr();
|
|
|
SQLQueryExpr queryExpr = (SQLQueryExpr) expr;
|
|
|
// if (parser.getLexer().token() != Token.EOF) {
|
|
|
// throw new ParserException("illegal sql expr : " + sql);
|
|
|
// }
|
|
|
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对象
|
|
|
Client client = elasticFactory.getTransportClient();
|
|
|
queryAction = new DefaultQueryAction(client, select);
|
|
|
requestBuilder = queryAction.explain();
|
|
|
}
|
|
|
SearchResponse response = (SearchResponse) requestBuilder.get();
|
|
|
Object queryResult = null;
|
|
|
if(sql.toUpperCase().indexOf("GROUP")!=-1||sql.toUpperCase().indexOf("SUM")!=-1){
|
|
|
queryResult = response.getAggregations();
|
|
|
}else{
|
|
|
queryResult = response.getHits();
|
|
|
}
|
|
|
ObjectResult temp = new ObjectResultsExtractor(true, true, true).extractResults(queryResult, true);
|
|
|
List<String> heads = temp.getHeaders();
|
|
|
for(List<Object> one:temp.getLines()){
|
|
|
// temp.getLines().stream().forEach(one -> {
|
|
|
try {
|
|
|
DataModel dataModel = new DataModel();
|
|
|
for (int i = 0; i < one.size(); i++) {
|
|
|
String key = null;
|
|
|
Object value = one.get(i);
|
|
|
if(heads.get(i).startsWith("_")){
|
|
|
continue;
|
|
|
}
|
|
|
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));
|
|
|
}
|
|
|
try {
|
|
|
if (value instanceof String) {
|
|
|
DataModel.class.getMethod(key, String.class).invoke(dataModel, value);
|
|
|
} else if (value instanceof Integer) {
|
|
|
DataModel.class.getMethod(key, Integer.class).invoke(dataModel, value);
|
|
|
} else if (value instanceof Double) {
|
|
|
DataModel.class.getMethod(key, Double.class).invoke(dataModel, value);
|
|
|
} else if (value instanceof java.util.Date) {
|
|
|
DataModel.class.getMethod(key, java.util.Date.class).invoke(dataModel, value);
|
|
|
}
|
|
|
}catch (Exception e){
|
|
|
logger.error(e.getMessage());
|
|
|
}
|
|
|
}
|
|
|
saveModels.add(dataModel);
|
|
|
} 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());
|
|
|
}
|
|
|
}
|