From f6348318d0511d54babc870d5bd7dd9e4ea00313 Mon Sep 17 00:00:00 2001
From: lrj <386002446@qq.com>
Date: 星期五, 25 十月 2024 09:48:20 +0800
Subject: [PATCH] 修改参数传入  ,支持 canal

---
 src/test/java/org/example/test.groovy                   |   31 ++++---
 src/main/java/com/ycl/scheme/entity/TriggerType.java    |    7 +
 src/main/java/com/ycl/scheme/entity/Keyword.java        |   14 ++-
 src/main/java/com/ycl/scheme/Parameter.java             |    7 +
 /dev/null                                               |   21 -----
 .idea/vcs.xml                                           |    6 +
 src/main/java/com/ycl/scheme/MatchResult.java           |    2 
 src/main/java/com/ycl/scheme/service/SchemeService.java |    3 
 src/test/java/org/example/Builder.java                  |   11 ++
 src/main/java/com/ycl/scheme/SqlQueryBuilder.java       |   58 ++++++++------
 src/main/java/com/ycl/scheme/SchemeRunnerBuilder.java   |   19 +---
 src/main/java/com/ycl/scheme/AbstractSchemeRunner.java  |    9 ++
 src/main/java/com/ycl/scheme/KeywordExample.java        |    2 
 src/main/java/com/ycl/scheme/entity/Scheme.java         |    4 +
 14 files changed, 109 insertions(+), 85 deletions(-)

diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..94a25f7
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="VcsDirectoryMappings">
+    <mapping directory="$PROJECT_DIR$" vcs="Git" />
+  </component>
+</project>
\ No newline at end of file
diff --git a/src/main/java/com/ycl/scheme/AbstractSchemeRunner.java b/src/main/java/com/ycl/scheme/AbstractSchemeRunner.java
index 421b77b..a152645 100644
--- a/src/main/java/com/ycl/scheme/AbstractSchemeRunner.java
+++ b/src/main/java/com/ycl/scheme/AbstractSchemeRunner.java
@@ -2,9 +2,16 @@
 
 import com.ycl.scheme.service.SchemeService;
 
+import java.util.HashMap;
+import java.util.Map;
+
 public abstract class AbstractSchemeRunner {
 
-    public abstract void run(SchemeService service);
 
+    protected Map<String,Parameter> parameters= new HashMap<>();
+
+    public void run(Map<String,Parameter> pars, SchemeService service){
+        parameters.putAll(pars);
+    }
 
 }
