OnlineQuerySqlUtils.java 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. package jnpf.onlinedev.util.onlineDevUtil;
  2. import cn.hutool.core.util.ObjectUtil;
  3. import jnpf.database.model.superQuery.SuperQueryJsonModel;
  4. import jnpf.emnus.SearchMethodEnum;
  5. import jnpf.model.visualJson.FieLdsModel;
  6. import jnpf.model.visualJson.config.ConfigModel;
  7. import jnpf.permission.model.authorize.OnlineDynamicSqlModel;
  8. import jnpf.util.visiual.JnpfKeyConsts;
  9. import lombok.Data;
  10. import org.mybatis.dynamic.sql.*;
  11. import java.util.ArrayList;
  12. import java.util.List;
  13. @Data
  14. public class OnlineQuerySqlUtils {
  15. /**
  16. * 运算符
  17. */
  18. private SearchMethodEnum symbol;
  19. /**
  20. * 逻辑拼接符号
  21. */
  22. private boolean and;
  23. /**
  24. * 组件标识
  25. */
  26. private String jnpfKey;
  27. /**
  28. * 字段key
  29. */
  30. private String vModel;
  31. /**
  32. * 自定义的值
  33. */
  34. private Object fieldValue;
  35. /**
  36. * 自定义的值2
  37. */
  38. private Object fieldValueTwo;
  39. private VisitableCondition sqlCondition = null;
  40. private BindableColumn<Object> sqlColumn = null;
  41. private List<AndOrCriteriaGroup> groupList = new ArrayList<>();
  42. private boolean isSqlServer = false;
  43. private boolean isOracle = false;
  44. private boolean isAddMatchLogic = false;
  45. private List<String> dataList = new ArrayList<>();
  46. public List<AndOrCriteriaGroup> getSuperSql(List<SuperQueryJsonModel> conditionList, List<OnlineDynamicSqlModel> sqlModelList, String databaseProductName, String matchLogic) {
  47. isSqlServer = databaseProductName.equalsIgnoreCase("Microsoft SQL Server");
  48. isOracle = databaseProductName.equalsIgnoreCase("oracle");
  49. isAddMatchLogic = SearchMethodEnum.And.getSymbol().equalsIgnoreCase(matchLogic);
  50. List<AndOrCriteriaGroup> groupQueryList = new ArrayList<>();
  51. OnlineProductSqlUtils.superList(conditionList,false);
  52. for (SuperQueryJsonModel queryJsonModel : conditionList) {
  53. List<FieLdsModel> fieLdsModelList = queryJsonModel.getGroups();
  54. String logic = queryJsonModel.getLogic();
  55. and = SearchMethodEnum.And.getSymbol().equalsIgnoreCase(logic);
  56. List<AndOrCriteriaGroup> groupListAll = new ArrayList<>();
  57. for (FieLdsModel fieLdsModel : fieLdsModelList) {
  58. ConfigModel config = fieLdsModel.getConfig();
  59. sqlCondition = null;
  60. sqlColumn = null;
  61. groupList = new ArrayList<>();
  62. jnpfKey = config.getJnpfKey();
  63. symbol = SearchMethodEnum.getSearchMethod(fieLdsModel.getSymbol());
  64. vModel = fieLdsModel.getVModel();
  65. fieldValue = fieLdsModel.getFieldValueOne();
  66. fieldValueTwo = fieLdsModel.getFieldValueTwo();
  67. dataList = fieLdsModel.getDataList();
  68. String tableName = ObjectUtil.isNotEmpty(config.getRelationTable()) ? config.getRelationTable() : config.getTableName();
  69. OnlineDynamicSqlModel onlineDynamicSqlModel = sqlModelList.stream().filter(sql -> sql.getTableName().equals(tableName)).findFirst().orElse(null);
  70. if (onlineDynamicSqlModel != null) {
  71. getSymbolWrapper(onlineDynamicSqlModel);
  72. groupListAll.addAll(groupList);
  73. }
  74. }
  75. if (groupListAll.size() > 0) {
  76. if(isAddMatchLogic){
  77. groupQueryList.add(SqlBuilder.and(DerivedColumn.of("1"), SqlBuilder.isEqualTo(and?1:2), groupListAll.toArray(new AndOrCriteriaGroup[groupListAll.size()])));
  78. }else{
  79. groupQueryList.add(SqlBuilder.or(DerivedColumn.of("1"), SqlBuilder.isEqualTo(and?1:2), groupListAll.toArray(new AndOrCriteriaGroup[groupListAll.size()])));
  80. }
  81. }
  82. }
  83. return groupQueryList;
  84. }
  85. private void getSymbolWrapper(OnlineDynamicSqlModel onlineDynamicSqlModel) {
  86. SqlTable sqlTable = onlineDynamicSqlModel.getSqlTable();
  87. sqlColumn = sqlTable.column(vModel);
  88. List<AndOrCriteriaGroup> list = new ArrayList<>();
  89. switch (symbol) {
  90. case IsNull:
  91. sqlCondition = SqlBuilder.isNull();
  92. list.add(SqlBuilder.and(sqlTable.column(vModel), sqlCondition));
  93. break;
  94. case IsNotNull:
  95. sqlCondition = SqlBuilder.isNotNull();
  96. list.add(SqlBuilder.and(sqlTable.column(vModel), sqlCondition));
  97. break;
  98. case Equal:
  99. sqlCondition = SqlBuilder.isEqualTo(fieldValue);
  100. list.add(SqlBuilder.and(sqlTable.column(vModel), sqlCondition));
  101. break;
  102. case NotEqual:
  103. sqlCondition = SqlBuilder.isNotEqualTo(fieldValue);
  104. list.add(SqlBuilder.and(sqlTable.column(vModel), sqlCondition));
  105. break;
  106. case GreaterThan:
  107. sqlCondition = SqlBuilder.isGreaterThan(fieldValue);
  108. list.add(SqlBuilder.and(sqlTable.column(vModel), sqlCondition));
  109. break;
  110. case LessThan:
  111. sqlCondition = SqlBuilder.isLessThan(fieldValue);
  112. list.add(SqlBuilder.and(sqlTable.column(vModel), sqlCondition));
  113. break;
  114. case GreaterThanOrEqual:
  115. sqlCondition = SqlBuilder.isGreaterThanOrEqualTo(fieldValue);
  116. list.add(SqlBuilder.and(sqlTable.column(vModel), sqlCondition));
  117. break;
  118. case LessThanOrEqual:
  119. sqlCondition = SqlBuilder.isLessThanOrEqualTo(fieldValue);
  120. list.add(SqlBuilder.and(sqlTable.column(vModel), sqlCondition));
  121. break;
  122. case Like:
  123. if (isSqlServer) {
  124. fieldValue = String.valueOf(fieldValue).replaceAll("\\[", "[[]");
  125. }
  126. sqlCondition = SqlBuilder.isLike("%" + fieldValue + "%");
  127. list.add(SqlBuilder.and(sqlTable.column(vModel), sqlCondition));
  128. break;
  129. case NotLike:
  130. if (isSqlServer) {
  131. fieldValue = String.valueOf(fieldValue).replaceAll("\\[", "[[]");
  132. }
  133. sqlCondition = SqlBuilder.isNotLike("%" + fieldValue + "%");
  134. list.add(SqlBuilder.and(sqlTable.column(vModel), sqlCondition));
  135. break;
  136. case Included:
  137. case NotIncluded:
  138. getInWrapper(sqlTable,list);
  139. break;
  140. case Between:
  141. sqlCondition = SqlBuilder.isBetween(fieldValue).and(fieldValueTwo);
  142. list.add(SqlBuilder.and(sqlTable.column(vModel), SqlBuilder.isBetween(fieldValue).and(fieldValueTwo)));
  143. break;
  144. default:
  145. break;
  146. }
  147. if (list.size() > 0) {
  148. int n=1;
  149. if(symbol.equals(SearchMethodEnum.Included)){
  150. n=2;
  151. }
  152. if (and) {
  153. groupList.add(SqlBuilder.and(DerivedColumn.of("1"), SqlBuilder.isEqualTo(n), list.toArray(new AndOrCriteriaGroup[list.size()])));
  154. } else {
  155. groupList.add(SqlBuilder.or(DerivedColumn.of("1"), SqlBuilder.isEqualTo(n), list.toArray(new AndOrCriteriaGroup[list.size()])));
  156. }
  157. }
  158. }
  159. private void getInWrapper(SqlTable sqlTable,List<AndOrCriteriaGroup> list) {
  160. for (String value : dataList) {
  161. if (isSqlServer) {
  162. value = String.valueOf(value).replaceAll("\\[", "[[]");
  163. }
  164. switch (symbol) {
  165. case Included:
  166. sqlCondition = SqlBuilder.isLike("%" + value + "%");
  167. list.add(SqlBuilder.or(sqlTable.column(vModel), SqlBuilder.isLike("%" + value + "%")));
  168. break;
  169. default:
  170. sqlCondition = SqlBuilder.isNotLike("%" + value + "%");
  171. list.add(SqlBuilder.and(sqlTable.column(vModel), SqlBuilder.isNotLike("%" + value + "%")));
  172. break;
  173. }
  174. }
  175. }
  176. }