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