Explorar o código

7/30 外部检索逻辑更改

lwhhszx hai 1 ano
pai
achega
c0b5de52e7

+ 447 - 0
src/main/java/cn/cslg/pas/common/utils/parseQueryToTree/ExpressTreeNode.java

@@ -0,0 +1,447 @@
+package cn.cslg.pas.common.utils.parseQueryToTree;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Stack;
+
+public class ExpressTreeNode {
+
+
+    public static treeNode Tokens2Node(List<String> Tokens, boolean isAnd)throws Exception
+
+    {
+
+        Stack<Symbol> symbolStack = new Stack<Symbol>();
+
+        Stack<treeNode> valueStack = new Stack<treeNode>();
+
+
+
+        boolean preIsValue = false;
+
+        for (int i = 0; i < Tokens.size(); i++)
+
+        {
+
+            String strTem = Tokens.get(i);
+
+
+
+            Symbol temSymbol = expressManager.getInstance().getSymbol(strTem);
+
+
+
+            if (temSymbol != null)
+
+            {
+
+                if (temSymbol instanceof operate)
+
+                {
+//                        region 如果是操作符,从操作符堆栈中取出优先级大于等于该操作符的结合值堆栈生成节点后压入值堆栈,然后将该操作符压入堆栈
+
+                    operate temoperate = (operate)temSymbol;
+
+
+
+                    if (symbolStack.size() > 0)
+
+                    {
+
+                        Symbol lastSymbol = symbolStack.peek();
+
+
+
+                        while (lastSymbol instanceof operate && ((operate)lastSymbol).priorityVale >= temoperate.priorityVale)
+
+                        {
+
+                            operateNode temSymbolNode = new operateNode();
+
+                            temSymbolNode.operate = (operate)lastSymbol;
+
+
+
+                            if (((operate)lastSymbol).operateValue == 1)
+
+                            {
+
+                                temSymbolNode.Right = valueStack.pop();
+
+                            }
+
+                            else
+
+                            {
+
+                                temSymbolNode.Right = valueStack.pop();
+
+                                temSymbolNode.Left = valueStack.pop();
+
+                            }
+
+
+
+                            valueStack.push(temSymbolNode);
+
+
+
+                            symbolStack.pop();
+
+
+
+                            if (symbolStack.size() > 0)
+
+                            {
+
+                                lastSymbol = symbolStack.peek();
+
+                            }
+
+                            else
+
+                            {
+
+                                break;
+
+                            }
+
+                        }
+
+                    }
+
+
+
+
+
+                    symbolStack.push(temSymbol);
+                    preIsValue = false;
+                }
+                    else
+
+                {
+
+                    if (temSymbol instanceof pairSymbol && ((pairSymbol)temSymbol).isEndSymbol == false)
+
+                    {
+
+                        List<String> strings = new ArrayList<>();
+
+
+
+                        int zkh = 1;
+
+                        for(int j = i+1; j < Tokens.size(); j++)
+
+                        {
+
+                            String s = Tokens.get(j);
+
+
+
+                            Symbol sysTem = expressManager.getInstance().getSymbol(s);
+
+
+
+                            if(sysTem != null)
+
+                            {
+
+                                if (sysTem instanceof pairSymbol)
+
+                                {
+
+                                    if (((pairSymbol)sysTem).isEndSymbol)
+
+                                    {
+
+                                        zkh--;
+
+                                    }
+
+                                    else
+
+                                    {
+
+                                        zkh++;
+
+                                    }
+
+                                }
+
+
+
+                            }
+
+
+
+                            if(zkh == 0)
+
+                            {
+
+                                break ;
+
+                            }
+
+                            else
+
+                            {
+
+                                strings.add(s);
+
+                            }
+
+
+
+                        }
+
+
+
+                        if(zkh == 0)
+
+                        {
+
+                            valueStack.push(Tokens2Node(strings, isAnd));
+
+                            preIsValue = true;
+
+                            i = i + strings.size() +1;
+
+                        }
+
+                    }
+
+                }
+
+            }
+
+            else
+
+            {
+
+                if(preIsValue && symbolStack.size() > 0)
+
+                {
+
+                    if (symbolStack.size() > 0)
+
+                    {
+
+                        Symbol lastSymbol = symbolStack.pop();
+
+
+
+                        operateNode temSymbolNode = new operateNode();
+
+                        temSymbolNode.operate =(operate) lastSymbol;
+
+
+
+                        if (((operate)lastSymbol).operateValue == 1)
+
+                        {
+
+                            temSymbolNode.Right = valueStack.pop();
+
+                        }
+
+                        else
+
+                        {
+
+                            temSymbolNode.Right = valueStack.pop();
+
+                            temSymbolNode.Left = valueStack.pop();
+
+                        }
+
+                        valueStack.push(temSymbolNode);
+
+
+
+                    }
+
+
+
+                }
+
+
+
+                valueNode  temNode = new valueNode();
+
+                temNode.value = strTem;
+
+                valueStack.push(temNode);
+
+                preIsValue = true;
+
+            }
+
+
+
+        }
+
+
+
+        while (symbolStack.size() > 0)
+
+        {
+
+            Symbol temSymbol = symbolStack.pop();
+
+
+
+            if (temSymbol instanceof operate)
+
+            {
+
+                operateNode temNode = new operateNode();
+
+                temNode.operate = (operate)temSymbol;
+
+
+
+                if (((operate)temSymbol).operateValue == 1)
+
+                {
+
+                    temNode.Right = valueStack.pop();
+
+                }
+
+                else
+
+                {
+
+                    temNode.Right = valueStack.pop();
+
+                    temNode.Left = valueStack.pop();
+
+                }
+
+
+
+                valueStack.push(temNode);
+
+
+
+            }
+
+                else
+
+            {
+
+                throw new Exception("无效的括号!");
+
+            }
+
+        }
+
+
+
+
+
+        if (valueStack.size() ==1)
+
+        {
+
+            return valueStack.pop();
+
+
+
+        }
+
+        else
+
+        {
+
+            if (valueStack.size() > 1)
+
+            {
+
+                List<treeNode> lstValues = new ArrayList<>();
+
+
+
+                while (valueStack.size() > 0)
+
+                {
+
+                    treeNode temNode = valueStack.pop();
+
+
+
+                    lstValues.add(0, temNode);
+
+                }
+
+
+
+                treeNode retNode = null;
+
+
+
+                for (treeNode temNode :lstValues)
+                {
+
+                    if (retNode == null)
+
+                    {
+
+                        retNode = temNode;
+
+                    }
+
+                    else
+
+                    {
+
+                        operateNode sNode = new operateNode();
+
+
+
+                        if (!isAnd)
+
+                        {
+
+                            sNode.operate = (operate) expressManager.getInstance().getSymbol("OR");
+
+                        }
+
+                        else
+
+                        {
+
+                            sNode.operate = (operate)expressManager.getInstance().getSymbol("AND");
+
+                        }
+
+
+
+                        sNode.Left = retNode;
+
+                        sNode.Right = temNode;
+
+                        retNode = sNode;
+
+                    }
+
+                }
+
+
+
+                return retNode;
+
+            }
+
+
+
+            throw new Exception("无效的检索式!");
+
+        }
+
+
+
+    }
+
+}

