lrj
2024-10-25 f6348318d0511d54babc870d5bd7dd9e4ea00313
修改参数传入  ,支持 canal
11个文件已修改
2个文件已添加
1个文件已删除
194 ■■■■■ 已修改文件
.idea/vcs.xml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ycl/scheme/AbstractSchemeRunner.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ycl/scheme/CanalTriggerBuilder.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ycl/scheme/KeywordExample.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ycl/scheme/MatchResult.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ycl/scheme/Parameter.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ycl/scheme/SchemeRunnerBuilder.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ycl/scheme/SqlQueryBuilder.java 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ycl/scheme/entity/Keyword.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ycl/scheme/entity/Scheme.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ycl/scheme/entity/TriggerType.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ycl/scheme/service/SchemeService.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/test/java/org/example/Builder.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/test/java/org/example/test.groovy 31 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.idea/vcs.xml
New file
@@ -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>
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);
    }
}
src/main/java/com/ycl/scheme/CanalTriggerBuilder.java
File was deleted
src/main/java/com/ycl/scheme/KeywordExample.java
@@ -8,8 +8,6 @@
public class KeywordExample {
    private static List<Keyword> keywords= new ArrayList<>();
    static {
src/main/java/com/ycl/scheme/MatchResult.java
@@ -14,5 +14,5 @@
    private int idx;
    private List<Parameter> parameters;
//    private List<Parameter> parameters;
}
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;
}
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) {
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执行是否正确
        return true;
@@ -120,7 +127,6 @@
        if(ss.length < 2){
            throw  new RuntimeException("结果表达式不正确");
        }
        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;
    }
}
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 不相同的话, 那么 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;//抓取
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;
src/main/java/com/ycl/scheme/entity/TriggerType.java
New file
@@ -0,0 +1,7 @@
package com.ycl.scheme.entity;
public enum TriggerType {
    CANAL, //通过canal触发
    TIME;//通过定时触发
}
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;
    }
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);
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;