From 7de1070bebc2f912e1ea42234dfed151372cedf9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=80=81=E5=91=A8?= Date: Mon, 28 Aug 2023 10:33:21 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8DQueryHelper=E5=AD=90?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E4=B8=AD=E6=97=A0=E6=B3=95=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E9=A2=84=E7=BC=96=E8=AF=91=E5=8F=82=E6=95=B0=E9=97=AE=E9=A2=98?= =?UTF-8?q?.=20(#228)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/crud/query/QueryAnalyzerImpl.java | 130 +++++++++++++++++- .../web/crud/query/QueryAnalyzerImplTest.java | 12 ++ 2 files changed, 137 insertions(+), 5 deletions(-) diff --git a/hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/query/QueryAnalyzerImpl.java b/hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/query/QueryAnalyzerImpl.java index b75b75d74..d3eb258f5 100644 --- a/hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/query/QueryAnalyzerImpl.java +++ b/hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/query/QueryAnalyzerImpl.java @@ -2,11 +2,10 @@ package org.hswebframework.web.crud.query; import lombok.Getter; import lombok.SneakyThrows; -import net.sf.jsqlparser.expression.Alias; -import net.sf.jsqlparser.expression.Expression; -import net.sf.jsqlparser.expression.ExpressionVisitorAdapter; -import net.sf.jsqlparser.expression.JdbcParameter; +import net.sf.jsqlparser.expression.*; +import net.sf.jsqlparser.expression.operators.relational.ExpressionList; import net.sf.jsqlparser.parser.CCJSqlParserUtil; +import net.sf.jsqlparser.schema.Table; import net.sf.jsqlparser.statement.select.*; import net.sf.jsqlparser.statement.values.ValuesStatement; import org.apache.commons.collections4.CollectionUtils; @@ -604,6 +603,9 @@ class QueryAnalyzerImpl implements FromItemVisitor, SelectItemVisitor, SelectVis from.append("FROM "); from.append(plainSelect.getFromItem()); + PrepareStatementVisitor visitor = new PrepareStatementVisitor(); + plainSelect.getFromItem().accept(visitor); + prefixParameters += visitor.parameterSize; } if (plainSelect.getJoins() != null) { @@ -847,14 +849,132 @@ class QueryAnalyzerImpl implements FromItemVisitor, SelectItemVisitor, SelectVis @Getter - static class PrepareStatementVisitor extends ExpressionVisitorAdapter { + static class PrepareStatementVisitor extends ExpressionVisitorAdapter implements FromItemVisitor, SelectVisitor { private int parameterSize; + public PrepareStatementVisitor() { + setSelectVisitor(this); + } + @Override public void visit(JdbcParameter parameter) { parameterSize++; super.visit(parameter); } + + @Override + public void visit(net.sf.jsqlparser.schema.Table tableName) { + + } + + @Override + public void visit(SubJoin subjoin) { + if (subjoin.getLeft() != null) { + subjoin.getLeft().accept(this); + } + if (CollectionUtils.isNotEmpty(subjoin.getJoinList())) { + for (net.sf.jsqlparser.statement.select.Join join : subjoin.getJoinList()) { + if (join.getRightItem() != null) { + join.getRightItem().accept(this); + } + if (join.getOnExpressions() != null) { + join.getOnExpressions().forEach(expr -> expr.accept(this)); + } + } + } + } + + @Override + public void visit(LateralSubSelect lateralSubSelect) { + if (lateralSubSelect.getSubSelect() != null) { + lateralSubSelect.getSubSelect().accept((ExpressionVisitor) this); + } + } + + @Override + public void visit(ValuesList valuesList) { + if (valuesList.getMultiExpressionList() != null) { + for (ExpressionList expressionList : valuesList.getMultiExpressionList().getExpressionLists()) { + expressionList.getExpressions().forEach(expr -> expr.accept(this)); + } + } + } + + @Override + public void visit(TableFunction tableFunction) { + tableFunction.getFunction().accept(this); + } + + @Override + public void visit(ParenthesisFromItem aThis) { + aThis.getFromItem().accept(this); + } + + @Override + public void visit(PlainSelect plainSelect) { + plainSelect.getFromItem().accept(this); + if (plainSelect.getJoins() != null) { + for (net.sf.jsqlparser.statement.select.Join join : plainSelect.getJoins()) { + join.getRightItem().accept(this); + } + } + if (plainSelect.getSelectItems() != null) { + for (SelectItem selectItem : plainSelect.getSelectItems()) { + selectItem.accept(this); + } + } + if (plainSelect.getWhere() != null) { + plainSelect.getWhere().accept(this); + } + if (plainSelect.getHaving() != null) { + plainSelect.getHaving().accept(this); + } + + if (plainSelect.getGroupBy() != null) { + for (Expression expression : plainSelect.getGroupBy().getGroupByExpressionList().getExpressions()) { + expression.accept(this); + } + } + } + + @Override + public void visit(SetOperationList setOpList) { + if (CollectionUtils.isNotEmpty(setOpList.getSelects())) { + for (SelectBody select : setOpList.getSelects()) { + select.accept(this); + } + } + if (setOpList.getOffset() != null) { + setOpList.getOffset().getOffset().accept(this); + } + if (setOpList.getLimit() != null) { + if (setOpList.getLimit().getRowCount() != null) { + setOpList.getLimit().getRowCount().accept(this); + } + if (setOpList.getLimit().getOffset() != null) { + setOpList.getLimit().getOffset().accept(this); + } + } + } + + @Override + public void visit(WithItem withItem) { + if (CollectionUtils.isNotEmpty(withItem.getWithItemList())) { + for (SelectItem selectItem : withItem.getWithItemList()) { + selectItem.accept(this); + } + } + if (withItem.getSubSelect() != null) { + withItem.getSubSelect().accept((ExpressionVisitor) this); + } + } + + @Override + public void visit(ValuesStatement aThis) { + if (aThis.getExpressions() != null) { + aThis.getExpressions().accept(this); + } + } } private interface QueryRefactor { diff --git a/hsweb-commons/hsweb-commons-crud/src/test/java/org/hswebframework/web/crud/query/QueryAnalyzerImplTest.java b/hsweb-commons/hsweb-commons-crud/src/test/java/org/hswebframework/web/crud/query/QueryAnalyzerImplTest.java index 073e6ed55..0b3d0db67 100644 --- a/hsweb-commons/hsweb-commons-crud/src/test/java/org/hswebframework/web/crud/query/QueryAnalyzerImplTest.java +++ b/hsweb-commons/hsweb-commons-crud/src/test/java/org/hswebframework/web/crud/query/QueryAnalyzerImplTest.java @@ -108,4 +108,16 @@ class QueryAnalyzerImplTest { System.out.println(request); } + + @Test + void testPrepare(){ + QueryAnalyzerImpl analyzer = new QueryAnalyzerImpl( + database, + "select * from (select substring(id,9) id from s_test where left(id,1) = ?) t"); + + SqlRequest request = analyzer + .refactor(QueryParamEntity.of(),33); + + System.out.println(request); + } } \ No newline at end of file