From 483eb6a197cb083ebf944dbc42596cfb96d0d272 Mon Sep 17 00:00:00 2001 From: taojinlong Date: Mon, 11 Dec 2023 18:40:16 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E8=A7=A3=E6=9E=90sql=E5=87=BA=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/dataset/DataSetTableService.java | 58 +++++++++++++++++-- 1 file changed, 52 insertions(+), 6 deletions(-) diff --git a/core/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java b/core/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java index 8539ce7738..f9c8217e72 100644 --- a/core/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java +++ b/core/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java @@ -1115,6 +1115,13 @@ public class DataSetTableService { } } + private String handlePlainSelect(PlainSelect plainSelect, Select statementSelect, String dsType) throws Exception { + handleSelectItems(plainSelect, dsType); + handleFromItems(plainSelect, dsType); + handleJoins(plainSelect, dsType); + return handleWhere(plainSelect, statementSelect, dsType); + } + private void handleSelectItems(PlainSelect plainSelect, String dsType) throws Exception { List selectItems = new ArrayList<>(); for (SelectItem selectItem : plainSelect.getSelectItems()) { @@ -1135,6 +1142,7 @@ public class DataSetTableService { private void handleFromItems(PlainSelect plainSelect, String dsType) throws Exception { FromItem fromItem = plainSelect.getFromItem(); + if (fromItem instanceof SubSelect) { SelectBody selectBody = ((SubSelect) fromItem).getSelectBody(); SubSelect subSelect = new SubSelect(); @@ -1152,6 +1160,50 @@ public class DataSetTableService { } plainSelect.setFromItem(subSelect); } + if (fromItem instanceof SubJoin) { + SubJoin subJoin = (SubJoin) fromItem; + if (subJoin.getLeft() instanceof SubSelect) { + SelectBody selectBody = ((SubSelect) subJoin.getLeft()).getSelectBody(); + SubSelect subSelect = new SubSelect(); + Select subSelectTmp = (Select) CCJSqlParserUtil.parse(removeVariables(selectBody.toString(), dsType)); + PlainSelect subPlainSelect = ((PlainSelect) subSelectTmp.getSelectBody()); + subSelect.setSelectBody(subPlainSelect); + if (dsType.equals(DatasourceTypes.oracle.getType())) { + subSelect.setAlias(new Alias(subJoin.getLeft().getAlias().toString(), false)); + } else { + if (subJoin.getLeft().getAlias() == null) { + throw new Exception("Failed to parse sql, Every derived table must have its own alias!"); + } + subSelect.setAlias(new Alias(subJoin.getLeft().getAlias().toString(), false)); + } + subJoin.setLeft(subSelect); + } + List joinsList = new ArrayList<>(); + for (Join join : subJoin.getJoinList()) { + FromItem rightItem = join.getRightItem(); + if (rightItem instanceof SubSelect) { + SelectBody selectBody = ((SubSelect) rightItem).getSelectBody(); + SubSelect subSelect = new SubSelect(); + Select subSelectTmp = (Select) CCJSqlParserUtil.parse(removeVariables(selectBody.toString(), dsType)); + PlainSelect subPlainSelect = ((PlainSelect) subSelectTmp.getSelectBody()); + subSelect.setSelectBody(subPlainSelect); + if (dsType.equals(DatasourceTypes.oracle.getType())) { + subSelect.setAlias(new Alias(rightItem.getAlias().toString(), false)); + } else { + if (rightItem.getAlias() == null) { + throw new Exception("Failed to parse sql, Every derived table must have its own alias!"); + } + subSelect.setAlias(new Alias(rightItem.getAlias().toString(), false)); + } + join.setRightItem(subSelect); + } + joinsList.add(join); + subJoin.setJoinList(joinsList); + + } + plainSelect.setFromItem(fromItem); + } + } private void handleJoins(PlainSelect plainSelect, String dsType) throws Exception { @@ -1224,12 +1276,6 @@ public class DataSetTableService { return builder.toString(); } - private String handlePlainSelect(PlainSelect plainSelect, Select statementSelect, String dsType) throws Exception { - handleSelectItems(plainSelect, dsType); - handleFromItems(plainSelect, dsType); - handleJoins(plainSelect, dsType); - return handleWhere(plainSelect, statementSelect, dsType); - } public Map getDBPreview(DataSetTableRequest dataSetTableRequest) throws Exception {