+ 47 - 17
src/main/java/cn/cslg/pas/common/utils/parseQueryToTree/expressManager.java

@@ -1,5 +1,6 @@
 package cn.cslg.pas.common.utils.parseQueryToTree;
 
+import cn.cslg.pas.common.utils.StringUtils;
 import org.springframework.util.CollectionUtils;
 
 import java.util.*;
@@ -157,9 +158,17 @@ public class expressManager {
         ArrayList<String> Tokens = GetTokens(strExpress);
         Stack<Symbol> symbolStack = new Stack<Symbol>();
         Stack<treeNode> valueStack = new Stack<treeNode>();
+        List<String> middleKuoHaoStrs =new ArrayList<>();
+     if(!isAnd){
+         return     ExpressTreeNode.Tokens2Node(Tokens,isAnd);
+     }
+        Boolean ifFindEndingMiddleKuoHaoStrs =false;
         for (String strTem : Tokens) {
             Symbol temSymbol = expressManager.getInstance().getSymbol(strTem);
-            if (temSymbol != null) {
+            if(ifFindEndingMiddleKuoHaoStrs&&(temSymbol == null||!(temSymbol instanceof pairSymbol&&((pairSymbol) temSymbol).Code.equals("]")))){
+                middleKuoHaoStrs.add(strTem);
+            }
+            else if (temSymbol != null) {
                 if (temSymbol instanceof operate) {
                     //#region 如果是操作符,从操作符堆栈中取出优先级大于等于该操作符的结合值堆栈生成节点后压入值堆栈,然后将该操作符压入堆栈
                     operate temOperate = (operate) temSymbol;
@@ -190,8 +199,22 @@ public class expressManager {
                     symbolStack.push(temSymbol);
                     //#endregion
                 } else {
+                    if(temSymbol instanceof pairSymbol&&((pairSymbol) temSymbol).Code.equals("["))
+                    {
+                        ifFindEndingMiddleKuoHaoStrs=true;
+                    }
+                    else if(temSymbol instanceof pairSymbol&&((pairSymbol) temSymbol).Code.equals("]"))
+                    {
+                        ifFindEndingMiddleKuoHaoStrs=false;
+                     String temp=   StringUtils.join(middleKuoHaoStrs,",");
+                        valueNode temNode = new valueNode();
+                        temNode.value = temp;
+                        valueStack.push(temNode);
+                        middleKuoHaoStrs=new ArrayList<>();
+                    }
+
                     //#region 括号处理
-                    if (temSymbol instanceof pairSymbol && ((pairSymbol) temSymbol).isEndSymbol) {
+                    else if (temSymbol instanceof pairSymbol && ((pairSymbol) temSymbol).isEndSymbol) {
                         Symbol lastSymbol = symbolStack.peek();
 
                         if (lastSymbol == null) {
@@ -227,10 +250,15 @@ public class expressManager {
                     //#endregion
                 }
             } else {
-                valueNode temNode = new valueNode();
-                temNode.value = strTem;
+                if(!ifFindEndingMiddleKuoHaoStrs) {
+                    valueNode temNode = new valueNode();
+                    temNode.value = strTem;
 
-                valueStack.push(temNode);
+                    valueStack.push(temNode);
+                }
+                else {
+                    middleKuoHaoStrs.add(strTem);
+                }
             }
         }
 
@@ -315,27 +343,29 @@ public class expressManager {
 
             String strTemToken = "";
             Boolean isFindingEndYinHao = false;
+            Boolean ifFindingEndMiddleKuoHao=false;
             int step = -1;
             for (int i = 0; i < strTem.length(); i++) {
                 char c = strTem.charAt(i);
 
                 switch (c) {
                     case '"':
-                        if (!isFindingEndYinHao) {
-                            isFindingEndYinHao = true;
-                            step = i;
-                        } else {
-                            if ((i < strTem.length() - 1 && strTem.charAt(i + 1) == ' ')
-                                    || (i < strTem.length() - 1 && strTem.charAt(i + 1) == ')')
-                                    || (i < strTem.length() - 1 && strTem.charAt(i + 1) == ']')
-                                    || i == strTem.length() - 1) {
-                                strTemToken = strTem.substring(step + 1, i);
-                                Tokens.add(strTemToken);
+                            if (!isFindingEndYinHao) {
+                                isFindingEndYinHao = true;
                                 step = i;
-                                isFindingEndYinHao = false;
+                            } else {
+                                if ((i < strTem.length() - 1 && strTem.charAt(i + 1) == ' ')
+                                        || (i < strTem.length() - 1 && strTem.charAt(i + 1) == ')')
+                                        || (i < strTem.length() - 1 && strTem.charAt(i + 1) == ']')
+                                        || i == strTem.length() - 1) {
+                                    strTemToken = strTem.substring(step + 1, i);
+                                    Tokens.add(strTemToken);
+                                    step = i;
+                                    isFindingEndYinHao = false;
+                                }
+
                             }
 
-                        }
                         break;
                     case ' ':
                         if (!isFindingEndYinHao) {

+ 1 - 15
src/main/java/cn/cslg/pas/factorys/EsBuilderFactory/NestedPersonQueryBuilder.java

@@ -22,23 +22,9 @@ public class NestedPersonQueryBuilder implements IQueryBuilder{
         Query query = null;
         if (operator.equals("=")) {
             String str = "*";
-            if (field.equals("priorities.priorityno")) {
-                String s = "";
-                String sub = value.substring(0, 2);
-                if ((StringUtils.isPositiveInteger(sub) || sub.equalsIgnoreCase("CN")) && (value.length() == 13|| value.length() == 15)) {
-                    String frontPart = value.substring(0, value.length() - 1);
-                    String afterPart = value.substring(value.length() - 1);
-                    String s1 = frontPart + "." + afterPart;
-                    s = str.concat(s1.toUpperCase(Locale.ROOT)).concat("*");
-                } else {
-                    s = str.concat(value.toUpperCase(Locale.ROOT)).concat("*");
-                }
-                String finalS = s;
-                query = QueryBuilders.wildcard(i -> i.field(field).value(finalS));
-            } else {
                 String s = str.concat(value).concat("*");
                 query = QueryBuilders.wildcard(i -> i.field(field).value(s));
-            }
+
         } else {
             query = QueryBuilders.term(i -> i.field(field).value(value));
         }

+ 89 - 0
src/main/java/cn/cslg/pas/factorys/EsBuilderFactory/WildcardNosQueryBuilder.java

@@ -0,0 +1,89 @@
+package cn.cslg.pas.factorys.EsBuilderFactory;
+
+import cn.cslg.pas.common.utils.StringUtils;
+import co.elastic.clients.elasticsearch._types.query_dsl.Query;
+import co.elastic.clients.elasticsearch._types.query_dsl.QueryBuilders;
+import org.springframework.stereotype.Component;
+
+import java.text.ParseException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Locale;
+
+@Component
+public class WildcardNosQueryBuilder implements IQueryBuilder {
+    private String field = "";
+    private String value = "";
+    private String operator = "";
+    public String path = "";
+    public Integer projectId = null;
+
+    @Override
+    public Query creteQuery() throws ParseException {
+        Query query = null;
+
+        List<Query> queries = new ArrayList<>();
+        String[] valueStrs = value.split("\\r\\n|,|\\r|\\n|,");
+
+
+        for (int i = 0; i < valueStrs.length; i++) {
+            String temValue = valueStrs[i];
+            String sub = temValue.substring(0, 2);
+            if ((!temValue.contains(".") && !(StringUtils.isPositiveInteger(sub)) && temValue.length() == 15) || (!temValue.contains(".") && StringUtils.isPositiveInteger(sub) && temValue.length() == 13)) {
+                temValue = temValue.substring(0, temValue.length() - 1);
+            }
+            temValue = "*" + temValue + "*";
+            String finalValue = temValue;
+            Query temQuery = QueryBuilders.wildcard(t -> t.field(field).value(finalValue));
+            queries.add(temQuery);
+        }
+        if (queries.size() == 1) {
+            return queries.get(0);
+        }
+        query = QueryBuilders.bool(i -> i.should(queries));
+        return query;
+    }
+
+    public String getField() {
+        return field;
+    }
+
+    public void setField(String field) {
+        this.field = field;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    public String getOperator() {
+        return operator;
+    }
+
+    public void setOperator(String operator) {
+        this.operator = operator;
+    }
+
+    public String getPath() {
+        return path;
+    }
+
+    public void setPath(String path) {
+        this.path = path;
+    }
+
+    @Override
+    public Integer getProjectId() {
+        return projectId;
+    }
+
+    @Override
+    public void setProjectId(Integer projectId) {
+        this.projectId = projectId;
+    }
+}

+ 0 - 29
src/main/java/cn/cslg/pas/factorys/GetWebIC1Query.java

@@ -1,29 +0,0 @@
-package cn.cslg.pas.factorys;
-
-import cn.cslg.pas.exception.XiaoShiException;
-import cn.cslg.pas.factorys.WebQueryFactory.FormWebQueryFieldImp;
-import cn.cslg.pas.factorys.WebQueryFactory.WebQueryConfigVO;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Component;
-
-
-@Slf4j
-@Component
-public class GetWebIC1Query implements FormWebQueryFieldImp {
-
-    @Override
-    public String getWebQuery(WebQueryConfigVO webQueryConfigVO) {
-        String value =webQueryConfigVO.getValue();
-        if(value.length()!=1){
-            throw  new XiaoShiException("ipc部查询格式错误");
-        }
-        String filed = webQueryConfigVO.getSqlField();
-        String option = webQueryConfigVO.getOption();
-        if (option.equals("=")) {
-            option = "/";
-        }
-        return value +option+ filed;
-    }
-
-
-}

+ 2 - 1
src/main/java/cn/cslg/pas/factorys/WebQueryFactory/GetWebNosQuery.java

@@ -24,7 +24,8 @@ public class GetWebNosQuery implements FormWebQueryFieldImp {
             option = "/";
         }
         value =value.trim();
-        String[] valueStrs =value.split("\\s+");
+        String[] valueStrs =value.split("\\r\\n|,|\\r|\\n|,");
+
         List<String> queryLists=new ArrayList<>();
 
         for(int i=0;i< valueStrs.length;i++){

+ 1 - 1
src/main/java/cn/cslg/pas/factorys/WebQueryFactory/GetWebPersonQuery.java

@@ -21,7 +21,7 @@ public class GetWebPersonQuery implements FormWebQueryFieldImp {
             option = "/";
         }
         value =value.trim();
-        String[] valueStrs =value.split("\\s+");
+        String[] valueStrs =value.split("\\r\\n|,|\\r|\\n|,");
         List<String> queryLists=new ArrayList<>();
 
         for(int i=0;i< valueStrs.length;i++){

+ 0 - 137
src/main/java/cn/cslg/pas/service/JobService.java

@@ -1,137 +0,0 @@
-package cn.cslg.pas.service;
-
-
-import cn.cslg.pas.common.vo.QuartzVO;
-import cn.cslg.pas.domain.business.ImportTask;
-import cn.cslg.pas.domain.business.ImportTaskCondition;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.quartz.*;
-import org.springframework.context.annotation.Lazy;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
-@Service
-@Slf4j
-@RequiredArgsConstructor(onConstructor_ = {@Lazy})
-public class JobService {
-
-    private final Scheduler scheduler;
-
-
-    /**
-     * 删除job
-     *
-     * @throws SchedulerException
-     */
-    public void deleteJob(Integer taskConditionId) throws SchedulerException {
-        //删除job中的该定时任务条件
-        QuartzVO quartzVO = this.generateQuartzVO(taskConditionId);
-        TriggerKey triggerKey = TriggerKey.triggerKey(quartzVO.getTriggerName(), quartzVO.getTriggerGroupName());
-        scheduler.pauseTrigger(triggerKey);
-        scheduler.unscheduleJob(triggerKey);
-        JobKey jobKey = JobKey.jobKey(quartzVO.getJobName(), quartzVO.getJobGroupName());
-        scheduler.deleteJob(jobKey);
-
-//        qrTaskService.removeById(taskId);
-//        //同时删除该任务条件的所有任务执行情况记录
-//        LambdaQueryWrapper<Task> queryWrapper = new LambdaQueryWrapper<>();
-//        queryWrapper.eq(Task::getTaskConditionId, taskId);
-//        taskService.remove(queryWrapper);
-    }
-
-    /**
-     * 暂停job
-     *
-     * @throws SchedulerException
-     */
-//    public void pauseJob(Integer taskId) throws SchedulerException {
-//        QuartzVO quartzVO = this.generateQuartzVO(taskId);
-//        //更新任务条件状态
-//        qrTaskService.updateState(taskId, 6);
-//        JobKey jobKey = JobKey.jobKey(quartzVO.getJobName(), quartzVO.getJobGroupName());
-//        scheduler.pauseJob(jobKey);
-//    }
-
-    /**
-     * 恢复job
-     *
-     * @throws SchedulerException
-     */
-//    public void resumeJob(Integer taskId) throws SchedulerException {
-//        QuartzVO quartzVO = this.generateQuartzVO(taskId);
-//        qrTaskService.updateState(taskId, 1);
-//        JobKey jobKey = JobKey.jobKey(quartzVO.getJobName(), quartzVO.getJobGroupName());
-//        scheduler.resumeJob(jobKey);
-//    }
-
-    /**
-     * 修改定时任务
-     *
-     * @param
-     */
-    public void updateJob(ImportTask qrtzTask) {
-        //更新任务
-
-        QuartzVO quartzVO = this.generateQuartzVO(qrtzTask.getId());
-        JobDataMap jobDataMap = new JobDataMap();
-        jobDataMap.put("qrtzTask", qrtzTask);
-        TriggerKey oldTriggerKey = TriggerKey.triggerKey(quartzVO.getTriggerName(), quartzVO.getTriggerGroupName());
-        CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(qrtzTask.getName());
-        CronTrigger cronTrigger = TriggerBuilder.newTrigger()
-                .withIdentity(oldTriggerKey).usingJobData(jobDataMap).withSchedule(scheduleBuilder).build();
-        try {
-            scheduler.rescheduleJob(oldTriggerKey, cronTrigger);
-        } catch (SchedulerException e) {
-            e.printStackTrace();
-        }
-    }
-
-    /**
-     * 新增job任务
-     *
-     * @throws SchedulerException
-     */
-    @Transactional
-    public void addJob(ImportTaskCondition taskCondition) throws SchedulerException {
-        //添加一条任务记录
-        QuartzVO quartzVO = this.generateQuartzVO(taskCondition.getId());
-        JobDataMap jobDataMap = new JobDataMap();
-        jobDataMap.put("taskCondition", taskCondition);
-        CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(taskCondition.getCrons());
-        JobDetail jobDetail = JobBuilder
-                .newJob(TaskAddJob.class)
-                .withIdentity(quartzVO.getJobName(), quartzVO.getJobGroupName())
-                .build();
-        Trigger trigger = TriggerBuilder
-                .newTrigger()
-                .withIdentity(quartzVO.getTriggerName(), quartzVO.getTriggerGroupName())
-                .withSchedule(cronScheduleBuilder)
-                .usingJobData(jobDataMap)
-                .build();
-        scheduler.scheduleJob(jobDetail, trigger);
-
-    }
-
-
-    public QuartzVO generateQuartzVO(Integer taskId) {
-        QuartzVO quartzVO = new QuartzVO();
-        quartzVO.setJobName("Job_" + taskId);
-        quartzVO.setJobGroupName("Default");
-        quartzVO.setTriggerName("Trigger_" + taskId);
-        quartzVO.setTriggerGroupName("Default");
-        return quartzVO;
-
-    }
-
-    /**
-     * 停止正在进行的job
-     *
-     * @throws SchedulerException
-     */
-    public void interruptJob(Integer taskId) throws SchedulerException {
-        QuartzVO quartzVO = this.generateQuartzVO(taskId);
-        JobKey jobKey = JobKey.jobKey(quartzVO.getJobName(), quartzVO.getJobGroupName());
-        scheduler.interrupt(jobKey);
-    }
-}

+ 20 - 0
src/test/java/cn/cslg/pas/service/ExpressManagerTests.java

@@ -0,0 +1,20 @@
+package cn.cslg.pas.service;
+
+import cn.cslg.pas.common.dto.business.QueryTreeNodeDTO;
+import cn.cslg.pas.common.model.cronModel.Records;
+import cn.cslg.pas.common.utils.parseQueryToTree.expressManager;
+import cn.cslg.pas.common.utils.parseQueryToTree.treeNode;
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+public class ExpressManagerTests {
+
+    @Test
+    void addIoc() throws Exception {
+        String condition="TI=(BI CI )";
+        treeNode tree = expressManager.getInstance().Parse(condition, false);
+        System.out.println(tree);
+    }
+
+}