From 5785e6e855bf3ad01b2284192ddd10a22503974f Mon Sep 17 00:00:00 2001 From: veezean Date: Sat, 9 Apr 2022 03:13:31 +0000 Subject: [PATCH] =?UTF-8?q?=E5=AD=97=E7=AC=A6=E4=B8=B2=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=E7=9A=84=E8=BF=87=E6=BB=A4=E6=9D=A1=E4=BB=B6=E5=A6=82=E6=9E=9C?= =?UTF-8?q?=E4=B8=BA=E7=A9=BA=E6=97=B6=E6=8A=A5=E9=94=99=E9=97=AE=E9=A2=98?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/provider/calcite/SqlBuilder.java | 86 +++++++++++-------- 1 file changed, 52 insertions(+), 34 deletions(-) diff --git a/data-providers/src/main/java/datart/data/provider/calcite/SqlBuilder.java b/data-providers/src/main/java/datart/data/provider/calcite/SqlBuilder.java index e33c041c..71845996 100644 --- a/data-providers/src/main/java/datart/data/provider/calcite/SqlBuilder.java +++ b/data-providers/src/main/java/datart/data/provider/calcite/SqlBuilder.java @@ -31,6 +31,7 @@ import org.apache.calcite.sql.fun.SqlBetweenOperator; import org.apache.calcite.sql.fun.SqlStdOperatorTable; import org.apache.calcite.sql.parser.SqlParseException; import org.apache.calcite.sql.parser.SqlParserPos; +import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.util.CollectionUtils; @@ -145,32 +146,20 @@ public class SqlBuilder { if (having == null) { having = filterSqlNode; } else { - having = new SqlBasicCall(SqlStdOperatorTable.AND, new SqlNode[]{having, filterSqlNode}, SqlParserPos.ZERO); + having = new SqlBasicCall(SqlStdOperatorTable.AND, new SqlNode[]{having, filterSqlNode}, + SqlParserPos.ZERO); } } else { if (where == null) { where = filterSqlNode; } else { - where = new SqlBasicCall(SqlStdOperatorTable.AND, new SqlNode[]{where, filterSqlNode}, SqlParserPos.ZERO); + where = new SqlBasicCall(SqlStdOperatorTable.AND, new SqlNode[]{where, filterSqlNode}, + SqlParserPos.ZERO); } } } } - // aggregators - if (!CollectionUtils.isEmpty(executeParam.getAggregators())) { - for (AggregateOperator aggregator : executeParam.getAggregators()) { - String alias; - if (aggregator.getSqlOperator() == null) { - alias = aggregator.getColumn(); - } else { - alias = aggregator.getSqlOperator().name() + "(" + aggregator.getColumn() + ")"; - } - columnAlias.put(aggregator.getColumn(), alias); - selectList.add(createAggNode(aggregator.getSqlOperator(), aggregator.getColumn(), alias)); - } - } - //group by if (!CollectionUtils.isEmpty(executeParam.getGroups())) { for (GroupByOperator group : executeParam.getGroups()) { @@ -186,10 +175,25 @@ public class SqlBuilder { } } + // aggregators + if (!CollectionUtils.isEmpty(executeParam.getAggregators())) { + for (AggregateOperator aggregator : executeParam.getAggregators()) { + String alias; + if (aggregator.getSqlOperator() == null) { + alias = aggregator.getColumn(); + } else { + alias = aggregator.getSqlOperator().name() + "(" + aggregator.getColumn() + ")"; + } + columnAlias.put(aggregator.getColumn(), alias); + selectList.add(createAggNode(aggregator.getSqlOperator(), aggregator.getColumn(), alias)); + } + } + //order if (!CollectionUtils.isEmpty(executeParam.getOrders())) { for (OrderOperator order : executeParam.getOrders()) { -// String columnName = columnAlias.containsKey(order.getColumn()) ? columnAlias.get(order.getColumn()) : order.getColumn(); +// String columnName = columnAlias.containsKey(order.getColumn()) ? columnAlias.get(order.getColumn()) +// : order.getColumn(); orderBy.add(createOrderNode(order)); } } @@ -203,7 +207,8 @@ public class SqlBuilder { } SqlNode from = new SqlBasicCall(SqlStdOperatorTable.AS - , new SqlNode[]{new SqlFragment("(" + srcSql + ")"), new SqlIdentifier(T, SqlParserPos.ZERO.withQuoting(true))} + , new SqlNode[]{new SqlFragment("(" + srcSql + ")"), new SqlIdentifier(T, + SqlParserPos.ZERO.withQuoting(true))} , SqlParserPos.ZERO); if (selectList.size() == 0) { @@ -213,8 +218,10 @@ public class SqlBuilder { SqlNode fetch = null; SqlNode offset = null; if (withPage && (dialect instanceof FetchAndOffsetSupport) && executeParam.getPageInfo() != null) { - fetch = SqlLiteral.createExactNumeric(Math.min(executeParam.getPageInfo().getPageSize(), Integer.MAX_VALUE) + "", SqlParserPos.ZERO); - offset = SqlLiteral.createExactNumeric(Math.min((executeParam.getPageInfo().getPageNo() - 1) * executeParam.getPageInfo().getPageSize(), Integer.MAX_VALUE) + "", SqlParserPos.ZERO); + fetch = SqlLiteral.createExactNumeric(Math.min(executeParam.getPageInfo().getPageSize(), + Integer.MAX_VALUE) + "", SqlParserPos.ZERO); + offset = + SqlLiteral.createExactNumeric(Math.min((executeParam.getPageInfo().getPageNo() - 1) * executeParam.getPageInfo().getPageSize(), Integer.MAX_VALUE) + "", SqlParserPos.ZERO); } SqlSelect sqlSelect = new SqlSelect(SqlParserPos.ZERO, @@ -335,34 +342,40 @@ public class SqlBuilder { sqlNodes = new SqlNode[]{column, nodes.get(0)}; break; case LIKE: - operator.getValues()[0].setValue("%" + operator.getValues()[0].getValue() + "%"); + SingleTypedValue likeParam = getInputStringParam(operator); + likeParam.setValue("%" + likeParam.getValue() + "%"); sqlOp = SqlStdOperatorTable.LIKE; - sqlNodes = new SqlNode[]{column, convertTypedValue(operator.getValues()[0])}; + sqlNodes = new SqlNode[]{column, convertTypedValue(likeParam)}; break; case PREFIX_LIKE: - operator.getValues()[0].setValue(operator.getValues()[0].getValue() + "%"); + SingleTypedValue prefixLikeParam = getInputStringParam(operator); + prefixLikeParam.setValue(prefixLikeParam.getValue() + "%"); sqlOp = SqlStdOperatorTable.LIKE; - sqlNodes = new SqlNode[]{column, convertTypedValue(operator.getValues()[0])}; + sqlNodes = new SqlNode[]{column, convertTypedValue(prefixLikeParam)}; break; case SUFFIX_LIKE: - operator.getValues()[0].setValue("%" + operator.getValues()[0].getValue()); + SingleTypedValue suffixLikeParam = getInputStringParam(operator); + suffixLikeParam.setValue("%" + suffixLikeParam.getValue()); sqlOp = SqlStdOperatorTable.LIKE; - sqlNodes = new SqlNode[]{column, convertTypedValue(operator.getValues()[0])}; + sqlNodes = new SqlNode[]{column, convertTypedValue(suffixLikeParam)}; break; case NOT_LIKE: - operator.getValues()[0].setValue("%" + operator.getValues()[0].getValue() + "%"); + SingleTypedValue notLikeParam = getInputStringParam(operator); + notLikeParam.setValue("%" + notLikeParam.getValue() + "%"); sqlOp = SqlStdOperatorTable.NOT_LIKE; - sqlNodes = new SqlNode[]{column, convertTypedValue(operator.getValues()[0])}; + sqlNodes = new SqlNode[]{column, convertTypedValue(notLikeParam)}; break; case PREFIX_NOT_LIKE: - operator.getValues()[0].setValue(operator.getValues()[0].getValue() + "%"); + SingleTypedValue prefixNotLikeParam = getInputStringParam(operator); + prefixNotLikeParam.setValue(prefixNotLikeParam.getValue() + "%"); sqlOp = SqlStdOperatorTable.NOT_LIKE; - sqlNodes = new SqlNode[]{column, convertTypedValue(operator.getValues()[0])}; + sqlNodes = new SqlNode[]{column, convertTypedValue(prefixNotLikeParam)}; break; case SUFFIX_NOT_LIKE: - operator.getValues()[0].setValue("%" + operator.getValues()[0].getValue()); + SingleTypedValue suffixNotLikeParam = getInputStringParam(operator); + suffixNotLikeParam.setValue("%" + suffixNotLikeParam.getValue()); sqlOp = SqlStdOperatorTable.NOT_LIKE; - sqlNodes = new SqlNode[]{column, convertTypedValue(operator.getValues()[0])}; + sqlNodes = new SqlNode[]{column, convertTypedValue(suffixNotLikeParam)}; break; case IS_NULL: sqlOp = SqlStdOperatorTable.IS_NULL; @@ -392,12 +405,17 @@ public class SqlBuilder { return new SqlBasicCall(sqlOp, sqlNodes, SqlParserPos.ZERO); } + private SingleTypedValue getInputStringParam(FilterOperator operator) { + return ArrayUtils.isEmpty(operator.getValues()) ? new SingleTypedValue("" + , ValueType.STRING) : operator.getValues()[0]; + } + /** * parse function column ,and register the column functions * - * @param column function column + * @param column function column * @param tableName table where function to execute - * @param register whether register this function as build function + * @param register whether register this function as build function */ private SqlNode parseSnippet(FunctionColumn column, String tableName, boolean register) throws SqlParseException { SqlSelect sqlSelect = (SqlSelect) SqlParserUtils.parseSnippet(column.getSnippet()); -- Gitee