diff --git a/src/main/java/com/ycl/scheme/CanalTriggerBuilder.java b/src/main/java/com/ycl/scheme/CanalTriggerBuilder.java
deleted file mode 100644
index abab347..0000000
--- a/src/main/java/com/ycl/scheme/CanalTriggerBuilder.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package com.ycl.scheme;
-
-import com.ycl.scheme.entity.BlockCode;
-import com.ycl.scheme.entity.Keyword;
-
-import java.util.List;
-
-public class CanalTriggerBuilder extends AbstractBlockCodeBuilder {
-
-
-
-    public CanalTriggerBuilder(BlockText blockText, List<Keyword> keywords, Integer idx) {
-
-
-    }
-
-    @Override
-    public BlockCode build() {
-        return null;
-    }
-}
diff --git a/src/main/java/com/ycl/scheme/KeywordExample.java b/src/main/java/com/ycl/scheme/KeywordExample.java
index 6fb41de..59523c9 100644
--- a/src/main/java/com/ycl/scheme/KeywordExample.java
+++ b/src/main/java/com/ycl/scheme/KeywordExample.java
@@ -8,8 +8,6 @@
 
 public class KeywordExample {
 
-
-
     private static List<Keyword> keywords= new ArrayList<>();
 
     static {
diff --git a/src/main/java/com/ycl/scheme/MatchResult.java b/src/main/java/com/ycl/scheme/MatchResult.java
index ad8ce12..512b589 100644
--- a/src/main/java/com/ycl/scheme/MatchResult.java
+++ b/src/main/java/com/ycl/scheme/MatchResult.java
@@ -14,5 +14,5 @@
 
     private int idx;
 
-    private List<Parameter> parameters;
+//    private List<Parameter> parameters;
 }
diff --git a/src/main/java/com/ycl/scheme/Parameter.java b/src/main/java/com/ycl/scheme/Parameter.java
index 6497847..b9f0842 100644
--- a/src/main/java/com/ycl/scheme/Parameter.java
+++ b/src/main/java/com/ycl/scheme/Parameter.java
@@ -5,5 +5,10 @@
 @Data
 public class Parameter {
 
-    private String script;
+    private String name;
+
+    private Object script;
+
+    private String typeName;
+
 }
diff --git a/src/main/java/com/ycl/scheme/SchemeRunnerBuilder.java b/src/main/java/com/ycl/scheme/SchemeRunnerBuilder.java
index 4510b92..62c406b 100644
--- a/src/main/java/com/ycl/scheme/SchemeRunnerBuilder.java
+++ b/src/main/java/com/ycl/scheme/SchemeRunnerBuilder.java
@@ -3,6 +3,7 @@
 import com.ycl.scheme.entity.BlockCode;
 import com.ycl.scheme.entity.Keyword;
 import com.ycl.scheme.entity.Scheme;
+import com.ycl.scheme.entity.TriggerType;
 import com.ycl.scheme.service.SchemeService;
 import groovy.lang.GroovyClassLoader;
 import org.apache.commons.lang3.StringUtils;
@@ -46,10 +47,11 @@
 
         List<BlockText> blockTexts = splitBlock(scheme.getInputText());
 
-        List<BlockCode> blockCodes = this.createBlockCode(blockTexts);
+        List<BlockCode> blockCodes = this.createBlockCode(blockTexts, scheme.getTriggerType() );
 
         StringBuilder csb = new StringBuilder();
         csb.append("package " + packageName + ";\n");
+        csb.append("\n");
         csb.append("import java.util.List;\n");
         csb.append("import java.util.ArrayList;\n");
         csb.append("import java.util.ArrayList;\n");
@@ -61,7 +63,8 @@
         csb.append("class scheme_" + scheme.getId() + " extends AbstractSchemeRunner {\n");
         csb.append("SchemeService service;\n");
         csb.append("    @Override\n");
-        csb.append("    void run(SchemeService service){\n");
+        csb.append("    void run(Map<String,Parameter> pars,SchemeService service){\n");
+        csb.append("        super.parameters.putAll(pars);\n");
         csb.append("        this.service = service;\n");
         csb.append("        "+ this.getConditionText(blockCodes));
 //        String cod = this.getCondition(bl);
@@ -124,27 +127,19 @@
 
     }
 
