diff --git a/README.md b/README.md index 1348e2b..90005e2 100644 --- a/README.md +++ b/README.md @@ -314,7 +314,7 @@ WHERE ( regexp_like(p.code,'^[0-9]+$')) 结果: -```json +```sql SELECT p.id, p.code, p.name, p.price FROM Product p WHERE (p.name LIKE '%双11%') @@ -350,21 +350,74 @@ GROUP BY p.name 目前允许的函数没有进行控制,所有的单一参数的函数都可以使用。 +单表查询的内容基本介绍完了,接下来是多表查询。 +现在有两张表,零售表`m_retail`,零售的店铺`m_retail.c_store_id`外键关联到`c_store`表。 +第一种是使用`id@` +```json +{ + "m_retail:r":{ + "@column":"id,docno", + "id": 18 + }, + "c_store:s":{ + "id@":"/r/c_store_id", + "@column":"code,name" + } +} +``` -单表查询的内容基本介绍完了。 +结果: -接下来是多表查询,后续文档内容敬请期待。 +```sql +SELECT r.id, r.docno, s.code as "s.code", s.name as "s.name" +FROM m_retail r, c_store s +WHERE (r.id = 18 AND r.c_store_id = s.id) +``` +如果不使用`id@` +```json +{ + "[]": { + "c_store": { + "@column": "code,name", + "code": "C86L" + }, + "m_retail:r": { + "@column": "id,docno" + } + }, + "join": { + "@innerJoin": [ + "c_store.id=r.c_store_id" + ] + } +} +``` + +结果: +```sql +SELECT r.id, r.docno, c_store.code, c_store.name +FROM m_retail r +INNER JOIN c_store ON c_store.id=r.c_store_id +WHERE (c_store.code = 'C86L') +``` +其他几种join的使用方法和这里演示的innerJoin是一样的。 +现在支持的join有: +@innerJoin +@leftOuterJoin +@rightOuterJoin +@join +@outerJoin diff --git a/src/main/java/zuo/biao/apijson/parser/APIJSONProvider.java b/src/main/java/zuo/biao/apijson/parser/APIJSONProvider.java index 83ed32e..dd55655 100644 --- a/src/main/java/zuo/biao/apijson/parser/APIJSONProvider.java +++ b/src/main/java/zuo/biao/apijson/parser/APIJSONProvider.java @@ -12,6 +12,8 @@ public class APIJSONProvider extends AbstractProvider { private final String ALIAS_SPLIT = ":"; private static final String AND = " AND "; private static final String OR = " OR "; + private final String q = "\""; + private boolean isWrap = false; private List tableWhiteList = new ArrayList(); private List tableBlackList = new ArrayList(); @@ -61,7 +63,7 @@ public List getTables() { Set tableNames = request.keySet(); String tableAliasName; String tableRealName; - for(String tableName : tableNames) { + out:for(String tableName : tableNames) { if(!tableName.matches("(\\w+(:\\w+)?)")) { error("表" + tableName + "格式不符合" ); return null; @@ -74,6 +76,19 @@ public List getTables() { }else { tableRealName = tableAliasName = tableName; } + if(join != null) { + String[] checkJoin = {"@innerJoin","@leftOuterJoin","@rightOuterJoin","@join","@outerJoin"}; + for(String joinKey : checkJoin) { + JSONArray array = join.getJSONArray(joinKey); + if(array != null && array.size() != 0) { + for(Object obj : array) { + if(obj instanceof String && (((String)obj).startsWith(tableRealName) || ((String)obj).startsWith(tableAliasName))) { + continue out; + } + } + } + } + } validateTable(tableRealName); list.add(tableRealName + " " + tableAliasName); } @@ -151,18 +166,27 @@ public List getSelect() { String columnRealName = functionStrs[1]; String columnAliasName = columnName.split(ALIAS_SPLIT)[1]; validateColumn(tableRealName,columnRealName); + if(propertis.getString("id@") != null) + columnAliasName = wrapColumn(tableAliasName, columnAliasName); list.add(funcitonName + "(" + tableAliasName + "." + columnRealName + ")" + " as " + columnAliasName); }else { //没函数的字段 String columnRealName = functionOrColumn ; String columnAliasName = columnName.split(ALIAS_SPLIT)[1]; validateColumn(tableRealName,columnRealName); + if(propertis.getString("id@") != null) + columnAliasName = wrapColumn(tableAliasName, columnAliasName); list.add(tableAliasName + "." + columnRealName + " as " + columnAliasName); } }else { //使用tableAliasName.columnName类型 validateColumn(tableRealName,columnName); - list.add(tableAliasName + "." + columnName); + if(propertis.getString("id@") != null) { + String columnAliasName = wrapColumn(tableAliasName, columnName); + list.add(tableAliasName + "." + columnName + " as " + columnAliasName); + }else { + list.add(tableAliasName + "." + columnName); + } } } } @@ -171,6 +195,9 @@ public List getSelect() { } return list; } + private String wrapColumn(String tableAliasName, String columnAliasName) { + return isWrap? q + tableAliasName + "." + columnAliasName + q : q + columnAliasName + q; + } /** * 解析请求中的过滤条件 * 支持以下模式: @@ -520,7 +547,7 @@ public List getOuterJoin() { List list = new ArrayList<>(); if(getStatementType() == StatementType.SELECT) { if(join != null && join.get("@outerJoin")!=null) { - JSONArray stms = join.getJSONArray("@join"); + JSONArray stms = join.getJSONArray("@outerJoin"); for(int i = 0; i < stms.size(); i++) { Object obj = stms.get(i); @@ -872,4 +899,12 @@ public List getColumnBlackList() { public void setColumnBlackList(List columnBlackList) { this.columnBlackList = columnBlackList; } + public boolean isWrap() { + return isWrap; + } + public void setWrap(boolean isWrap) { + this.isWrap = isWrap; + } + + } diff --git a/src/main/java/zuo/biao/apijson/parser/App.java b/src/main/java/zuo/biao/apijson/parser/App.java index 06c74db..c45c8e7 100644 --- a/src/main/java/zuo/biao/apijson/parser/App.java +++ b/src/main/java/zuo/biao/apijson/parser/App.java @@ -14,12 +14,22 @@ 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" + + " \"c_store\": {\r\n" + + " \"@column\": \"code,name\",\r\n" + + " \"code\": \"C86L\"\r\n" + + " },\r\n" + + " \"m_retail:r\": {\r\n" + + " \"@column\": \"id,docno\"\r\n" + + " }\r\n" + + " },\r\n" + + " \"join\": {\r\n" + + " \"@innerJoin\": [\r\n" + + " \"c_store.id=r.c_store_id\"\r\n" + + " ]\r\n" + " }\r\n" + "}"; + System.out.println(json); JSONObject req = JSONObject.parseObject(json); long fastJsonet = System.currentTimeMillis(); //JSON解析太耗时了174ms diff --git a/target/classes/META-INF/maven/APIJSONParser/APIJSONParser/pom.properties b/target/classes/META-INF/maven/APIJSONParser/APIJSONParser/pom.properties index b28d1ab..646310f 100644 --- a/target/classes/META-INF/maven/APIJSONParser/APIJSONParser/pom.properties +++ b/target/classes/META-INF/maven/APIJSONParser/APIJSONParser/pom.properties @@ -1,5 +1,5 @@ #Generated by Maven Integration for Eclipse -#Tue Dec 25 10:09:51 CST 2018 +#Wed Jan 16 11:59:18 CST 2019 version=0.0.1-SNAPSHOT groupId=APIJSONParser m2e.projectName=APIJSONParser diff --git a/target/classes/zuo/biao/apijson/parser/APIJSONProvider.class b/target/classes/zuo/biao/apijson/parser/APIJSONProvider.class index 6345296..417bd28 100644 Binary files a/target/classes/zuo/biao/apijson/parser/APIJSONProvider.class and b/target/classes/zuo/biao/apijson/parser/APIJSONProvider.class differ diff --git a/target/classes/zuo/biao/apijson/parser/App.class b/target/classes/zuo/biao/apijson/parser/App.class index 64ddeda..eec3c2b 100644 Binary files a/target/classes/zuo/biao/apijson/parser/App.class and b/target/classes/zuo/biao/apijson/parser/App.class differ