FormatQueryService.java 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288
  1. package cn.cslg.pas.service.query;
  2. import cn.cslg.pas.common.model.cronModel.GroupConfig;
  3. import cn.cslg.pas.common.model.cronModel.OrderConfig;
  4. import cn.cslg.pas.common.model.cronModel.SqlObject;
  5. import cn.cslg.pas.common.model.request.MapRequest;
  6. import cn.cslg.pas.common.model.request.OrderDTO;
  7. import cn.cslg.pas.common.model.request.QueryRequest;
  8. import cn.cslg.pas.common.model.request.StringRequest;
  9. import cn.cslg.pas.common.utils.StringUtils;
  10. import cn.cslg.pas.common.utils.parseQueryToTree.*;
  11. import cn.cslg.pas.exception.ConditionException;
  12. import cn.cslg.pas.factorys.getOrderFactory.GetOrderFactory;
  13. import cn.cslg.pas.factorys.getOrderFactory.GetOrderObject;
  14. import cn.cslg.pas.factorys.getSqlFactorys.GetSqlFactory;
  15. import cn.cslg.pas.factorys.getSqlFactorys.GetSqlObject;
  16. import cn.cslg.pas.service.business.CommonService;
  17. import com.alibaba.fastjson.JSON;
  18. import com.google.gson.Gson;
  19. import lombok.RequiredArgsConstructor;
  20. import lombok.extern.slf4j.Slf4j;
  21. import org.springframework.beans.factory.annotation.Autowired;
  22. import org.springframework.context.annotation.Lazy;
  23. import org.springframework.stereotype.Service;
  24. import java.io.*;
  25. import java.util.*;
  26. /**
  27. * 格式化检索式类
  28. */
  29. @Service
  30. @Slf4j
  31. public class FormatQueryService {
  32. @Autowired
  33. private GetSqlFactory getSqlFactory;
  34. @Autowired
  35. private GetOrderFactory getOrderFactory;
  36. public String getText(String text) throws Exception {
  37. treeNode tree = expressManager.getInstance().Parse(text, false);
  38. System.out.print(this.ToString((operateNode) tree));
  39. return "";
  40. }
  41. /**
  42. * 二叉树转检索式
  43. *
  44. * @param node
  45. * @return
  46. */
  47. public String ToString(operateNode node) {
  48. operate operate1 = node.getoperate();
  49. treeNode Left = node.getLeft();
  50. treeNode Right = node.getRight();
  51. String strCode = "";
  52. String optionName = "";
  53. if ((operate1.getShowName() != null)) {
  54. strCode = operate1.getShowName();
  55. optionName = operate1.getShowName();
  56. } else {
  57. strCode = operate1.getCode();
  58. optionName = operate1.getCode();
  59. }
  60. GetSqlObject getSqlObject = null;
  61. if (Left != null) {
  62. if ((operate1.gettype() == enuType.Logic || operate1.gettype() == enuType.Assignment) && (Left instanceof operateNode)) {
  63. strCode = "(" + this.ToString((operateNode) Left) + ") " + strCode;
  64. } else { //获得栏位名称
  65. String field = Left.ToString();
  66. strCode = Left.ToString() + " " + strCode;
  67. //判断 参数类型
  68. String json = CommonService.readJsonFile("event.json");
  69. List<SqlObject> sqlObjects = JSON.parseArray(json, SqlObject.class);
  70. SqlObject sqlObject = sqlObjects.stream().filter(item -> item.getValue().equals(field)).findFirst().orElse(null);
  71. if (sqlObject != null) {
  72. getSqlObject = getSqlFactory.getClass(sqlObject.getSqlClass());
  73. sqlObject.setOption(optionName);
  74. getSqlObject.setSqlObject(sqlObject);
  75. }
  76. }
  77. }
  78. if (Right != null) {
  79. String rightValue = "";
  80. if ((operate1.gettype() == enuType.Logic || operate1.gettype() == enuType.Assignment) && (Right instanceof operateNode)) {
  81. rightValue = this.ToString((operateNode) Right);
  82. strCode = strCode + " (" + rightValue + ") ";
  83. } else {
  84. rightValue = Right.ToString();
  85. strCode = strCode + " " + Right.ToString();
  86. }
  87. if (getSqlObject != null) {
  88. if (optionName.equals(" LIKE ")) {
  89. rightValue = "'%" + rightValue + "%'";
  90. }
  91. strCode = getSqlObject.getSql(rightValue);
  92. }
  93. }
  94. return strCode;
  95. }
  96. /**
  97. * 排序转sql排序语句
  98. *
  99. * @param dtos
  100. * @return
  101. */
  102. public String orderToString(List<OrderDTO> dtos,String tableName) {
  103. //读取排序配置类
  104. String json = CommonService.readJsonFile(tableName+".json");
  105. List<OrderConfig> configs = JSON.parseArray(json, OrderConfig.class);
  106. String re = "order by ";
  107. List<String> orders = new ArrayList<>();
  108. dtos.forEach(item -> {
  109. OrderConfig orderConfig = configs.stream().filter(tem -> tem.getField().equals(item.getOrderBy())).findFirst().orElse(null);
  110. GetOrderObject getOrderObject = getOrderFactory.getClass(orderConfig.getOrderClass());
  111. String order = getOrderObject.getOrderString(orderConfig.getSqlField(), item.getOrderType());
  112. if (order != "") {
  113. orders.add(order);
  114. }
  115. });
  116. if(orders.size()==0){
  117. return "";
  118. }
  119. String orderStr = StringUtils.join(orders, ",");
  120. re += orderStr;
  121. return re;
  122. }
  123. /**
  124. * 二叉树转检索式
  125. *
  126. * @param node
  127. * @return
  128. */
  129. public String ToString2(operateNode node, GetSqlObject getSqlObject,String tableName) {
  130. operate operate1 = node.getoperate();
  131. treeNode Left = node.getLeft();
  132. treeNode Right = node.getRight();
  133. String strCode = "";
  134. String optionName = "";
  135. if ((operate1.getShowName() != null)) {
  136. strCode = operate1.getShowName();
  137. optionName = operate1.getShowName();
  138. } else {
  139. strCode = operate1.getCode();
  140. optionName = operate1.getCode();
  141. }
  142. GetSqlObject getSqlObjectLocal = null;
  143. if (Left != null) {
  144. if ((operate1.gettype() == enuType.Logic || operate1.gettype() == enuType.Assignment) && (Left instanceof operateNode)) {
  145. strCode = "(" + this.ToString2((operateNode) Left, getSqlObject,tableName) + ") " + strCode + " ";
  146. } else { //获得栏位名称
  147. String field = Left.ToString();
  148. if (getSqlObject != null) {
  149. strCode = getSqlObject.getSql(field) + strCode + " ";
  150. } else {
  151. strCode = Left.ToString() + " " + strCode;
  152. //判断 参数类型
  153. String json = CommonService.readJsonFile(tableName+".json");
  154. List<SqlObject> sqlObjects = JSON.parseArray(json, SqlObject.class);
  155. SqlObject sqlObject = sqlObjects.stream().filter(item -> item.getValue().equals(field)).findFirst().orElse(null);
  156. if (sqlObject != null) {
  157. getSqlObjectLocal = getSqlFactory.getClass(sqlObject.getSqlClass());
  158. sqlObject.setOption(optionName);
  159. getSqlObjectLocal.setSqlObject(sqlObject);
  160. getSqlObject = getSqlObjectLocal;
  161. }
  162. }
  163. }
  164. }
  165. if (Right != null) {
  166. String rightValue = "";
  167. if ((operate1.gettype() == enuType.Logic || operate1.gettype() == enuType.Assignment) && (Right instanceof operateNode)) {
  168. rightValue = this.ToString2((operateNode) Right, getSqlObject,tableName);
  169. if (getSqlObject != null) {
  170. return rightValue;
  171. }
  172. strCode = strCode + " (" + rightValue + ") ";
  173. } else {
  174. if (getSqlObjectLocal != null) {
  175. rightValue = Right.ToString();
  176. strCode = getSqlObject.getSql(rightValue);
  177. } else if (getSqlObject != null) {
  178. rightValue = Right.ToString();
  179. strCode = strCode + getSqlObject.getSql(rightValue);
  180. }
  181. }
  182. }
  183. return strCode;
  184. }
  185. /**
  186. * 格式化分组
  187. *
  188. * @param groupBy
  189. * @return
  190. */
  191. public String groupToString(String groupBy) {
  192. String json = CommonService.readJsonFile("event.json");
  193. List<GroupConfig> groupConfigs = JSON.parseArray(json, GroupConfig.class);
  194. GroupConfig groupConfig = groupConfigs.stream().filter(item -> item.getField().equals(groupBy)).findFirst().orElse(null);
  195. if (groupConfig != null) {
  196. return " group by " + groupConfig.getSqlField() + " ";
  197. }
  198. return "";
  199. }
  200. /**
  201. * 返回sql列表
  202. *
  203. * @param queryRequest
  204. * @return
  205. */
  206. public List<String> reSqls(QueryRequest queryRequest,String tableName) {
  207. List<String> sqls = new ArrayList<>();
  208. String sql1 = "";
  209. String sql2 = "";
  210. String sql3 = "";
  211. //合成检索式
  212. StringRequest stringRequest = null;
  213. if (queryRequest instanceof MapRequest) {
  214. } else {
  215. stringRequest = (StringRequest) queryRequest;
  216. }
  217. String condition = stringRequest.getSearchQuery();
  218. if(queryRequest.getGroupField()!=null){
  219. if(condition!=null&&condition!="") {
  220. condition += " AND " + queryRequest.getGroupField() + "=" + queryRequest.getGroupFieldValue();
  221. }
  222. else {
  223. condition = queryRequest.getGroupField() + "=" + queryRequest.getGroupFieldValue();
  224. }
  225. }
  226. //检索式格式化
  227. if (condition != null && condition != "") {
  228. try {
  229. //将检索式转换为二叉树
  230. treeNode tree = expressManager.getInstance().Parse(condition, false);
  231. //格式化检索式
  232. sql1 = this.ToString2((operateNode) tree, null,tableName);
  233. } catch (Exception e) {
  234. throw new ConditionException("检索式错误");
  235. }
  236. }
  237. //格式化排序
  238. if (queryRequest.getOrderDTOList() != null && queryRequest.getOrderDTOList().size() != 0) {
  239. String orderSql = this.orderToString(queryRequest.getOrderDTOList(),tableName);
  240. sql2 = orderSql;
  241. }
  242. //格式化 分页信息
  243. if (queryRequest.getSize() != null && queryRequest.getCurrent() != null) {
  244. Long size = queryRequest.getSize();
  245. Long current = queryRequest.getCurrent();
  246. String page = " limit " + ((current - 1) * size) + "," + size;
  247. sql3 = page;
  248. }
  249. //格式化分组信息
  250. sqls.add(sql1);
  251. sqls.add(sql2);
  252. sqls.add(sql3);
  253. return sqls;
  254. }
  255. }