|
@@ -1,19 +1,18 @@
|
|
|
package com.persagy.dmp.rwd.digital.utils;
|
|
|
|
|
|
import cn.hutool.core.map.MapUtil;
|
|
|
+import cn.hutool.core.util.ArrayUtil;
|
|
|
import cn.hutool.core.util.ReflectUtil;
|
|
|
import cn.hutool.core.util.StrUtil;
|
|
|
import com.fasterxml.jackson.databind.JsonNode;
|
|
|
+import com.fasterxml.jackson.databind.node.ArrayNode;
|
|
|
import com.fasterxml.jackson.databind.node.ObjectNode;
|
|
|
import com.persagy.dmp.basic.model.QueryOperator;
|
|
|
import com.persagy.dmp.basic.utils.JsonNodeUtils;
|
|
|
import com.persagy.dmp.common.model.entity.BaseEntity;
|
|
|
import com.persagy.dmp.digital.entity.ObjectDigital;
|
|
|
|
|
|
-import java.util.HashMap;
|
|
|
-import java.util.Iterator;
|
|
|
-import java.util.Map;
|
|
|
-import java.util.Set;
|
|
|
+import java.util.*;
|
|
|
|
|
|
/**
|
|
|
* 对象 查询条件 助手
|
|
@@ -62,7 +61,7 @@ public class ObjectDigitalCriteriaHelper {
|
|
|
processOrCond(value);
|
|
|
continue;
|
|
|
}
|
|
|
- // 如果值是对象
|
|
|
+ // 如果值是对象 先处理contains并移除
|
|
|
if(value.isObject()) {
|
|
|
// 包含
|
|
|
if (value.has(QueryOperator.CONTAINS.getIndex())) {
|
|
@@ -70,23 +69,19 @@ public class ObjectDigitalCriteriaHelper {
|
|
|
String valueStr = valueNode.isTextual() ? value.asText():value.toString();
|
|
|
String key = StrUtil.format("#JSON#json_contains({}, {}, '$.{}')", ObjectDigital.EXTRA_COLUMN, valueStr, infoCode);
|
|
|
valueMap.put(key, criteria.numberNode(1));
|
|
|
+ ((ObjectNode) value).remove(QueryOperator.CONTAINS.getIndex());
|
|
|
} else if (value.has(QueryOperator.NOT_CONTAINS.getIndex())) {
|
|
|
// 不包含
|
|
|
JsonNode valueNode = value.get(QueryOperator.NOT_CONTAINS.getIndex());
|
|
|
String valueStr = valueNode.isTextual() ? value.asText():value.toString();
|
|
|
String key = StrUtil.format("#JSON#json_contains({}, {}, '$.{}')", ObjectDigital.EXTRA_COLUMN, valueStr, infoCode);
|
|
|
valueMap.put(key, criteria.numberNode(0));
|
|
|
+ ((ObjectNode) value).remove(QueryOperator.NOT_CONTAINS.getIndex());
|
|
|
}
|
|
|
- } else if(value.isTextual()) {
|
|
|
- String key = StrUtil.format("#JSON#json_unquote(json_extract({}, '$.{}'))", ObjectDigital.EXTRA_COLUMN, infoCode);
|
|
|
- valueMap.put(key, value);
|
|
|
- } else if(value.isInt()) {
|
|
|
- String key = StrUtil.format("#JSON#ifnull(json_extract({}, '$.{}'), -9999)", ObjectDigital.EXTRA_COLUMN, infoCode);
|
|
|
- valueMap.put(key, value);
|
|
|
- } else if(value.isDouble()) {
|
|
|
- String key = StrUtil.format("#JSON#ifnull(json_extract({}, '$.{}'), -9999.99)", ObjectDigital.EXTRA_COLUMN, infoCode);
|
|
|
- valueMap.put(key, value);
|
|
|
}
|
|
|
+ // 获取格式化的Key
|
|
|
+ String key = ensureFormatKey(infoCode, value);
|
|
|
+ valueMap.put(key, value);
|
|
|
// 处理完成后删除
|
|
|
fieldNames.remove();
|
|
|
}
|
|
@@ -100,6 +95,52 @@ public class ObjectDigitalCriteriaHelper {
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
+ * 格式化Key
|
|
|
+ * @param infoCode
|
|
|
+ * @param value
|
|
|
+ */
|
|
|
+ private static String ensureFormatKey(String infoCode, JsonNode value) {
|
|
|
+ if(StrUtil.isBlank(infoCode) || value == null) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ String format = null;
|
|
|
+ // 如果值是对象
|
|
|
+ if(value.isObject()) {
|
|
|
+ ObjectNode obj = (ObjectNode) value;
|
|
|
+ if (obj.has("$like")) {
|
|
|
+ format = "#JSON#json_unquote(json_extract({}, '$.{}'))";
|
|
|
+ } else {
|
|
|
+ for (String key : Arrays.asList("$gt", "$lt", "$gte", "$lte", "$ne")) {
|
|
|
+ if (obj.has(key)) {
|
|
|
+ // 递归处理
|
|
|
+ return ensureFormatKey(infoCode, obj.get(key));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else if (value.isArray()) {
|
|
|
+ ArrayNode array = (ArrayNode) value;
|
|
|
+ if (ArrayUtil.isEmpty(array)) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ // 递归处理
|
|
|
+ return ensureFormatKey(infoCode, array.get(0));
|
|
|
+ } else if (value.isNull()) {
|
|
|
+ return null;
|
|
|
+ } else if (value.isTextual()) {
|
|
|
+ format = "#JSON#json_unquote(json_extract({}, '$.{}'))";
|
|
|
+ } else if (value.isDouble() || value.isFloat() || value.isBigDecimal()) {
|
|
|
+ format = "#JSON#ifnull(json_extract({}, '$.{}'), -9999.99)";
|
|
|
+ } else if (value.isInt() || value.isLong() || value.isShort() || value.isBigInteger()) {
|
|
|
+ format = "#JSON#ifnull(json_extract({}, '$.{}'), -9999)";
|
|
|
+ } else if (value.isBoolean()) {
|
|
|
+ format = "#JSON#ifnull(json_extract({}, '$.{}'), 0)";
|
|
|
+ } else if (value.isPojo()) {
|
|
|
+ format = "#JSON#json_unquote(json_extract({}, '$.{}'))";
|
|
|
+ }
|
|
|
+ return StrUtil.format(format, ObjectDigital.EXTRA_COLUMN, infoCode);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
* 处理or条件
|
|
|
* @param node
|
|
|
*/
|