Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
59 changes: 56 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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%')
Expand Down Expand Up @@ -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



Expand Down
41 changes: 38 additions & 3 deletions src/main/java/zuo/biao/apijson/parser/APIJSONProvider.java
Original file line number Diff line number Diff line change
Expand Up @@ -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<String> tableWhiteList = new ArrayList<String>();
private List<String> tableBlackList = new ArrayList<String>();
Expand Down Expand Up @@ -61,7 +63,7 @@ public List<String> getTables() {
Set<String> 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;
Expand All @@ -74,6 +76,19 @@ public List<String> 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);
}
Expand Down Expand Up @@ -151,18 +166,27 @@ public List<String> 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);
}
}
}
}
Expand All @@ -171,6 +195,9 @@ public List<String> getSelect() {
}
return list;
}
private String wrapColumn(String tableAliasName, String columnAliasName) {
return isWrap? q + tableAliasName + "." + columnAliasName + q : q + columnAliasName + q;
}
/**
* 解析请求中的过滤条件
* 支持以下模式:
Expand Down Expand Up @@ -520,7 +547,7 @@ public List<String> getOuterJoin() {
List<String> 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);
Expand Down Expand Up @@ -872,4 +899,12 @@ public List<String> getColumnBlackList() {
public void setColumnBlackList(List<String> columnBlackList) {
this.columnBlackList = columnBlackList;
}
public boolean isWrap() {
return isWrap;
}
public void setWrap(boolean isWrap) {
this.isWrap = isWrap;
}


}
18 changes: 14 additions & 4 deletions src/main/java/zuo/biao/apijson/parser/App.java
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
@@ -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
Expand Down
Binary file modified target/classes/zuo/biao/apijson/parser/APIJSONProvider.class
Binary file not shown.
Binary file modified target/classes/zuo/biao/apijson/parser/App.class
Binary file not shown.