GenSqlStringServiceImpl.java 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301
  1. package com.bowintek.practice.services.impl;
  2. import com.bowintek.practice.mapper.SrSaerchtempMapper;
  3. import com.bowintek.practice.mapper.SrSubjectMapper;
  4. import com.bowintek.practice.mapper.SrSubjectfieldMapper;
  5. import com.bowintek.practice.mapper.cquery.SubjectCQuery;
  6. import com.bowintek.practice.mapper.cquery.TempCQuery;
  7. import com.bowintek.practice.model.*;
  8. import com.bowintek.practice.services.service.GenSqlStringService;
  9. import com.bowintek.practice.services.service.TempService;
  10. import com.bowintek.practice.util.multipdb.DBTypeEnum;
  11. import com.bowintek.practice.util.multipdb.SwitchDataSource;
  12. import com.bowintek.practice.vo.temp.*;
  13. import org.apache.ibatis.jdbc.SqlRunner;
  14. import org.springframework.beans.factory.annotation.Autowired;
  15. import org.springframework.beans.factory.annotation.Value;
  16. import org.springframework.stereotype.Component;
  17. import java.sql.Connection;
  18. import java.sql.DriverManager;
  19. import java.text.MessageFormat;
  20. import java.util.*;
  21. import java.util.concurrent.RecursiveTask;
  22. import java.util.stream.Collectors;
  23. @Component
  24. public class GenSqlStringServiceImpl implements GenSqlStringService {
  25. @Autowired
  26. SrSubjectMapper srSubjectMapper;
  27. @Autowired
  28. SrSubjectfieldMapper srSubjectfieldMapper;
  29. @Autowired
  30. TempCQuery tempCQuery;
  31. @Value("${spring.datasource.postgre.url}")
  32. private String postgreUrl;
  33. @Value("${spring.datasource.postgre.username}")
  34. private String postgreUsername;
  35. @Value("${spring.datasource.postgre.password}")
  36. private String postgrePassword;
  37. @Value("${spring.datasource.postgre.driver-class-name}")
  38. private String postgreDriver;
  39. @Override
  40. public List<Map<String,Object>> getListBySqlString(String sqlString){
  41. //return tempCQuery.getListBySqlString(sqlString);
  42. try {
  43. //加载数据库驱动
  44. Class.forName(postgreDriver);
  45. Connection connection = DriverManager.getConnection(postgreUrl, postgreUsername, postgrePassword);
  46. SqlRunner sqlRunner = new SqlRunner(connection);
  47. return sqlRunner.selectAll(sqlString);
  48. }
  49. catch (Exception ex){
  50. ex.printStackTrace();
  51. return null;
  52. }
  53. }
  54. @Override
  55. public Map<String,Object> getMapBySqlString(String sqlString){
  56. try {
  57. //加载数据库驱动
  58. Class.forName(postgreDriver);
  59. Connection connection = DriverManager.getConnection(postgreUrl, postgreUsername, postgrePassword);
  60. SqlRunner sqlRunner = new SqlRunner(connection);
  61. return sqlRunner.selectOne(sqlString);
  62. }
  63. catch (Exception ex){
  64. ex.printStackTrace();
  65. return null;
  66. }
  67. }
  68. @Override
  69. public int getIntBySqlString(String sqlString, String colName) {
  70. Map<String, Object> map = getMapBySqlString(sqlString);
  71. return Integer.parseInt(map.get(colName).toString());
  72. }
  73. //查询语句生成,要素点:查询主表、关联子表、查询字段、查询条件
  74. //查询主表:FROM (sr_subject.execSql) AS T
  75. //查询字段-维度:sr_tempdimension.fieldAlias
  76. //查询字段-度量:sr_tempmeasure.fieldAlias + 函数名称/表达式; SUM({$FIELD$}) / COUNT(*) 替换中间字段名称
  77. //查询条件:检测出 日期型、字符型、数字型,在针对性生成条件语句
  78. //输出字段 AS:ReFieldName0,1,2...;依据维度度量排序来
  79. //表名 AS:T 主表,T0,1,2...;子表,依据维度度量子表排序来
  80. @Override
  81. public GenSqlStringResult Generation(TempObjectModel data, String userID){
  82. GenSqlStringResult result = new GenSqlStringResult();
  83. result.excelNameList = new ArrayList<>();
  84. //取得字段原本定义
  85. data.sub = srSubjectMapper.selectByPrimaryKey(data.temp.getSubId());
  86. List<SrSubjectfield> fileds = getSubjectfieldsBySubId(data.temp.getSubId());
  87. //循环分析出关联表
  88. //isForeignKey leftFieldId rightFieldId referencesTab displayColumn
  89. int tabIndex = 0;
  90. HashMap<String, SqlColumnModel> aliasMap = new HashMap<>();
  91. List<SqlFieldModel> models = new ArrayList<>();
  92. data.bases.forEach(it->{ models.add(SqlFieldModel.GenModel(it.getFieldId(),it.getTempFeildId()));});
  93. data.measures.forEach(it->{ models.add(SqlFieldModel.GenModel(it.getFieldId(),it.getTempFeildId()));});
  94. //生成主要的字段、关联表、表T名称、字段T名称对照表
  95. String leftTableString = "";
  96. for(int i=0;i<models.size();i++){
  97. SrSubjectfield fd = findFieldByFieldId(fileds, models.get(i).getFieldId());
  98. SqlColumnModel cm = getSqlColumn(fd.getIsForeignKey(), fd.getFieldAlias(), fd.getFieldCode(), fd.getForeignKey(),
  99. fd.getReferencesTab(), fd.getDisplayColumn(), tabIndex);
  100. if(cm.getIsForeignKey()) {
  101. tabIndex++;
  102. leftTableString+=cm.getLeftJoinString();
  103. }
  104. aliasMap.put(models.get(i).getTempFieldId(), cm);
  105. }
  106. int fieldIndex = 0;
  107. String colString = "", groupString = "";
  108. //维度生成,Group生成
  109. for(int i=0;i<data.bases.size();i++){
  110. SrTempdimension dim = data.bases.get(i);
  111. SqlColumnModel cm = aliasMap.get(dim.getTempFeildId());
  112. colString += MessageFormat.format("{0} {1} AS {2}\n\t",
  113. getCommaString(fieldIndex), cm.getDisplayColumn(), getFieldName(fieldIndex));
  114. groupString += MessageFormat.format("{0} {1}\n\t",getCommaString(fieldIndex), cm.getDisplayColumn());
  115. cm.setMeasureColumn(cm.getDisplayColumn());
  116. //生成字段-名称对照表
  117. result.excelNameList.add(ExceNameModel.GenModel(
  118. getFieldName(dim.getFieldName(), dim.getDisplayName()),
  119. getFieldName(fieldIndex)));
  120. fieldIndex++;
  121. }
  122. //度量生成
  123. for(int i=0;i<data.measures.size();i++){
  124. SrTempmeasure msr = data.measures.get(i);
  125. SqlColumnModel cm = aliasMap.get(msr.getTempFeildId());
  126. colString += MessageFormat.format("{0} {1} AS {2}\n\t",
  127. getCommaString(fieldIndex),
  128. getMeasurString(msr.getOperation(), cm.getDisplayColumn()),
  129. getFieldName(fieldIndex));
  130. cm.setMeasureColumn(getMeasurString(msr.getOperation(), cm.getDisplayColumn()));
  131. //生成字段-名称对照表
  132. result.excelNameList.add(ExceNameModel.GenModel(
  133. getFieldName(msr.getFieldName(), msr.getDisplayName()),
  134. getFieldName(fieldIndex)));
  135. fieldIndex++;
  136. }
  137. //查询条件的生成
  138. String whereString = "";
  139. for(int i=0;i<data.wheres.size();i++){
  140. SrTempfield stf = data.wheres.get(i);
  141. if(stf.getQueryType()==1 || stf.getQueryType()==4) whereString += genWhereString(stf);
  142. else if(stf.getQueryType()==2) whereString += genWhereNumber(stf);
  143. else if(stf.getQueryType()==3) whereString += genWhereDate(stf);
  144. }
  145. //生成排序字段
  146. String orderByString = "";
  147. if(IsNullEmpty(data.pagination.orderBy) || !aliasMap.containsKey(data.pagination.orderBy))
  148. data.pagination.orderBy = aliasMap.keySet().stream().findFirst().get();
  149. System.out.println("data.orderBy:"+data.pagination.orderBy);
  150. if(aliasMap.containsKey(data.pagination.orderBy)){
  151. if(IsNullEmpty(data.pagination.orderByString)) data.pagination.orderByString = "asc";
  152. SqlColumnModel cmOrder = aliasMap.get(data.pagination.orderBy);
  153. orderByString = MessageFormat.format("ORDER BY {0} {1}", cmOrder.getMeasureColumn(), data.pagination.orderByString);
  154. }
  155. String limitString = MessageFormat.format("LIMIT {0} OFFSET {1}",
  156. data.pagination.rows, (data.pagination.page-1) * data.pagination.rows);
  157. String mainSqlString = MessageFormat.format("SELECT {0} \nFROM {1} AS T {2} \nWHERE 1=1 {3} \nGROUP BY {4} \n{5} \n{6}",
  158. colString, data.sub.getTabCode(), leftTableString, whereString, groupString, orderByString, limitString);
  159. result.setMainSqlString(mainSqlString);
  160. String countSqlString = MessageFormat.format("SELECT COUNT(*) CNT FROM (SELECT {0} \nFROM {1} AS T {2} \nWHERE 1=1 {3} \nGROUP BY {4})",
  161. colString, data.sub.getTabCode(), leftTableString, whereString, groupString);
  162. result.setCountSqlStrimg(countSqlString);
  163. System.out.println(mainSqlString);
  164. System.out.println(countSqlString);
  165. return result;
  166. }
  167. public String getFieldName(String fieldName,String displayName){
  168. return IsNullEmpty(displayName)? fieldName : displayName;
  169. }
  170. public static boolean IsNullEmpty(String value) {
  171. return value == null || value.isEmpty();
  172. }
  173. public String genWhereString(SrTempfield stf){
  174. if(IsNullEmpty(stf.getOperation()) || IsNullEmpty(stf.getValue1()))
  175. return genRemark("genWhereString", stf.getTempFeildId());
  176. if(stf.getOperation().equals("="))
  177. return MessageFormat.format("\n\tAND T.{0}={1}", stf.getFieldAlias(),
  178. "'"+stf.getValue1()+"'");
  179. else if(stf.getOperation().equals("like"))
  180. return MessageFormat.format("\n\tAND T.{0} like {1}", stf.getFieldAlias(),
  181. "'%"+stf.getValue1()+"%'");
  182. else
  183. return MessageFormat.format("\n\tAND T.{0} {1}", stf.getFieldAlias(), stf.getOperation());
  184. }
  185. public String genWhereNumber(SrTempfield stf){
  186. if(IsNullEmpty(stf.getOperation()) || IsNullEmpty(stf.getValue1()) ||
  187. (stf.getOperation().equals("limit") && IsNullEmpty(stf.getValue2())))
  188. return genRemark("genWhereNumber", stf.getTempFeildId());
  189. if(stf.getOperation().equals("limit"))
  190. return MessageFormat.format("\n\tAND T.{0} >= {1} AND T.{2}<={3}",
  191. stf.getFieldAlias(), stf.getValue1(), stf.getFieldAlias(), stf.getValue2());
  192. else
  193. return MessageFormat.format("\n\tAND T.{0} {1} {2}", stf.getFieldAlias(), stf.getOperation(), stf.getValue1());
  194. }
  195. public String genWhereDate(SrTempfield stf){
  196. if(IsNullEmpty(stf.getOperation())) return genRemark("genWhereDate", stf.getTempFeildId());
  197. String where = "";
  198. String[] arys = stf.getOperation().split(",");
  199. if(stf.getOperation().equals("date") || stf.getOperation().equals("datetime")) {
  200. if (!IsNullEmpty(stf.getValue1()))
  201. where += MessageFormat.format("\n\tAND T.{0} >= {1}", stf.getFieldAlias(),
  202. "'" + stf.getValue1() + "'");
  203. if (!IsNullEmpty(stf.getValue2()))
  204. where += MessageFormat.format("\n\tAND T.{0} <= {1}", stf.getFieldAlias(),
  205. "'" + stf.getValue2() + "'");
  206. }
  207. else if(arys.length>1){
  208. if (!IsNullEmpty(stf.getValue1()))
  209. where += MessageFormat.format("\n\tAND T.{0} {1} {2}", stf.getFieldAlias(),
  210. arys[1], "'" + stf.getValue1() + "'");
  211. }
  212. return IsNullEmpty(where)?genRemark("genWhereDate", stf.getTempFeildId()) : where;
  213. }
  214. public String genRemark(String fun,String key) {
  215. //return "\n/*" + fun + " " + key + " is gen err*/";
  216. return "";
  217. }
  218. public SrSubjectfield findFieldByFieldId(List<SrSubjectfield> fields, String fieldId){
  219. return fields.stream().filter(t->t.getFieldId().equals(fieldId)).findAny().orElse(null);
  220. }
  221. public List<SrSubjectfield> getSubjectfieldsBySubId(String subId){
  222. SrSubjectfieldExample example = new SrSubjectfieldExample();
  223. SrSubjectfieldExample.Criteria criteria = example.or();
  224. criteria.andSubIdIn(Arrays.asList(new String[]{subId}));
  225. List<SrSubjectfield> fileds = srSubjectfieldMapper.selectByExample(example);
  226. System.out.println("getSubjectfieldsBySubId Size:"+fileds.size());
  227. return fileds;
  228. }
  229. public SqlColumnModel getSqlColumn(int isForeignKey, String filedAlias, String leftFieldId, String rightFieldId,
  230. String referencesTab, String displayColumn, int index){
  231. SqlColumnModel model = new SqlColumnModel();
  232. if(isForeignKey==0 || IsNullEmpty(leftFieldId) || IsNullEmpty(rightFieldId) || IsNullEmpty(referencesTab) || IsNullEmpty(displayColumn)){
  233. model.setIsForeignKey(false);
  234. model.setTableAlias("T");
  235. model.setDisplayColumn(MessageFormat.format("{0}.{1}","T", filedAlias));
  236. return model;
  237. }
  238. model.setIsForeignKey(true);
  239. model.setTableAlias("T"+index);
  240. String leftJoinString = MessageFormat.format("\nLEFT JOIN {0} AS {1} on T.{2}={3}.{4}",
  241. referencesTab, model.getTableAlias(), leftFieldId, model.getTableAlias(), rightFieldId);
  242. model.setLeftJoinString(leftJoinString);
  243. model.setDisplayColumn(MessageFormat.format("{0}.{1}",model.getTableAlias(), displayColumn));
  244. return model;
  245. }
  246. public String getFieldName(int index){
  247. return "RENAME"+index;
  248. }
  249. public String getCommaString(boolean is){
  250. return is?",":"";
  251. }
  252. public String getCommaString(int index){
  253. return getCommaString(index>0);
  254. }
  255. public String getMeasurString(String oprationStr, String fieldName){
  256. return oprationStr.replaceAll("\\{\\$FIELD\\$\\}", fieldName);
  257. }
  258. }