Browse Source

解决模糊查询问题

yucheng 3 years ago
parent
commit
82e2353ca6

+ 0 - 2
src/main/java/com/persagy/proxy/adm/controller/AdmEquipShaftController.java

@@ -67,8 +67,6 @@ public class AdmEquipShaftController {
         request.setName(AdmEquipment.OBJ_TYPE);
         // 设置关系条件
         request.resetRelationCond(true, "MechInArch", "Eq2Sh", shaftId, false);
-        // TODO 级别获取设备类别对象未处理,再单独查一次即可
-
         return equipmentService.doQuery(AdmContextUtil.toDmpContext(), request, AdmEquipment.class);
     }
 

+ 33 - 32
src/main/java/com/persagy/proxy/adm/utils/AdmQueryCriteriaHelper.java

@@ -1,5 +1,6 @@
 package com.persagy.proxy.adm.utils;
 
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.map.MapUtil;
 import cn.hutool.core.util.ArrayUtil;
 import cn.hutool.core.util.StrUtil;
@@ -157,43 +158,42 @@ public class AdmQueryCriteriaHelper {
         filters = StrUtil.replace(filters, "[", " ( ");
         filters = StrUtil.replace(filters, "]", " ) ");
         // 查找下一个 连接点[and or为连接点]
-        ensureOrCondition(name, criteria, filters);
+        convertCondition(name, criteria, filters);
         return criteria;
     }
 
     /**
-     * 从or条件中截取表达式
-     * @param criteria
-     * @param filters
-     */
-    private static void ensureOrCondition(String name, ObjectNode criteria, String filters) {
-        int orIndex = StrUtil.indexOfIgnoreCase(filters, " or ", 0);
-        String orLeft = orIndex < 0 ? filters : StrUtil.subPre(filters, orIndex);
-        ensureAndCondition(name, criteria, orLeft);
-        // 有or条件
-        if(orIndex >= 0) {
-            String orRight = StrUtil.subSuf(filters, orIndex + 4);
-            ObjectNode node = criteria.putObject("$or");
-            // 右侧字符串继续递归处理
-            ensureOrCondition(name, node, orRight);
-        }
-    }
-
-    /**
-     * 从and条件中截取表达式
+     * 转换为查询条件
+     * @param name
      * @param criteria
      * @param filters
      */
-    private static void ensureAndCondition(String name, ObjectNode criteria, String filters) {
-        int andIndex = StrUtil.indexOfIgnoreCase(filters, " and ", 0);
-        String andLeft = andIndex < 0 ? filters : StrUtil.subPre(filters, andIndex);
-        // 处理左侧条件
-        ensureAndExpress(name, criteria, andLeft);
-        // 处理右侧条件
-        if(andIndex >= 0) {
-            String andRight = StrUtil.subSuf(filters, andIndex+5);
-            // 递归处理and
-            ensureAndCondition(name, criteria, andRight);
+    private static void convertCondition(String name, ObjectNode criteria, String filters) {
+        // 按and分隔
+        List<String> andFilters = StrUtil.splitTrim(filters, " and ");
+        // 按分隔后的表达式依次处理
+        for(String andFilter:andFilters) {
+            // 按or分组
+            List<String> orFilters = StrUtil.splitTrim(andFilter, " or ");
+            if(CollUtil.isEmpty(orFilters)) {
+                continue;
+            }
+            // 长度为1,则不是or条件
+            if(orFilters.size() == 1) {
+                // 转换为Condition
+                convertExpress(name, criteria, orFilters.get(0));
+                continue;
+            }
+            // or条件
+            ObjectNode andOr = (ObjectNode) criteria.get(QueryOperator.AND_OR.getIndex());
+            if(andOr == null) {
+                // 没有此条件则创建
+                andOr = criteria.putObject(QueryOperator.AND_OR.getIndex());
+            }
+            // 转换为Condition
+            for(String orFilter:orFilters) {
+                convertExpress(name, andOr, orFilter);
+            }
         }
     }
 
@@ -202,8 +202,9 @@ public class AdmQueryCriteriaHelper {
      * @param criteria
      * @param express
      */
-    private static void ensureAndExpress(String name, ObjectNode criteria, String express) {
-        String cond = StrUtil.isBlank(StrUtil.getContainsStr(express, COND_STR)) ? StrUtil.getContainsStr(express, COND_STR_TRIM) : StrUtil.getContainsStr(express, COND_STR);
+    private static void convertExpress(String name, ObjectNode criteria, String express) {
+        String cond = StrUtil.isBlank(StrUtil.getContainsStr(express, COND_STR)) ?
+                StrUtil.getContainsStr(express, COND_STR_TRIM) : StrUtil.getContainsStr(express, COND_STR);
         if(StrUtil.isBlank(cond)) {
             return;
         }