|
@@ -32,7 +32,7 @@ import java.util.*;
|
|
public class ObjectDigitalCriteriaHelper {
|
|
public class ObjectDigitalCriteriaHelper {
|
|
|
|
|
|
/** 对象类字段集 */
|
|
/** 对象类字段集 */
|
|
- public static final Set<String> DIGITAL_FIELDS = ReflectUtil.getFieldMap(ObjectDigital.class).keySet();
|
|
|
|
|
|
+ public static final Set<String> DIGITAL_FIELDS = JsonNodeUtils.getFieldMap(ObjectDigital.class).keySet();
|
|
/** 未绑定关系标识 */
|
|
/** 未绑定关系标识 */
|
|
private static final String BIND_FLAG = "$bindFlag";
|
|
private static final String BIND_FLAG = "$bindFlag";
|
|
|
|
|
|
@@ -97,8 +97,13 @@ public class ObjectDigitalCriteriaHelper {
|
|
continue;
|
|
continue;
|
|
}
|
|
}
|
|
// 基础属性不用处理
|
|
// 基础属性不用处理
|
|
- if(DIGITAL_FIELDS.contains(infoCode)
|
|
|
|
- || QueryOperator.AND_OR.getIndex().equalsIgnoreCase(infoCode)) {
|
|
|
|
|
|
+ if(DIGITAL_FIELDS.contains(infoCode)) {
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+ if (QueryOperator.AND_OR.getIndex().equalsIgnoreCase(infoCode)){
|
|
|
|
+ // $andOr的特殊处理
|
|
|
|
+ JsonNode andOrNode = criteria.get(QueryOperator.AND_OR.getIndex());
|
|
|
|
+ processAndOrCond(andOrNode);
|
|
continue;
|
|
continue;
|
|
}
|
|
}
|
|
JsonNode value = criteria.get(infoCode);
|
|
JsonNode value = criteria.get(infoCode);
|
|
@@ -110,29 +115,7 @@ public class ObjectDigitalCriteriaHelper {
|
|
processOrCond(value);
|
|
processOrCond(value);
|
|
continue;
|
|
continue;
|
|
}
|
|
}
|
|
- // 如果值是对象 先处理contains并移除
|
|
|
|
- if(value.isObject()) {
|
|
|
|
- // 包含
|
|
|
|
- if (value.has(QueryOperator.CONTAINS.getIndex())) {
|
|
|
|
- JsonNode valueNode = value.get(QueryOperator.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(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());
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- // 获取格式化的Key
|
|
|
|
- String key = ensureFormatKey(infoCode, value);
|
|
|
|
- valueMap.put(key, value);
|
|
|
|
- // 处理完成后删除
|
|
|
|
- fieldNames.remove();
|
|
|
|
|
|
+ commonProcessInfosCond(value,infoCode,criteria, valueMap,fieldNames);
|
|
}
|
|
}
|
|
// 将valueMap写入criteria中
|
|
// 将valueMap写入criteria中
|
|
if(MapUtil.isEmpty(valueMap)) {
|
|
if(MapUtil.isEmpty(valueMap)) {
|
|
@@ -142,6 +125,77 @@ public class ObjectDigitalCriteriaHelper {
|
|
criteria.set(key, valueMap.get(key));
|
|
criteria.set(key, valueMap.get(key));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+ /***
|
|
|
|
+ * Description: 处理andOr的查询条件
|
|
|
|
+ * @param node : andOr查询对象
|
|
|
|
+ * @return : void
|
|
|
|
+ * @author : lijie
|
|
|
|
+ * @date :2021/10/20 19:16
|
|
|
|
+ * Update By lijie 2021/10/20 19:16
|
|
|
|
+ */
|
|
|
|
+ private static void processAndOrCond(JsonNode node) {
|
|
|
|
+ if(node == null || node.isNull() || !node.isObject()) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ ObjectNode objectNode = (ObjectNode) node;
|
|
|
|
+ Iterator<String> fieldNames = node.fieldNames();
|
|
|
|
+ Map<String, JsonNode> valueMap = new HashMap<>(16);
|
|
|
|
+ while (fieldNames.hasNext()){
|
|
|
|
+ String infoCode = fieldNames.next();
|
|
|
|
+ // 基础属性不用处理
|
|
|
|
+ if(DIGITAL_FIELDS.contains(infoCode)) {
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+ JsonNode value = node.get(infoCode);
|
|
|
|
+ commonProcessInfosCond(value,infoCode,objectNode, valueMap,fieldNames);
|
|
|
|
+ }
|
|
|
|
+ // 将valueMap写入criteria中
|
|
|
|
+ if(MapUtil.isEmpty(valueMap)) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ for(String key:valueMap.keySet()) {
|
|
|
|
+ objectNode.set(key, valueMap.get(key));
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ /***
|
|
|
|
+ * Description: 通用处理infos的查询条件
|
|
|
|
+ * @param value : key对应的值
|
|
|
|
+ * @param infoCode : 信息点code
|
|
|
|
+ * @param node : 查询条件对象
|
|
|
|
+ * @param valueMap : 信息点code与值的映射
|
|
|
|
+ * @param fieldNames : 字段列表
|
|
|
|
+ * @return : void
|
|
|
|
+ * @author : lijie
|
|
|
|
+ * @date :2021/10/20 19:16
|
|
|
|
+ * Update By lijie 2021/10/20 19:16
|
|
|
|
+ */
|
|
|
|
+ private static void commonProcessInfosCond(JsonNode value,String infoCode, ObjectNode node,
|
|
|
|
+ Map<String, JsonNode> valueMap,
|
|
|
|
+ Iterator<String> fieldNames) {
|
|
|
|
+ // 如果值是对象 先处理contains并移除
|
|
|
|
+ if(value.isObject()) {
|
|
|
|
+ // 包含
|
|
|
|
+ if (value.has(QueryOperator.CONTAINS.getIndex())) {
|
|
|
|
+ JsonNode valueNode = value.get(QueryOperator.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, node.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, node.numberNode(0));
|
|
|
|
+ ((ObjectNode) value).remove(QueryOperator.NOT_CONTAINS.getIndex());
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ // 获取格式化的Key
|
|
|
|
+ String key = ensureFormatKey(infoCode, value);
|
|
|
|
+ valueMap.put(key,value);
|
|
|
|
+ // 处理完成后删除
|
|
|
|
+ fieldNames.remove();
|
|
|
|
+ }
|
|
|
|
|
|
/**
|
|
/**
|
|
* 格式化Key
|
|
* 格式化Key
|