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.exception.ConditionException; 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.service.business.CommonService; import com.alibaba.fastjson.JSON; import com.google.gson.Gson; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import java.io.*; import java.util.*; /** * 格式化检索式类 */ @Service @Slf4j public class FormatQueryService { @Autowired private GetSqlFactory getSqlFactory; @Autowired private GetOrderFactory getOrderFactory; 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)).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; } /** * 格式化分组 * * @param groupBy * @return */ public String groupToString(String groupBy) { String json = CommonService.readJsonFile("event.json"); List groupConfigs = JSON.parseArray(json, GroupConfig.class); GroupConfig groupConfig = groupConfigs.stream().filter(item -> item.getField().equals(groupBy)).findFirst().orElse(null); if (groupConfig != null) { return " group by " + groupConfig.getSqlField() + " "; } return ""; } /** * 返回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){ if(condition!=null&&condition!="") { condition += " AND " + queryRequest.getGroupField() + "=" + queryRequest.getGroupFieldValue(); } else { condition = queryRequest.getGroupField() + "=" + queryRequest.getGroupFieldValue(); } } //检索式格式化 if (condition != null && condition != "") { try { //将检索式转换为二叉树 treeNode tree = expressManager.getInstance().Parse(condition, false); //格式化检索式 sql1 = this.ToString2((operateNode) tree, null,tableName); } catch (Exception e) { throw new ConditionException("检索式错误"); } } //格式化排序 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; } }