@@ -107,6 +107,11 @@ public abstract class AbstractSQLConfig implements SQLConfig { |
107 | 107 | * 可取值 new RequestMethod[]{ RequestMethod.GET, RequestMethod.POST ... } |
108 | 108 | */ |
109 | 109 | public static List<RequestMethod> IGNORE_BLANK_STRING_METHOD_LIST = null; |
| 110 | + |
| 111 | + public static String KEY_DELETED_KEY = "deletedKey"; |
| 112 | + public static String KEY_DELETED_VALUE = "deletedValue"; |
| 113 | + public static String KEY_NOT_DELETED_VALUE = "notDeletedValue"; |
| 114 | + |
110 | 115 | public static int MAX_HAVING_COUNT = 5; |
111 | 116 | public static int MAX_WHERE_COUNT = 10; |
112 | 117 | public static int MAX_COMBINE_DEPTH = 2; |
@@ -4295,6 +4300,15 @@ public String getRemoveString(String key, String column, Object value) throws Il |
4295 | 4300 | } |
4296 | 4301 | //SET >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> |
4297 | 4302 |
|
| 4303 | + @Override |
| 4304 | + public boolean isFakeDelete() { |
| 4305 | + return false; |
| 4306 | + } |
| 4307 | + |
| 4308 | + @Override |
| 4309 | + public Map<String, Object> onFakeDelete(Map<String, Object> map) { |
| 4310 | + return map; |
| 4311 | + } |
4298 | 4312 |
|
4299 | 4313 | /** |
4300 | 4314 | * @return |
@@ -5159,33 +5173,49 @@ else if (userId instanceof Subquery) {} |
5159 | 5173 | whereList.add(userIdInKey); |
5160 | 5174 | } |
5161 | 5175 |
|
5162 | | - if(config.isFakeDelete()) { |
5163 | | - // 查询Access假删除 |
5164 | | - Map<String, Object> accessFakeDeleteMap = AbstractVerifier.ACCESS_FAKE_DELETE_MAP.get(config.getTable()); |
5165 | | - if (accessFakeDeleteMap != null && StringUtil.isNotEmpty(accessFakeDeleteMap.get("deletedKey"), true)) { |
5166 | | - Map<String, Object> fakeDeleteMap = new HashMap<>(); |
| 5176 | + if (enableFakeDelete) { |
| 5177 | + // 查询 Access 假删除 |
| 5178 | + Map<String, Object> accessFakeDeleteMap = method == DELETE |
| 5179 | + ? null : AbstractVerifier.ACCESS_FAKE_DELETE_MAP.get(config.getTable()); |
| 5180 | + Object deletedKey = accessFakeDeleteMap == null ? null : accessFakeDeleteMap.get(KEY_DELETED_KEY); |
| 5181 | + boolean hasKey = deletedKey instanceof String && StringUtil.isNotEmpty(deletedKey, true); |
| 5182 | + Object deletedValue = hasKey ? accessFakeDeleteMap.get(KEY_DELETED_VALUE) : null; |
| 5183 | + boolean containNotDeletedValue = hasKey ? accessFakeDeleteMap.containsKey(KEY_NOT_DELETED_VALUE) : null; |
| 5184 | + Object notDeletedValue = containNotDeletedValue ? accessFakeDeleteMap.get(KEY_NOT_DELETED_VALUE) : null; |
| 5185 | + |
| 5186 | + if (deletedValue != null || containNotDeletedValue) { |
5167 | 5187 | boolean isFakeDelete = true; |
5168 | | - if(method != DELETE) { |
5169 | | - if(from != null) { |
5170 | | - // 兼容 join 外层select 重复生成deletedKey |
5171 | | - if(StringUtil.equals(table, from.getConfig().getTable())) { |
5172 | | - isFakeDelete = false; |
5173 | | - } |
| 5188 | + if (from != null) { |
| 5189 | + // 兼容 JOIN 外层 SELECT 重复生成 deletedKey |
| 5190 | + SQLConfig<?> cfg = from.getConfig(); |
| 5191 | + if (cfg != null && StringUtil.equals(table, cfg.getTable())) { |
| 5192 | + isFakeDelete = false; |
| 5193 | + } |
5174 | 5194 |
|
5175 | | - if(from.getConfig().getJoinList() != null) { |
5176 | | - for(Join join : from.getConfig().getJoinList()) { |
5177 | | - if(StringUtil.equals(table, join.getTable())) { |
5178 | | - isFakeDelete = false; |
5179 | | - break; |
5180 | | - } |
| 5195 | + List<Join> jl = isFakeDelete && cfg != null ? cfg.getJoinList() : null; |
| 5196 | + if (jl != null) { |
| 5197 | + for (Join join : jl) { |
| 5198 | + if (join != null && StringUtil.equals(table, join.getTable())) { |
| 5199 | + isFakeDelete = false; |
| 5200 | + break; |
5181 | 5201 | } |
5182 | 5202 | } |
5183 | 5203 | } |
5184 | | - if(isFakeDelete) { |
5185 | | - fakeDeleteMap.put(accessFakeDeleteMap.get("deletedKey").toString()+"!", accessFakeDeleteMap.get("deletedValue")); |
5186 | | - tableWhere.putAll(fakeDeleteMap); |
5187 | | - andList.addAll(fakeDeleteMap.keySet()); |
5188 | | - whereList.addAll(fakeDeleteMap.keySet()); |
| 5204 | + } |
| 5205 | + |
| 5206 | + if (isFakeDelete) { // 支持 deleted != 1 / deleted is null 等表达式 |
| 5207 | + if (deletedValue != null) { // deletedKey != deletedValue |
| 5208 | + String key = deletedKey + "!"; |
| 5209 | + tableWhere.put(key, deletedValue); |
| 5210 | + andList.add(key); |
| 5211 | + whereList.add(key); |
| 5212 | + } |
| 5213 | + |
| 5214 | + if (containNotDeletedValue) { // deletedKey = notDeletedValue |
| 5215 | + String key = deletedKey.toString(); |
| 5216 | + tableWhere.put(key, notDeletedValue); |
| 5217 | + andList.add(key); |
| 5218 | + whereList.add(key); |
5189 | 5219 | } |
5190 | 5220 | } |
5191 | 5221 | } |
@@ -5289,18 +5319,26 @@ else if (w.startsWith("!")) { |
5289 | 5319 | config.setContent(tableContent); |
5290 | 5320 | } |
5291 | 5321 |
|
5292 | | - if(method == DELETE) { |
5293 | | - if(config.isFakeDelete()) { |
5294 | | - //查询Access假删除 |
5295 | | - Map<String, Object> accessFakeDeleteMap = AbstractVerifier.ACCESS_FAKE_DELETE_MAP.get(config.getTable()); |
5296 | | - if (StringUtil.isNotEmpty(accessFakeDeleteMap.get("deletedKey"), true)) { |
5297 | | - //假删除需要更新的其他字段,比如:删除时间 deletedTime 之类的 |
5298 | | - Map<String, Object> fakeDeleteMap = new HashMap<>(); |
5299 | | - config.onFakeDelete(fakeDeleteMap); |
5300 | | - fakeDeleteMap.put(accessFakeDeleteMap.get("deletedKey").toString(), accessFakeDeleteMap.get("deletedValue")); |
5301 | | - config.setMethod(PUT); |
5302 | | - config.setContent(fakeDeleteMap); |
| 5322 | + if (enableFakeDelete && method == DELETE) { |
| 5323 | + // 查询 Access 假删除 |
| 5324 | + Map<String, Object> accessFakeDeleteMap = AbstractVerifier.ACCESS_FAKE_DELETE_MAP.get(config.getTable()); |
| 5325 | + |
| 5326 | + Object deletedKey = accessFakeDeleteMap.get(KEY_DELETED_KEY); |
| 5327 | + if (StringUtil.isNotEmpty(deletedKey, true)) { |
| 5328 | + // 假删除需要更新的其他字段,比如:删除时间 deletedTime 之类的 |
| 5329 | + Map<String, Object> fakeDeleteMap = new HashMap<>(); |
| 5330 | + fakeDeleteMap.put(deletedKey.toString(), accessFakeDeleteMap.get(KEY_DELETED_VALUE)); |
| 5331 | + fakeDeleteMap = config.onFakeDelete(fakeDeleteMap); |
| 5332 | + |
| 5333 | + Map<String, Object> content = config.getContent(); |
| 5334 | + if (content == null || content.isEmpty()) { |
| 5335 | + content = fakeDeleteMap; |
| 5336 | + } else { |
| 5337 | + content.putAll(fakeDeleteMap); |
5303 | 5338 | } |
| 5339 | + |
| 5340 | + config.setMethod(PUT); |
| 5341 | + config.setContent(content); |
5304 | 5342 | } |
5305 | 5343 | } |
5306 | 5344 |
|
|