package cn.cslg.pas.service.query; import cn.cslg.pas.common.model.cronModel.GroupConfig; import cn.cslg.pas.common.model.cronModel.OrderConfig; import cn.cslg.pas.common.model.cronModel.SqlObject; import cn.cslg.pas.common.model.request.MapRequest; import cn.cslg.pas.common.model.request.OrderDTO; import cn.cslg.pas.common.model.request.QueryRequest; import cn.cslg.pas.common.model.request.StringRequest; import cn.cslg.pas.common.utils.StringUtils; import cn.cslg.pas.common.utils.parseQueryToTree.*; import cn.cslg.pas.common.vo.EsConfigVO; import cn.cslg.pas.exception.ConditionException; import cn.cslg.pas.exception.ExceptionEnum; import cn.cslg.pas.exception.XiaoShiException; import cn.cslg.pas.factorys.EsBuilderFactory.EsBuilderFactory; import cn.cslg.pas.factorys.EsBuilderFactory.IQueryBuilder; import cn.cslg.pas.factorys.WebQueryFactory.FormWebQueryFieldImp; import cn.cslg.pas.factorys.WebQueryFactory.GetWebQueryFactory; import cn.cslg.pas.factorys.WebQueryFactory.WebQueryConfigVO; import cn.cslg.pas.factorys.getOrderFactory.GetOrderFactory; import cn.cslg.pas.factorys.getOrderFactory.GetOrderObject; import cn.cslg.pas.factorys.getSqlFactorys.GetSqlFactory; import cn.cslg.pas.factorys.getSqlFactorys.GetSqlObject; import cn.cslg.pas.factorys.getSqlFactorys.GetWebQuerySql; import cn.cslg.pas.service.business.CommonService; import co.elastic.clients.elasticsearch._types.query_dsl.QueryBuilders; import com.alibaba.fastjson.JSON; import com.fasterxml.jackson.databind.node.ValueNode; import com.google.gson.Gson; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import co.elastic.clients.elasticsearch._types.query_dsl.Query; import org.springframework.util.CollectionUtils; import java.io.*; import java.text.ParseException; import java.util.*; /** * 格式化检索式类 */ @Service @Slf4j public class FormatQueryService { @Autowired private GetSqlFactory getSqlFactory; @Autowired private GetOrderFactory getOrderFactory; @Autowired private EsBuilderFactory esBuilderFactory; @Autowired private GetWebQueryFactory getWebQueryFactory; public String getText(String text) throws Exception { treeNode tree = expressManager.getInstance().Parse(text, false); System.out.print(this.ToString((operateNode) tree)); return ""; } /** * 二叉树转检索式 * * @param node * @return */ public String ToString(operateNode node) { operate operate1 = node.getoperate(); treeNode Left = node.getLeft(); treeNode Right = node.getRight(); String strCode = ""; String optionName = ""; if ((operate1.getShowName() != null)) { strCode = operate1.getShowName(); optionName = operate1.getShowName(); } else { strCode = operate1.getCode(); optionName = operate1.getCode(); } GetSqlObject getSqlObject = null; if (Left != null) { if ((operate1.gettype() == enuType.Logic || operate1.gettype() == enuType.Assignment) && (Left instanceof operateNode)) { strCode = "(" + this.ToString((operateNode) Left) + ") " + strCode; } else { //获得栏位名称 String field = Left.ToString(); strCode = Left.ToString() + " " + strCode; //判断 参数类型 String json = CommonService.readJsonFile("event.json"); List sqlObjects = JSON.parseArray(json, SqlObject.class); SqlObject sqlObject = sqlObjects.stream().filter(item -> item.getValue().equals(field)).findFirst().orElse(null); if (sqlObject != null) { getSqlObject = getSqlFactory.getClass(sqlObject.getSqlClass()); sqlObject.setOption(optionName); getSqlObject.setSqlObject(sqlObject); } } } if (Right != null) { String rightValue = ""; if ((operate1.gettype() == enuType.Logic || operate1.gettype() == enuType.Assignment) && (Right instanceof operateNode)) { rightValue = this.ToString((operateNode) Right); strCode = strCode + " (" + rightValue + ") "; } else { rightValue = Right.ToString(); strCode = strCode + " " + Right.ToString(); } if (getSqlObject != null) { if (optionName.equals(" LIKE ")) { rightValue = "'%" + rightValue + "%'"; } strCode = getSqlObject.getSql(rightValue); } } return strCode; } /** * 排序转sql排序语句 * * @param dtos * @return */ public String orderToString(List dtos, String tableName) { //读取排序配置类 String json = CommonService.readJsonFile(tableName + ".json"); List configs = JSON.parseArray(json, OrderConfig.class); String re = "order by "; List orders = new ArrayList<>(); dtos.forEach(item -> { OrderConfig orderConfig = configs.stream().filter(tem -> tem.getField().equals(item.getOrderBy())).findFirst().orElse(null); GetOrderObject getOrderObject = getOrderFactory.getClass(orderConfig.getOrderClass()); String order = getOrderObject.getOrderString(orderConfig.getSqlField(), item.getOrderType()); if (order != "") { orders.add(order); } }); if (orders.size() == 0) { return ""; } String orderStr = StringUtils.join(orders, ","); re += orderStr; return re; } /** * 二叉树转检索式 * * @param node * @return */ public String ToString2(operateNode node, GetSqlObject getSqlObject, String tableName) { operate operate1 = node.getoperate(); treeNode Left = node.getLeft(); treeNode Right = node.getRight(); String strCode = ""; String optionName = ""; if ((operate1.getShowName() != null)) { strCode = operate1.getShowName(); optionName = operate1.getShowName(); } else { strCode = operate1.getCode(); optionName = operate1.getCode(); } GetSqlObject getSqlObjectLocal = null; if (Left != null) { if ((operate1.gettype() == enuType.Logic || operate1.gettype() == enuType.Assignment) && (Left instanceof operateNode)) { strCode = "(" + this.ToString2((operateNode) Left, getSqlObject, tableName) + ") " + strCode + " "; } else { //获得栏位名称 String field = Left.ToString(); if (getSqlObject != null) { strCode = getSqlObject.getSql(field) + strCode + " "; } else { strCode = Left.ToString() + " " + strCode; //判断 参数类型 String json = CommonService.readJsonFile(tableName + ".json"); List sqlObjects = JSON.parseArray(json, SqlObject.class); SqlObject sqlObject = sqlObjects.stream().filter(item -> item.getValue().equals(field) && item.getIfAsCondition() != null && item.getIfAsCondition().equals(true)).findFirst().orElse(null); if (sqlObject != null) { getSqlObjectLocal = getSqlFactory.getClass(sqlObject.getSqlClass()); sqlObject.setOption(optionName); getSqlObjectLocal.setSqlObject(sqlObject); getSqlObject = getSqlObjectLocal; } } } } if (Right != null) { String rightValue = ""; if ((operate1.gettype() == enuType.Logic || operate1.gettype() == enuType.Assignment) && (Right instanceof operateNode)) { rightValue = this.ToString2((operateNode) Right, getSqlObject, tableName); if (getSqlObject != null) { return rightValue; } strCode = strCode + " (" + rightValue + ") "; } else { if (getSqlObjectLocal != null) { rightValue = Right.ToString(); strCode = getSqlObject.getSql(rightValue); } else if (getSqlObject != null) { rightValue = Right.ToString(); strCode = strCode + getSqlObject.getSql(rightValue); } } } return strCode; } /** * 返回sql列表 * * @param queryRequest * @return */ public List reSqls(QueryRequest queryRequest, String tableName) { List sqls = new ArrayList<>(); String sql1 = ""; String sql2 = ""; String sql3 = ""; //合成检索式 StringRequest stringRequest = null; if (queryRequest instanceof MapRequest) { } else { stringRequest = (StringRequest) queryRequest; } String condition = stringRequest.getSearchQuery(); if (queryRequest.getGroupField() != null) { String value =""; if(queryRequest.getGroupFieldValue()==null||queryRequest.getGroupFieldValue().equals("未知")){ value = queryRequest.getGroupField() + "=" +"null"; } else { value =queryRequest.getGroupField() + "=" + queryRequest.getGroupFieldValue(); } if (condition != null && condition != "") { condition += " AND " + value; } else { condition = value; } } if (queryRequest.getProjectId() != null) { if (condition != null && condition != "") { condition += " AND " + "project_id" + "=" + queryRequest.getProjectId(); } else { condition = "project_id" + "=" + queryRequest.getProjectId(); } } //检索式格式化 if (condition != null && condition != "") { try { //将检索式转换为二叉树 treeNode tree = expressManager.getInstance().Parse(condition, false); //格式化检索式 sql1 = this.ToString2((operateNode) tree, null, tableName); } catch (Exception e) { throw new XiaoShiException(ExceptionEnum.BUSINESS_ERROR, "检索式错误"); } } //格式化排序 if (queryRequest.getOrderDTOList() != null && queryRequest.getOrderDTOList().size() != 0) { String orderSql = this.orderToString(queryRequest.getOrderDTOList(), tableName); sql2 = orderSql; } //格式化 分页信息 if (queryRequest.getSize() != null && queryRequest.getCurrent() != null) { Long size = queryRequest.getSize(); Long current = queryRequest.getCurrent(); String page = " limit " + ((current - 1) * size) + "," + size; sql3 = page; } //格式化分组信息 sqls.add(sql1); sqls.add(sql2); sqls.add(sql3); return sqls; } /** * 返回查新报告sql列表 * * @param queryRequest * @return */ public List formatSqls(QueryRequest queryRequest, String tableName) { List sqls = new ArrayList<>(); String sql1 = ""; String sql2 = ""; String sql3 = ""; //合成检索式 StringRequest stringRequest = null; if (queryRequest instanceof MapRequest) { } else { stringRequest = (StringRequest) queryRequest; } String condition = stringRequest.getSearchQuery(); if (queryRequest.getGroupField() != null) { String value =""; if(queryRequest.getGroupFieldValue()==null||queryRequest.getGroupFieldValue().equals("未知")){ value = queryRequest.getGroupField() + "=" +"null"; } else { value =queryRequest.getGroupField() + "=" + queryRequest.getGroupFieldValue(); } if (condition != null && condition != "") { condition += " AND " + value; } else { condition = value; } } if (queryRequest.getProjectId() != null) { if (condition != null && condition != "") { condition += " AND " + "projectId" + "=" + queryRequest.getProjectId(); } else { condition = "projectId" + "=" + queryRequest.getProjectId(); } } //检索式格式化 if (StringUtils.isNotEmpty(condition)) { try { //将检索式转换为二叉树 treeNode tree = expressManager.getInstance().Parse(condition, false); //格式化检索式 sql1 = this.ToString2((operateNode) tree, null, tableName); } catch (Exception e) { throw new ConditionException("检索式错误"); } } //格式化排序 if (!CollectionUtils.isEmpty(queryRequest.getOrderDTOList())) { String orderSql = this.orderToString(queryRequest.getOrderDTOList(), tableName); sql2 = orderSql; } else { sql2 = "order by p.create_time desc"; } //格式化 分页信息 if (queryRequest.getSize() != null && queryRequest.getCurrent() != null) { Long size = queryRequest.getSize(); Long current = queryRequest.getCurrent(); String page = " limit " + ((current - 1) * size) + "," + size; sql3 = page; } //格式化分组信息 sqls.add(sql1); sqls.add(sql2); sqls.add(sql3); return sqls; } /** * 网站检索式格式化 * * @param node * @param getSqlObject * @param tableName * @return */ public String webQueryToString(operateNode node, GetSqlObject getSqlObject, String tableName) { operate operate1 = node.getoperate(); treeNode Left = node.getLeft(); treeNode Right = node.getRight(); String strCode = ""; String optionName = ""; if ((operate1.getShowName() != null)) { if (operate1.getShowName().equals("AND")) { strCode="*"; optionName="*"; } else if (operate1.getShowName().equals("OR")) { strCode="+"; optionName="+"; } else if (operate1.getShowName().equals("NOT")) { strCode="-"; optionName="-"; } else { strCode=operate1.getShowName(); optionName=operate1.getShowName(); } } else { if (operate1.getCode().equals("AND")) { strCode="*"; optionName="*"; } else if (operate1.getCode().equals("OR")) { strCode="+"; optionName="+"; } else if (operate1.getCode().equals("NOT")) { strCode="-"; optionName="-"; } else { strCode=operate1.getShowName(); optionName=operate1.getShowName(); } } GetSqlObject getSqlObjectLocal = null; if (Left != null) { if ((operate1.gettype() == enuType.Logic || operate1.gettype() == enuType.Assignment) && (Left instanceof operateNode)) { strCode = "(" + this.webQueryToString((operateNode) Left, getSqlObject, tableName) + ")" + strCode; } else { //获得栏位名称 String field = Left.ToString(); if (getSqlObject != null) { strCode = getSqlObject.getSql(field) + strCode; } else { strCode = Left.ToString() + strCode; //判断 参数类型 String json = CommonService.readJsonFile(tableName + ".json"); List sqlObjects = JSON.parseArray(json, SqlObject.class); SqlObject sqlObject = sqlObjects.stream().filter(item -> item.getField().equals(field)).findFirst().orElse(null); if (sqlObject != null) { getSqlObjectLocal = getSqlFactory.getClass(sqlObject.getSqlClass()); sqlObject.setOption(optionName); getSqlObjectLocal.setSqlObject(sqlObject); getSqlObject = getSqlObjectLocal; } } } } if (Right != null) { String rightValue = ""; if ((operate1.gettype() == enuType.Logic || operate1.gettype() == enuType.Assignment) && (Right instanceof operateNode)) { if (((operateNode) Right).getoperate().getCode().equals("~")) { rightValue = this.webQueryToString((operateNode) Right, null, tableName); strCode = getSqlObject.getSql(rightValue); } else { rightValue = this.webQueryToString((operateNode) Right, getSqlObject, tableName); if (getSqlObject != null) { return rightValue; } strCode = strCode + "(" + rightValue + ")"; } } else { if (getSqlObjectLocal != null) { rightValue = Right.ToString(); strCode = getSqlObject.getSql(rightValue); } else if (getSqlObject != null) { rightValue = Right.ToString(); strCode = strCode + getSqlObject.getSql(rightValue); } else if (!(Left instanceof operateNode)) { rightValue = Right.ToString(); strCode += rightValue; } } } return strCode; } public String reQuery(String query, String configName) { //将检索式转换为二叉树 treeNode tree = null; try { tree = expressManager.getInstance().Parse(query, false); } catch (Exception e) { e.printStackTrace(); } //格式化检索式 String reQuery = this.webQueryToString2( tree, configName); reQuery = "F XX (" + reQuery + ")"; return reQuery; } /** * Es检索 * * @param node * @param configName * @return * @throws ParseException */ public Query EsQueryToQuery(treeNode node, String configName, Integer projectId) throws ParseException { if (node == null) { return null; } else { if (node instanceof operateNode) { operate operate1 = ((operateNode) node).getoperate(); treeNode Left = node.getLeft(); treeNode Right = node.getRight(); //如果and or 则递归本身 if (operate1.gettype().equals(enuType.Logic)) { Query q1 = this.EsQueryToQuery((operateNode) Left, configName,projectId); Query q2 = this.EsQueryToQuery((operateNode) Right, configName,projectId); switch (operate1.getShowName()) { case "AND": return QueryBuilders.bool(i -> i.must(q1, q2)); case "OR": return QueryBuilders.bool(i -> i.should(q1, q2)); case "NOT": Query temQ = (q1 == null) ? q2 : q1; return QueryBuilders.bool(i -> i.mustNot(temQ)); case "TO": return QueryBuilders.bool(i -> i.must(q1, q2)); case "*": return QueryBuilders.bool(i -> i.must(q1, q2)); default: return null; } } else { if (operate1.gettype().equals(enuType.Assignment)) { return HandleValueNode(((valueNode) Left).getvalue(), operate1.getCode(), Right, configName, "", "",projectId); } else { return null; } } } else { return null; } } } public Query HandleValueNode(String field, String operate, treeNode valeNode, String configName,String op,String dp,Integer projectId) throws ParseException { if (valeNode == null) { return null; } else { if (valeNode instanceof operateNode) { operate operate1 = ((operateNode) valeNode).getoperate(); if (operate1.getShowName().equals("TO")) { op = ">="; dp = "<="; } if (operate1.gettype().equals(enuType.Logic)) { Query q1 = this.HandleValueNode(field, operate, ((treeNode) valeNode).getLeft(), configName,op,"",projectId); Query q2 = this.HandleValueNode(field, operate, (treeNode) valeNode.getRight(), configName,"",dp,projectId); switch (operate1.getShowName()) { case "AND": return QueryBuilders.bool(i -> i.must(q1, q2)); case "OR": return QueryBuilders.bool(i -> i.should(q1, q2)); case "NOT": Query temQ = (q1 == null) ? q2 : q1; return QueryBuilders.bool(i -> i.mustNot(temQ)); case "TO": return QueryBuilders.bool(i -> i.must(q1, q2)); case "*": return QueryBuilders.bool(i -> i.must(q1, q2)); default: return null; } } else { return null; } } else { if (StringUtils.isNotEmpty(op)) { operate = op; } else if (StringUtils.isNotEmpty(dp)) operate = dp; //比较运算符 IQueryBuilder iQueryBuilder = null; String json = CommonService.readJsonFile(configName + ".json"); List esConfigVOS = JSON.parseArray(json, EsConfigVO.class); EsConfigVO esConfigVO = esConfigVOS.stream().filter(item -> item.getField().equals(field)).findFirst().orElse(null); if (esConfigVO != null) { iQueryBuilder = esBuilderFactory.getClass(esConfigVO.getEsClass()); iQueryBuilder.setField(esConfigVO.getEsField()); if (iQueryBuilder.getField().contains(".")) { String path = iQueryBuilder.getField().substring(0, iQueryBuilder.getField().indexOf(".")); iQueryBuilder.setPath(path); } iQueryBuilder.setOperator(operate); iQueryBuilder.setValue(((valueNode) valeNode).getvalue()); iQueryBuilder.setProjectId(projectId); return iQueryBuilder.creteQuery(); } else { return null; } } } } public String webQueryToString2(treeNode treenode, String tableName) { operateNode node =(operateNode)treenode; treeNode Left = node.getLeft(); treeNode Right = node.getRight(); operate operate1 = node.getoperate(); if(operate1.gettype() == enuType.Assignment) { if(!(Left instanceof valueNode)) { throw new XiaoShiException("检索式错误"); } valueNode leftValue = (valueNode) Left; return this.getQueryValue(Right,tableName,leftValue.getvalue(),this.getNodeStrCode(operate1)); } else if(operate1.gettype()==enuType.Logic&&operate1.getoperateValue()==1) { return "("+"/TI"+this.getNodeStrCode(operate1)+this.webQueryToString2(Right,tableName)+")"; } else if(operate1.gettype()==enuType.Logic) { return "("+ this.webQueryToString2(Left,tableName)+this.getNodeStrCode(operate1)+this.webQueryToString2(Right,tableName)+")"; } return null; } public String getQueryValue(treeNode node, String tableName,String field,String option){ if(node instanceof valueNode){ valueNode valuenode =(valueNode) node; String json = CommonService.readJsonFile(tableName + ".json"); List webQueryConfigVOS = JSON.parseArray(json, WebQueryConfigVO.class); WebQueryConfigVO webQueryConfigVO = webQueryConfigVOS.stream().filter(item -> item.getField().equals(field)).findFirst().orElse(null); webQueryConfigVO.setOption(option); FormWebQueryFieldImp formWebQueryFieldImp =getWebQueryFactory.getClass(webQueryConfigVO.getSqlClass()); webQueryConfigVO.setValue(valuenode.getvalue()); return formWebQueryFieldImp.getWebQuery(webQueryConfigVO); } else { operateNode operatenode =(operateNode)node; treeNode Left = operatenode.getLeft(); treeNode Right = operatenode.getRight(); operate operate1 = operatenode.getoperate(); if(operate1.getoperateValue()==1){ return "("+"/TI"+this.getNodeStrCode(operate1)+this.getQueryValue(Right,tableName,field,option)+")"; } return "("+this.getQueryValue(Left,tableName,field,option)+this.getNodeStrCode(operate1)+this.getQueryValue(Right,tableName,field,option)+")"; } } public String getNodeStrCode(operate operate1){ String strCode = ""; String optionName = ""; if ((operate1.getShowName() != null)) { if (operate1.getShowName().equals("AND")) { strCode="*"; optionName="*"; } else if (operate1.getShowName().equals("OR")) { strCode="+"; optionName="+"; } else if (operate1.getShowName().equals("NOT")) { strCode="-"; optionName="-"; } else { strCode=operate1.getShowName(); optionName=operate1.getShowName(); } } else { if (operate1.getCode().equals("AND")) { strCode="*"; optionName="*"; } else if (operate1.getCode().equals("OR")) { strCode="+"; optionName="+"; } else if (operate1.getCode().equals("NOT")) { strCode="-"; optionName="-"; } else { strCode=operate1.getShowName(); optionName=operate1.getShowName(); } } return strCode; } }