-    private List<BlockCode> createBlockCode(List<BlockText> blockTexts){
+    private List<BlockCode> createBlockCode(List<BlockText> blockTexts,TriggerType triggerType){
         List<BlockCode> blockCodes = new ArrayList<>();
         for(int i=0;i<blockTexts.size();i++){
             BlockText text = blockTexts.get(i);
             BlockCode code = new BlockCode();
             AbstractBlockCodeBuilder builder = null;
-            if(StringUtils.isBlank(text.getResult().trim())){
-                builder = new CanalTriggerBuilder(text,this.keywordTemplates,i);
-
-            }else{
-                builder = new SqlQueryBuilder(text,this.keywordTemplates,i);
-            }
+            builder = new SqlQueryBuilder(text,this.keywordTemplates,i, triggerType);
             code =builder.build();
             blockCodes.add(code);
         }
 
         return blockCodes;
     }
-
-
-
 
     private List<BlockText> splitBlock(String script) {
 
diff --git a/src/main/java/com/ycl/scheme/SqlQueryBuilder.java b/src/main/java/com/ycl/scheme/SqlQueryBuilder.java
index 88dbaec..139c92b 100644
--- a/src/main/java/com/ycl/scheme/SqlQueryBuilder.java
+++ b/src/main/java/com/ycl/scheme/SqlQueryBuilder.java
@@ -4,19 +4,15 @@
 import com.ycl.scheme.entity.BlockCode;
 import com.ycl.scheme.entity.Keyword;
 import com.ycl.scheme.entity.KeywordType;
-import com.ycl.scheme.service.SchemeService;
+import com.ycl.scheme.entity.TriggerType;
 import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
+import java.util.*;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 
 public class SqlQueryBuilder extends AbstractBlockCodeBuilder {
-
 
     private static final String[] splits = {" ", "/", "\\", "(", ")", System.lineSeparator(), ":", ";", ",", "."};
     private BlockText blockText;
@@ -39,16 +35,20 @@
 
     private Integer  idx ;
 
-
-    private List<Parameter> pars=new ArrayList<>();
+    private TriggerType triggerType;
 
 
-    public SqlQueryBuilder(BlockText blockText, List<Keyword> keywords, Integer idx) {
+    private Map<String,Parameter> parameters = new HashMap<>();
+
+
+    public SqlQueryBuilder(BlockText blockText, List<Keyword> keywords, Integer idx, TriggerType triggerType) {
         this.blockText = blockText;
 
         this.keywords = keywords;
 
         this.idx= idx;
+
+        this.triggerType = triggerType;
 
     }
 
@@ -59,14 +59,17 @@
             throw  new RuntimeException("娌℃湁鎵惧埌鏁版嵁婧�:" + this.blockText.getSource().trim());
         }
 
-        this.scanExpression();
+        this.scanWhere();
+        if(this.triggerType== TriggerType.CANAL){
+            this.addWhereRowSql();
+        }
         this.scanResult();
         this.buildSql();
         BlockCode bc = this.buildCode();
         return bc;
     }
 
-    private void scanExpression() {
+    private void scanWhere() {
         String inputExpression =  this.blockText.getExpression();
         int idx = 0;
 
@@ -105,6 +108,10 @@
 
     }
 
+    private void addWhereRowSql(){
+        this.where += this.tableKeyword.getTableKey() + "= :rowId";
+    }
+
     private boolean sqlTest(){
         //娴嬭瘯sql鎵ц鏄惁姝g‘
         return true;
@@ -120,7 +127,6 @@
         if(ss.length < 2){
             throw  new RuntimeException("缁撴灉琛ㄨ揪寮忎笉姝g‘");
         }
-
 
 
         String fields = ss[0];
@@ -165,6 +171,7 @@
 
     private void buildSql(){
         this.sql = "select " + this.select + " from " + this.tableKeyword.getTable() + " where " + this.where;
+
     }
 
     private BlockCode buildCode(){
@@ -173,16 +180,15 @@
         StringBuilder csb = new StringBuilder();
         String sql = "\"" +this.sql + "\"";
         csb.append("        def " + funcName + "(){\n");
-        csb.append("            List<Object> pars = new ArrayList<>();\n");
+        csb.append("            Map<String,Object> pars = new HashMap<>();\n");
         csb.append("            def sql= " +sql + ";\n");
-        for(int i=0;i<this.pars.size();i++){
-            String pname= "p_" + i;
 
-            Parameter p  = this.pars.get(i);
-            csb.append("            def " + pname  + " = " + p.getScript()+";\n");
-            csb.append("            pars.add("+pname + ");\n");
+        this.parameters.forEach((k,v)->{
+            String pname= "p_" + k;
+            csb.append("            def " + pname  + " = " + v.getScript()+";\n");
+            csb.append("            pars.put('" +v.getName() +"'," + pname +");\n");
 
-        }
+        });
         csb.append("            def rs = service.execQuery(sql,pars);\n");
         csb.append("            if(rs " + this.compareScript + "){\n");
         csb.append("                return true;\n");
@@ -345,7 +351,6 @@
 
     private  MatchResult matchTimeRange(String skw, Keyword tkw,int idx){
 
-
         String sub = this.blockText.getExpression().substring(idx);
 
         String regex =  tkw.getRegex();
@@ -372,18 +377,21 @@
                 String d = vm.group(0);
                 day = Integer.valueOf(d);
 
-                rs.setOutput(tableKeyword.getTableTimeField() + " between ? and ?");
+                rs.setOutput(tableKeyword.getTableTimeField() + " between :beginTime and :endTime");
                 rs.setInput(skw);
                 rs.setIdx(idx + e);
 
                 //鏈夊嚑涓棶鍙凤紝灏辫鏈夊嚑涓搴旂殑鍙傛暟
                 Parameter p1 = new Parameter();
+                p1.setName("beginTime");
                 p1.setScript("LocalDateTime.now()");
+                p1.setTypeName("LocalDateTime");
                 Parameter p2 = new Parameter();
+                p2.setName("endTime");
                 p2.setScript("LocalDateTime.now().minusDays("+day+ ")");
-
-                pars.add(p1);
-                pars.add(p2);
+                p2.setTypeName("LocalDateTime");
+                parameters.put(p1.getName(),p1);
+                parameters.put(p2.getName(),p2);
 
             }else{
                 throw new RuntimeException("娌℃湁鍦ㄦ棩鏈熻寖鍥翠腑鎵惧埌鎸囧畾澶╂暟");
@@ -395,4 +403,6 @@
         return rs;
     }
 
+
+
 }
diff --git a/src/main/java/com/ycl/scheme/entity/Keyword.java b/src/main/java/com/ycl/scheme/entity/Keyword.java
index fa3b7ac..b5080fb 100644
--- a/src/main/java/com/ycl/scheme/entity/Keyword.java
+++ b/src/main/java/com/ycl/scheme/entity/Keyword.java
@@ -18,19 +18,21 @@
 
     private KeywordType keywordType;
 
-    private String table;
+    private String source; //瑙﹀彂鐨勫師鏁版嵁琛�
 
-    private String field;
+    private String table;//瑙﹀彂鍚庢煡璇㈢殑琛紙瑙嗗浘锛� 锛屽鏋� table 鍜� source 涓嶇浉鍚岀殑璇濓紝 閭d箞 tableKey蹇呴』鐩稿悓
 
-    private String sql;
+    private String field;//瀛楁鍚嶇О
+
+    private String sql;//鏆傛椂娌$敤
 
     private String dataType;//瀵瑰簲java鐨勬暟鎹被鍨�
 
-    private String tableTimeField;
+    private String tableTimeField;//table 蹇呴』
 
-    private String tableKey;
+    private String tableKey;//table 蹇呴』
 
-    private String regex;
+    private String regex;//鎶撳彇
 
 
 
diff --git a/src/main/java/com/ycl/scheme/entity/Scheme.java b/src/main/java/com/ycl/scheme/entity/Scheme.java
index 3bc65c7..5ca0d44 100644
--- a/src/main/java/com/ycl/scheme/entity/Scheme.java
+++ b/src/main/java/com/ycl/scheme/entity/Scheme.java
@@ -10,6 +10,10 @@
 
     private String name;
 
+    private TriggerType triggerType;
+
+    private String timing;
+
     private String inputText;
 
     private String outCode;
diff --git a/src/main/java/com/ycl/scheme/entity/TriggerType.java b/src/main/java/com/ycl/scheme/entity/TriggerType.java
new file mode 100644
index 0000000..3d686b2
--- /dev/null
+++ b/src/main/java/com/ycl/scheme/entity/TriggerType.java
@@ -0,0 +1,7 @@
+package com.ycl.scheme.entity;
+
+public enum TriggerType {
+
+    CANAL, //閫氳繃canal瑙﹀彂
+    TIME;//閫氳繃瀹氭椂瑙﹀彂
+}
diff --git a/src/main/java/com/ycl/scheme/service/SchemeService.java b/src/main/java/com/ycl/scheme/service/SchemeService.java
index 4642bd0..6b65079 100644
--- a/src/main/java/com/ycl/scheme/service/SchemeService.java
+++ b/src/main/java/com/ycl/scheme/service/SchemeService.java
@@ -14,6 +14,7 @@
 
 import java.sql.Connection;
 import java.util.List;
+import java.util.Map;
 
 @Service
 public class SchemeService {
@@ -35,7 +36,7 @@
         System.out.println(scheme.getOutCode());
     }
 
-    public Object execQuery(String sql, List<Parameter> pars){
+    public Object execQuery(String sql, Map<String,Object> pars){
         return 5;
     }
 
diff --git a/src/test/java/org/example/Builder.java b/src/test/java/org/example/Builder.java
index 778273b..8b7c4b2 100644
--- a/src/test/java/org/example/Builder.java
+++ b/src/test/java/org/example/Builder.java
@@ -2,6 +2,7 @@
 
 import com.ycl.scheme.AbstractSchemeRunner;
 import com.ycl.scheme.BlockText;
+import com.ycl.scheme.Parameter;
 import com.ycl.scheme.entity.BlockCode;
 import com.ycl.scheme.entity.Scheme;
 import com.ycl.scheme.SchemeRunnerBuilder;
@@ -12,6 +13,8 @@
 import org.springframework.stereotype.Component;
 
 import javax.annotation.Resource;
+import java.util.HashMap;
+import java.util.Map;
 
 @SpringBootTest
 public class Builder {
@@ -43,8 +46,12 @@
         String code =scheme.getOutCode();
 
         AbstractSchemeRunner runner = scheme.getRunner();
-
-        runner.run(service);
+        Map<String, Parameter> pars= new HashMap<>();
+        Parameter p = new Parameter();
+        p.setName("rowId");
+        p.setScript(1);
+        p.setTypeName("Integer");
+        runner.run(pars,service);
 
         System.out.println(code);
 
diff --git a/src/test/java/org/example/test.groovy b/src/test/java/org/example/test.groovy
index 895a94e..9c3e396 100644
--- a/src/test/java/org/example/test.groovy
+++ b/src/test/java/org/example/test.groovy
@@ -1,4 +1,5 @@
 package com.ycl.scheme;
+
 import java.util.List;
 import java.util.ArrayList;
 import java.util.ArrayList;
@@ -8,20 +9,22 @@
 import  java.time.LocalDate;
 class scheme_1 extends AbstractSchemeRunner {
     SchemeService service;
-    void run(SchemeService service){
+    @Override
+    void run(Map<String,Parameter> pars,SchemeService service){
+        super.parameters.putAll(pars);
         this.service = service;
-        if(func_0() &&func_1() ){
+        if(func_0() && func_1() ){
             service.doAction(1)
         }
     }
 
     def func_0(){
-        List<Object> pars = new ArrayList<>();
-        def sql= "select count() from t_info where create_time between ? and ?  and  content like '%鎶㈠ず%'  and address like '%閲戠墰澶ч亾%' "
-        def p_0 = LocalDateTime.now();;
-        pars.add(p_0);
-        def p_1 = LocalDateTime.now().minusDays(5);;
-        pars.add(p_1);
+        Map<String,Object> pars = new HashMap<>();
+        def sql= "select count(*) from t_info where create_time between :beginTime and :endTime  and  content like '%鎶㈠ず%'  and address like '%閲戠墰澶ч亾%' ";
+        def p_beginTime = LocalDateTime.now();
+        pars.put('beginTime',p_beginTime);
+        def p_endTime = LocalDateTime.now().minusDays(5);
+        pars.put('endTime',p_endTime);
         def rs = service.execQuery(sql,pars);
         if(rs > 2){
             return true;
@@ -30,12 +33,12 @@
         }
     }
     def func_1(){
-        List<Object> pars = new ArrayList<>();
-        def sql= "select  from t_case where create_time between ? and ?  and  content like '%鍛芥%'  and address like '%閲戠墰澶ч亾%' "
-        def p_0 = LocalDateTime.now();;
-        pars.add(p_0);
-        def p_1 = LocalDateTime.now().minusDays(5);;
-        pars.add(p_1);
+        Map<String,Object> pars = new HashMap<>();
+        def sql= "select  from t_case where create_time between :beginTime and :endTime  and  content like '%鍛芥%'  and address like '%閲戠墰澶ч亾%' ";
+        def p_beginTime = LocalDateTime.now();
+        pars.put('beginTime',p_beginTime);
+        def p_endTime = LocalDateTime.now().minusDays(5);
+        pars.put('endTime',p_endTime);
         def rs = service.execQuery(sql,pars);
         if(rs >=2){
             return true;

--
Gitblit v1.8.0