GenSqlStringServiceImpl.java 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  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.SqlColumnModel;
  13. import com.bowintek.practice.vo.temp.SqlFieldModel;
  14. import com.bowintek.practice.vo.temp.TempObjectModel;
  15. import com.bowintek.practice.vo.temp.TempSaveResult;
  16. import org.apache.ibatis.jdbc.SqlRunner;
  17. import org.springframework.beans.factory.annotation.Autowired;
  18. import org.springframework.stereotype.Component;
  19. import java.sql.Connection;
  20. import java.sql.DriverManager;
  21. import java.text.MessageFormat;
  22. import java.util.*;
  23. import java.util.concurrent.RecursiveTask;
  24. import java.util.stream.Collectors;
  25. @Component
  26. public class GenSqlStringServiceImpl implements GenSqlStringService {
  27. @Autowired
  28. SrSubjectMapper srSubjectMapper;
  29. @Autowired
  30. SrSubjectfieldMapper srSubjectfieldMapper;
  31. @Autowired
  32. TempCQuery tempCQuery;
  33. @Override
  34. @SwitchDataSource(DBTypeEnum.POSTGRE)
  35. public List<Map<String,Object>> getListBySqlString(String sqlString){
  36. //return tempCQuery.getListBySqlString(sqlString);
  37. try {
  38. Connection connection = DriverManager.getConnection(
  39. "jdbc:mysql://office.bowintek.com:3306/practicedb?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai",
  40. "root", "bowin123");
  41. SqlRunner sqlRunner = new SqlRunner(connection);
  42. return sqlRunner.selectAll(sqlString);
  43. }
  44. catch (Exception ex){
  45. ex.printStackTrace();
  46. return null;
  47. }
  48. }
  49. //查询语句生成,要素点:查询主表、关联子表、查询字段、查询条件
  50. //查询主表:FROM (sr_subject.execSql) AS T
  51. //查询字段-维度:sr_tempdimension.fieldAlias
  52. //查询字段-度量:sr_tempmeasure.fieldAlias + 函数名称/表达式; SUM({$FIELD$}) / COUNT(*) 替换中间字段名称
  53. //查询条件:检测出 日期型、字符型、数字型,在针对性生成条件语句
  54. //输出字段 AS:ReFieldName0,1,2...;依据维度度量排序来
  55. //表名 AS:T 主表,T0,1,2...;子表,依据维度度量子表排序来
  56. @Override
  57. public String Generation(TempObjectModel data, String userID){
  58. //取得字段原本定义
  59. data.sub = srSubjectMapper.selectByPrimaryKey(data.temp.getSubId());
  60. List<SrSubjectfield> fileds = getSubjectfieldsBySubId(data.temp.getSubId());
  61. //循环分析出关联表
  62. //isForeignKey leftFieldId rightFieldId referencesTab displayColumn
  63. int tabIndex = 0;
  64. HashMap<String, SqlColumnModel> aliasMap = new HashMap<>();
  65. List<SqlFieldModel> models = new ArrayList<>();
  66. data.bases.forEach(it->{ models.add(SqlFieldModel.GenModel(it.getFieldId(),it.getTempFeildId()));});
  67. data.measures.forEach(it->{ models.add(SqlFieldModel.GenModel(it.getFieldId(),it.getTempFeildId()));});
  68. //生成主要的字段、关联表、表T名称、字段T名称对照表
  69. String leftTableString = "";
  70. for(int i=0;i<models.size();i++){
  71. SrSubjectfield fd = findFieldByFieldId(fileds, models.get(i).getFieldId());
  72. SqlColumnModel cm = getSqlColumn(fd.getIsForeignKey(), fd.getFieldAlias(), fd.getFieldCode(), fd.getForeignKey(),
  73. fd.getReferencesTab(), fd.getDisplayColumn(), tabIndex);
  74. if(cm.getIsForeignKey()) {
  75. tabIndex++;
  76. leftTableString+=cm.getLeftJoinString();
  77. }
  78. aliasMap.put(models.get(i).getTempFieldId(), cm);
  79. }
  80. int fieldIndex = 0;
  81. String colString = "", groupString = "";
  82. //维度生成,Group生成
  83. for(int i=0;i<data.bases.size();i++){
  84. SrTempdimension dim = data.bases.get(i);
  85. SqlColumnModel cm = aliasMap.get(dim.getTempFeildId());
  86. colString += MessageFormat.format("{0} {1} AS {2}\n\t",
  87. getCommaString(fieldIndex), cm.getDisplayColumn(), getFieldName(fieldIndex));
  88. groupString += MessageFormat.format("{0} {1}\n\t",getCommaString(fieldIndex), cm.getDisplayColumn());
  89. fieldIndex++;
  90. }
  91. //度量生成
  92. for(int i=0;i<data.measures.size();i++){
  93. SrTempmeasure msr = data.measures.get(i);
  94. SqlColumnModel cm = aliasMap.get(msr.getTempFeildId());
  95. colString += MessageFormat.format("{0} {1} AS {2}\n\t",
  96. getCommaString(fieldIndex),
  97. getMeasurString(msr.getOperation(), cm.getDisplayColumn()),
  98. getFieldName(fieldIndex));
  99. fieldIndex++;
  100. }
  101. //查询条件的生成
  102. String whereString = "";
  103. for(int i=0;i<data.wheres.size();i++){
  104. SrTempfield stf = data.wheres.get(i);
  105. int dataType = getDataType(stf.getDataType());
  106. if(dataType==0) whereString += genWhereString(stf);
  107. else if(dataType==1) whereString += genWhereNumber(stf);
  108. else if(dataType==2) whereString += genWhereDate(stf);
  109. }
  110. //生成排序字段
  111. String orderByString = "";
  112. if(IsNullEmpty(data.orderBy) || !aliasMap.containsKey(data.orderBy)) data.orderBy = aliasMap.keySet().stream().findFirst().get();
  113. System.out.println("data.orderBy:"+data.orderBy);
  114. if(aliasMap.containsKey(data.orderBy)){
  115. if(IsNullEmpty(data.orderByString)) data.orderByString = "asc";
  116. SqlColumnModel cmOrder = aliasMap.get(data.orderBy);
  117. orderByString = MessageFormat.format("ORDER BY {0} {1}", cmOrder.getDisplayColumn(), data.orderByString);
  118. }
  119. String mainSqlStrimg = MessageFormat.format("SELECT {0} \nFROM {1} AS T {2} \nWHERE 1=1 {3} \nGROUP BY {4} \n\n{5}",
  120. colString, data.sub.getExecSql(), leftTableString, whereString, groupString, orderByString);
  121. System.out.println(mainSqlStrimg);
  122. return mainSqlStrimg;
  123. }
  124. public int getDataType(String typeString){
  125. List<String> strings = Arrays.asList(new String[]{"char","varchar","text"});
  126. List<String> numbers = Arrays.asList(new String[]{"int","bigint","decimal"});
  127. List<String> dates = Arrays.asList(new String[]{"date"});
  128. if(strings.indexOf(typeString.toLowerCase(Locale.ROOT))>=0) return 0;
  129. if(numbers.indexOf(typeString.toLowerCase(Locale.ROOT))>=0) return 1;
  130. if(dates.indexOf(typeString.toLowerCase(Locale.ROOT))>=0) return 2;
  131. return -1;
  132. }
  133. public static boolean IsNullEmpty(String value) {
  134. return value == null || value.isEmpty();
  135. }
  136. public String genWhereString(SrTempfield stf){
  137. if(IsNullEmpty(stf.getOperation()) || IsNullEmpty(stf.getValue1()))
  138. return genRemark("genWhereString", stf.getTempFeildId());
  139. if(stf.getOperation().equals("="))
  140. return MessageFormat.format("\n\tAND T.{0}='{1}'", stf.getFieldAlias(),
  141. "'"+stf.getValue1()+"'");
  142. else if(stf.getOperation().equals("like"))
  143. return MessageFormat.format("\n\tAND T.{0} like {1}", stf.getFieldAlias(),
  144. "'%"+stf.getValue1()+"%'");
  145. else
  146. return MessageFormat.format("\n\tAND T.{0} {1}", stf.getFieldAlias(), stf.getOperation());
  147. }
  148. public String genWhereNumber(SrTempfield stf){
  149. if(IsNullEmpty(stf.getOperation()) || IsNullEmpty(stf.getValue1()) ||
  150. (stf.getOperation().equals("limit") && IsNullEmpty(stf.getValue2())))
  151. return genRemark("genWhereNumber", stf.getTempFeildId());
  152. if(stf.getOperation().equals("limit"))
  153. return MessageFormat.format("\n\tAND T.{0} >= {1} AND T.{2}<={3}",
  154. stf.getFieldAlias(), stf.getValue1(), stf.getFieldAlias(), stf.getValue2());
  155. else
  156. return MessageFormat.format("\n\tAND T.{0} {1} {2}", stf.getFieldAlias(), stf.getOperation(), stf.getValue1());
  157. }
  158. public String genWhereDate(SrTempfield stf){
  159. if(IsNullEmpty(stf.getOperation())) return genRemark("genWhereDate", stf.getTempFeildId());
  160. String where = "";
  161. if(!IsNullEmpty(stf.getValue1()))
  162. where += MessageFormat.format("\n\tAND T.{0} >= {1}", stf.getFieldAlias(),
  163. "'"+stf.getValue1()+"'");
  164. if(!IsNullEmpty(stf.getValue2()))
  165. where += MessageFormat.format("\n\tAND T.{0} <= {1}", stf.getFieldAlias(),
  166. "'"+stf.getValue2()+"'");
  167. return IsNullEmpty(where)?genRemark("genWhereDate", stf.getTempFeildId()) : where;
  168. }
  169. public String genRemark(String fun,String key) {
  170. //return "\n/*" + fun + " " + key + " is gen err*/";
  171. return "";
  172. }
  173. public SrSubjectfield findFieldByFieldId(List<SrSubjectfield> fields, String fieldId){
  174. return fields.stream().filter(t->t.getFieldId().equals(fieldId)).findAny().orElse(null);
  175. }
  176. public List<SrSubjectfield> getSubjectfieldsBySubId(String subId){
  177. SrSubjectfieldExample example = new SrSubjectfieldExample();
  178. SrSubjectfieldExample.Criteria criteria = example.or();
  179. criteria.andSubIdIn(Arrays.asList(new String[]{subId}));
  180. List<SrSubjectfield> fileds = srSubjectfieldMapper.selectByExample(example);
  181. System.out.println("getSubjectfieldsBySubId Size:"+fileds.size());
  182. return fileds;
  183. }
  184. public SqlColumnModel getSqlColumn(int isForeignKey, String filedAlias, String leftFieldId, String rightFieldId,
  185. String referencesTab, String displayColumn, int index){
  186. SqlColumnModel model = new SqlColumnModel();
  187. if(isForeignKey==0 || IsNullEmpty(leftFieldId) || IsNullEmpty(rightFieldId) || IsNullEmpty(referencesTab) || IsNullEmpty(displayColumn)){
  188. model.setIsForeignKey(false);
  189. model.setTableAlias("T");
  190. model.setDisplayColumn(MessageFormat.format("{0}.{1}","T", filedAlias));
  191. return model;
  192. }
  193. model.setIsForeignKey(true);
  194. model.setTableAlias("T"+index);
  195. String leftJoinString = MessageFormat.format("\nLEFT JOIN {0} AS {1} on T.{2}={3}.{4}",
  196. referencesTab, model.getTableAlias(), leftFieldId, model.getTableAlias(), rightFieldId);
  197. model.setLeftJoinString(leftJoinString);
  198. model.setDisplayColumn(MessageFormat.format("{0}.{1}",model.getTableAlias(), displayColumn));
  199. return model;
  200. }
  201. public String getFieldName(int index){
  202. return "ReFieldName"+index;
  203. }
  204. public String getCommaString(boolean is){
  205. return is?",":"";
  206. }
  207. public String getCommaString(int index){
  208. return getCommaString(index>0);
  209. }
  210. public String getMeasurString(String oprationStr, String fieldName){
  211. return oprationStr.replaceAll("\\{\\$FIELD\\$\\}", fieldName);
  212. }
  213. }