Skip to content

Commit 7a24178

Browse files
committed
优化假删除,支持 notDeletedValue,适配 deletedTime = NULL 表示未删除等需求
1 parent 718a5bb commit 7a24178

File tree

1 file changed

+71
-33
lines changed

1 file changed

+71
-33
lines changed

APIJSONORM/src/main/java/apijson/orm/AbstractSQLConfig.java

Lines changed: 71 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,11 @@ public abstract class AbstractSQLConfig implements SQLConfig {
107107
* 可取值 new RequestMethod[]{ RequestMethod.GET, RequestMethod.POST ... }
108108
*/
109109
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+
110115
public static int MAX_HAVING_COUNT = 5;
111116
public static int MAX_WHERE_COUNT = 10;
112117
public static int MAX_COMBINE_DEPTH = 2;
@@ -4295,6 +4300,15 @@ public String getRemoveString(String key, String column, Object value) throws Il
42954300
}
42964301
//SET >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
42974302

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+
}
42984312

42994313
/**
43004314
* @return
@@ -5159,33 +5173,49 @@ else if (userId instanceof Subquery) {}
51595173
whereList.add(userIdInKey);
51605174
}
51615175

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) {
51675187
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+
}
51745194

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;
51815201
}
51825202
}
51835203
}
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);
51895219
}
51905220
}
51915221
}
@@ -5289,18 +5319,26 @@ else if (w.startsWith("!")) {
52895319
config.setContent(tableContent);
52905320
}
52915321

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);
53035338
}
5339+
5340+
config.setMethod(PUT);
5341+
config.setContent(content);
53045342
}
53055343
}
53065344

0 commit comments

Comments
 (0)