From 2b65f3af909bdea89ba453200b276cb00bd07178 Mon Sep 17 00:00:00 2001 From: zhanglingsi Date: Mon, 7 Jan 2019 11:25:24 +0800 Subject: [PATCH 1/4] init --- .gitignore | 1 + pom.xml | 72 +- .../biao/apijson/parser/APIJSONProvider.java | 1627 ++++++++--------- .../biao/apijson/parser/AbstractProvider.java | 226 +-- .../java/zuo/biao/apijson/parser/App.java | 8 +- .../zuo/biao/apijson/parser/BaseProvider.java | 3 + .../apijson/parser/InterpreterProvider.java | 336 ++-- .../java/zuo/biao/apijson/parser/Message.java | 75 +- .../zuo/biao/apijson/parser/SQLExplorer.java | 421 ++--- .../zuo/biao/apijson/parser/SQLProvider.java | 165 +- .../apijson/parser/SQLProviderException.java | 84 +- .../java/zuo/biao/apijson/parser/AppTest.java | 38 - .../zuo/biao/apijson/parser/TestCase.java | 74 + 13 files changed, 1514 insertions(+), 1616 deletions(-) create mode 100644 .gitignore delete mode 100644 src/test/java/zuo/biao/apijson/parser/AppTest.java create mode 100644 src/test/java/zuo/biao/apijson/parser/TestCase.java diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b83d222 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/target/ diff --git a/pom.xml b/pom.xml index e6ffde5..54ebe2f 100644 --- a/pom.xml +++ b/pom.xml @@ -1,30 +1,54 @@ - 4.0.0 + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 - APIJSONParser - APIJSONParser - 0.0.1-SNAPSHOT - jar + APIJSONParser + APIJSONParser + 0.0.1-SNAPSHOT + jar - APIJSONParser - http://maven.apache.org + APIJSONParser + http://maven.apache.org - - UTF-8 - + + UTF-8 + UTF-8 + 1.8 + - - - junit - junit - 3.8.1 - test - - - com.alibaba - fastjson - 1.2.21 - - + + + com.alibaba + fastjson + 1.2.21 + + + org.projectlombok + lombok + 1.18.4 + + + + com.google.guava + guava + 19.0 + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + org.apache.maven.plugins + maven-compiler-plugin + + ${java.version} + ${java.version} + + + + diff --git a/src/main/java/zuo/biao/apijson/parser/APIJSONProvider.java b/src/main/java/zuo/biao/apijson/parser/APIJSONProvider.java index 83ed32e..99b56bc 100644 --- a/src/main/java/zuo/biao/apijson/parser/APIJSONProvider.java +++ b/src/main/java/zuo/biao/apijson/parser/APIJSONProvider.java @@ -1,26 +1,37 @@ package zuo.biao.apijson.parser; import java.math.BigDecimal; -import java.util.ArrayList; import java.util.List; import java.util.Set; + import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.google.common.collect.Lists; +import lombok.Getter; +import lombok.Setter; + +/** + * @author zhangls + */ +public class APIJSONProvider extends BaseProvider { + + private final String ALIAS_SPLIT = ":"; + private static final String AND = " AND "; + private static final String OR = " OR "; + + @Getter @Setter + private List tableWhiteList = Lists.newArrayList(); + @Getter @Setter + private List tableBlackList = Lists.newArrayList(); + @Getter @Setter + private List columnWhiteList = Lists.newArrayList(); + @Getter @Setter + private List columnBlackList = Lists.newArrayList(); + + private JSONObject request; + + private JSONObject join; -public class APIJSONProvider extends AbstractProvider { - - private final String ALIAS_SPLIT = ":"; - private static final String AND = " AND "; - private static final String OR = " OR "; - - private List tableWhiteList = new ArrayList(); - private List tableBlackList = new ArrayList(); - private List columnWhiteList = new ArrayList(); - private List columnBlackList = new ArrayList(); - - private JSONObject request; - private JSONObject join; - /* * ================================== * 通用逻辑 @@ -29,751 +40,751 @@ public class APIJSONProvider extends AbstractProvider { * 所有操作都会涉及到的内容 * */ - - /** - * 传入的参数应该是一个通过验证的APIJSON请求 - * @param request - */ - public APIJSONProvider(JSONObject obj) { - if(obj == null) { - error("APIJSONProvider传入的请求不能为空"); - } - JSONObject tabs = obj.getJSONObject("[]"); - if(tabs == null) { - this.request = obj; - }else { - this.request = tabs; - this.join = obj.getJSONObject("join"); - } - } - /** - * 解析请求中的表名 - * 表名必须符合:(\w+(:\w+)?) - * 即: - * 表名 - * 表名:表别名 - * 两种形式 - */ - @Override - public List getTables() { - // TODO Auto-generated method stub - List list = new ArrayList<>(); - Set tableNames = request.keySet(); - String tableAliasName; - String tableRealName; - for(String tableName : tableNames) { - if(!tableName.matches("(\\w+(:\\w+)?)")) { - error("表" + tableName + "格式不符合" ); - return null; - } - //是否有自定义别名 - if(tableName.contains(ALIAS_SPLIT)) { - String[] splitArray = tableName.split(ALIAS_SPLIT); - tableRealName = splitArray[0]; - tableAliasName = splitArray[1]; - }else { - tableRealName = tableAliasName = tableName; - } - validateTable(tableRealName); - list.add(tableRealName + " " + tableAliasName); - } - return list; - } + + /** + * 传入的参数应该是一个通过验证的APIJSON请求 + * + * @param obj + */ + public APIJSONProvider(JSONObject obj) { + if (obj == null) { + error("APIJSONProvider传入的请求不能为空"); + } + + JSONObject tabs = obj.getJSONObject("[]"); + if (tabs == null) { + this.request = obj; + } else { + this.request = tabs; + this.join = obj.getJSONObject("join"); + } + } + + /** + * 解析请求中的表名 + * 表名必须符合:(\w+(:\w+)?) + * 即: + * 表名 + * 表名:表别名 + * 两种形式 + */ + @Override + public List getTables() { + List list = Lists.newArrayList(); + Set tableNames = request.keySet(); + String tableAliasName; + String tableRealName; + for (String tableName : tableNames) { + if (!tableName.matches("(\\w+(:\\w+)?)")) { + error("表" + tableName + "格式不符合"); + return null; + } + //是否有自定义别名 + if (tableName.contains(ALIAS_SPLIT)) { + String[] splitArray = tableName.split(ALIAS_SPLIT); + tableRealName = splitArray[0]; + tableAliasName = splitArray[1]; + } else { + tableRealName = tableAliasName = tableName; + } + validateTable(tableRealName); + list.add(tableRealName + " " + tableAliasName); + } + return list; + } /* * ================================== * 查询逻辑 * ================================== */ - - /** - * 解析请求中的字段 - * 路径:/表名/@column - * 同时为字段设置好引用的表别名,如: p.id - * 表名必须符合:(\w+(:\w+)?) - * 字段值必须符合: - * 不支持函数的正则:(\w+(:\w+)?)+(\s?,\s?(\w+(:\w+)?)+)* - * 支持函数的正则:((\w+\(\w+\):\w+|\w+)(:\w+)?)+(\s?,\s?((\w+\(\w+\):\w+|\w+)(:\w+)?)+)* - * 例:a,b,c或a:a1,b:b1,c - * 约束:必须要有表名 - * 目前支持函数 - */ - @Override - public List getSelect() { - // TODO Auto-generated method stub - List list = new ArrayList<>(); - if(getStatementType() == StatementType.SELECT) { - Set tableNames = request.keySet(); - String tableRealName; - String tableAliasName; - for(String tableName : tableNames) { - //格式检查 - if(!tableName.matches("(\\w+(:\\w+)?)")) { - error("表" + tableName + "格式不符合" ); - return null; - } - //是否有自定义别名 - if(tableName.contains(ALIAS_SPLIT)) { - tableRealName = tableName.split(ALIAS_SPLIT)[0]; - //填写了表别名 - tableAliasName = tableName.split(ALIAS_SPLIT)[1]; - }else { - tableRealName = tableAliasName = tableName; - } - // 获取请求@column的值 - JSONObject propertis = request.getJSONObject(tableName); - String columnsValue = propertis.getString("@column"); - - if(columnsValue == null) { - validateColumn(tableRealName,"*"); - //没有填写@column字段,默认为全部 - list.add(tableAliasName + ".*"); - }else { - if(!columnsValue.matches("((\\w+\\(\\w+\\):\\w+|\\w+)(:\\w+)?)+(\\s?,\\s?((\\w+\\(\\w+\\):\\w+|\\w+)(:\\w+)?)+)*")) { - error("字段@column:" + columnsValue + "格式不符合,正确请求如:a,b,c:d或者a,max(d):d,c:e" ); - return null; - } - //填写了,则返回tableAliasName.colName或tableAliasName.columnName as columnAliasName - String[] columnNames = columnsValue.replaceAll("\\s", "").split(","); - for(String columnName : columnNames) { - if(columnName.contains(ALIAS_SPLIT)) { - //填写了字段别名,使用:tableAliasName.columnName as columnAliasName这种类型 - //这里columnRealName有两种情况,如:id或max(id) - String functionOrColumn = columnName.split(ALIAS_SPLIT)[0]; - if(functionOrColumn.contains("(")) { - //有函数的字段 - //去掉) - functionOrColumn = functionOrColumn.replaceAll("\\)", ""); - String[] functionStrs = functionOrColumn.split("\\("); - String funcitonName = functionStrs[0]; - //要对函数进行控制这这里进行 - //此处省略函数合法性检查的代码... - String columnRealName = functionStrs[1]; - String columnAliasName = columnName.split(ALIAS_SPLIT)[1]; - validateColumn(tableRealName,columnRealName); - list.add(funcitonName + "(" + tableAliasName + "." + columnRealName + ")" + " as " + columnAliasName); - }else { - //没函数的字段 - String columnRealName = functionOrColumn ; - String columnAliasName = columnName.split(ALIAS_SPLIT)[1]; - validateColumn(tableRealName,columnRealName); - list.add(tableAliasName + "." + columnRealName + " as " + columnAliasName); - } - }else { - //使用tableAliasName.columnName类型 - validateColumn(tableRealName,columnName); - list.add(tableAliasName + "." + columnName); - } - } - } - - } - } - return list; - } - /** - * 解析请求中的过滤条件 - * 支持以下模式: - * 单值:"id" : "12" 即id=12 - * 多值:"id&{}" : ">12,<30" 即 id > 12 AND id < 30 - * 多值:"id|{}" : ">12,<30" 即 id > 12 OR id < 30 - * 多值:"id{}" : [1,2,3] 即 id IN (1,2,3) - * 多值:"id!{}" : [1,2,3] 即 id NOT IN (1,2,3) - * 模糊:"content~":"keyword" 即字段content包含字符串keyword - * 模糊:"content$":"%keyword" 同样是模糊查询,%放出来自己操控 - * 正则:"content?":"^[0-9]+$" 后面填写正则即可 - * 外键:"id@":"/外键表/外键字段" - */ - @Override - public List getWhere() { - // TODO Auto-generated method stub - List list = new ArrayList<>(); - Set tableNames = request.keySet(); - String tableAliasName; - for(String tableName : tableNames) { - //是否有自定义别名 - if(tableName.contains(ALIAS_SPLIT)) { - //填写了表别名 - tableAliasName = tableName.split(ALIAS_SPLIT)[1]; - }else { - tableAliasName = tableName; - } - // 遍历过滤条件 - JSONObject propertis = request.getJSONObject(tableName); - conditionLoop:for(String condition : propertis.keySet() ) { - //关键字则跳过 - if(condition.startsWith("@")) { - continue conditionLoop; - } - if(condition.matches("\\w+")) { - //纯字段名 - if(propertis.get(condition) instanceof Integer || - propertis.get(condition) instanceof Float || - propertis.get(condition) instanceof Double || - propertis.get(condition) instanceof BigDecimal) { - list.add(tableAliasName + "." + condition + " = " + propertis.get(condition) ); - }else if(propertis.get(condition) instanceof String) { - list.add(tableAliasName + "." + condition + " = '" + ((String) propertis.get(condition)).replaceAll("'", "''") + "'" ); - } - }else if(condition.matches("(\\w+(!|&|\\|)?\\{\\})+")) { - - //表示这是一个多条件类型 - if(propertis.get(condition) instanceof String) { - String exp = (String)propertis.get(condition); - //是否匹配这种类型:<20.3,>3.3,=3.3 - if(!exp.matches("(\\s?(>|<|>=|<=|=|<>)+\\s?((\\-|\\+)?\\d+(\\.\\d+)?)+)+(\\s?,\\s?((>|<|>=|<=|=|<>)+\\s?((\\-|\\+)?\\d+(\\.\\d+)?)))*")) { - error(condition + "的格式不正确,正确使用方式如: >10,<20"); - return null; - } - if(condition.endsWith("|{}")) { - String[] terms = exp.replaceAll("\\s", "").split(","); - String columnName = condition.replaceAll("\\|\\{\\}", ""); - String limit = ""; - for(int i = 0; i < terms.length; i++) { - String term = terms[i]; - if(term.startsWith(">=")) { - limit += tableAliasName + "." + columnName + " >= " + term.replaceAll(">=", ""); - }else if(term.startsWith("<=")) { - limit += tableAliasName + "." + columnName + " <= " + term.replaceAll("<=", ""); - }else if(term.startsWith(">")) { - limit += tableAliasName + "." + columnName + " > " + term.replaceAll(">", ""); - }else if(term.startsWith("<")) { - limit += tableAliasName + "." + columnName + " < " + term.replaceAll("<", ""); - }else if(term.startsWith("<>") || term.startsWith("!=") ) { - limit += tableAliasName + "." + columnName + " <> " + term.replaceAll("<>", "").replaceAll("!=", ""); - }else if(term.startsWith("=")) { - limit += tableAliasName + "." + columnName + " = " + term.replaceAll("=", ""); - } - if(terms.length > 1 && (i != (terms.length - 1))) - limit += OR; - } - list.add(limit); - }else { - getLastList().add(AND); - String[] terms = exp.replaceAll("\\s", "").split(","); - String columnName = condition.replaceAll("\\{\\}", "").replaceAll("&", "").replaceAll("!", ""); - String limit = ""; - for(int i = 0; i < terms.length; i++) { - String term = terms[i]; - if(term.startsWith(">=")) { - limit += tableAliasName + "." + columnName + " >= " + term.replaceAll(">=", ""); - }else if(term.startsWith("<=")) { - limit += tableAliasName + "." + columnName + " <= " + term.replaceAll("<=", ""); - }else if(term.startsWith(">")) { - limit += tableAliasName + "." + columnName + " > " + term.replaceAll(">", ""); - }else if(term.startsWith("<")) { - limit += tableAliasName + "." + columnName + " < " + term.replaceAll("<", ""); - }else if(term.startsWith("<>") || term.startsWith("!=") ) { - limit += tableAliasName + "." + columnName + " <> " + term.replaceAll("<>", "").replaceAll("!=", ""); - }else if(term.startsWith("=")) { - limit += tableAliasName + "." + columnName + " = " + term.replaceAll("=", ""); - } - if(terms.length > 1 && (i != (terms.length - 1))) - limit += AND; - } - list.add(limit); - - } - }else if(propertis.get(condition) instanceof JSONArray) { - JSONArray array = (JSONArray)propertis.get(condition); - //分离出字段名 - String columnName = condition.replaceAll("\\{\\}", "").replaceAll("&", "").replaceAll("!", ""); - String limit = ""; - if(condition.endsWith("!{}")) { - if(!array.isEmpty()) { - for(int i = 0; i < array.size(); i++) { - Object obj = array.get(i); - if(i != 0) { - limit += ", "; - } - if( obj instanceof Integer || - obj instanceof Float || - obj instanceof Double || - obj instanceof BigDecimal) { - limit += obj; - }else if(obj instanceof String) { - limit += "'" + ((String)obj).replaceAll("'", "''") + "'"; - } - } - list.add(tableAliasName + "." + columnName + " NOT IN [" + limit + "]" ); - } - }else { - if(!array.isEmpty()) { - for(int i = 0; i < array.size(); i++) { - Object obj = array.get(i); - if(i != 0) { - limit += ", "; - } - if( obj instanceof Integer || - obj instanceof Float || - obj instanceof Double || - obj instanceof BigDecimal) { - limit += obj; - }else if(obj instanceof String) { - limit += "'" + ((String)obj).replaceAll("'", "''") + "'"; - } - } - list.add(tableAliasName + "." + columnName + " IN [" + limit + "]" ); - } - } - } - }else if(condition.matches("\\w+~")) { - //字符串查询,包含 - if(propertis.get(condition) instanceof String) { - String exp = (String)propertis.get(condition); - String columnName = condition.replaceAll("~", ""); - list.add(tableAliasName + "." + columnName + " LIKE '%" + exp.replaceAll("'", "''") + "%'" ); - }else { - error(condition +"的值必须要是字符串"); - return null; - } - }else if(condition.matches("\\w+\\$")) { - //字符串查询,LIKE - if(propertis.get(condition) instanceof String) { - String exp = (String)propertis.get(condition); - String columnName = condition.replaceAll("\\$", ""); - list.add(tableAliasName + "." + columnName + " LIKE '" + exp.replaceAll("'", "''") + "'" ); - }else { - error(condition +"的值必须要是字符串"); - return null; - } - }else if(condition.matches("\\w+\\?")) { - //字符串查询,正则 - if(propertis.get(condition) instanceof String) { - String exp = (String)propertis.get(condition); - String columnName = condition.replaceAll("\\?", ""); - list.add(" regexp_like(" + tableAliasName + "." + columnName + ",'" + exp.replaceAll("'", "''") + "')" ); - }else { - error(condition +"的值必须要是字符串"); - return null; - } - }else if(condition.matches("\\w+@")) { - //内连接 - if(propertis.get(condition) instanceof String) { - String exp = (String)propertis.get(condition); - String columnName = condition.replaceAll("@", ""); - if(exp.matches("/\\w+/\\w+")) { - String[] args = exp.split("/"); - String refTable = args[1]; - String refColumn = args[2]; - list.add(refTable + "." + refColumn + " = " + tableAliasName + "." + columnName); - }else { - error(condition + "必须符合:\"/表名或别名/字段名\"的形式"); - return null; - } - }else { - error(condition +"的值必须要是字符串"); - return null; - } - } - } - - - } - return list; - } - /** - * 内连接 - * 请求:"@innerJoin" : ["table1.column1 = table2.column2","table1.column1 = table2.column2"] - * 编译之后:INNER JOIN table1 ON table1.column1=table2.column2 - */ - @Override - public List getInnerJoin() { - // TODO Auto-generated method stub - List list = new ArrayList<>(); - if(getStatementType() == StatementType.SELECT) { - if(join != null && join.get("@innerJoin")!=null) { - JSONArray stms = join.getJSONArray("@innerJoin"); - for(int i = 0; i < stms.size(); i++) { - Object obj = stms.get(i); - if(obj instanceof String) { - String joinStr = (String)obj; - if(joinStr.matches("\\w+\\.\\w+\\s?=\\s?\\w+\\.\\w+")) { - //table1.column1 = table2.column2 - String[] tcs = joinStr.replaceAll("\\s", "").split("="); - String leftTable = tcs[0].split("\\.")[0]; - String rightTable = tcs[1].split("\\.")[0]; - validateTable(leftTable); - list.add(leftTable + " ON " + joinStr); - }else { - error("@innerJoin的格式必须是:table1.column1 = table2.column2,相当于INNER JOIN table1 ON table1.column1=table2.column2"); - return null; - } - }else { - error("@innerJoin的类型必须是String类型,填写的值如:table1.column1 = table2.column2,相当于INNER JOIN table1 ON table1.column1=table2.column2。注意:表有别名的应该写表别名"); - return null; - } - } - } - } - return list; - } - /** - * 左外连接 - * - */ - @Override - public List getLeftOuterJoin() { - // TODO Auto-generated method stub - List list = new ArrayList<>(); - if(getStatementType() == StatementType.SELECT) { - if(join != null && join.get("@leftOuterJoin")!=null) { - JSONArray stms = join.getJSONArray("@leftOuterJoin"); - for(int i = 0; i < stms.size(); i++) { - Object obj = stms.get(i); - if(obj instanceof String) { - String joinStr = (String)obj; - if(joinStr.matches("\\w+\\.\\w+\\s?=\\s?\\w+\\.\\w+")) { - //table1.column1 = table2.column2 - String[] tcs = joinStr.replaceAll("\\s", "").split("="); - String leftTable = tcs[0].split("\\.")[0]; - String rightTable = tcs[1].split("\\.")[0]; - validateTable(leftTable); - list.add(leftTable + " ON " + joinStr); - }else { - error("@leftOuterJoin的格式必须是:table1.column1 = table2.column2,相当于LEFT OUTER JOIN table1 ON table1.column1=table2.column2"); - return null; - } - }else { - error("@leftOuterJoin的类型必须是String类型,填写的值如:table1.column1 = table2.column2,相当于LEFT OUTER JOIN table1 ON table1.column1=table2.column2。注意:表有别名的应该写表别名"); - return null; - } - } - } - } - return list; - } - /** - * 右外链接 - */ - @Override - public List getRightOuterJoin() { - // TODO Auto-generated method stub - List list = new ArrayList<>(); - if(getStatementType() == StatementType.SELECT) { - if(join != null && join.get("@rightOuterJoin")!=null) { - JSONArray stms = join.getJSONArray("@rightOuterJoin"); - for(int i = 0; i < stms.size(); i++) { - Object obj = stms.get(i); - if(obj instanceof String) { - String joinStr = (String)obj; - if(joinStr.matches("\\w+\\.\\w+\\s?=\\s?\\w+\\.\\w+")) { - //table1.column1 = table2.column2 - String[] tcs = joinStr.replaceAll("\\s", "").split("="); - String leftTable = tcs[0].split("\\.")[0]; - String rightTable = tcs[1].split("\\.")[0]; - validateTable(leftTable); - list.add(leftTable + " ON " + joinStr); - }else { - error("@rightOuterJoin的格式必须是:table1.column1 = table2.column2,相当于RIGHT OUTER JOIN table1 ON table1.column1=table2.column2"); - return null; - } - }else { - error("@rightOuterJoin的类型必须是String类型,填写的值如:table1.column1 = table2.column2,相当于RIGHT OUTER JOIN table1 ON table1.column1=table2.column2。注意:表有别名的应该写表别名"); - return null; - } - } - } - } - return list; - } - /** - * join连接 - */ - @Override - public List getJoin() { - // TODO Auto-generated method stub - List list = new ArrayList<>(); - if(getStatementType() == StatementType.SELECT) { - if(join != null && join.get("@join")!=null) { - JSONArray stms = join.getJSONArray("@join"); - for(int i = 0; i < stms.size(); i++) { - Object obj = stms.get(i); - if(obj instanceof String) { - String joinStr = (String)obj; - if(joinStr.matches("\\w+\\.\\w+\\s?=\\s?\\w+\\.\\w+")) { - //table1.column1 = table2.column2 - String[] tcs = joinStr.replaceAll("\\s", "").split("="); - String leftTable = tcs[0].split("\\.")[0]; - String rightTable = tcs[1].split("\\.")[0]; - validateTable(leftTable); - list.add(leftTable + " ON " + joinStr); - }else { - error("@join的格式必须是:table1.column1 = table2.column2,相当于JOIN table1 ON table1.column1=table2.column2"); - return null; - } - }else { - error("@join的类型必须是String类型,填写的值如:table1.column1 = table2.column2,相当于JOIN table1 ON table1.column1=table2.column2。注意:表有别名的应该写表别名"); - return null; - } - } - } - } - return list; - } - /** - * 外连接 - */ - @Override - public List getOuterJoin() { - // TODO Auto-generated method stub - List list = new ArrayList<>(); - if(getStatementType() == StatementType.SELECT) { - if(join != null && join.get("@outerJoin")!=null) { - JSONArray stms = join.getJSONArray("@join"); - for(int i = 0; i < stms.size(); i++) { - - Object obj = stms.get(i); - if(obj instanceof String) { - String joinStr = (String)obj; - if(joinStr.matches("\\w+\\.\\w+\\s?=\\s?\\w+\\.\\w+")) { - //table1.column1 = table2.column2 - String[] tcs = joinStr.replaceAll("\\s", "").split("="); - String leftTable = tcs[0].split("\\.")[0]; - String rightTable = tcs[1].split("\\.")[0]; - validateTable(leftTable); - list.add(leftTable + " ON " + joinStr); - }else { - error("@outerJoin的格式必须是:table1.column1 = table2.column2,相当于OUTER JOIN table1 ON table1.column1=table2.column2"); - return null; - } - }else { - error("@outerJoin的类型必须是String类型,填写的值如:table1.column1 = table2.column2,相当于OUTER JOIN table1 ON table1.column1=table2.column2。注意:表有别名的应该写表别名"); - return null; - } - } - } - } - return list; - } - /** - * 解析分组 - * "@group":"store_id" - */ - @Override - public List getGroupBy() { - // TODO Auto-generated method stub - List list = new ArrayList<>(); - if(getStatementType() == StatementType.SELECT) { - Set tableNames = request.keySet(); - String tableAliasName; - for(String tableName : tableNames) { - //格式检查 - if(!tableName.matches("(\\w+(:\\w+)?)")) { - error("表" + tableName + "格式不符合" ); - return null; - } - //是否有自定义别名 - if(tableName.contains(ALIAS_SPLIT)) { - //填写了表别名 - tableAliasName = tableName.split(ALIAS_SPLIT)[1]; - }else { - tableAliasName = tableName; - } - // 获取请求@group的值 - JSONObject propertis = request.getJSONObject(tableName); - String columnsValue = propertis.getString("@group"); - if(columnsValue != null) { - if(!columnsValue.matches("\\w+(\\s?,\\s?\\w+)*")) { - error("字段@group:" + columnsValue + "格式不符合,正确请求如:a,b,c" ); - return null; - } - String[] columnNames = columnsValue.replaceAll("\\s", "").split(","); - for(String colmunName : columnNames) { - list.add(tableAliasName + "." + colmunName); - } - } - - } - } - return list; - } - - /** - * 解析排序逻辑 - * column1+,column2-,+表示升序,-表示降序 - */ - @Override - public List getOrderBy() { - // TODO Auto-generated method stub - List list = new ArrayList<>(); - if(getStatementType() == StatementType.SELECT) { - Set tableNames = request.keySet(); - String tableAliasName; - for(String tableName : tableNames) { - //格式检查 - if(!tableName.matches("(\\w+(:\\w+)?)")) { - error("表" + tableName + "格式不符合" ); - return null; - } - //是否有自定义别名 - if(tableName.contains(ALIAS_SPLIT)) { - //填写了表别名 - tableAliasName = tableName.split(ALIAS_SPLIT)[1]; - }else { - tableAliasName = tableName; - } - // 获取请求@column的值 - JSONObject propertis = request.getJSONObject(tableName); - String columnsValue = propertis.getString("@orders"); - if(columnsValue != null) { - if(!columnsValue.matches("(\\w+(\\+|\\-)?)+(\\s?,\\s?(\\w+(\\+|\\-)?)+)*")) { - error("字段@orders:" + columnsValue + "格式不符合,正确格式如:column1+,column2-,+表示升序,-表示降序。" ); - return null; - } - //没有填写@orders字段,默认为全部 - String[] columnNames = columnsValue.replaceAll("\\s", "").split(","); - for(String columnName : columnNames) { - if(columnName.endsWith("+")) - list.add(tableAliasName + "." + columnName.replaceAll("\\+", "") + " ASC"); - else if (columnName.endsWith("-")) - list.add(tableAliasName + "." + columnName.replaceAll("\\-", "") + " DESC"); - } - } - } - } - return list; - } + + /** + * 解析请求中的字段 + * 路径:/表名/@column + * 同时为字段设置好引用的表别名,如: p.id + * 表名必须符合:(\w+(:\w+)?) + * 字段值必须符合: + * 不支持函数的正则:(\w+(:\w+)?)+(\s?,\s?(\w+(:\w+)?)+)* + * 支持函数的正则:((\w+\(\w+\):\w+|\w+)(:\w+)?)+(\s?,\s?((\w+\(\w+\):\w+|\w+)(:\w+)?)+)* + * 例:a,b,c或a:a1,b:b1,c + * 约束:必须要有表名 + * 目前支持函数 + */ + @Override + public List getSelect() { + List list = Lists.newArrayList(); + if (getStatementType() == StatementType.SELECT) { + Set tableNames = request.keySet(); + String tableRealName; + String tableAliasName; + for (String tableName : tableNames) { + //格式检查 + if (!tableName.matches("(\\w+(:\\w+)?)")) { + error("表" + tableName + "格式不符合"); + return null; + } + //是否有自定义别名 + if (tableName.contains(ALIAS_SPLIT)) { + tableRealName = tableName.split(ALIAS_SPLIT)[0]; + //填写了表别名 + tableAliasName = tableName.split(ALIAS_SPLIT)[1]; + } else { + tableRealName = tableAliasName = tableName; + } + // 获取请求@column的值 + JSONObject propertis = request.getJSONObject(tableName); + String columnsValue = propertis.getString("@column"); + + if (columnsValue == null) { + validateColumn(tableRealName, "*"); + //没有填写@column字段,默认为全部 + list.add(tableAliasName + ".*"); + } else { + if (!columnsValue.matches("((\\w+\\(\\w+\\):\\w+|\\w+)(:\\w+)?)+(\\s?,\\s?((\\w+\\(\\w+\\):\\w+|\\w+)(:\\w+)?)+)*")) { + error("字段@column:" + columnsValue + "格式不符合,正确请求如:a,b,c:d或者a,max(d):d,c:e"); + return null; + } + //填写了,则返回tableAliasName.colName或tableAliasName.columnName as columnAliasName + String[] columnNames = columnsValue.replaceAll("\\s", "").split(","); + for (String columnName : columnNames) { + if (columnName.contains(ALIAS_SPLIT)) { + //填写了字段别名,使用:tableAliasName.columnName as columnAliasName这种类型 + //这里columnRealName有两种情况,如:id或max(id) + String functionOrColumn = columnName.split(ALIAS_SPLIT)[0]; + if (functionOrColumn.contains("(")) { + //有函数的字段 + //去掉) + functionOrColumn = functionOrColumn.replaceAll("\\)", ""); + String[] functionStrs = functionOrColumn.split("\\("); + String funcitonName = functionStrs[0]; + //要对函数进行控制这这里进行 + //此处省略函数合法性检查的代码... + String columnRealName = functionStrs[1]; + String columnAliasName = columnName.split(ALIAS_SPLIT)[1]; + validateColumn(tableRealName, columnRealName); + list.add(funcitonName + "(" + tableAliasName + "." + columnRealName + ")" + " as " + columnAliasName); + } else { + //没函数的字段 + String columnRealName = functionOrColumn; + String columnAliasName = columnName.split(ALIAS_SPLIT)[1]; + validateColumn(tableRealName, columnRealName); + list.add(tableAliasName + "." + columnRealName + " as " + columnAliasName); + } + } else { + //使用tableAliasName.columnName类型 + validateColumn(tableRealName, columnName); + list.add(tableAliasName + "." + columnName); + } + } + } + + } + } + return list; + } + + /** + * 解析请求中的过滤条件 + * 支持以下模式: + * 单值:"id" : "12" 即id=12 + * 多值:"id&{}" : ">12,<30" 即 id > 12 AND id < 30 + * 多值:"id|{}" : ">12,<30" 即 id > 12 OR id < 30 + * 多值:"id{}" : [1,2,3] 即 id IN (1,2,3) + * 多值:"id!{}" : [1,2,3] 即 id NOT IN (1,2,3) + * 模糊:"content~":"keyword" 即字段content包含字符串keyword + * 模糊:"content$":"%keyword" 同样是模糊查询,%放出来自己操控 + * 正则:"content?":"^[0-9]+$" 后面填写正则即可 + * 外键:"id@":"/外键表/外键字段" + */ + @Override + public List getWhere() { + List list = Lists.newArrayList(); + Set tableNames = request.keySet(); + String tableAliasName; + for (String tableName : tableNames) { + //是否有自定义别名 + if (tableName.contains(ALIAS_SPLIT)) { + //填写了表别名 + tableAliasName = tableName.split(ALIAS_SPLIT)[1]; + } else { + tableAliasName = tableName; + } + // 遍历过滤条件 + JSONObject propertis = request.getJSONObject(tableName); + conditionLoop: + for (String condition : propertis.keySet()) { + //关键字则跳过 + if (condition.startsWith("@")) { + continue conditionLoop; + } + if (condition.matches("\\w+")) { + //纯字段名 + if (propertis.get(condition) instanceof Integer || + propertis.get(condition) instanceof Float || + propertis.get(condition) instanceof Double || + propertis.get(condition) instanceof BigDecimal) { + list.add(tableAliasName + "." + condition + " = " + propertis.get(condition)); + } else if (propertis.get(condition) instanceof String) { + list.add(tableAliasName + "." + condition + " = '" + ((String) propertis.get(condition)).replaceAll("'", "''") + "'"); + } + } else if (condition.matches("(\\w+(!|&|\\|)?\\{\\})+")) { + + //表示这是一个多条件类型 + if (propertis.get(condition) instanceof String) { + String exp = (String) propertis.get(condition); + //是否匹配这种类型:<20.3,>3.3,=3.3 + if (!exp.matches("(\\s?(>|<|>=|<=|=|<>)+\\s?((\\-|\\+)?\\d+(\\.\\d+)?)+)+(\\s?,\\s?((>|<|>=|<=|=|<>)+\\s?((\\-|\\+)?\\d+(\\.\\d+)?)))*")) { + error(condition + "的格式不正确,正确使用方式如: >10,<20"); + return null; + } + if (condition.endsWith("|{}")) { + String[] terms = exp.replaceAll("\\s", "").split(","); + String columnName = condition.replaceAll("\\|\\{\\}", ""); + String limit = ""; + for (int i = 0; i < terms.length; i++) { + String term = terms[i]; + if (term.startsWith(">=")) { + limit += tableAliasName + "." + columnName + " >= " + term.replaceAll(">=", ""); + } else if (term.startsWith("<=")) { + limit += tableAliasName + "." + columnName + " <= " + term.replaceAll("<=", ""); + } else if (term.startsWith(">")) { + limit += tableAliasName + "." + columnName + " > " + term.replaceAll(">", ""); + } else if (term.startsWith("<")) { + limit += tableAliasName + "." + columnName + " < " + term.replaceAll("<", ""); + } else if (term.startsWith("<>") || term.startsWith("!=")) { + limit += tableAliasName + "." + columnName + " <> " + term.replaceAll("<>", "").replaceAll("!=", ""); + } else if (term.startsWith("=")) { + limit += tableAliasName + "." + columnName + " = " + term.replaceAll("=", ""); + } + if (terms.length > 1 && (i != (terms.length - 1))) + limit += OR; + } + list.add(limit); + } else { + getLastList().add(AND); + String[] terms = exp.replaceAll("\\s", "").split(","); + String columnName = condition.replaceAll("\\{\\}", "").replaceAll("&", "").replaceAll("!", ""); + String limit = ""; + for (int i = 0; i < terms.length; i++) { + String term = terms[i]; + if (term.startsWith(">=")) { + limit += tableAliasName + "." + columnName + " >= " + term.replaceAll(">=", ""); + } else if (term.startsWith("<=")) { + limit += tableAliasName + "." + columnName + " <= " + term.replaceAll("<=", ""); + } else if (term.startsWith(">")) { + limit += tableAliasName + "." + columnName + " > " + term.replaceAll(">", ""); + } else if (term.startsWith("<")) { + limit += tableAliasName + "." + columnName + " < " + term.replaceAll("<", ""); + } else if (term.startsWith("<>") || term.startsWith("!=")) { + limit += tableAliasName + "." + columnName + " <> " + term.replaceAll("<>", "").replaceAll("!=", ""); + } else if (term.startsWith("=")) { + limit += tableAliasName + "." + columnName + " = " + term.replaceAll("=", ""); + } + if (terms.length > 1 && (i != (terms.length - 1))) + limit += AND; + } + list.add(limit); + + } + } else if (propertis.get(condition) instanceof JSONArray) { + JSONArray array = (JSONArray) propertis.get(condition); + //分离出字段名 + String columnName = condition.replaceAll("\\{\\}", "").replaceAll("&", "").replaceAll("!", ""); + String limit = ""; + if (condition.endsWith("!{}")) { + if (!array.isEmpty()) { + for (int i = 0; i < array.size(); i++) { + Object obj = array.get(i); + if (i != 0) { + limit += ", "; + } + if (obj instanceof Integer || + obj instanceof Float || + obj instanceof Double || + obj instanceof BigDecimal) { + limit += obj; + } else if (obj instanceof String) { + limit += "'" + ((String) obj).replaceAll("'", "''") + "'"; + } + } + list.add(tableAliasName + "." + columnName + " NOT IN [" + limit + "]"); + } + } else { + if (!array.isEmpty()) { + for (int i = 0; i < array.size(); i++) { + Object obj = array.get(i); + if (i != 0) { + limit += ", "; + } + if (obj instanceof Integer || + obj instanceof Float || + obj instanceof Double || + obj instanceof BigDecimal) { + limit += obj; + } else if (obj instanceof String) { + limit += "'" + ((String) obj).replaceAll("'", "''") + "'"; + } + } + list.add(tableAliasName + "." + columnName + " IN [" + limit + "]"); + } + } + } + } else if (condition.matches("\\w+~")) { + //字符串查询,包含 + if (propertis.get(condition) instanceof String) { + String exp = (String) propertis.get(condition); + String columnName = condition.replaceAll("~", ""); + list.add(tableAliasName + "." + columnName + " LIKE '%" + exp.replaceAll("'", "''") + "%'"); + } else { + error(condition + "的值必须要是字符串"); + return null; + } + } else if (condition.matches("\\w+\\$")) { + //字符串查询,LIKE + if (propertis.get(condition) instanceof String) { + String exp = (String) propertis.get(condition); + String columnName = condition.replaceAll("\\$", ""); + list.add(tableAliasName + "." + columnName + " LIKE '" + exp.replaceAll("'", "''") + "'"); + } else { + error(condition + "的值必须要是字符串"); + return null; + } + } else if (condition.matches("\\w+\\?")) { + //字符串查询,正则 + if (propertis.get(condition) instanceof String) { + String exp = (String) propertis.get(condition); + String columnName = condition.replaceAll("\\?", ""); + list.add(" regexp_like(" + tableAliasName + "." + columnName + ",'" + exp.replaceAll("'", "''") + "')"); + } else { + error(condition + "的值必须要是字符串"); + return null; + } + } else if (condition.matches("\\w+@")) { + //内连接 + if (propertis.get(condition) instanceof String) { + String exp = (String) propertis.get(condition); + String columnName = condition.replaceAll("@", ""); + if (exp.matches("/\\w+/\\w+")) { + String[] args = exp.split("/"); + String refTable = args[1]; + String refColumn = args[2]; + list.add(refTable + "." + refColumn + " = " + tableAliasName + "." + columnName); + } else { + error(condition + "必须符合:\"/表名或别名/字段名\"的形式"); + return null; + } + } else { + error(condition + "的值必须要是字符串"); + return null; + } + } + } + + + } + return list; + } + + /** + * 内连接 + * 请求:"@innerJoin" : ["table1.column1 = table2.column2","table1.column1 = table2.column2"] + * 编译之后:INNER JOIN table1 ON table1.column1=table2.column2 + */ + @Override + public List getInnerJoin() { + List list = Lists.newArrayList(); + if (getStatementType() == StatementType.SELECT) { + if (join != null && join.get("@innerJoin") != null) { + JSONArray stms = join.getJSONArray("@innerJoin"); + for (int i = 0; i < stms.size(); i++) { + Object obj = stms.get(i); + if (obj instanceof String) { + String joinStr = (String) obj; + if (joinStr.matches("\\w+\\.\\w+\\s?=\\s?\\w+\\.\\w+")) { + //table1.column1 = table2.column2 + String[] tcs = joinStr.replaceAll("\\s", "").split("="); + String leftTable = tcs[0].split("\\.")[0]; + String rightTable = tcs[1].split("\\.")[0]; + validateTable(leftTable); + list.add(leftTable + " ON " + joinStr); + } else { + error("@innerJoin的格式必须是:table1.column1 = table2.column2,相当于INNER JOIN table1 ON table1.column1=table2.column2"); + return null; + } + } else { + error("@innerJoin的类型必须是String类型,填写的值如:table1.column1 = table2.column2,相当于INNER JOIN table1 ON table1.column1=table2.column2。注意:表有别名的应该写表别名"); + return null; + } + } + } + } + return list; + } + + /** + * 左外连接 + */ + @Override + public List getLeftOuterJoin() { + List list = Lists.newArrayList(); + if (getStatementType() == StatementType.SELECT) { + if (join != null && join.get("@leftOuterJoin") != null) { + JSONArray stms = join.getJSONArray("@leftOuterJoin"); + for (int i = 0; i < stms.size(); i++) { + Object obj = stms.get(i); + if (obj instanceof String) { + String joinStr = (String) obj; + if (joinStr.matches("\\w+\\.\\w+\\s?=\\s?\\w+\\.\\w+")) { + //table1.column1 = table2.column2 + String[] tcs = joinStr.replaceAll("\\s", "").split("="); + String leftTable = tcs[0].split("\\.")[0]; + String rightTable = tcs[1].split("\\.")[0]; + validateTable(leftTable); + list.add(leftTable + " ON " + joinStr); + } else { + error("@leftOuterJoin的格式必须是:table1.column1 = table2.column2,相当于LEFT OUTER JOIN table1 ON table1.column1=table2.column2"); + return null; + } + } else { + error("@leftOuterJoin的类型必须是String类型,填写的值如:table1.column1 = table2.column2,相当于LEFT OUTER JOIN table1 ON table1.column1=table2.column2。注意:表有别名的应该写表别名"); + return null; + } + } + } + } + return list; + } + + /** + * 右外链接 + */ + @Override + public List getRightOuterJoin() { + List list = Lists.newArrayList(); + if (getStatementType() == StatementType.SELECT) { + if (join != null && join.get("@rightOuterJoin") != null) { + JSONArray stms = join.getJSONArray("@rightOuterJoin"); + for (int i = 0; i < stms.size(); i++) { + Object obj = stms.get(i); + if (obj instanceof String) { + String joinStr = (String) obj; + if (joinStr.matches("\\w+\\.\\w+\\s?=\\s?\\w+\\.\\w+")) { + //table1.column1 = table2.column2 + String[] tcs = joinStr.replaceAll("\\s", "").split("="); + String leftTable = tcs[0].split("\\.")[0]; + String rightTable = tcs[1].split("\\.")[0]; + validateTable(leftTable); + list.add(leftTable + " ON " + joinStr); + } else { + error("@rightOuterJoin的格式必须是:table1.column1 = table2.column2,相当于RIGHT OUTER JOIN table1 ON table1.column1=table2.column2"); + return null; + } + } else { + error("@rightOuterJoin的类型必须是String类型,填写的值如:table1.column1 = table2.column2,相当于RIGHT OUTER JOIN table1 ON table1.column1=table2.column2。注意:表有别名的应该写表别名"); + return null; + } + } + } + } + return list; + } + + /** + * join连接 + */ + @Override + public List getJoin() { + List list = Lists.newArrayList(); + if (getStatementType() == StatementType.SELECT) { + if (join != null && join.get("@join") != null) { + JSONArray stms = join.getJSONArray("@join"); + for (int i = 0; i < stms.size(); i++) { + Object obj = stms.get(i); + if (obj instanceof String) { + String joinStr = (String) obj; + if (joinStr.matches("\\w+\\.\\w+\\s?=\\s?\\w+\\.\\w+")) { + //table1.column1 = table2.column2 + String[] tcs = joinStr.replaceAll("\\s", "").split("="); + String leftTable = tcs[0].split("\\.")[0]; + String rightTable = tcs[1].split("\\.")[0]; + validateTable(leftTable); + list.add(leftTable + " ON " + joinStr); + } else { + error("@join的格式必须是:table1.column1 = table2.column2,相当于JOIN table1 ON table1.column1=table2.column2"); + return null; + } + } else { + error("@join的类型必须是String类型,填写的值如:table1.column1 = table2.column2,相当于JOIN table1 ON table1.column1=table2.column2。注意:表有别名的应该写表别名"); + return null; + } + } + } + } + return list; + } + + /** + * 外连接 + */ + @Override + public List getOuterJoin() { + List list = Lists.newArrayList(); + if (getStatementType() == StatementType.SELECT) { + if (join != null && join.get("@outerJoin") != null) { + JSONArray stms = join.getJSONArray("@join"); + for (int i = 0; i < stms.size(); i++) { + + Object obj = stms.get(i); + if (obj instanceof String) { + String joinStr = (String) obj; + if (joinStr.matches("\\w+\\.\\w+\\s?=\\s?\\w+\\.\\w+")) { + //table1.column1 = table2.column2 + String[] tcs = joinStr.replaceAll("\\s", "").split("="); + String leftTable = tcs[0].split("\\.")[0]; + String rightTable = tcs[1].split("\\.")[0]; + validateTable(leftTable); + list.add(leftTable + " ON " + joinStr); + } else { + error("@outerJoin的格式必须是:table1.column1 = table2.column2,相当于OUTER JOIN table1 ON table1.column1=table2.column2"); + return null; + } + } else { + error("@outerJoin的类型必须是String类型,填写的值如:table1.column1 = table2.column2,相当于OUTER JOIN table1 ON table1.column1=table2.column2。注意:表有别名的应该写表别名"); + return null; + } + } + } + } + return list; + } + + /** + * 解析分组 + * "@group":"store_id" + */ + @Override + public List getGroupBy() { + List list = Lists.newArrayList(); + if (getStatementType() == StatementType.SELECT) { + Set tableNames = request.keySet(); + String tableAliasName; + for (String tableName : tableNames) { + //格式检查 + if (!tableName.matches("(\\w+(:\\w+)?)")) { + error("表" + tableName + "格式不符合"); + return null; + } + //是否有自定义别名 + if (tableName.contains(ALIAS_SPLIT)) { + //填写了表别名 + tableAliasName = tableName.split(ALIAS_SPLIT)[1]; + } else { + tableAliasName = tableName; + } + // 获取请求@group的值 + JSONObject propertis = request.getJSONObject(tableName); + String columnsValue = propertis.getString("@group"); + if (columnsValue != null) { + if (!columnsValue.matches("\\w+(\\s?,\\s?\\w+)*")) { + error("字段@group:" + columnsValue + "格式不符合,正确请求如:a,b,c"); + return null; + } + String[] columnNames = columnsValue.replaceAll("\\s", "").split(","); + for (String colmunName : columnNames) { + list.add(tableAliasName + "." + colmunName); + } + } + + } + } + return list; + } + + /** + * 解析排序逻辑 + * column1+,column2-,+表示升序,-表示降序 + */ + @Override + public List getOrderBy() { + List list = Lists.newArrayList(); + if (getStatementType() == StatementType.SELECT) { + Set tableNames = request.keySet(); + String tableAliasName; + for (String tableName : tableNames) { + //格式检查 + if (!tableName.matches("(\\w+(:\\w+)?)")) { + error("表" + tableName + "格式不符合"); + return null; + } + //是否有自定义别名 + if (tableName.contains(ALIAS_SPLIT)) { + //填写了表别名 + tableAliasName = tableName.split(ALIAS_SPLIT)[1]; + } else { + tableAliasName = tableName; + } + // 获取请求@column的值 + JSONObject propertis = request.getJSONObject(tableName); + String columnsValue = propertis.getString("@orders"); + if (columnsValue != null) { + if (!columnsValue.matches("(\\w+(\\+|\\-)?)+(\\s?,\\s?(\\w+(\\+|\\-)?)+)*")) { + error("字段@orders:" + columnsValue + "格式不符合,正确格式如:column1+,column2-,+表示升序,-表示降序。"); + return null; + } + //没有填写@orders字段,默认为全部 + String[] columnNames = columnsValue.replaceAll("\\s", "").split(","); + for (String columnName : columnNames) { + if (columnName.endsWith("+")) { + list.add(tableAliasName + "." + columnName.replaceAll("\\+", "") + " ASC"); + } else if (columnName.endsWith("-")) { + list.add(tableAliasName + "." + columnName.replaceAll("\\-", "") + " DESC"); + } + } + } + } + } + return list; + } /* * ================================== * 新增逻辑 * ================================== */ - - @Override - public List getColumns() { - // TODO Auto-generated method stub - List list = new ArrayList<>(); - if(getStatementType() == StatementType.INSERT) { - Set tableNames = request.keySet(); - if(tableNames.size()!=1) { - error("新增时,表只能有一个"); - return null; - } - for(String tableName : tableNames) { - //是否有自定义别名 - if(tableName.contains(ALIAS_SPLIT)) { - //填写了表别名 - error("新增时,表不需要有别名"); - return null; - } - // 遍历过滤条件 - JSONObject propertis = request.getJSONObject(tableName); - for(String condition : propertis.keySet() ) { - //关键字则跳过 - if(condition.endsWith("@")) - continue; - if(condition.matches("\\w+")) { - //纯字段名 - validateColumn(tableName,condition); - list.add(condition); - }else { - error("新增时,"+condition+"必须是字段名"); - return null; - } - } - - } - } - return list; - } - - @Override - public List getValues() { - // TODO Auto-generated method stub - List list = new ArrayList<>(); - if(getStatementType() == StatementType.INSERT) { - Set tableNames = request.keySet(); - if(tableNames.size()!=1) { - error("新增时,表只能有一个"); - return null; - } - for(String tableName : tableNames) { - //是否有自定义别名 - if(tableName.contains(ALIAS_SPLIT)) { - //填写了表别名 - error("新增时,表不需要有别名"); - return null; - } - // 遍历过滤条件 - JSONObject propertis = request.getJSONObject(tableName); - for(String condition : propertis.keySet() ) { - //关键字则跳过 - if(condition.endsWith("@")) - continue; - if(condition.matches("\\w+")) { - //纯字段名 - if(propertis.get(condition) instanceof Integer || - propertis.get(condition) instanceof Float || - propertis.get(condition) instanceof Double || - propertis.get(condition) instanceof BigDecimal) { - list.add(propertis.get(condition).toString() ); - }else if(propertis.get(condition) instanceof String) { - list.add("'" + ((String) propertis.get(condition)).replaceAll("'", "''") + "'"); - } - }else { - error("新增时,"+condition+"必须是字段名"); - } - } - - } - } - return list; - } + + @Override + public List getColumns() { + List list = Lists.newArrayList(); + if (getStatementType() == StatementType.INSERT) { + Set tableNames = request.keySet(); + if (tableNames.size() != 1) { + error("新增时,表只能有一个"); + return null; + } + for (String tableName : tableNames) { + //是否有自定义别名 + if (tableName.contains(ALIAS_SPLIT)) { + //填写了表别名 + error("新增时,表不需要有别名"); + return null; + } + // 遍历过滤条件 + JSONObject propertis = request.getJSONObject(tableName); + for (String condition : propertis.keySet()) { + //关键字则跳过 + if (condition.endsWith("@")) { + continue; + } + if (condition.matches("\\w+")) { + //纯字段名 + validateColumn(tableName, condition); + list.add(condition); + } else { + error("新增时," + condition + "必须是字段名"); + return null; + } + } + + } + } + return list; + } + + @Override + public List getValues() { + List list = Lists.newArrayList(); + if (getStatementType() == StatementType.INSERT) { + Set tableNames = request.keySet(); + if (tableNames.size() != 1) { + error("新增时,表只能有一个"); + return null; + } + for (String tableName : tableNames) { + //是否有自定义别名 + if (tableName.contains(ALIAS_SPLIT)) { + //填写了表别名 + error("新增时,表不需要有别名"); + return null; + } + // 遍历过滤条件 + JSONObject propertis = request.getJSONObject(tableName); + for (String condition : propertis.keySet()) { + //关键字则跳过 + if (condition.endsWith("@")){ + continue; + } + if (condition.matches("\\w+")) { + //纯字段名 + if (propertis.get(condition) instanceof Integer || + propertis.get(condition) instanceof Float || + propertis.get(condition) instanceof Double || + propertis.get(condition) instanceof BigDecimal) { + list.add(propertis.get(condition).toString()); + } else if (propertis.get(condition) instanceof String) { + list.add("'" + ((String) propertis.get(condition)).replaceAll("'", "''") + "'"); + } + } else { + error("新增时," + condition + "必须是字段名"); + } + } + + } + } + return list; + } /* * ================================== * 修改逻辑 * ================================== */ - - /** - * 更新字段 - * "@description": "20190101,元旦快乐" - * 有@标记的才会更新,否则会被认为是WHERE的条件 - */ - @Override - public List getSets() { - // TODO Auto-generated method stub - List list = new ArrayList<>(); - if(getStatementType() == StatementType.UPDATE) { - Set tableNames = request.keySet(); - if(tableNames.size()!=1) { - error("更新时,表只能有一个"); - return null; - } - for(String tableName : tableNames) { - //是否有自定义别名 - if(tableName.contains(ALIAS_SPLIT)) { - //填写了表别名 - error("更新时,表不需要有别名"); - return null; - } - // 遍历过滤条件 - JSONObject propertis = request.getJSONObject(tableName); - for(String condition : propertis.keySet() ) { - //关键字则跳过 - if(condition.matches("@\\w+")) { - //要更新的字段 - String columnName = condition.replaceAll("@", ""); - if(propertis.get(condition) instanceof Integer || - propertis.get(condition) instanceof Float || - propertis.get(condition) instanceof Double || - propertis.get(condition) instanceof BigDecimal) { - validateColumn(tableName,columnName); - list.add(tableName + "." + columnName + "=" + propertis.get(condition).toString() ); - }else if(propertis.get(condition) instanceof String) { - validateColumn(tableName, columnName); - list.add(tableName + "." + columnName + "=" + "'" + ((String) propertis.get(condition)).replaceAll("'", "''") + "'"); - } - } - } - - } - } - return list; - } + + /** + * 更新字段 + * "@description": "20190101,元旦快乐" + * 有@标记的才会更新,否则会被认为是WHERE的条件 + */ + @Override + public List getSets() { + List list = Lists.newArrayList(); + if (getStatementType() == StatementType.UPDATE) { + Set tableNames = request.keySet(); + if (tableNames.size() != 1) { + error("更新时,表只能有一个"); + return null; + } + for (String tableName : tableNames) { + //是否有自定义别名 + if (tableName.contains(ALIAS_SPLIT)) { + //填写了表别名 + error("更新时,表不需要有别名"); + return null; + } + // 遍历过滤条件 + JSONObject propertis = request.getJSONObject(tableName); + for (String condition : propertis.keySet()) { + //关键字则跳过 + if (condition.matches("@\\w+")) { + //要更新的字段 + String columnName = condition.replaceAll("@", ""); + if (propertis.get(condition) instanceof Integer || + propertis.get(condition) instanceof Float || + propertis.get(condition) instanceof Double || + propertis.get(condition) instanceof BigDecimal) { + validateColumn(tableName, columnName); + list.add(tableName + "." + columnName + "=" + propertis.get(condition).toString()); + } else if (propertis.get(condition) instanceof String) { + validateColumn(tableName, columnName); + list.add(tableName + "." + columnName + "=" + "'" + ((String) propertis.get(condition)).replaceAll("'", "''") + "'"); + } + } + } + + } + } + return list; + } /* * ================================== @@ -795,81 +806,61 @@ public List getSets() { * 如果想要新增或者修改的更复杂的逻辑, * 请在外层处理完成之后以制定格式提交该SQL的黑白名单即可 * - */ - /** - * 表的黑白名单检查 - * @param tableName - */ - private void validateTable(String tableName) { - String tableUCN = tableName.toUpperCase(); - if(tableBlackList != null && !tableBlackList.isEmpty()) { - for(String tn : tableBlackList) { - if(tableUCN.equals(tn.toUpperCase())) { - error("请求的表:" + tableName + "在黑名单中"); - return; - } - } - } - - if(tableWhiteList != null && !tableWhiteList.isEmpty()) { - for(String tn : tableWhiteList) { - if(tableUCN.equals(tn.toUpperCase())) { - return; - } - } - error("请求的表:" + tableName + "不在白名单中"); - } - } - /** - * 字段黑白名单检查 - * 要求: "表.列" - * @param columnName */ - private void validateColumn(String tableName, String columnName) { - String tableUCN = tableName.toUpperCase(); - String columnUCN = columnName.toUpperCase(); - String tcUCN = tableUCN + "." + columnUCN; - if(columnBlackList != null && !columnBlackList.isEmpty()) { - for(String tc : columnBlackList) { - if(tcUCN.equals(tc.toUpperCase())) { - error("请求的字段:" + tcUCN + "在黑名单中"); - return; - } - } - } - - if(columnWhiteList != null && !columnWhiteList.isEmpty()) { - for(String tc : columnWhiteList) { - if(tc.endsWith(".*") || tcUCN.equals(tc.toUpperCase())) { - return; - } - } - error("请求的字段:" + tcUCN + "不在白名单中"); - } - } - - public List getTableWhiteList() { - return tableWhiteList; - } - public void setTableWhiteList(List tableWhiteList) { - this.tableWhiteList = tableWhiteList; - } - public List getTableBlackList() { - return tableBlackList; - } - public void setTableBlackList(List tableBlackList) { - this.tableBlackList = tableBlackList; - } - public List getColumnWhiteList() { - return columnWhiteList; - } - public void setColumnWhiteList(List columnWhiteList) { - this.columnWhiteList = columnWhiteList; - } - public List getColumnBlackList() { - return columnBlackList; - } - public void setColumnBlackList(List columnBlackList) { - this.columnBlackList = columnBlackList; - } + + /** + * 表的黑白名单检查 + * + * @param tableName + */ + private void validateTable(String tableName) { + String tableUCN = tableName.toUpperCase(); + if (tableBlackList != null && !tableBlackList.isEmpty()) { + for (String tn : tableBlackList) { + if (tableUCN.equals(tn.toUpperCase())) { + error("请求的表:" + tableName + "在黑名单中"); + return; + } + } + } + + if (tableWhiteList != null && !tableWhiteList.isEmpty()) { + for (String tn : tableWhiteList) { + if (tableUCN.equals(tn.toUpperCase())) { + return; + } + } + error("请求的表:" + tableName + "不在白名单中"); + } + } + + /** + * 字段黑白名单检查 + * 要求: "表.列" + * + * @param columnName + */ + private void validateColumn(String tableName, String columnName) { + String tableUCN = tableName.toUpperCase(); + String columnUCN = columnName.toUpperCase(); + String tcUCN = tableUCN + "." + columnUCN; + if (columnBlackList != null && !columnBlackList.isEmpty()) { + for (String tc : columnBlackList) { + if (tcUCN.equals(tc.toUpperCase())) { + error("请求的字段:" + tcUCN + "在黑名单中"); + return; + } + } + } + + if (columnWhiteList != null && !columnWhiteList.isEmpty()) { + for (String tc : columnWhiteList) { + if (tc.endsWith(".*") || tcUCN.equals(tc.toUpperCase())) { + return; + } + } + error("请求的字段:" + tcUCN + "不在白名单中"); + } + } + } diff --git a/src/main/java/zuo/biao/apijson/parser/AbstractProvider.java b/src/main/java/zuo/biao/apijson/parser/AbstractProvider.java index c6f71f8..faed4e2 100644 --- a/src/main/java/zuo/biao/apijson/parser/AbstractProvider.java +++ b/src/main/java/zuo/biao/apijson/parser/AbstractProvider.java @@ -1,196 +1,48 @@ package zuo.biao.apijson.parser; -import java.util.ArrayList; -import java.util.List; +import com.google.common.collect.Lists; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; +import java.util.List; +/** + * @author zhangls + */ +@Data public abstract class AbstractProvider implements SQLProvider { - private StatementType statementType; - private List sets = new ArrayList(); - private List select = new ArrayList(); - private List tables = new ArrayList(); - private List join = new ArrayList(); - private List innerJoin = new ArrayList(); - private List outerJoin = new ArrayList(); - private List leftOuterJoin = new ArrayList(); - private List rightOuterJoin = new ArrayList(); - private List where = new ArrayList(); - private List having = new ArrayList(); - private List groupBy = new ArrayList(); - private List orderBy = new ArrayList(); - private List lastList = new ArrayList(); - private List columns = new ArrayList(); - private List values = new ArrayList(); - private boolean distinct; - - private Message message = new Message(); - - public Message getMessage() { - return message; - }; - /** - * 接收错误消息 - * @param err - */ - public void error(String err) { - StackTraceElement ste = new Throwable().getStackTrace()[1]; - //this.message.error(ste.getFileName() + ": Line " + ste.getLineNumber() + " Error message:" +err, ste); - this.message.error(err, ste); - } - - @Override - public StatementType getStatementType() { - // TODO Auto-generated method stub - return statementType; - } - public void setStatementType(StatementType statementType) { - // TODO Auto-generated method stub - this.statementType = statementType; - } - - @Override - public List getSets() { - // TODO Auto-generated method stub - return sets; - } - - @Override - public List getSelect() { - // TODO Auto-generated method stub - return select; - } - - @Override - public List getTables() { - // TODO Auto-generated method stub - return tables; - } - - @Override - public List getJoin() { - // TODO Auto-generated method stub - return join; - } - - @Override - public List getInnerJoin() { - // TODO Auto-generated method stub - return innerJoin; - } - - @Override - public List getOuterJoin() { - // TODO Auto-generated method stub - return outerJoin; - } - - @Override - public List getLeftOuterJoin() { - // TODO Auto-generated method stub - return leftOuterJoin; - } - - @Override - public List getRightOuterJoin() { - // TODO Auto-generated method stub - return rightOuterJoin; - } - - @Override - public List getWhere() { - // TODO Auto-generated method stub - return where; - } - - @Override - public List getHaving() { - // TODO Auto-generated method stub - return having; - } - - @Override - public List getGroupBy() { - // TODO Auto-generated method stub - return groupBy; - } - - @Override - public List getOrderBy() { - // TODO Auto-generated method stub - return orderBy; - } - - @Override - public List getLastList() { - // TODO Auto-generated method stub - return lastList; - } - - @Override - public List getColumns() { - // TODO Auto-generated method stub - return columns; - } - @Override - public List getValues() { - // TODO Auto-generated method stub - return values; - } + private StatementType statementType; + private List sets = Lists.newArrayList(); + private List select = Lists.newArrayList(); + private List tables = Lists.newArrayList(); + private List join = Lists.newArrayList(); + private List innerJoin = Lists.newArrayList(); + private List outerJoin = Lists.newArrayList(); + private List leftOuterJoin = Lists.newArrayList(); + private List rightOuterJoin = Lists.newArrayList(); + private List where = Lists.newArrayList(); + private List having = Lists.newArrayList(); + private List groupBy = Lists.newArrayList(); + private List orderBy = Lists.newArrayList(); + private List lastList = Lists.newArrayList(); + private List columns = Lists.newArrayList(); + private List values = Lists.newArrayList(); + private boolean distinct; + + private Message message = new Message(); + + /** + * 接收错误消息 + * + * @param err + */ + public void error(String err) { + StackTraceElement ste = new Throwable().getStackTrace()[1]; + + this.message.error(err, ste); + } - @Override - public boolean isDistinct() { - // TODO Auto-generated method stub - return distinct; - } - public void setSets(List sets) { - this.sets = sets; - } - public void setSelect(List select) { - this.select = select; - } - public void setTables(List tables) { - this.tables = tables; - } - public void setJoin(List join) { - this.join = join; - } - public void setInnerJoin(List innerJoin) { - this.innerJoin = innerJoin; - } - public void setOuterJoin(List outerJoin) { - this.outerJoin = outerJoin; - } - public void setLeftOuterJoin(List leftOuterJoin) { - this.leftOuterJoin = leftOuterJoin; - } - public void setRightOuterJoin(List rightOuterJoin) { - this.rightOuterJoin = rightOuterJoin; - } - public void setWhere(List where) { - this.where = where; - } - public void setHaving(List having) { - this.having = having; - } - public void setGroupBy(List groupBy) { - this.groupBy = groupBy; - } - public void setOrderBy(List orderBy) { - this.orderBy = orderBy; - } - public void setLastList(List lastList) { - this.lastList = lastList; - } - public void setColumns(List columns) { - this.columns = columns; - } - public void setValues(List values) { - this.values = values; - } - public void setDistinct(boolean distinct) { - this.distinct = distinct; - } - } diff --git a/src/main/java/zuo/biao/apijson/parser/App.java b/src/main/java/zuo/biao/apijson/parser/App.java index 06c74db..6de7e73 100644 --- a/src/main/java/zuo/biao/apijson/parser/App.java +++ b/src/main/java/zuo/biao/apijson/parser/App.java @@ -13,13 +13,7 @@ public class App public static void main( String[] args ) throws SQLProviderException { long st = System.currentTimeMillis(); - String json = "{\r\n" + - " \"Product:p\":{\r\n" + - " \"@column\":\"name,max(price):max_price\",\r\n" + - " \"name~\": \"双11\",\r\n" + - " \"@group\": \"name\"\r\n" + - " }\r\n" + - "}"; + String json = "{'Product:p':{'name~':'双11','@group':'name','@column':'name,max(price):max_price'}}"; JSONObject req = JSONObject.parseObject(json); long fastJsonet = System.currentTimeMillis(); //JSON解析太耗时了174ms diff --git a/src/main/java/zuo/biao/apijson/parser/BaseProvider.java b/src/main/java/zuo/biao/apijson/parser/BaseProvider.java index 00311cb..a42b434 100644 --- a/src/main/java/zuo/biao/apijson/parser/BaseProvider.java +++ b/src/main/java/zuo/biao/apijson/parser/BaseProvider.java @@ -1,5 +1,8 @@ package zuo.biao.apijson.parser; +/** + * @author zhangls + */ public class BaseProvider extends AbstractProvider { } diff --git a/src/main/java/zuo/biao/apijson/parser/InterpreterProvider.java b/src/main/java/zuo/biao/apijson/parser/InterpreterProvider.java index 69d2a8d..78a3510 100644 --- a/src/main/java/zuo/biao/apijson/parser/InterpreterProvider.java +++ b/src/main/java/zuo/biao/apijson/parser/InterpreterProvider.java @@ -1,185 +1,169 @@ package zuo.biao.apijson.parser; +import lombok.Getter; + import java.util.List; /** - * 该类延伸出来转换方法,让继承的子类实现 - * toXXX方法时转换逻辑,需要继承实现 - * @author Zerounary + * 该类延伸出来转换方法,让继承的子类实现 + * toXXX方法时转换逻辑,需要继承实现 * + * @author Zerounary */ -public abstract class InterpreterProvider extends AbstractProvider{ - - private T statementTypeHandle; - private T setsHandle; - private T selectHandle; - private T tableHandle; - private T joinHandle; - private T innerJoinHandle; - private T valuesHandle; - private T outerJoinHandle; - private T leftOuterJoinHandle; - private T rightOuterJoinHandle; - private T whereHandle; - private T havingHandle; - private T groupByHandle; - private T orderByHandle; - private T columnsHandle; - private T lastListHandle; - private T distinctHandle; - - public T getStatementTypeHandle() { - return statementTypeHandle; - } - public void setStatementTypeHandle(T statementTypeHandle) { - setStatementType(toSatementType(statementTypeHandle)); - this.statementTypeHandle = statementTypeHandle; - } - public abstract StatementType toSatementType(T charger) ; - - public T getSetsHandle() { - return setsHandle; - } - public void setSetsHandle(T setsHandle) { - setSets(toSets(setsHandle)); - this.setsHandle = setsHandle; - } - public abstract List toSets(T charger) ; - - public T getSelectHandle() { - return selectHandle; - } - public void setSelectHandle(T selectHandle) { - setSelect(toSelect(selectHandle)); - this.selectHandle = selectHandle; - } - public abstract List toSelect(T charger) ; - - public T getTableHandle() { - return tableHandle; - } - public void setTableHandle(T charger) { - setTables(toTables(charger)); - this.tableHandle = charger; - } - public abstract List toTables(T charger) ; - - public T getJoinHandle() { - return joinHandle; - } - public void setJoinHandle(T charger) { - setJoin(toJoin(charger)); - this.joinHandle = charger; - } - public abstract List toJoin(T charger) ; - - public T getInnerJoinHandle() { - return innerJoinHandle; - } - public void setInnerJoinHandle(T charger) { - setInnerJoin(toInnerJoin(charger)); - this.innerJoinHandle = charger; - } - public abstract List toInnerJoin(T charger) ; - - public T getValuesHandle() { - return valuesHandle; - } - public void setValuesHandle(T charger) { - setValues(toValues(charger)); - this.valuesHandle = charger; - } - public abstract List toValues(T charger) ; - - public T getOuterJoinHandle() { - return outerJoinHandle; - } - public void setOuterJoinHandle(T charger) { - setOuterJoin(toOuterJoin(charger)); - this.outerJoinHandle = charger; - } - public abstract List toOuterJoin(T charger) ; - - public T getLeftOuterJoinHandle() { - return leftOuterJoinHandle; - } - public void setLeftOuterJoinHandle(T charger) { - setLeftOuterJoin(toLeftOuterJoin(charger)); - this.leftOuterJoinHandle = charger; - } - public abstract List toLeftOuterJoin(T charger) ; - - public T getRightOuterJoinHandle() { - return rightOuterJoinHandle; - } - public void setRightOuterJoinHandle(T charger) { - setRightOuterJoin(toRightOuterJoin(charger)); - this.rightOuterJoinHandle = charger; - } - public abstract List toRightOuterJoin(T charger) ; - - public T getWhereHandle() { - return whereHandle; - } - public void setWhereHandle(T charger) { - setWhere(toWhere(charger)); - this.whereHandle = charger; - } - public abstract List toWhere(T charger) ; - - public T getHavingHandle() { - return havingHandle; - } - public void setHavingHandle(T charger) { - setHaving(toHaving(charger)); - this.havingHandle = charger; - } - public abstract List toHaving(T charger) ; - - public T getGroupByHandle() { - return groupByHandle; - } - public void setGroupByHandle(T charger) { - setGroupBy(toGroupBy(charger)); - this.groupByHandle = charger; - } - public abstract List toGroupBy(T charger) ; - - public T getOrderByHandle() { - return orderByHandle; - } - public void setOrderByHandle(T charger) { - - this.orderByHandle = charger; - } - public abstract List toOrderBy(T charger) ; - - public T getColumnsHandle() { - return columnsHandle; - } - public void setColumnsHandle(T charger) { - setColumns(toColumns(charger)); - this.columnsHandle = charger; - } - public abstract List toColumns(T charger) ; - - public T getLastListHandle() { - return lastListHandle; - } - public void setLastListHandle(T charger) { - setLastList(toLastList(charger)); - this.lastListHandle = charger; - } - public abstract List toLastList(T charger) ; - - public T getDistinctHandle() { - return distinctHandle; - } - public void setDistinctHandle(T charger) { - super.setDistinct(toDistinct(charger)); - this.distinctHandle = charger; - } - public abstract boolean toDistinct(T charger) ; - +public abstract class InterpreterProvider extends BaseProvider { + + @Getter + private T statementTypeHandle; + @Getter + private T setsHandle; + @Getter + private T selectHandle; + @Getter + private T tableHandle; + @Getter + private T joinHandle; + @Getter + private T innerJoinHandle; + @Getter + private T valuesHandle; + @Getter + private T outerJoinHandle; + @Getter + private T leftOuterJoinHandle; + @Getter + private T rightOuterJoinHandle; + @Getter + private T whereHandle; + @Getter + private T havingHandle; + @Getter + private T groupByHandle; + @Getter + private T orderByHandle; + @Getter + private T columnsHandle; + @Getter + private T lastListHandle; + @Getter + private T distinctHandle; + + public void setStatementTypeHandle(T statementTypeHandle) { + setStatementType(toSatementType(statementTypeHandle)); + this.statementTypeHandle = statementTypeHandle; + } + + public abstract StatementType toSatementType(T charger); + + public void setSetsHandle(T setsHandle) { + setSets(toSets(setsHandle)); + this.setsHandle = setsHandle; + } + + public abstract List toSets(T charger); + + public void setSelectHandle(T selectHandle) { + setSelect(toSelect(selectHandle)); + this.selectHandle = selectHandle; + } + + public abstract List toSelect(T charger); + + public void setTableHandle(T charger) { + setTables(toTables(charger)); + this.tableHandle = charger; + } + + public abstract List toTables(T charger); + + public void setJoinHandle(T charger) { + setJoin(toJoin(charger)); + this.joinHandle = charger; + } + + public abstract List toJoin(T charger); + + public void setInnerJoinHandle(T charger) { + setInnerJoin(toInnerJoin(charger)); + this.innerJoinHandle = charger; + } + + public abstract List toInnerJoin(T charger); + + public void setValuesHandle(T charger) { + setValues(toValues(charger)); + this.valuesHandle = charger; + } + + public abstract List toValues(T charger); + + public void setOuterJoinHandle(T charger) { + setOuterJoin(toOuterJoin(charger)); + this.outerJoinHandle = charger; + } + + public abstract List toOuterJoin(T charger); + + public void setLeftOuterJoinHandle(T charger) { + setLeftOuterJoin(toLeftOuterJoin(charger)); + this.leftOuterJoinHandle = charger; + } + + public abstract List toLeftOuterJoin(T charger); + + public void setRightOuterJoinHandle(T charger) { + setRightOuterJoin(toRightOuterJoin(charger)); + this.rightOuterJoinHandle = charger; + } + + public abstract List toRightOuterJoin(T charger); + + public void setWhereHandle(T charger) { + setWhere(toWhere(charger)); + this.whereHandle = charger; + } + + public abstract List toWhere(T charger); + + public void setHavingHandle(T charger) { + setHaving(toHaving(charger)); + this.havingHandle = charger; + } + + public abstract List toHaving(T charger); + + public void setGroupByHandle(T charger) { + setGroupBy(toGroupBy(charger)); + this.groupByHandle = charger; + } + + public abstract List toGroupBy(T charger); + + public void setOrderByHandle(T charger) { + + this.orderByHandle = charger; + } + + public abstract List toOrderBy(T charger); + + public void setColumnsHandle(T charger) { + setColumns(toColumns(charger)); + this.columnsHandle = charger; + } + + public abstract List toColumns(T charger); + + public void setLastListHandle(T charger) { + setLastList(toLastList(charger)); + this.lastListHandle = charger; + } + + public abstract List toLastList(T charger); + + public void setDistinctHandle(T charger) { + super.setDistinct(toDistinct(charger)); + this.distinctHandle = charger; + } + + public abstract boolean toDistinct(T charger); } diff --git a/src/main/java/zuo/biao/apijson/parser/Message.java b/src/main/java/zuo/biao/apijson/parser/Message.java index f381152..144f995 100644 --- a/src/main/java/zuo/biao/apijson/parser/Message.java +++ b/src/main/java/zuo/biao/apijson/parser/Message.java @@ -1,56 +1,43 @@ package zuo.biao.apijson.parser; +import com.google.common.collect.Lists; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + import java.util.ArrayList; import java.util.List; + /** * 消息通知类,通过这个类型把Provider的消息传递给SQLBuilder * 比如:当我们自定义操作遇到异常需要抛出异常的时候,往这个类里面塞StackTraceElement异常 - * 之后传到SQLBuilder中getSQL方法,统一抛出异常。 - * @author Zerounary + * 之后传到SQLBuilder中getSQL方法,统一抛出异常。 * + * @author Zerounary */ public class Message { - private List errors = new ArrayList<>(); - - public List getErrors() { - return errors; - } - - public void setErrors(List errors) { - this.errors = errors; - } - - public void error(String errorMsg, StackTraceElement stack) { - errors.add(new ErrorElement(errorMsg, stack)); - } - - public void cleanErrors() { - errors.clear(); - } - - public class ErrorElement { - private String errorMsg; - private StackTraceElement stack; - public ErrorElement() { - - } - public ErrorElement(String errorMsg, StackTraceElement stack) { - this.errorMsg = errorMsg; - this.stack = stack; - } - public String getErrorMsg() { - return errorMsg; - } - public void setErrorMsg(String errorMsg) { - this.errorMsg = errorMsg; - } - public StackTraceElement getStack() { - return stack; - } - public void setStack(StackTraceElement stack) { - this.stack = stack; - } - - } + + @Getter + @Setter + private List errors = Lists.newArrayList(); + + + public void error(String errorMsg, StackTraceElement stack) { + errors.add(new ErrorElement(errorMsg, stack)); + } + + public void cleanErrors() { + errors.clear(); + } + + @Getter + @Setter + @NoArgsConstructor + @AllArgsConstructor + public class ErrorElement { + private String errorMsg; + private StackTraceElement stack; + } } diff --git a/src/main/java/zuo/biao/apijson/parser/SQLExplorer.java b/src/main/java/zuo/biao/apijson/parser/SQLExplorer.java index e2b0a79..9eea0c8 100644 --- a/src/main/java/zuo/biao/apijson/parser/SQLExplorer.java +++ b/src/main/java/zuo/biao/apijson/parser/SQLExplorer.java @@ -1,218 +1,219 @@ package zuo.biao.apijson.parser; +import com.google.common.collect.Lists; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + import java.io.IOException; import java.util.ArrayList; import java.util.List; - +/** + * @author zhangls + */ public class SQLExplorer { - private static final String AND = ") \nAND ("; - private static final String OR = ") \nOR ("; - private SQLStatement sql = new SQLStatement(); - private SQLProvider sqlProvider; - public SQLExplorer(SQLProvider sqlProvider) { - this.sqlProvider = sqlProvider; - } - - public String getSQL() throws SQLProviderException { - feedSQLStatement(); - //异常处理 - if(!sqlProvider.getMessage().getErrors().isEmpty()) { - throw new SQLProviderException(sqlProvider.getMessage().getErrors()); - } - StringBuffer sb = new StringBuffer(); - sql.sql(sb); - return sb.toString(); - } - - /*** - * 将提供器提供的数据刷新到SQLStatement中 - */ - private void feedSQLStatement() { - sql = new SQLStatement(); - if(sqlProvider.getStatementType() == null) - return; - - sql.statementType = sqlProvider.getStatementType(); - sql.sets.addAll(ofNullable(sqlProvider.getSets())); - sql.select.addAll(ofNullable(sqlProvider.getSelect())); - sql.tables.addAll(ofNullable(sqlProvider.getTables())); - sql.join.addAll(ofNullable(sqlProvider.getJoin())); - sql.innerJoin.addAll(ofNullable(sqlProvider.getInnerJoin())); - sql.outerJoin.addAll(ofNullable(sqlProvider.getOuterJoin())); - sql.leftOuterJoin.addAll(ofNullable(sqlProvider.getLeftOuterJoin())); - sql.rightOuterJoin.addAll(ofNullable(sqlProvider.getRightOuterJoin())); - sql.where.addAll(ofNullable(sqlProvider.getWhere())); - sql.having.addAll(ofNullable(sqlProvider.getHaving())); - sql.groupBy.addAll(ofNullable(sqlProvider.getGroupBy())); - sql.orderBy.addAll(ofNullable(sqlProvider.getOrderBy())); - sql.lastList.addAll(ofNullable(sqlProvider.getLastList())); - sql.columns.addAll(ofNullable(sqlProvider.getColumns())); - sql.values.addAll(ofNullable(sqlProvider.getValues())); - } - - public SQLProvider getSqlProvider() { - return sqlProvider; - } - - public void setSqlProvider(SQLProvider sqlProvider) { - this.sqlProvider = sqlProvider; - } - - private List ofNullable(List list){ - if(list == null) - return new ArrayList(); - return list; - } - - private static class SafeAppendable { - private final Appendable a; - private boolean empty = true; - - public SafeAppendable(Appendable a) { - super(); - this.a = a; - } - - public SafeAppendable append(CharSequence s) { - try { - if (empty && s.length() > 0) { - empty = false; - } - a.append(s); - } catch (IOException e) { - throw new RuntimeException(e); - } - return this; - } - - public boolean isEmpty() { - return empty; - } - - } - - private static class SQLStatement { - - private StatementType statementType; - private List sets = new ArrayList(); - private List select = new ArrayList(); - private List tables = new ArrayList(); - private List join = new ArrayList(); - private List innerJoin = new ArrayList(); - private List outerJoin = new ArrayList(); - private List leftOuterJoin = new ArrayList(); - private List rightOuterJoin = new ArrayList(); - private List where = new ArrayList(); - private List having = new ArrayList(); - private List groupBy = new ArrayList(); - private List orderBy = new ArrayList(); - private List lastList = new ArrayList(); - private List columns = new ArrayList(); - private List values = new ArrayList(); - private boolean distinct; - - public SQLStatement() { - // Prevent Synthetic Access - } - - private void sqlClause(SafeAppendable builder, String keyword, List parts, String open, String close, - String conjunction) { - if (!parts.isEmpty()) { - if (!builder.isEmpty()) { - builder.append("\n"); - } - builder.append(keyword); - builder.append(" "); - builder.append(open); - String last = "________"; - for (int i = 0, n = parts.size(); i < n; i++) { - String part = parts.get(i); - if (i > 0 && !part.equals(AND) && !part.equals(OR) && !last.equals(AND) && !last.equals(OR)) { - builder.append(conjunction); - } - builder.append(part); - last = part; - } - builder.append(close); - } - } - - private String selectSQL(SafeAppendable builder) { - if (distinct) { - sqlClause(builder, "SELECT DISTINCT", select, "", "", ", "); - } else { - sqlClause(builder, "SELECT", select, "", "", ", "); - } - - sqlClause(builder, "FROM", tables, "", "", ", "); - joins(builder); - sqlClause(builder, "WHERE", where, "(", ")", " AND "); - sqlClause(builder, "GROUP BY", groupBy, "", "", ", "); - sqlClause(builder, "HAVING", having, "(", ")", " AND "); - sqlClause(builder, "ORDER BY", orderBy, "", "", ", "); - return builder.toString(); - } - - private void joins(SafeAppendable builder) { - sqlClause(builder, "JOIN", join, "", "", "\nJOIN "); - sqlClause(builder, "INNER JOIN", innerJoin, "", "", "\nINNER JOIN "); - sqlClause(builder, "OUTER JOIN", outerJoin, "", "", "\nOUTER JOIN "); - sqlClause(builder, "LEFT OUTER JOIN", leftOuterJoin, "", "", "\nLEFT OUTER JOIN "); - sqlClause(builder, "RIGHT OUTER JOIN", rightOuterJoin, "", "", "\nRIGHT OUTER JOIN "); - } - - private String insertSQL(SafeAppendable builder) { - sqlClause(builder, "INSERT INTO", tables, "", "", ""); - sqlClause(builder, "", columns, "(", ")", ", "); - sqlClause(builder, "VALUES", values, "(", ")", ", "); - return builder.toString(); - } - - private String deleteSQL(SafeAppendable builder) { - sqlClause(builder, "DELETE FROM", tables, "", "", ""); - sqlClause(builder, "WHERE", where, "(", ")", " AND "); - return builder.toString(); - } - - private String updateSQL(SafeAppendable builder) { - sqlClause(builder, "UPDATE", tables, "", "", ""); - joins(builder); - sqlClause(builder, "SET", sets, "", "", ", "); - sqlClause(builder, "WHERE", where, "(", ")", " AND "); - return builder.toString(); - } - - public String sql(Appendable a) { - SafeAppendable builder = new SafeAppendable(a); - if (statementType == null) { - return null; - } - - String answer; - - switch (statementType) { - case DELETE: - answer = deleteSQL(builder); - break; - - case INSERT: - answer = insertSQL(builder); - break; - - case SELECT: - answer = selectSQL(builder); - break; - - case UPDATE: - answer = updateSQL(builder); - break; - - default: - answer = null; - } - - return answer; - } - } + private static final String AND = ") \nAND ("; + private static final String OR = ") \nOR ("; + private SQLStatement sql = new SQLStatement(); + + @Getter + @Setter + private SQLProvider sqlProvider; + + public SQLExplorer(SQLProvider sqlProvider) { + this.sqlProvider = sqlProvider; + } + + public String getSQL() throws SQLProviderException { + feedSQLStatement(); + //异常处理 + if (!sqlProvider.getMessage().getErrors().isEmpty()) { + throw new SQLProviderException(sqlProvider.getMessage().getErrors()); + } + StringBuffer sb = new StringBuffer(); + sql.sql(sb); + return sb.toString(); + } + + /** + * 将提供器提供的数据刷新到SQLStatement中 + */ + private void feedSQLStatement() { + sql = new SQLStatement(); + if (sqlProvider.getStatementType() == null) { + return; + } + + sql.statementType = sqlProvider.getStatementType(); + sql.sets.addAll(ofNullable(sqlProvider.getSets())); + sql.select.addAll(ofNullable(sqlProvider.getSelect())); + sql.tables.addAll(ofNullable(sqlProvider.getTables())); + sql.join.addAll(ofNullable(sqlProvider.getJoin())); + sql.innerJoin.addAll(ofNullable(sqlProvider.getInnerJoin())); + sql.outerJoin.addAll(ofNullable(sqlProvider.getOuterJoin())); + sql.leftOuterJoin.addAll(ofNullable(sqlProvider.getLeftOuterJoin())); + sql.rightOuterJoin.addAll(ofNullable(sqlProvider.getRightOuterJoin())); + sql.where.addAll(ofNullable(sqlProvider.getWhere())); + sql.having.addAll(ofNullable(sqlProvider.getHaving())); + sql.groupBy.addAll(ofNullable(sqlProvider.getGroupBy())); + sql.orderBy.addAll(ofNullable(sqlProvider.getOrderBy())); + sql.lastList.addAll(ofNullable(sqlProvider.getLastList())); + sql.columns.addAll(ofNullable(sqlProvider.getColumns())); + sql.values.addAll(ofNullable(sqlProvider.getValues())); + } + + private List ofNullable(List list) { + if (list == null) { + return Lists.newArrayList(); + } + return list; + } + + private static class SafeAppendable { + private final Appendable a; + private boolean empty = true; + + public SafeAppendable(Appendable a) { + super(); + this.a = a; + } + + public SafeAppendable append(CharSequence s) { + try { + if (empty && s.length() > 0) { + empty = false; + } + a.append(s); + } catch (IOException e) { + throw new RuntimeException(e); + } + return this; + } + + public boolean isEmpty() { + return empty; + } + + } + + @NoArgsConstructor + private static class SQLStatement { + + private StatementType statementType; + private List sets = Lists.newArrayList(); + private List select = Lists.newArrayList(); + private List tables = Lists.newArrayList(); + private List join = Lists.newArrayList(); + private List innerJoin = Lists.newArrayList(); + private List outerJoin = Lists.newArrayList(); + private List leftOuterJoin = Lists.newArrayList(); + private List rightOuterJoin = Lists.newArrayList(); + private List where = Lists.newArrayList(); + private List having = Lists.newArrayList(); + private List groupBy = Lists.newArrayList(); + private List orderBy = Lists.newArrayList(); + private List lastList = Lists.newArrayList(); + private List columns = Lists.newArrayList(); + private List values = Lists.newArrayList(); + private boolean distinct; + + private void sqlClause(SafeAppendable builder, String keyword, List parts, String open, String close, String conjunction) { + if (!parts.isEmpty()) { + if (!builder.isEmpty()) { + builder.append("\n"); + } + builder.append(keyword); + builder.append(" "); + builder.append(open); + String last = "________"; + for (int i = 0, n = parts.size(); i < n; i++) { + String part = parts.get(i); + if (i > 0 && !part.equals(AND) && !part.equals(OR) && !last.equals(AND) && !last.equals(OR)) { + builder.append(conjunction); + } + builder.append(part); + last = part; + } + builder.append(close); + } + } + + private String selectSQL(SafeAppendable builder) { + if (distinct) { + sqlClause(builder, "SELECT DISTINCT", select, "", "", ", "); + } else { + sqlClause(builder, "SELECT", select, "", "", ", "); + } + + sqlClause(builder, "FROM", tables, "", "", ", "); + joins(builder); + sqlClause(builder, "WHERE", where, "(", ")", " AND "); + sqlClause(builder, "GROUP BY", groupBy, "", "", ", "); + sqlClause(builder, "HAVING", having, "(", ")", " AND "); + sqlClause(builder, "ORDER BY", orderBy, "", "", ", "); + return builder.toString(); + } + + private void joins(SafeAppendable builder) { + sqlClause(builder, "JOIN", join, "", "", "\nJOIN "); + sqlClause(builder, "INNER JOIN", innerJoin, "", "", "\nINNER JOIN "); + sqlClause(builder, "OUTER JOIN", outerJoin, "", "", "\nOUTER JOIN "); + sqlClause(builder, "LEFT OUTER JOIN", leftOuterJoin, "", "", "\nLEFT OUTER JOIN "); + sqlClause(builder, "RIGHT OUTER JOIN", rightOuterJoin, "", "", "\nRIGHT OUTER JOIN "); + } + + private String insertSQL(SafeAppendable builder) { + sqlClause(builder, "INSERT INTO", tables, "", "", ""); + sqlClause(builder, "", columns, "(", ")", ", "); + sqlClause(builder, "VALUES", values, "(", ")", ", "); + return builder.toString(); + } + + private String deleteSQL(SafeAppendable builder) { + sqlClause(builder, "DELETE FROM", tables, "", "", ""); + sqlClause(builder, "WHERE", where, "(", ")", " AND "); + return builder.toString(); + } + + private String updateSQL(SafeAppendable builder) { + sqlClause(builder, "UPDATE", tables, "", "", ""); + joins(builder); + sqlClause(builder, "SET", sets, "", "", ", "); + sqlClause(builder, "WHERE", where, "(", ")", " AND "); + return builder.toString(); + } + + public String sql(Appendable a) { + SafeAppendable builder = new SafeAppendable(a); + if (statementType == null) { + return null; + } + + String answer; + + switch (statementType) { + case DELETE: + answer = deleteSQL(builder); + break; + + case INSERT: + answer = insertSQL(builder); + break; + + case SELECT: + answer = selectSQL(builder); + break; + + case UPDATE: + answer = updateSQL(builder); + break; + + default: + answer = null; + } + + return answer; + } + } } diff --git a/src/main/java/zuo/biao/apijson/parser/SQLProvider.java b/src/main/java/zuo/biao/apijson/parser/SQLProvider.java index 7dbfa2a..944a8ec 100644 --- a/src/main/java/zuo/biao/apijson/parser/SQLProvider.java +++ b/src/main/java/zuo/biao/apijson/parser/SQLProvider.java @@ -1,77 +1,106 @@ package zuo.biao.apijson.parser; import java.util.List; + /** * 实现这个接口提供SQLBuilder获取构造SQL语句所需要的数据 - * @author Zerounary * + * @author Zerounary */ public interface SQLProvider { - /** - * 消息类,如果Provider中有异常,通过这个方法可以传递消息 - * @return - */ - public Message getMessage(); - /** - * StatementType表示要生成的是SELECT,INSERT,UPDATE,DLEETE中的哪种 - * @return StatementType - */ - public StatementType getStatementType(); - /** - * StatementType为UPDATE时 - * UPDATE要更新的字段 - * @return List - */ - public List getSets() ; - /** - * StatementType为SELECT时 - * SELECT要查询的字段 - * @return List - */ - public List getSelect() ; - /** - * StatementType所有类型都将使用这个方法 - * SQL所涉及的表 - * @return - */ - public List getTables(); - public List getJoin(); - public List getInnerJoin() ; - public List getOuterJoin() ; - public List getLeftOuterJoin() ; - public List getRightOuterJoin() ; - /** - * SQL过滤条件 - * @return - */ - public List getWhere(); - public List getHaving(); - /** - * StatementType为SELECT时 - * SQL查询时的分组 - * @return - */ - public List getGroupBy() ; - /** - * StatementType为SELECT时 - * SQL查询时的排序 - * @return - */ - public List getOrderBy() ; - public List getLastList() ; - /** - * StatementType为INSERT时 - * SQL新增的字段 - * @return - */ - public List getColumns() ; - /** - * StatementType为INSERT时 - * SQL新增字段所对应的值 - * @return - */ - public List getValues() ; - public boolean isDistinct() ; - - + + /** + * 消息类,如果Provider中有异常,通过这个方法可以传递消息 + * + * @return + */ + public Message getMessage(); + + /** + * StatementType表示要生成的是SELECT,INSERT,UPDATE,DLEETE中的哪种 + * + * @return StatementType + */ + public StatementType getStatementType(); + + /** + * StatementType为UPDATE时 + * UPDATE要更新的字段 + * + * @return List + */ + public List getSets(); + + /** + * StatementType为SELECT时 + * SELECT要查询的字段 + * + * @return List + */ + public List getSelect(); + + /** + * StatementType所有类型都将使用这个方法 + * SQL所涉及的表 + * + * @return + */ + public List getTables(); + + public List getJoin(); + + public List getInnerJoin(); + + public List getOuterJoin(); + + public List getLeftOuterJoin(); + + public List getRightOuterJoin(); + + /** + * SQL过滤条件 + * + * @return + */ + public List getWhere(); + + public List getHaving(); + + /** + * StatementType为SELECT时 + * SQL查询时的分组 + * + * @return + */ + public List getGroupBy(); + + /** + * StatementType为SELECT时 + * SQL查询时的排序 + * + * @return + */ + public List getOrderBy(); + + public List getLastList(); + + /** + * StatementType为INSERT时 + * SQL新增的字段 + * + * @return + */ + public List getColumns(); + + /** + * StatementType为INSERT时 + * SQL新增字段所对应的值 + * + * @return + */ + public List getValues(); + + public boolean isDistinct(); + + } diff --git a/src/main/java/zuo/biao/apijson/parser/SQLProviderException.java b/src/main/java/zuo/biao/apijson/parser/SQLProviderException.java index 12c826e..8fa0f71 100644 --- a/src/main/java/zuo/biao/apijson/parser/SQLProviderException.java +++ b/src/main/java/zuo/biao/apijson/parser/SQLProviderException.java @@ -1,53 +1,49 @@ package zuo.biao.apijson.parser; -import java.util.ArrayList; -import java.util.HashSet; + import java.util.List; import java.util.Set; +import com.google.common.collect.Lists; +import com.google.common.collect.Sets; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; import zuo.biao.apijson.parser.Message.ErrorElement; - +/** + * @author zhangls + */ +@NoArgsConstructor public class SQLProviderException extends Exception { - - private List errors; - private Set errorMsgs = new HashSet<>(); - - public SQLProviderException() { - - } - public SQLProviderException(String message) { - super(message); - } - public SQLProviderException(Throwable cause) { - super(cause); - } - public SQLProviderException(List errors) { - List stackTrace = new ArrayList<>(); - StringBuffer sb = new StringBuffer(); - for(int i = 0; i < errors.size(); i++) { - errorMsgs.add(errors.get(i).getErrorMsg() + Utils.NEW_LINE); - sb.append( i + ".Error message: ----> " + errors.get(i).getErrorMsg() + Utils.NEW_LINE); - stackTrace.add(errors.get(i).getStack()); - } - System.err.print(sb.toString()); - StackTraceElement[] stack = new StackTraceElement[stackTrace.size()]; - super.setStackTrace(stackTrace.toArray(stack)); - this.errors = errors; - } - - public List getErrors() { - return errors; - } - public void setErrors(List errors) { - this.errors = errors; - } - public Set getErrorMsgs() { - return errorMsgs; - } - public void setErrorMsgs(Set errorMsgs) { - this.errorMsgs = errorMsgs; - } - - + + @Getter + @Setter + private List errors; + @Getter + @Setter + private Set errorMsgs = Sets.newHashSet(); + + + public SQLProviderException(String message) { + super(message); + } + + public SQLProviderException(Throwable cause) { + super(cause); + } + + public SQLProviderException(List errors) { + List stackTrace = Lists.newArrayList(); + StringBuffer sb = new StringBuffer(); + for (int i = 0; i < errors.size(); i++) { + errorMsgs.add(errors.get(i).getErrorMsg() + Utils.NEW_LINE); + sb.append(i + ".Error message: ----> " + errors.get(i).getErrorMsg() + Utils.NEW_LINE); + stackTrace.add(errors.get(i).getStack()); + } + System.err.print(sb.toString()); + StackTraceElement[] stack = new StackTraceElement[stackTrace.size()]; + super.setStackTrace(stackTrace.toArray(stack)); + this.errors = errors; + } } diff --git a/src/test/java/zuo/biao/apijson/parser/AppTest.java b/src/test/java/zuo/biao/apijson/parser/AppTest.java deleted file mode 100644 index 6cc93e4..0000000 --- a/src/test/java/zuo/biao/apijson/parser/AppTest.java +++ /dev/null @@ -1,38 +0,0 @@ -package zuo.biao.apijson.parser; - -import junit.framework.Test; -import junit.framework.TestCase; -import junit.framework.TestSuite; - -/** - * Unit test for simple App. - */ -public class AppTest - extends TestCase -{ - /** - * Create the test case - * - * @param testName name of the test case - */ - public AppTest( String testName ) - { - super( testName ); - } - - /** - * @return the suite of tests being tested - */ - public static Test suite() - { - return new TestSuite( AppTest.class ); - } - - /** - * Rigourous Test :-) - */ - public void testApp() - { - assertTrue( true ); - } -} diff --git a/src/test/java/zuo/biao/apijson/parser/TestCase.java b/src/test/java/zuo/biao/apijson/parser/TestCase.java new file mode 100644 index 0000000..110b3a2 --- /dev/null +++ b/src/test/java/zuo/biao/apijson/parser/TestCase.java @@ -0,0 +1,74 @@ +package zuo.biao.apijson.parser; + +import java.util.Arrays; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.Optional; + +/** + * Created by zhangls on 2019/1/7. + */ +public class TestCase { + + public static void main(String[] args) { + /* of */ + //调用工厂方法创建Optional实例 + Optional name = Optional.of("YanWei"); + //传入参数为null,抛出NullPointerException. + //Optional someNull = Optional.of(null); + +/*opNullable*/ + Optional empty = Optional.ofNullable(null); + +/*isPresent*/ + if (name.isPresent()) { + System.out.println(name.get());//输出YanWei + } + +/*get*/ + try { + System.out.println(empty.get()); + } catch (NoSuchElementException ex) { + System.err.println(ex.getMessage()); + } + +/*ifPresent*/ + name.ifPresent((value) -> { + System.out.println("The length of the value is: " + value.length()); + }); + + empty.ifPresent((value) -> { + System.out.println("The length of the value is: " + value.toString()); + }); + +/*orElse*/ + System.out.println(empty.orElse("There is no value present!")); + System.out.println(name.orElse("There is some value!")); + +/*orElseGet*/ + System.out.println(empty.orElseGet(() -> "Default Value")); + System.out.println(name.orElseGet(String::new)); + +/*orElseThrow*/ + try { + empty.orElseThrow(IllegalArgumentException::new); + } catch (Throwable ex) { + System.out.println("error:" + ex.getMessage()); + } + +/*map*/ + Optional upperName = name.map((value) -> value.toUpperCase()); + System.out.println(upperName.orElse("No value found")); + +/*flatMap*/ + upperName = name.flatMap((value) -> Optional.of(value.toUpperCase())); + System.out.println(upperName.get()); + +/*filter*/ + List names = Arrays.asList("YanWei", "YanTian"); + for (String s : names) { + Optional nameLenLessThan7 = Optional.of(s).filter((value) -> value.length() < 7); + System.out.println(nameLenLessThan7.orElse("The name is more than 6 characters")); + } + } +} From 2c43bdaafc61f07aa7b36304587a390bcfae2c10 Mon Sep 17 00:00:00 2001 From: zhanglingsi Date: Mon, 7 Jan 2019 11:26:07 +0800 Subject: [PATCH 2/4] init --- .classpath | 27 --------------------------- .project | 23 ----------------------- 2 files changed, 50 deletions(-) delete mode 100644 .classpath delete mode 100644 .project diff --git a/.classpath b/.classpath deleted file mode 100644 index d390ea1..0000000 --- a/.classpath +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/.project b/.project deleted file mode 100644 index 322cc59..0000000 --- a/.project +++ /dev/null @@ -1,23 +0,0 @@ - - - APIJSONParser - - - - - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.m2e.core.maven2Builder - - - - - - org.eclipse.jdt.core.javanature - org.eclipse.m2e.core.maven2Nature - - From f6f6574b583f5494af4548f1776ca16e6a959946 Mon Sep 17 00:00:00 2001 From: zhanglingsi Date: Mon, 7 Jan 2019 11:27:16 +0800 Subject: [PATCH 3/4] delete --- target/classes/META-INF/MANIFEST.MF | 5 --- .../APIJSONParser/pom.properties | 7 ---- .../maven/APIJSONParser/APIJSONParser/pom.xml | 30 ------------------ .../biao/apijson/parser/APIJSONProvider.class | Bin 21195 -> 0 bytes .../apijson/parser/AbstractProvider.class | Bin 5498 -> 0 bytes .../classes/zuo/biao/apijson/parser/App.class | Bin 2083 -> 0 bytes .../biao/apijson/parser/BaseProvider.class | Bin 333 -> 0 bytes .../apijson/parser/InterpreterProvider.class | Bin 6953 -> 0 bytes .../apijson/parser/Message$ErrorElement.class | Bin 1256 -> 0 bytes .../zuo/biao/apijson/parser/Message.class | Bin 1466 -> 0 bytes .../parser/SQLExplorer$SQLStatement.class | Bin 6352 -> 0 bytes .../parser/SQLExplorer$SafeAppendable.class | Bin 1203 -> 0 bytes .../zuo/biao/apijson/parser/SQLExplorer.class | Bin 3771 -> 0 bytes .../zuo/biao/apijson/parser/SQLProvider.class | Bin 799 -> 0 bytes .../apijson/parser/SQLProviderException.class | Bin 3337 -> 0 bytes .../biao/apijson/parser/StatementType.class | Bin 1167 -> 0 bytes .../zuo/biao/apijson/parser/Utils.class | Bin 511 -> 0 bytes .../zuo/biao/apijson/parser/AppTest.class | Bin 633 -> 0 bytes 18 files changed, 42 deletions(-) delete mode 100644 target/classes/META-INF/MANIFEST.MF delete mode 100644 target/classes/META-INF/maven/APIJSONParser/APIJSONParser/pom.properties delete mode 100644 target/classes/META-INF/maven/APIJSONParser/APIJSONParser/pom.xml delete mode 100644 target/classes/zuo/biao/apijson/parser/APIJSONProvider.class delete mode 100644 target/classes/zuo/biao/apijson/parser/AbstractProvider.class delete mode 100644 target/classes/zuo/biao/apijson/parser/App.class delete mode 100644 target/classes/zuo/biao/apijson/parser/BaseProvider.class delete mode 100644 target/classes/zuo/biao/apijson/parser/InterpreterProvider.class delete mode 100644 target/classes/zuo/biao/apijson/parser/Message$ErrorElement.class delete mode 100644 target/classes/zuo/biao/apijson/parser/Message.class delete mode 100644 target/classes/zuo/biao/apijson/parser/SQLExplorer$SQLStatement.class delete mode 100644 target/classes/zuo/biao/apijson/parser/SQLExplorer$SafeAppendable.class delete mode 100644 target/classes/zuo/biao/apijson/parser/SQLExplorer.class delete mode 100644 target/classes/zuo/biao/apijson/parser/SQLProvider.class delete mode 100644 target/classes/zuo/biao/apijson/parser/SQLProviderException.class delete mode 100644 target/classes/zuo/biao/apijson/parser/StatementType.class delete mode 100644 target/classes/zuo/biao/apijson/parser/Utils.class delete mode 100644 target/test-classes/zuo/biao/apijson/parser/AppTest.class diff --git a/target/classes/META-INF/MANIFEST.MF b/target/classes/META-INF/MANIFEST.MF deleted file mode 100644 index 77c881a..0000000 --- a/target/classes/META-INF/MANIFEST.MF +++ /dev/null @@ -1,5 +0,0 @@ -Manifest-Version: 1.0 -Built-By: Zerounary -Build-Jdk: 1.8.0_144 -Created-By: Maven Integration for Eclipse - diff --git a/target/classes/META-INF/maven/APIJSONParser/APIJSONParser/pom.properties b/target/classes/META-INF/maven/APIJSONParser/APIJSONParser/pom.properties deleted file mode 100644 index b28d1ab..0000000 --- a/target/classes/META-INF/maven/APIJSONParser/APIJSONParser/pom.properties +++ /dev/null @@ -1,7 +0,0 @@ -#Generated by Maven Integration for Eclipse -#Tue Dec 25 10:09:51 CST 2018 -version=0.0.1-SNAPSHOT -groupId=APIJSONParser -m2e.projectName=APIJSONParser -m2e.projectLocation=D\:\\Programing software\\eclipse_workspaces\\works\\APIJSONParser -artifactId=APIJSONParser diff --git a/target/classes/META-INF/maven/APIJSONParser/APIJSONParser/pom.xml b/target/classes/META-INF/maven/APIJSONParser/APIJSONParser/pom.xml deleted file mode 100644 index e6ffde5..0000000 --- a/target/classes/META-INF/maven/APIJSONParser/APIJSONParser/pom.xml +++ /dev/null @@ -1,30 +0,0 @@ - - 4.0.0 - - APIJSONParser - APIJSONParser - 0.0.1-SNAPSHOT - jar - - APIJSONParser - http://maven.apache.org - - - UTF-8 - - - - - junit - junit - 3.8.1 - test - - - com.alibaba - fastjson - 1.2.21 - - - diff --git a/target/classes/zuo/biao/apijson/parser/APIJSONProvider.class b/target/classes/zuo/biao/apijson/parser/APIJSONProvider.class deleted file mode 100644 index 63452963f6b250840ae48242a48c74604dcf9828..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21195 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�c6!z8Jxfj?XFf z|42GS9N}bA1j!4W^q+synsCYFjR1LOe@c0KF;d>ZVeJmu`(g6N+gH(^pu91@1vNiG z4*12mO@ljT`UN#yCR*w;8|U$b8Tx6ysP{Wo-l1PsTPbLg*Va5C zDA)A9Q5)0 zo(!Ds7dlrvT2upAmA9n~WSv~DpTa>{dSG zIVPJFi;JKP!R&xocmiTE&JYVe#}Erv0%Gx3T`caUJ<^KNLbV-Xm#a9iF{~KThan&v ze~CR|V&nlp*f|OjBxKUhkq`xLO@Bn4#WnaxV1ih%RlJr#k%ROMv}j;l95b}$U!Y~vBnCgyUkAHbI?9F$f7n#_9Tm`7j-iArhcX*8e&SO$)*!{WUAF45B z(qdCzsxu*?kMs)D0D8$ZNP=g8wjMfourd-TI6|fu`5!PI6r86g@h8%ZSd5cOEhQrO z1!NT$JvF;P+)mf_!4}GD9`-ZewXc&MOhUq0C+&Ux0#~>wB;`xBwE?aQY z*#BNZZz;QJmU!p`Ow-c(07+p3SezUK`e+5q^jm5tiYnk((q= zaPgfUCL-|DOMG#nP!4{rqR=!!uAMlwLIr*8m_I}OR{yMq56dr%#v+fvELp{8LA`<> z0mXBgJ(rskKh9ivFFjA8uNu3&%)Xz^&YEmSr zmx0vFTOn2ZBrBBE4mzn{oRrj*NK&tiO6r#1677&@LQbyujaU~9HMt>^9GxfxxdwoGU@?~7@LVg=nU0G@H^Mcc@w zGDgA1liDF8o7e231-(}3aSzX(!4BD$k6T?$3N^JaT!+b#I1QD)inBn6CoS^=8)Sk`Pz(Dt zqS8rv9@_@!AzK?iKaAaoIjw6?p7tr09v#Rzn=8%gGOE%bomOaD06elYTR@cu_A9IMqN18{hX7pRGN#_P#gMY$kCw z5XU)g@)MFW}AQ``lEJf1^$w+F@ zc9MGuqx1_qVT63)EgY4XaY$an@puyl<2N`GZ=u&+ zXgmug73D!uC__i_SD|Axzzaqx{AJIoI_^^c?+7XYC#rTD*LXTtl{*gt?Npo2pxTvq zd-+2;fjJD{qvvAVjxwdrP50=OJD+;zwN{LNBSzQe$gbmEg)Brcn==q*%lAck2?J5+ zENKGe9p{)l&P{>ioFH9v-UG1;Hmi=#c^Y$vm2g_OVn1~`3eEhj@{p>XJ;n-j4rQ(o zdu)=eG+*J`6fg)z4$aY!eY@oUkwT=% zZdv4FpokqQvR4+l5-3uP6zP>kt_F(CMvC;wBG&^&F3`mQPnx?8Pw;x@jlj;Y(5q!1 zx$OAJAo8*|wJ~q1bR3v_(@l8Or;gG>Z{p|v74+ctUX8&p`P+gu-tV zUP_&yydF*Ilqp|;@?{8x-%-4jdO>+3nzC7@d+lnwPRvP_9N(x@F3bp!^g<;dehTr9n{Mj;3svDL;d9 zD}=&tlwL}spu7`J*(pQx-1r}`&`y{D diff --git a/target/classes/zuo/biao/apijson/parser/App.class b/target/classes/zuo/biao/apijson/parser/App.class deleted file mode 100644 index 64ddeda1287dd6bc44f8b65eecbb392057b30f6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2083 zcma)7TW=dh6#gc0vi4?8Tc=5zq$P>lwCgnKCM}_0myioC)OB;g!4L{9V`u7aSnn?D zb(Mn33qtBcCHeqD;sJpwQJ#?KgHsWSAHe@;>90VX@rB4q+z>0XGjryAbFSa~_0J!F z0yqy#K^w!s=ViypncOkBYp$0Z+il`ek@p!oFPgUL zPcyXZu`EMi-dPhW+7Z&wflh`4Y10-9Kw@u0To@o~n@_IG7kr%FSI(A7xgkh`|TxL1FOTT zTh;BEyknJ%b~GNfc~OiN`G)R#W?sbNG`&%sM#pLp)${Vym(lo8^yxSECnuXkGX>8n z6Z}vWDq2&z8&>bCIEI%M9A_BJJ4J(AW{&5$ag&$)YCcn$#f4htGz?;hp{ttVMlz@L zJ;Iva2PvT-%5b_>q-U2d%Uc`KRxyl|vNlE-PU`z&$Fd=uMofXuFw*LZjL#`YGB0;r zp{Lx2XAg_9~LB1bIuI?No4y;mFSR zoGY6aHCqtx5Q4176!FXRM-QL<_~7qve|`3SC9Wcgl#IrloTW8f#R8emU02v^49E1; zZrkgqi6E93+KMHq`L5K=FpTeI=PvIX2vYMs4OtnkpzqW;C5R6g`WqEo<-#VDgZPjk z{Pe-S=fC}2_kuWzdj;Z!?mZ}qY%Ed2Sc*=`ew1XmGf>2G?Vk9IVR+x>AiirvQV?u= z$v;PgTj%aZ!!g8KR&K+yIup{>O0JeC>b90zR7s5rCXF_EwVH9tUS3=>CBX;jxi~A` zqK+b~=z#&+Xh!b=jS8&{`ZD@A z!mw4+kkUs_&^;6BTNrQgIty@EI7=`LDVFi+zalBac&GBV zqtoOJ=s!RXDfG02aTF2s(`*1yqVQ3SU<#)&L)@2yjw^`4q}_WsgI|cEWPm=Rppfgh zMl%_dhxi!RDKrXx!VP>vaS!7MaO6l9!FR}$w1aMVfHj&CXX9%K+$5AKcqrf&WDDfz Op6i6quuiCL`1D_;`YUY! diff --git a/target/classes/zuo/biao/apijson/parser/BaseProvider.class b/target/classes/zuo/biao/apijson/parser/BaseProvider.class deleted file mode 100644 index 62aaeece9acfe26d1110f6b79223b9004c2355e3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 333 zcmZ`!%Syvg5IvJ7jmFki|DYgJU3eER6+s18K?F7sw-N^s!^_)+4d zSm>skGjqfJ``o-2)=#)tSi))UN?uIaOUwVo zxPFsBIM4T8-t~Ax$X;FJOZz14#*^LR)tpz15!8|X4vo}0QB0MY4F{6TPaJ%x5Ft}+ V%g})%#oi`QH1?Gdjuj&e{s5KJP?`V$ diff --git a/target/classes/zuo/biao/apijson/parser/InterpreterProvider.class b/target/classes/zuo/biao/apijson/parser/InterpreterProvider.class deleted file mode 100644 index bef21b416df11974bb0101374fc01ff4e9781cf3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6953 zcmbuD_kR>c7{=cXAtA|-qY3tgB?%=8ib`TcL5hYViBV(SBf?MZw-13Mg1m zu~$%0VNq1<4eVY27(YJmZMmJvGaxcJs2dW7tEsfzMU8HEi}7b~ROM)G%6wb9*w5t@k=XX^kdl z9NjSnjkMFbZpc`wr~6WdMw8kH^kKa@rKgk4D|-fvUZ+K)nhrCW)}5@40%JNm;i=6S zP9~@$GDZpo1GCQ2ds3lb?SN&bgHXaurw#jph(`?TsjLx7C9Euvq6H?WjBA~hs&|TQ zCi_Ra>#plJ?67IkuMeB)WYGBdq-|w~&RZASmW^(U*u7RNJD3i0sZZ${r`^niVD)`4 z%ygc#s?|)JP8&L+QA=a!C_#tO;Tk2{&9t#1JJ@5`o!lqfy;iTD>e6kK zZQohx^qU!tX0?wtcm+lqV=z_L!XWy3bN-J|E5@^p)slwOQD{a?X=p4oC&o53qGkW<1MHQ&O*rwW=w zb2XZvCZ|zTLrfjcb!INtm=!b{&%GHg5$>fk1l4dajpszd2&Xt-Pz$x9JHU>BMkf?x z&aKO=W2TyUPUhg+1f4?*G^+MBv8es3`Es0mqnEs_&>9((4#&nq$<2dAF7y0)=G+$v zs^#1hxpwj~&VGrYrJVgZ&YnZ;yg<-}oLEg*0YeMn+ywR3AM36VRL8pYC>9B^!bO5s z`?9%6hMk>)E)HZpFW7tgbvtR;UZ3Z84%WX+kO=xbA7P~{1YPO(IS1HvwV-Q)&SW1J zD>7atZ&<9_D`-5cPD0j7n02ldlw|2T#|oqDHw6u_K6cA|HS{SO>5A-u+`^!s`k=p~ zF_sw;wASw!FT~D_ASdV;&+BEc?3=88ouEXJy%J`n^@48jvk#-}ze&)|LH1$5+cnxp zZqVG&ZGt9nL%b~%D8iz53c8CMOE{KPf@Ajxx|bW|g)0R$nuac0U10y`Rv!>Fkz1XH zYK6+M^h1I+a55Eff zjehqU&X=!j=+2*--4N@rvUabr*yM}Fp#|;;vw6eUXhCb|{K#JK-|E^%J3KOAb3je|n6vB66=He|`hRw~)p_#_*fm1JX2k!-AX$;N7w zY^)>6#_X4DOjyarB$RAS8_C8fN9@z^9alYk9)TV?7ymW~OE8}0(%H;7Pi345##vyTJqn{Y$qO^qU>PtY?rjZ z=fq?@zXaoAmzFW(LY47!FwO(x8KW?I3%4+1tD za+R?SjOT!H!6=MfxwTlBvCC(~wNqleq$uO1D&wM7+06Uh)cM{xTYv$N@eVd$(Sy|Xt`uF zV@hSb42<1iyu1uXyaXi1Y*EHxmGSDBjMtZ7T<6k_%s8wv_JFY$jD2M=;yEHQ-cpqD zR+X_oCgbfT81HcDZf3kyWn2Ts6c`7~V8km(V!W>?&j}>7tC=RmMAF zGCo^^@i~`XWXA0(sCyJFwED;toKJ?$xn@aE`7v&d-HtWQ{y=d-SZf_7b1*_kTEfWkz>JA zBVfeu1k%ubQk3yimGPCBjGvca{KBQLnekJV@pUln0OQUw81Z9;#CV`6<3W{iS4_t5 pOECVhmwsW!gDT^@VB8JHJ!LTB_mYtD56u2Qu_`L)FaHtw_kUwyCRG3c diff --git a/target/classes/zuo/biao/apijson/parser/Message$ErrorElement.class b/target/classes/zuo/biao/apijson/parser/Message$ErrorElement.class deleted file mode 100644 index 41de4f57fb4621f19ec1381e78529fa7d22aa664..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1256 zcmaiy&2G~`6ot>^zlmu>nwC%~NlQu{)5ev`0twVjRV1Vo7OAqVG%=&#klK~)u;8gc zB0^%p1MpCYdnZ;BhoWpeo|!Y}esk{p{`2z}fKym`qy&z>jD5TBO5c{Z?lAN{`&I^_ z3hYZ2hH{{q7eU|$7bA6}yeN;1KzS%XOM4`}f&IQeR8AyNP%OF(2LhGOe7hS3t~Yok zkPRd0d=l7AY|_$IARQH(lP(v1bi?L}z+Pts7K>lIo*SJBG|iRjR!<;v?tf5g5ZExV zhGG$E+&54{MIddmV58%D>fQLJuYxPtA1S_!@5oV41}@Lz#SB9Vv{w~PBuBj6)tHHR zbasiA<-l4!zRp7fS>*Wdk%2r40;Pe9blY@Cs%9(U68EGOE{e9ye>I#*fvmdI=GB*c zmT5>#ma({z^jp@lb+PM@14q4aIcXz)Zf$-&G=1xNDmWj>FjQe4ra*nggP=2uFBN-~ zN1EPw8Yzy4{!$zcP%d-#X`UlR2?l-d(d;Gdr)Vr%&nH;7exUqKpV{O!y|Yi}nyAv8 z&+zINwrOOS2eHdFDKoTIow-;?6V$BZ33ldw6|FfSzh_v-AvR%Z--afx#=hjD$(gFE z+0#_zF?QoxHjT`YwZ5bFm3~rWG`$vJEr4ccpifYb51)~mjdKiIo1;yydQ64e+F^UD znjz&h5*Kdhh&j4Nkey|alRH87@$@c`g^Z>kr&R96e?YjKg7BL9>Ial1_k__7(SrC3 D-?je+ diff --git a/target/classes/zuo/biao/apijson/parser/Message.class b/target/classes/zuo/biao/apijson/parser/Message.class deleted file mode 100644 index 85772d8024c73df5098b584360dc92ceb01461db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1466 zcmbVMYflqF6g{(TDcvsRSp)?sirSZ~;xj2B3cn(@l=05&(n9@!_@O(UJ9o}G_uRYt>-UeJ03P948V19{=Za^0sq8pmwRpdZSz31LWUtBr7r_ItLwu~=(u*>3Bnpfrs1?b9(JT) zcrkFiTEB#FX;T4jy5dlHVQr1zhE^TV3D+1B#nKK#a>L&jCK4F2kb#-TD8po5!%Hdo zu@Yh;hmi~zCM={d#4uWSJn^P;*c5V`H(e4pQTJQi-Qm(v`#6{kKR8s^;$=crp=}Xr zxs*RqEDe-O3G06a|D*m)&}W$}4w5KKHU^_tW>F~97u`5MI&&nYd(E&C)968HgwpZa zwMb4J;jNF`lDEWJ_ewiyEHYHD(sC08+*X}kVrUdEZNdfqe^HdhT@=%}$B^p}jhYt= zC6sB%`2Ida{(Py?%-2fq8HTkLTR~e5Pyelm&0t6cA(_B1f8lV@7lv%h72JzvM=5$} zVFf1LS8>T;HvEokiC2yqQ!9QKmlYvxUwfXA8!it5L4#*$l-P1C(!eL^{bn%K)YF=# zoq=K6(ZIr_XO<%Cl*MQrD|ca)Pm$Z}V(dG{zv}Esdge5ag(OBW3JX&dv!Xl5W14mh z*Dyoa5yPy;wJEA_Q{`_M|3ZHZC@>|2$j*VJdLY+vqX#mlLEh2cP`ApJSW-fxm^wN| zrQ|izbd(h%DVC_@dAb`(RgqyW=_VFvRi*Dzp0X&fB%Y$MSFTjMxOIX%26p@PM`SZZ zG^@!9(WM?)9u-t|S$W*YGD%^ud;UJxq=2bNPVj(X5P6QeF@MewGe$P(+pKJRj3>0J Keii8V6zmU>r%n<8 diff --git a/target/classes/zuo/biao/apijson/parser/SQLExplorer$SQLStatement.class b/target/classes/zuo/biao/apijson/parser/SQLExplorer$SQLStatement.class deleted file mode 100644 index 7b035da62785066647c908c65e67c8a58cc92314..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6352 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 diff --git a/target/classes/zuo/biao/apijson/parser/SQLExplorer.class b/target/classes/zuo/biao/apijson/parser/SQLExplorer.class deleted file mode 100644 index f8b489dad0885ef3e970bba848c52859e123a1f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3771 zcmbVO`Fm4U5Ir}Iq)jgo3MB;>Pzt0i5;g@bf^97d1_})paer-J%fmE@FE2=O-}fE& zeOKH-1;i@u;`TTAcleW^XI|cGUm7TAzpqK|oilUi&YYRKzyI^q5dh2ZX9OXIxx0(G zWUpo9l1ARzQOISJdBZN4b~3#=)wwI5$=RkIL0DnR4r8a0%oy3hWLNJFv(HheYTJ0R zLS1T1l6Gt>JJ_l)xg(b?I7Zg#F)~H78Z`>lO>?4Dn3GTlb#+%mD@3@})h#ko3_HdiA?w~YE4>YWi4m5LLzZe8cjV4;f`Ft z8ATQ9HKt+)y-qasM9`qH_`mucMI7}tP&iFvGGg-U42@GUMd8$xl{GgOhk8wWi_x1g zCBnHrBhzEpmaM(au(RDNoZ!BG0_DDgro+G~Oiwf&D`C;jU43TWv6!|9<|{0m;6{EJ zM^&P9KcUeiF_|)8n*G5P)uILGM6hsTuK6}K79pt+rMnx5{(PMct)&3 z=TP1mc1dt$6!UPQkb;DomMFz{RHIc$a*@J}@paN(92hX|DAu4}_|PF#U_mu|2HaX} z%jeB(zvR937dQ4px5u_Fjw zF3^m|kPmf}%?rel)5r&*=L*!;DEK#BpR=+8ENbiw0?!lRE{$OUYKCN8Hf!2G`euz= zg6I{3zD?tHAKg`S#?W_a+!aKx6!bkB_X=8gm@)^PGL8E+9tdijFB%VNJS-YhsnKl> zZZB7PRO2yGsqyK!SahDycv5t#sk3#vX|t)v@wCRCGUyV4KCAJZK&4$=YV7266YL8b zFP34K3if4k>Ox%(o8<_%)5!%fN0D-_&@^2Y1<=T_x~48t;~Y-88> z#&9VtBdF)B&d@x0G`8^>Xfc`mb?&K2!GbFC$#c}n1!v`D;RS-3UP zkueGdle6@f31+D`yc*p()R}Q#G&C@7862h&{LW|6@g`irnZ~p+V2%wBCZ>D?XR(o0 z@gW$-ES!Q#Tt&DFp_=PxU|q{SzEE5l-zWSQ>{Qh8a~fBd(@Kcn_05Mcy?F%jZHF-P z0A@9}9Kh-OU9~g$S;vDwLt)hNnG?fwe$M93jFK|u&>{J&mq!pyE1ZqFlr?fM%+);i zu&2Gl+IiT5<}YyiVKgfo#Nxv^Pq8H9Bbc`>xPJ(%z8%3D`qY-<{;ZaRXy3|@&V967 z1@UYaFI4hxIvRNXLe|xC{<;t|10J?}9xkWvmtq|~TJKs=3+W^uKHOk5LW^ir0qWCW zBwRl)Q#gw7esQAYAUD25m#n`;y1BHsRpAh>JdA5Y*jkeGdJ=MNoMgKvxuHUm^&~e| zNE}acQ-x%=C%Lska)&3myFzlGCwZ_!@`xvSyh8GnCwZnq^1LT`sY3FqCwZen^0p^= zuR^ldlYCqu+2=_<4@iWkB{p=EnP9GK$;UW3*gys*$i8;W=g?okahSjpO!!_j<0tm~ zzsQ%ragM6PB2po#)?%@`9!u12K1KInnfioW5}xZ4Ej$)^+-czELFTnoNlAW_J2*wS zAp8uu{FHJ7Uk;;ISgxgN5d!&TxSD7w!%5@nF6!>KQfF0w&67L}Qp}}#3(1p)*u(C* zU%Az0dNyM%M^QV15mwPR`&z`auu diff --git a/target/classes/zuo/biao/apijson/parser/SQLProvider.class b/target/classes/zuo/biao/apijson/parser/SQLProvider.class deleted file mode 100644 index b3896d473fe21794f4ee331fa9bcdc45ddb74848..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 799 zcmaKq$xg#C5QZmZNjIP^`+h(|?S&jT7I6T?rl10;K;q^Wle$Xn$aX4~N8`W)@KA_x z0-_kfDgI{WpEYmqFRuWw58E!}9N2kIgx6t2cqC?hCAb$8si^dV8~<90A$z3Kg-Hi0 zeKI6oM0n`6I(^#J4irPGuc%Taq?oAQ@c+v78PvoqCbf+DUI$zz(P)RA~EgmuYiM0kd6>&$#~d2G@>+Tlul&cZPJM-Rxq_L z1>+8s@pZvDmEYJ(^cR|ueEOuvOjR`9vamO9%cJeSM@?&{$~hTg1KAGGq)6hUQ3frE z8#hogd5O|yw#;=bqGZ6aHIv|uM2Ts$$kYi&Fm5g~QExn;DG-V5(o+^;vC7yX_sqto z9l${R1psPz*D06=b6*$o>9+ty^q0_^gEHD@ES|M^&f<#2Rf}sD&s)4;@uI~`7B5@8 UV)3fQYZkA=2F~ihW;*fK2a~0!!vFvP diff --git a/target/classes/zuo/biao/apijson/parser/SQLProviderException.class b/target/classes/zuo/biao/apijson/parser/SQLProviderException.class deleted file mode 100644 index 1b17e7b33d2652fe3ec57b434bf81b86acd21f37..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3337 zcmb7G`%@cL6#i~VSO{AR6iVNvPYDEKTdWF*El4dEC>08}RqGPAurwrbH=(7zwe|hh zs=qq^;7>Z*u{>mS{LLB1{zcAMzk7ER@}gsbN%r2o=R4my-#O><*T2914&VsB*5DHe zUrQ$NX2HEJePRwAy!FR*FWm^UIZBR(C; zz7QxkZ98E*0yTr`eL7{uB7>Hb>Jq3NwWi}nDs7tr#|mC|53WaG$aEZI+T7nSf%{|T zoEcAb^+-77YRH+Uw~aY)qo#DWFMp@oT`IbxDcg!qD~$4PD{iHF1j?F2;{yJ^#FQCC z8ESOs*r1_Kpmr^elZG=x^dM?cQwf0v9hC@5?^fI#PR~u6_LwmlV|aCgiKr19H*8C; zy-j~=#v<4Dbwe$cYlhO$TueSRE@|$NG`9(8b8eEP<26~lI0d%k0*uYri7S#-my5AS zV(bJ2#vYiFsq2ePK9%vfLH?tKdx8rSeZrkoV`aoaW)WX%L|5H%WF1U45& z)tkO_$+UwA$pdWyjl~D77;Cl)5ggL+pg{GSjuKnPVH~0E(`HI$cp#J$_UXx4Gn(qs z@X$RPqf}i6(Se6`Jc36Bs)(#=mK7>c-<<2fQznQmJf@+W-BL(jM-LvSu=7SNZJxd) za4=Uxk6=m2Fm_a;7f)#D6WF<4SDj^FIy(BXOQ2%7f8yfcz;J&MVLYkhBnH^XMlxx} zrv%z^9ec!!9rvbHy1OLADIJ3{0~M)+d%g<87}0QAV8faSY$P3L@H90rrsyZH$}<6; zmnj;P$v9i2lE*JgZ=sbn|pK-{#Vi+BGR>yOAo?%eP z(UcLrEU>#kMQ)DSM%2uVC0T7F^25+Ei6{q(V_joUak>mt!o;)&N|`J6f|D}mbj-lw zDGs!3|5=I12*(sX+omx`LLrF|q?K|BlEw%xEjG zoDGWTkdgEzdS#}^Io9hkwUNc6L2uFKea}Z;bj+P9Z+g))9^HGdHV>aIMV|)>_wwV) z-hFxo)`hCeo#YZpj`z&eQ896|B$PZD98IL{sCmMYx8K%M7g@V3Mg}ktkDGR1%y1mj z(QuPZwcd>KCM<1K^qvsd!@?-zzb-!hvO2iZ)T)AOUdP#W6)O15Yn-3eJkd)l!S9-u zC2VY2MeVsIY`Ts5pOy7yepV~o8uSauZHt&) z#O1Ks`VGlWe@l2Px!97+{1UFVwBE+cQc6Fhl$|n2O6E$rjp^CW?C!t;W_yJBex0kE zTz|)M`T={f%tZZ({rHV;cbBdL8ia<3`U|l*|AEb;@8I36TJNbqBHWd=8=w#` z|HKEMic&HHniXTWPy^XQeV@_fNzS-s%K+usT$L%5pxSLE&#*#rd6#EnFZW`XF}Ysk zj*Lm*1ALhE@=+1h`a-JhC8>UlPqHANDv&&?szYrizkKrYovRFS9;pQ*Hc QjxYEvr$h(7#8(ji0YUK+&Hw-a diff --git a/target/classes/zuo/biao/apijson/parser/StatementType.class b/target/classes/zuo/biao/apijson/parser/StatementType.class deleted file mode 100644 index 23f99383d2759b2575c988685c3b6b414ef291c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1167 zcma)5ZBNrs6n-w<)~!@tCW5?)FCg1MDk3Ci3xQxwhy#orOBO%f&59+XUAm4qf0d38 z5RJso{wU))mjz~`$@-!9Jh$h0?s@Jx{q_6XC4e<-=ok=K_}mJtswV?WHoW6z;9CtD zHr>#2A{n_St{;`!4Od4@VCYz$N~$ zDRfiDGsPPpP853nQGPdDPEqb16LBPx&>7q{p)*J_m^P7QkYaGpL<$Lx?wc?$C@@^~ ze0RTfQgy?UtkzwDbTO#OdRc}ZW3_2O!zdLOee{}C&#A1pTnciTY`<0wWRTO56&UHU z&~8$nOe|qpASJ_4wrfG7&B8rK530v*Ez0lyV~flS=&GE94+8mKTK9gkefEMaJ~ib;R+{{Nyj_#Wz-7ko?rB6vOuBF zN;mUctJFY^{)G6}B)1))l{&6gYPMRb&%nqOcbPI{Gz2DY5pRglC&K)czC%>f!`eAU z&M>CHcuau_1t#MPOervvP+(U7K_sn%F{cviV8W@yJD74Ri4JC+Gt7M@-2ptHw?QkP z{G4iisCM}ajdZt)RoZ74dTwdv9FJ~@2}(ehWU5%lJlmn+UBKfmeS@qseY}IY%4;om zSt)R3d)o8`7MH)!m#Z?a)WmfODQfacS0hI`e3p?GxeHi7A^y)Bz%!+}Muu2>{SV}8 B1QY-O diff --git a/target/classes/zuo/biao/apijson/parser/Utils.class b/target/classes/zuo/biao/apijson/parser/Utils.class deleted file mode 100644 index e3a7ae84324e33833673681561200962e0e15941..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 511 zcmaJ-%SyvQ6g|_lO`68G*7u``8);oM3zrr*Qb7n+sMe)S;!vlgNtsNA`d8vYap4E} zQQ}Q3h!z}}$GzvCd(PaC&$o8~M`)PHF*F{hvFl47yL=)?NgTNot`ec#Yc0dXM4q8G z;t$*nc{Fq{{E-MWgVpQa+f%{s?Xn0I`CkSOE^$CN~Yz-Llr}3SzP-dtQ zAliu_8LnexV+mCgm0vRbS)#?*K@H0c<)P4*DxL_XXAB3;MZMNyssx4=2L%)vsvar! zrej~IEAEFP^&AI09B?Jmc%CeFGRHOyY&uwnMXvR|Oc?gOe}_c>wfpf@1>#Jm-R*32 z?Q|^ICm#lln_(+8L$4exn6w#66t(D1SE+8l!g)shiGmzf=`3bY9&1@9Z9$&qG?(s_ ZSU7ya#$Sq&QJn7r(%q&)hMlao}MNnuJ%%R7MAO%msOG`m-TU~W)P0A)w@K@w{l_hAjjA9!W zp*Bnc6?>Oj+{*h<-*~3d5s@Sm4-}UU3Dt%_6nDZKiQvlX###ke?Pi}~b;1kjAdixZ z0*Zt=Uj_0cxgAK|6N3?Zl>P8rjQT<=lV^uke61qFmj4f6n=lnK&Iz*_t6va=LX@bO zi?v46|7(-BjYY!BU!|_;bWlds&@T}x-`DJnL=>f4+6IBIjF4|M`wj@JF4nM4a9ARB z+|vmYSdBAtCr&p^^tn7%W_vfg>3u_vEpE;8{{crPN0Fn=*&%ZL0L9(CXG}fuR}KzG zCq1pOvWjWWmnJH>nBk1|n8h4>lrWEl%xgEB;Jl%HTBc`I9$7i@GxLD;)XU5xETfk7 dwfJqS1?vSXKM}TJVJB^KC!!32u#uW?egQILflUAa From 386e645ae7cb1202d87ff855c4ec147ac526e451 Mon Sep 17 00:00:00 2001 From: zhanglingsi Date: Mon, 7 Jan 2019 11:27:47 +0800 Subject: [PATCH 4/4] init --- .settings/org.eclipse.core.resources.prefs | 4 ---- .settings/org.eclipse.jdt.core.prefs | 6 ------ .settings/org.eclipse.m2e.core.prefs | 4 ---- 3 files changed, 14 deletions(-) delete mode 100644 .settings/org.eclipse.core.resources.prefs delete mode 100644 .settings/org.eclipse.jdt.core.prefs delete mode 100644 .settings/org.eclipse.m2e.core.prefs diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs deleted file mode 100644 index 4c28b1a..0000000 --- a/.settings/org.eclipse.core.resources.prefs +++ /dev/null @@ -1,4 +0,0 @@ -eclipse.preferences.version=1 -encoding//src/main/java=UTF-8 -encoding//src/test/java=UTF-8 -encoding/=UTF-8 diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 1e9dd93..0000000 --- a/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,6 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 -org.eclipse.jdt.core.compiler.compliance=1.7 -org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning -org.eclipse.jdt.core.compiler.release=disabled -org.eclipse.jdt.core.compiler.source=1.7 diff --git a/.settings/org.eclipse.m2e.core.prefs b/.settings/org.eclipse.m2e.core.prefs deleted file mode 100644 index 14b697b..0000000 --- a/.settings/org.eclipse.m2e.core.prefs +++ /dev/null @@ -1,4 +0,0 @@ -activeProfiles= -eclipse.preferences.version=1 -resolveWorkspaceProjects=true -version=1