.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;