From 44baf113ec86e3fba57723fb5b790c290662d0bc Mon Sep 17 00:00:00 2001 From: zhangliang Date: Fri, 12 Dec 2025 18:01:06 +0800 Subject: [PATCH 01/13] Refactor InExpressionConverter --- .../segment/expression/ExpressionConverter.java | 2 +- .../expression/impl/InExpressionConverter.java | 8 ++------ .../segment/expression/ExpressionConverterTest.java | 4 ++-- .../expression/impl/InExpressionConverterTest.java | 13 ++----------- 4 files changed, 7 insertions(+), 20 deletions(-) diff --git a/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverter.java b/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverter.java index ac7d9516dda66..66b8749a6df5a 100644 --- a/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverter.java +++ b/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverter.java @@ -112,7 +112,7 @@ public static Optional convert(final ExpressionSegment segment) { return SubqueryExpressionConverter.convert((SubqueryExpressionSegment) segment); } if (segment instanceof InExpression) { - return InExpressionConverter.convert((InExpression) segment); + return Optional.of(InExpressionConverter.convert((InExpression) segment)); } if (segment instanceof BetweenExpression) { return Optional.of(BetweenExpressionConverter.convert((BetweenExpression) segment)); diff --git a/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/InExpressionConverter.java b/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/InExpressionConverter.java index 2bd387635d48f..d6ab6707551c0 100644 --- a/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/InExpressionConverter.java +++ b/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/InExpressionConverter.java @@ -30,7 +30,6 @@ import java.util.ArrayList; import java.util.Collection; import java.util.LinkedList; -import java.util.Optional; /** * In expression converter. @@ -44,14 +43,11 @@ public final class InExpressionConverter { * @param expression in expression * @return SQL node */ - public static Optional convert(final InExpression expression) { - if (null == expression) { - return Optional.empty(); - } + public static SqlBasicCall convert(final InExpression expression) { Collection sqlNodes = new LinkedList<>(); ExpressionConverter.convert(expression.getLeft()).ifPresent(sqlNodes::add); ExpressionConverter.convert(expression.getRight()) .ifPresent(optional -> sqlNodes.add(optional instanceof SqlBasicCall ? new SqlNodeList(((SqlBasicCall) optional).getOperandList(), SqlParserPos.ZERO) : optional)); - return Optional.of(new SqlBasicCall(expression.isNot() ? SqlStdOperatorTable.NOT_IN : SqlStdOperatorTable.IN, new ArrayList<>(sqlNodes), SqlParserPos.ZERO)); + return new SqlBasicCall(expression.isNot() ? SqlStdOperatorTable.NOT_IN : SqlStdOperatorTable.IN, new ArrayList<>(sqlNodes), SqlParserPos.ZERO); } } diff --git a/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverterTest.java b/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverterTest.java index a5f12a7a9ebf8..65d200c762a05 100644 --- a/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverterTest.java +++ b/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverterTest.java @@ -130,9 +130,9 @@ void assertConvertDelegatesToAllSupportedConverters() { SqlNode expectedSubqueryNode = mock(SqlNode.class); SubqueryExpressionSegment subqueryExpressionSegment = new SubqueryExpressionSegment(subquerySegment); when(SubqueryExpressionConverter.convert(subqueryExpressionSegment)).thenReturn(Optional.of(expectedSubqueryNode)); - SqlNode expectedInNode = mock(SqlNode.class); + SqlBasicCall expectedInNode = mock(SqlBasicCall.class); InExpression inExpression = new InExpression(0, 0, literalSegment, literalSegment, false); - when(InExpressionConverter.convert(inExpression)).thenReturn(Optional.of(expectedInNode)); + when(InExpressionConverter.convert(inExpression)).thenReturn(expectedInNode); SqlBasicCall expectedBetweenNode = mock(SqlBasicCall.class); BetweenExpression betweenExpression = new BetweenExpression(0, 0, literalSegment, literalSegment, literalSegment, false); when(BetweenExpressionConverter.convert(betweenExpression)).thenReturn(expectedBetweenNode); diff --git a/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/InExpressionConverterTest.java b/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/InExpressionConverterTest.java index ed0bd30375457..fa74cd2d70d44 100644 --- a/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/InExpressionConverterTest.java +++ b/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/InExpressionConverterTest.java @@ -37,8 +37,6 @@ import static org.hamcrest.CoreMatchers.instanceOf; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -46,11 +44,6 @@ @StaticMockSettings(ExpressionConverter.class) class InExpressionConverterTest { - @Test - void assertConvertReturnsEmptyWhenExpressionIsNull() { - assertFalse(InExpressionConverter.convert(null).isPresent()); - } - @Test void assertConvertWrapsSqlBasicCallRightAsListForNotIn() { LiteralExpressionSegment left = new LiteralExpressionSegment(0, 0, 1); @@ -60,8 +53,7 @@ void assertConvertWrapsSqlBasicCallRightAsListForNotIn() { SqlBasicCall rightBasicCall = new SqlBasicCall(SqlStdOperatorTable.PLUS, Collections.singletonList(rightOperand), SqlParserPos.ZERO); when(ExpressionConverter.convert(left)).thenReturn(Optional.of(leftNode)); when(ExpressionConverter.convert(right)).thenReturn(Optional.of(rightBasicCall)); - SqlBasicCall actual = (SqlBasicCall) InExpressionConverter.convert(new InExpression(0, 0, left, right, true)).orElse(null); - assertNotNull(actual); + SqlBasicCall actual = InExpressionConverter.convert(new InExpression(0, 0, left, right, true)); assertThat(actual.getOperator(), is(SqlStdOperatorTable.NOT_IN)); SqlNode secondOperand = actual.getOperandList().get(1); assertThat(secondOperand, instanceOf(SqlNodeList.class)); @@ -77,8 +69,7 @@ void assertConvertAddsNonBasicCallRightForIn() { SqlNode rightNode = mock(SqlNode.class); when(ExpressionConverter.convert(left)).thenReturn(Optional.of(leftNode)); when(ExpressionConverter.convert(right)).thenReturn(Optional.of(rightNode)); - SqlBasicCall actual = (SqlBasicCall) InExpressionConverter.convert(new InExpression(0, 0, left, right, false)).orElse(null); - assertNotNull(actual); + SqlBasicCall actual = InExpressionConverter.convert(new InExpression(0, 0, left, right, false)); assertThat(actual.getOperator(), is(SqlStdOperatorTable.IN)); assertThat(actual.getOperandList(), is(Arrays.asList(leftNode, rightNode))); } From 6ccb01b638df9600d9f4132f5094593b52c01647 Mon Sep 17 00:00:00 2001 From: zhangliang Date: Fri, 12 Dec 2025 18:02:49 +0800 Subject: [PATCH 02/13] Refactor IntervalExpressionConverter --- .../converter/segment/expression/ExpressionConverter.java | 2 +- .../expression/impl/IntervalExpressionConverter.java | 6 ++---- .../segment/expression/ExpressionConverterTest.java | 4 ++-- .../expression/impl/IntervalExpressionConverterTest.java | 4 +--- 4 files changed, 6 insertions(+), 10 deletions(-) diff --git a/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverter.java b/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverter.java index 66b8749a6df5a..fa3cfd7df30af 100644 --- a/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverter.java +++ b/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverter.java @@ -157,7 +157,7 @@ public static Optional convert(final ExpressionSegment segment) { return UnaryOperationExpressionConverter.convert((UnaryOperationExpression) segment); } if (segment instanceof IntervalExpression) { - return IntervalExpressionConverter.convert((IntervalExpression) segment); + return Optional.of(IntervalExpressionConverter.convert((IntervalExpression) segment)); } if (segment instanceof QuantifySubqueryExpression) { return QuantifySubqueryExpressionConverter.convert((QuantifySubqueryExpression) segment); diff --git a/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/IntervalExpressionConverter.java b/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/IntervalExpressionConverter.java index e287faabfb6bf..91df5ce6e312d 100644 --- a/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/IntervalExpressionConverter.java +++ b/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/IntervalExpressionConverter.java @@ -31,7 +31,6 @@ import java.util.ArrayList; import java.util.List; -import java.util.Optional; /** * Interval expression converter. @@ -45,13 +44,12 @@ public final class IntervalExpressionConverter { * @param segment unary operation expression * @return SQL node */ - public static Optional convert(final IntervalExpression segment) { + public static SqlBasicCall convert(final IntervalExpression segment) { TimeUnit timeUnit = getTimeUnit(segment.getIntervalUnit()); List sqlNodes = new ArrayList<>(); ExpressionConverter.convert(segment.getValue()).ifPresent(sqlNodes::add); sqlNodes.add(new SqlIntervalQualifier(timeUnit, timeUnit, SqlParserPos.ZERO)); - SqlBasicCall result = new SqlBasicCall(SQLExtensionOperatorTable.INTERVAL_OPERATOR, sqlNodes, SqlParserPos.ZERO); - return Optional.of(result); + return new SqlBasicCall(SQLExtensionOperatorTable.INTERVAL_OPERATOR, sqlNodes, SqlParserPos.ZERO); } private static TimeUnit getTimeUnit(final IntervalUnit unit) { diff --git a/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverterTest.java b/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverterTest.java index 65d200c762a05..587bd8dd384df 100644 --- a/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverterTest.java +++ b/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverterTest.java @@ -178,9 +178,9 @@ void assertConvertDelegatesToAllSupportedConverters() { SqlNode expectedUnaryNode = mock(SqlNode.class); UnaryOperationExpression unaryOperationExpression = new UnaryOperationExpression(0, 0, literalSegment, "+", "text"); when(UnaryOperationExpressionConverter.convert(unaryOperationExpression)).thenReturn(Optional.of(expectedUnaryNode)); - SqlNode expectedIntervalNode = mock(SqlNode.class); + SqlBasicCall expectedIntervalNode = mock(SqlBasicCall.class); IntervalExpression intervalExpression = new IntervalExpression(0, 0, literalSegment, IntervalUnit.DAY, "interval"); - when(IntervalExpressionConverter.convert(intervalExpression)).thenReturn(Optional.of(expectedIntervalNode)); + when(IntervalExpressionConverter.convert(intervalExpression)).thenReturn(expectedIntervalNode); SqlNode expectedQuantifyNode = mock(SqlNode.class); QuantifySubqueryExpression quantifySubqueryExpression = new QuantifySubqueryExpression(0, 0, new SubquerySegment(0, 0, new SelectStatement(databaseType), "sub"), "ALL"); when(QuantifySubqueryExpressionConverter.convert(quantifySubqueryExpression)).thenReturn(Optional.of(expectedQuantifyNode)); diff --git a/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/IntervalExpressionConverterTest.java b/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/IntervalExpressionConverterTest.java index ea958f4caad72..66300b03eeb75 100644 --- a/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/IntervalExpressionConverterTest.java +++ b/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/IntervalExpressionConverterTest.java @@ -41,7 +41,6 @@ import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; -import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.Mockito.when; @@ -63,8 +62,7 @@ void assertConvertIntervalUnits(final IntervalUnit intervalUnit, final TimeUnit SqlNode literalNode = SqlLiteral.createExactNumeric("1", SqlParserPos.ZERO); when(ExpressionConverter.convert(value)).thenReturn(Optional.of(literalNode)); IntervalExpression intervalExpression = new IntervalExpression(0, 0, value, intervalUnit, "INTERVAL 1"); - SqlBasicCall actual = (SqlBasicCall) IntervalExpressionConverter.convert(intervalExpression).orElse(null); - assertNotNull(actual); + SqlBasicCall actual = IntervalExpressionConverter.convert(intervalExpression); assertThat(actual.getOperator(), is(SQLExtensionOperatorTable.INTERVAL_OPERATOR)); assertThat(actual.getOperandList().get(0), is(literalNode)); SqlIntervalQualifier qualifier = (SqlIntervalQualifier) actual.getOperandList().get(1); From cab8011f2e6b6614d20de6f7a8ba00f14652f570 Mon Sep 17 00:00:00 2001 From: zhangliang Date: Fri, 12 Dec 2025 18:05:43 +0800 Subject: [PATCH 03/13] Refactor LiteralExpressionConverter --- .../impl/LiteralExpressionConverter.java | 32 +++++++++---------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/LiteralExpressionConverter.java b/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/LiteralExpressionConverter.java index a24626450317d..0360102f3660c 100644 --- a/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/LiteralExpressionConverter.java +++ b/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/LiteralExpressionConverter.java @@ -87,7 +87,7 @@ public static Optional convert(final LiteralExpressionSegment segment) return Optional.of(new SqlIntervalQualifier(TimeUnit.valueOf(literalValue.toUpperCase()), null, SqlParserPos.ZERO)); } if (segment.getLiterals() instanceof Number) { - return convertNumber(segment, literalValue); + return Optional.of(convertNumber(segment, literalValue)); } if (segment.getLiterals() instanceof String) { return Optional.of(SqlLiteral.createCharString(literalValue, SqlParserPos.ZERO)); @@ -96,10 +96,10 @@ public static Optional convert(final LiteralExpressionSegment segment) return Optional.of(SqlLiteral.createBoolean(Boolean.parseBoolean(literalValue), SqlParserPos.ZERO)); } if (segment.getLiterals() instanceof Calendar) { - return convertCalendar(segment); + return Optional.of(convertCalendar(segment)); } if (segment.getLiterals() instanceof Date) { - return convertDate(segment, literalValue); + return Optional.of(convertDate(segment, literalValue)); } if (segment.getLiterals() instanceof LocalDate) { return Optional.of(SqlLiteral.createDate(DateString.fromDaysSinceEpoch((int) ((LocalDate) segment.getLiterals()).toEpochDay()), SqlParserPos.ZERO)); @@ -122,33 +122,31 @@ public static Optional convert(final LiteralExpressionSegment segment) return Optional.empty(); } - private static Optional convertNumber(final LiteralExpressionSegment segment, final String literalValue) { - if (segment.getLiterals() instanceof BigDecimal || segment.getLiterals() instanceof BigInteger) { - return Optional.of(SqlLiteral.createApproxNumeric(literalValue, SqlParserPos.ZERO)); - } - return Optional.of(SqlLiteral.createExactNumeric(literalValue, SqlParserPos.ZERO)); + private static SqlNode convertNumber(final LiteralExpressionSegment segment, final String literalValue) { + return segment.getLiterals() instanceof BigDecimal || segment.getLiterals() instanceof BigInteger + ? SqlLiteral.createApproxNumeric(literalValue, SqlParserPos.ZERO) + : SqlLiteral.createExactNumeric(literalValue, SqlParserPos.ZERO); } - private static Optional convertCalendar(final LiteralExpressionSegment segment) { + private static SqlNode convertCalendar(final LiteralExpressionSegment segment) { Calendar calendar = (Calendar) segment.getLiterals(); - if (hasTimePart(calendar)) { - return Optional.of(SqlLiteral.createTimestamp(SqlTypeName.TIMESTAMP, TimestampString.fromCalendarFields(calendar), 1, SqlParserPos.ZERO)); - } - return Optional.of(SqlLiteral.createDate(DateString.fromCalendarFields(calendar), SqlParserPos.ZERO)); + return hasTimePart(calendar) + ? SqlLiteral.createTimestamp(SqlTypeName.TIMESTAMP, TimestampString.fromCalendarFields(calendar), 1, SqlParserPos.ZERO) + : SqlLiteral.createDate(DateString.fromCalendarFields(calendar), SqlParserPos.ZERO); } private static boolean hasTimePart(final Calendar calendar) { return 0 != calendar.get(Calendar.HOUR_OF_DAY) || 0 != calendar.get(Calendar.MINUTE) || 0 != calendar.get(Calendar.SECOND) || 0 != calendar.get(Calendar.MILLISECOND); } - private static Optional convertDate(final LiteralExpressionSegment segment, final String literalValue) { + private static SqlNode convertDate(final LiteralExpressionSegment segment, final String literalValue) { if (segment.getLiterals() instanceof Timestamp) { Timestamp timestamp = (Timestamp) segment.getLiterals(); - return Optional.of(SqlLiteral.createTimestamp(SqlTypeName.TIMESTAMP, TimestampString.fromMillisSinceEpoch(timestamp.getTime()), 1, SqlParserPos.ZERO)); + return SqlLiteral.createTimestamp(SqlTypeName.TIMESTAMP, TimestampString.fromMillisSinceEpoch(timestamp.getTime()), 1, SqlParserPos.ZERO); } if (segment.getLiterals() instanceof Time) { - return Optional.of(SqlLiteral.createTime(new TimeString(literalValue), 1, SqlParserPos.ZERO)); + return SqlLiteral.createTime(new TimeString(literalValue), 1, SqlParserPos.ZERO); } - return Optional.of(SqlLiteral.createDate(new DateString(literalValue), SqlParserPos.ZERO)); + return SqlLiteral.createDate(new DateString(literalValue), SqlParserPos.ZERO); } } From f06778965bb3b0504ce2c7a00181ac1e19dfefc8 Mon Sep 17 00:00:00 2001 From: zhangliang Date: Fri, 12 Dec 2025 18:07:12 +0800 Subject: [PATCH 04/13] Refactor MatchExpressionConverter --- .../segment/expression/ExpressionConverter.java | 2 +- .../expression/impl/MatchExpressionConverter.java | 7 +++---- .../segment/expression/ExpressionConverterTest.java | 4 ++-- .../expression/impl/MatchExpressionConverterTest.java | 9 +++------ 4 files changed, 9 insertions(+), 13 deletions(-) diff --git a/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverter.java b/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverter.java index fa3cfd7df30af..f49dba566f7f0 100644 --- a/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverter.java +++ b/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverter.java @@ -142,7 +142,7 @@ public static Optional convert(final ExpressionSegment segment) { return Optional.of(ExtractArgExpressionConverter.convert((ExtractArgExpression) segment)); } if (segment instanceof MatchAgainstExpression) { - return MatchExpressionConverter.convert((MatchAgainstExpression) segment); + return Optional.of(MatchExpressionConverter.convert((MatchAgainstExpression) segment)); } if (segment instanceof CollateExpression) { return Optional.of(CollateExpressionConverter.convert((CollateExpression) segment)); diff --git a/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/MatchExpressionConverter.java b/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/MatchExpressionConverter.java index 0b6d82e25eec5..8630f6315b385 100644 --- a/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/MatchExpressionConverter.java +++ b/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/MatchExpressionConverter.java @@ -25,15 +25,14 @@ import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.parser.SqlParserPos; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.ColumnSegment; -import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.match.MatchAgainstExpression; import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.OwnerSegment; +import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.match.MatchAgainstExpression; import org.apache.shardingsphere.sqlfederation.compiler.sql.ast.converter.operator.common.SQLExtensionOperatorTable; import org.apache.shardingsphere.sqlfederation.compiler.sql.ast.converter.segment.expression.ExpressionConverter; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; -import java.util.Optional; /** * Match expression converter. @@ -47,7 +46,7 @@ public final class MatchExpressionConverter { * @param segment match against expression * @return SQL node */ - public static Optional convert(final MatchAgainstExpression segment) { + public static SqlBasicCall convert(final MatchAgainstExpression segment) { List sqlNodes = new LinkedList<>(); List names = new ArrayList<>(); for (ColumnSegment each : segment.getColumns()) { @@ -60,7 +59,7 @@ public static Optional convert(final MatchAgainstExpression segment) { ExpressionConverter.convert(segment.getExpr()).ifPresent(sqlNodes::add); SqlNode searchModifier = SqlLiteral.createCharString(segment.getSearchModifier(), SqlParserPos.ZERO); sqlNodes.add(searchModifier); - return Optional.of(new SqlBasicCall(SQLExtensionOperatorTable.MATCH_AGAINST, sqlNodes, SqlParserPos.ZERO)); + return new SqlBasicCall(SQLExtensionOperatorTable.MATCH_AGAINST, sqlNodes, SqlParserPos.ZERO); } private static void addOwnerNames(final List names, final OwnerSegment owner) { diff --git a/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverterTest.java b/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverterTest.java index 587bd8dd384df..f57c7fc6934ee 100644 --- a/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverterTest.java +++ b/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverterTest.java @@ -163,9 +163,9 @@ void assertConvertDelegatesToAllSupportedConverters() { SqlIdentifier expectedExtractNode = mock(SqlIdentifier.class); ExtractArgExpression extractArgExpression = new ExtractArgExpression(0, 0, "extract"); when(ExtractArgExpressionConverter.convert(extractArgExpression)).thenReturn(expectedExtractNode); - SqlNode expectedMatchNode = mock(SqlNode.class); + SqlBasicCall expectedMatchNode = mock(SqlBasicCall.class); MatchAgainstExpression matchAgainstExpression = new MatchAgainstExpression(0, 0, literalSegment, "search", "text"); - when(MatchExpressionConverter.convert(matchAgainstExpression)).thenReturn(Optional.of(expectedMatchNode)); + when(MatchExpressionConverter.convert(matchAgainstExpression)).thenReturn(expectedMatchNode); SqlBasicCall expectedCollateNode = mock(SqlBasicCall.class); CollateExpression collateExpression = new CollateExpression(0, 0, literalSegment, literalSegment); when(CollateExpressionConverter.convert(collateExpression)).thenReturn(expectedCollateNode); diff --git a/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/MatchExpressionConverterTest.java b/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/MatchExpressionConverterTest.java index 0a7bad4642003..888f61ff4cefb 100644 --- a/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/MatchExpressionConverterTest.java +++ b/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/MatchExpressionConverterTest.java @@ -24,10 +24,10 @@ import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.ColumnSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.simple.LiteralExpressionSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.OwnerSegment; +import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.match.MatchAgainstExpression; import org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue; import org.apache.shardingsphere.sqlfederation.compiler.sql.ast.converter.operator.common.SQLExtensionOperatorTable; import org.apache.shardingsphere.sqlfederation.compiler.sql.ast.converter.segment.expression.ExpressionConverter; -import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.match.MatchAgainstExpression; import org.apache.shardingsphere.test.infra.framework.extension.mock.AutoMockExtension; import org.apache.shardingsphere.test.infra.framework.extension.mock.StaticMockSettings; import org.junit.jupiter.api.Test; @@ -39,7 +39,6 @@ import static org.hamcrest.CoreMatchers.instanceOf; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; -import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -59,8 +58,7 @@ void assertConvertWithOwnerHierarchyAndExpression() { when(ExpressionConverter.convert(expr)).thenReturn(Optional.of(exprNode)); MatchAgainstExpression segment = new MatchAgainstExpression(0, 0, expr, "modifier", ""); segment.getColumns().add(columnSegment); - SqlBasicCall actual = (SqlBasicCall) MatchExpressionConverter.convert(segment).orElse(null); - assertNotNull(actual); + SqlBasicCall actual = MatchExpressionConverter.convert(segment); assertThat(actual.getOperator(), is(SQLExtensionOperatorTable.MATCH_AGAINST)); SqlIdentifier identifier = (SqlIdentifier) actual.getOperandList().get(0); assertThat(identifier.names, is(Arrays.asList("schema", "table", "column"))); @@ -76,8 +74,7 @@ void assertConvertWithoutExpressionLeavesSearchModifierOnly() { when(ExpressionConverter.convert(expr)).thenReturn(Optional.empty()); MatchAgainstExpression segment = new MatchAgainstExpression(0, 0, expr, "modifier", ""); segment.getColumns().add(columnSegment); - SqlBasicCall actual = (SqlBasicCall) MatchExpressionConverter.convert(segment).orElse(null); - assertNotNull(actual); + SqlBasicCall actual = MatchExpressionConverter.convert(segment); assertThat(actual.getOperandList().size(), is(2)); assertThat(actual.getOperandList().get(0), instanceOf(SqlIdentifier.class)); SqlLiteral modifier = (SqlLiteral) actual.getOperandList().get(1); From ac36ad3600621bbe6c8a1cff610780bdbf29ed4d Mon Sep 17 00:00:00 2001 From: zhangliang Date: Fri, 12 Dec 2025 18:09:23 +0800 Subject: [PATCH 05/13] Refactor NotExpressionConverter --- .../converter/segment/expression/ExpressionConverter.java | 2 +- .../segment/expression/impl/NotExpressionConverter.java | 8 ++------ .../segment/expression/ExpressionConverterTest.java | 4 ++-- .../expression/impl/NotExpressionConverterTest.java | 7 ++----- 4 files changed, 7 insertions(+), 14 deletions(-) diff --git a/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverter.java b/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverter.java index f49dba566f7f0..3a01233cfff44 100644 --- a/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverter.java +++ b/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverter.java @@ -133,7 +133,7 @@ public static Optional convert(final ExpressionSegment segment) { return Optional.of(CaseWhenExpressionConverter.convert((CaseWhenExpression) segment)); } if (segment instanceof NotExpression) { - return NotExpressionConverter.convert((NotExpression) segment); + return Optional.of(NotExpressionConverter.convert((NotExpression) segment)); } if (segment instanceof TypeCastExpression) { return TypeCastExpressionConverter.convert((TypeCastExpression) segment); diff --git a/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/NotExpressionConverter.java b/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/NotExpressionConverter.java index ac83ec6819152..3c564e93c3f51 100644 --- a/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/NotExpressionConverter.java +++ b/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/NotExpressionConverter.java @@ -28,7 +28,6 @@ import java.util.LinkedList; import java.util.List; -import java.util.Optional; /** * Not expression converter. @@ -42,13 +41,10 @@ public final class NotExpressionConverter { * @param segment not expression * @return SQL node */ - public static Optional convert(final NotExpression segment) { + public static SqlBasicCall convert(final NotExpression segment) { SqlNode expression = ExpressionConverter.convert(segment.getExpression()).orElseThrow(IllegalStateException::new); List sqlNodes = new LinkedList<>(); sqlNodes.add(expression); - if (segment.getNotSign().equals(true)) { - return Optional.of(new SqlBasicCall(SQLExtensionOperatorTable.NOT_SIGN, sqlNodes, SqlParserPos.ZERO)); - } - return Optional.of(new SqlBasicCall(SQLExtensionOperatorTable.NOT, sqlNodes, SqlParserPos.ZERO)); + return new SqlBasicCall(segment.getNotSign() ? SQLExtensionOperatorTable.NOT_SIGN : SQLExtensionOperatorTable.NOT, sqlNodes, SqlParserPos.ZERO); } } diff --git a/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverterTest.java b/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverterTest.java index f57c7fc6934ee..eba229be880cf 100644 --- a/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverterTest.java +++ b/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverterTest.java @@ -154,9 +154,9 @@ void assertConvertDelegatesToAllSupportedConverters() { SqlCase expectedCaseWhenNode = mock(SqlCase.class); CaseWhenExpression caseWhenExpression = new CaseWhenExpression(0, 0, literalSegment, Collections.singleton(literalSegment), Collections.singleton(literalSegment), literalSegment); when(CaseWhenExpressionConverter.convert(caseWhenExpression)).thenReturn(expectedCaseWhenNode); - SqlNode expectedNotNode = mock(SqlNode.class); + SqlBasicCall expectedNotNode = mock(SqlBasicCall.class); NotExpression notExpression = new NotExpression(0, 0, literalSegment, true); - when(NotExpressionConverter.convert(notExpression)).thenReturn(Optional.of(expectedNotNode)); + when(NotExpressionConverter.convert(notExpression)).thenReturn(expectedNotNode); SqlNode expectedTypeCastNode = mock(SqlNode.class); TypeCastExpression typeCastExpression = new TypeCastExpression(0, 0, "text", literalSegment, "int"); when(TypeCastExpressionConverter.convert(typeCastExpression)).thenReturn(Optional.of(expectedTypeCastNode)); diff --git a/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/NotExpressionConverterTest.java b/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/NotExpressionConverterTest.java index 4053a4ee14adb..989076170750f 100644 --- a/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/NotExpressionConverterTest.java +++ b/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/NotExpressionConverterTest.java @@ -32,7 +32,6 @@ import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; -import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -45,8 +44,7 @@ void assertConvertNotSignTrue() { LiteralExpressionSegment expression = new LiteralExpressionSegment(0, 0, 1); SqlNode expressionNode = mock(SqlNode.class); when(ExpressionConverter.convert(expression)).thenReturn(Optional.of(expressionNode)); - SqlBasicCall actual = (SqlBasicCall) NotExpressionConverter.convert(new NotExpression(0, 0, expression, true)).orElse(null); - assertNotNull(actual); + SqlBasicCall actual = NotExpressionConverter.convert(new NotExpression(0, 0, expression, true)); assertThat(actual.getOperator(), is(SQLExtensionOperatorTable.NOT_SIGN)); assertThat(actual.getOperandList().get(0), is(expressionNode)); } @@ -56,8 +54,7 @@ void assertConvertNotSignFalse() { LiteralExpressionSegment expression = new LiteralExpressionSegment(0, 0, 1); SqlNode expressionNode = mock(SqlNode.class); when(ExpressionConverter.convert(expression)).thenReturn(Optional.of(expressionNode)); - SqlBasicCall actual = (SqlBasicCall) NotExpressionConverter.convert(new NotExpression(0, 0, expression, false)).orElse(null); - assertNotNull(actual); + SqlBasicCall actual = NotExpressionConverter.convert(new NotExpression(0, 0, expression, false)); assertThat(actual.getOperator(), is(SQLExtensionOperatorTable.NOT)); } } From dbe0433c950eb2602fd93188008959fb4681547a Mon Sep 17 00:00:00 2001 From: zhangliang Date: Fri, 12 Dec 2025 18:11:12 +0800 Subject: [PATCH 06/13] Refactor ParameterMarkerExpressionConverter --- .../converter/segment/expression/ExpressionConverter.java | 2 +- .../impl/ParameterMarkerExpressionConverter.java | 7 ++----- .../segment/projection/ProjectionsConverter.java | 2 +- .../segment/expression/ExpressionConverterTest.java | 5 +++-- .../impl/ParameterMarkerExpressionConverterTest.java | 8 ++------ .../segment/projection/ProjectionsConverterTest.java | 5 +++-- 6 files changed, 12 insertions(+), 17 deletions(-) diff --git a/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverter.java b/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverter.java index 3a01233cfff44..894e838130bf9 100644 --- a/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverter.java +++ b/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverter.java @@ -118,7 +118,7 @@ public static Optional convert(final ExpressionSegment segment) { return Optional.of(BetweenExpressionConverter.convert((BetweenExpression) segment)); } if (segment instanceof ParameterMarkerExpressionSegment) { - return ParameterMarkerExpressionConverter.convert((ParameterMarkerExpressionSegment) segment); + return Optional.of(ParameterMarkerExpressionConverter.convert((ParameterMarkerExpressionSegment) segment)); } if (segment instanceof FunctionSegment) { return FunctionConverter.convert((FunctionSegment) segment); diff --git a/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/ParameterMarkerExpressionConverter.java b/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/ParameterMarkerExpressionConverter.java index 460985c9acba9..0f2f8d6786070 100644 --- a/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/ParameterMarkerExpressionConverter.java +++ b/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/ParameterMarkerExpressionConverter.java @@ -20,12 +20,9 @@ import lombok.AccessLevel; import lombok.NoArgsConstructor; import org.apache.calcite.sql.SqlDynamicParam; -import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.parser.SqlParserPos; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.simple.ParameterMarkerExpressionSegment; -import java.util.Optional; - /** * Parameter marker expression converter. */ @@ -38,7 +35,7 @@ public final class ParameterMarkerExpressionConverter { * @param segment parameter marker expression segment * @return SQL node */ - public static Optional convert(final ParameterMarkerExpressionSegment segment) { - return Optional.of(new SqlDynamicParam(segment.getParameterMarkerIndex(), SqlParserPos.ZERO)); + public static SqlDynamicParam convert(final ParameterMarkerExpressionSegment segment) { + return new SqlDynamicParam(segment.getParameterMarkerIndex(), SqlParserPos.ZERO); } } diff --git a/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/projection/ProjectionsConverter.java b/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/projection/ProjectionsConverter.java index 75e03c6fd4974..01780e1faddd9 100644 --- a/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/projection/ProjectionsConverter.java +++ b/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/projection/ProjectionsConverter.java @@ -78,7 +78,7 @@ private static Optional getProjectionSQLNode(final ProjectionSegment se return AggregationProjectionConverter.convert((AggregationProjectionSegment) segment); } if (segment instanceof ParameterMarkerExpressionSegment) { - return ParameterMarkerExpressionConverter.convert((ParameterMarkerExpressionSegment) segment); + return Optional.of(ParameterMarkerExpressionConverter.convert((ParameterMarkerExpressionSegment) segment)); } // TODO process other projection return Optional.empty(); diff --git a/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverterTest.java b/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverterTest.java index eba229be880cf..6fd558d7b784f 100644 --- a/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverterTest.java +++ b/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverterTest.java @@ -18,6 +18,7 @@ package org.apache.shardingsphere.sqlfederation.compiler.sql.ast.converter.segment.expression; import org.apache.calcite.sql.SqlBasicCall; +import org.apache.calcite.sql.SqlDynamicParam; import org.apache.calcite.sql.SqlIdentifier; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.fun.SqlCase; @@ -136,9 +137,9 @@ void assertConvertDelegatesToAllSupportedConverters() { SqlBasicCall expectedBetweenNode = mock(SqlBasicCall.class); BetweenExpression betweenExpression = new BetweenExpression(0, 0, literalSegment, literalSegment, literalSegment, false); when(BetweenExpressionConverter.convert(betweenExpression)).thenReturn(expectedBetweenNode); - SqlNode expectedParameterNode = mock(SqlNode.class); + SqlDynamicParam expectedParameterNode = mock(SqlDynamicParam.class); ParameterMarkerExpressionSegment parameterSegment = new ParameterMarkerExpressionSegment(0, 0, 0); - when(ParameterMarkerExpressionConverter.convert(parameterSegment)).thenReturn(Optional.of(expectedParameterNode)); + when(ParameterMarkerExpressionConverter.convert(parameterSegment)).thenReturn(expectedParameterNode); SqlNode expectedFunctionNode = mock(SqlNode.class); FunctionSegment functionSegment = new FunctionSegment(0, 0, "func", "func_text"); when(FunctionConverter.convert(functionSegment)).thenReturn(Optional.of(expectedFunctionNode)); diff --git a/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/ParameterMarkerExpressionConverterTest.java b/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/ParameterMarkerExpressionConverterTest.java index 28932e7aa2990..c1885ba40c396 100644 --- a/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/ParameterMarkerExpressionConverterTest.java +++ b/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/ParameterMarkerExpressionConverterTest.java @@ -18,21 +18,17 @@ package org.apache.shardingsphere.sqlfederation.compiler.sql.ast.converter.segment.expression.impl; import org.apache.calcite.sql.SqlDynamicParam; -import org.apache.calcite.sql.SqlNode; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.simple.ParameterMarkerExpressionSegment; import org.junit.jupiter.api.Test; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; -import static org.junit.jupiter.api.Assertions.assertNotNull; class ParameterMarkerExpressionConverterTest { @Test void assertConvertParameterMarker() { - SqlNode actual = ParameterMarkerExpressionConverter.convert(new ParameterMarkerExpressionSegment(0, 0, 5)).orElse(null); - assertNotNull(actual); - SqlDynamicParam param = (SqlDynamicParam) actual; - assertThat(param.getIndex(), is(5)); + SqlDynamicParam actual = ParameterMarkerExpressionConverter.convert(new ParameterMarkerExpressionSegment(0, 0, 5)); + assertThat(actual.getIndex(), is(5)); } } diff --git a/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/projection/ProjectionsConverterTest.java b/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/projection/ProjectionsConverterTest.java index a9584c9303b87..146a19db08fab 100644 --- a/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/projection/ProjectionsConverterTest.java +++ b/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/projection/ProjectionsConverterTest.java @@ -17,6 +17,7 @@ package org.apache.shardingsphere.sqlfederation.compiler.sql.ast.converter.segment.projection; +import org.apache.calcite.sql.SqlDynamicParam; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlNodeList; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.simple.ParameterMarkerExpressionSegment; @@ -77,9 +78,9 @@ void assertConvertCollectsAllSupportedProjections() { AggregationProjectionSegment aggregationProjectionSegment = mock(AggregationProjectionSegment.class); when(AggregationProjectionConverter.convert(aggregationProjectionSegment)).thenReturn(Optional.of(expectedAggregationNode)); projectionsSegment.getProjections().add(aggregationProjectionSegment); - SqlNode expectedParameterNode = mock(SqlNode.class); + SqlDynamicParam expectedParameterNode = mock(SqlDynamicParam.class); ParameterMarkerExpressionSegment parameterMarkerExpressionSegment = new ParameterMarkerExpressionSegment(0, 0, 0); - when(ParameterMarkerExpressionConverter.convert(parameterMarkerExpressionSegment)).thenReturn(Optional.of(expectedParameterNode)); + when(ParameterMarkerExpressionConverter.convert(parameterMarkerExpressionSegment)).thenReturn(expectedParameterNode); projectionsSegment.getProjections().add(parameterMarkerExpressionSegment); SqlNodeList actual = ProjectionsConverter.convert(projectionsSegment).orElse(null); assertNotNull(actual); From cf787464e5b273bbc601931bee6f1ad8b8f1f7d0 Mon Sep 17 00:00:00 2001 From: zhangliang Date: Fri, 12 Dec 2025 18:12:53 +0800 Subject: [PATCH 07/13] Refactor QuantifySubqueryExpressionConverter --- .../segment/expression/ExpressionConverter.java | 2 +- .../impl/QuantifySubqueryExpressionConverter.java | 6 ++---- .../segment/expression/ExpressionConverterTest.java | 2 +- .../impl/QuantifySubqueryExpressionConverterTest.java | 10 +--------- 4 files changed, 5 insertions(+), 15 deletions(-) diff --git a/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverter.java b/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverter.java index 894e838130bf9..c2dd642629044 100644 --- a/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverter.java +++ b/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverter.java @@ -160,7 +160,7 @@ public static Optional convert(final ExpressionSegment segment) { return Optional.of(IntervalExpressionConverter.convert((IntervalExpression) segment)); } if (segment instanceof QuantifySubqueryExpression) { - return QuantifySubqueryExpressionConverter.convert((QuantifySubqueryExpression) segment); + return Optional.of(QuantifySubqueryExpressionConverter.convert((QuantifySubqueryExpression) segment)); } throw new UnsupportedSQLOperationException("unsupported TableSegment type: " + segment.getClass()); } diff --git a/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/QuantifySubqueryExpressionConverter.java b/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/QuantifySubqueryExpressionConverter.java index 76c15bd5a9ca9..ea582bc7a78e5 100644 --- a/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/QuantifySubqueryExpressionConverter.java +++ b/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/QuantifySubqueryExpressionConverter.java @@ -23,8 +23,6 @@ import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.QuantifySubqueryExpression; import org.apache.shardingsphere.sqlfederation.compiler.sql.ast.converter.statement.type.SelectStatementConverter; -import java.util.Optional; - /** * Quantify subquery expression converter. */ @@ -37,7 +35,7 @@ public final class QuantifySubqueryExpressionConverter { * @param expression quantify subquery expression * @return SQL node */ - public static Optional convert(final QuantifySubqueryExpression expression) { - return null == expression ? Optional.empty() : Optional.of(new SelectStatementConverter().convert(expression.getSubquery().getSelect())); + public static SqlNode convert(final QuantifySubqueryExpression expression) { + return new SelectStatementConverter().convert(expression.getSubquery().getSelect()); } } diff --git a/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverterTest.java b/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverterTest.java index 6fd558d7b784f..1154e5820a9f7 100644 --- a/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverterTest.java +++ b/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverterTest.java @@ -184,7 +184,7 @@ void assertConvertDelegatesToAllSupportedConverters() { when(IntervalExpressionConverter.convert(intervalExpression)).thenReturn(expectedIntervalNode); SqlNode expectedQuantifyNode = mock(SqlNode.class); QuantifySubqueryExpression quantifySubqueryExpression = new QuantifySubqueryExpression(0, 0, new SubquerySegment(0, 0, new SelectStatement(databaseType), "sub"), "ALL"); - when(QuantifySubqueryExpressionConverter.convert(quantifySubqueryExpression)).thenReturn(Optional.of(expectedQuantifyNode)); + when(QuantifySubqueryExpressionConverter.convert(quantifySubqueryExpression)).thenReturn(expectedQuantifyNode); Map expectations = new LinkedHashMap<>(23, 1F); expectations.put(literalSegment, expectedLiteralNode); expectations.put(listSegment, expectedListNode); diff --git a/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/QuantifySubqueryExpressionConverterTest.java b/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/QuantifySubqueryExpressionConverterTest.java index 1c1adbfdce2d4..f59f5fd24e4a2 100644 --- a/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/QuantifySubqueryExpressionConverterTest.java +++ b/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/QuantifySubqueryExpressionConverterTest.java @@ -17,7 +17,6 @@ package org.apache.shardingsphere.sqlfederation.compiler.sql.ast.converter.segment.expression.impl; -import org.apache.calcite.sql.SqlNode; import org.apache.shardingsphere.database.connector.core.type.DatabaseType; import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.QuantifySubqueryExpression; @@ -27,18 +26,12 @@ import org.apache.shardingsphere.sql.parser.statement.core.statement.type.dml.SelectStatement; import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; class QuantifySubqueryExpressionConverterTest { private final DatabaseType databaseType = TypedSPILoader.getService(DatabaseType.class, "FIXTURE"); - @Test - void assertConvertReturnsEmptyWhenExpressionIsNull() { - assertFalse(QuantifySubqueryExpressionConverter.convert(null).isPresent()); - } - @Test void assertConvertQuantifySubqueryExpression() { SelectStatement selectStatement = new SelectStatement(databaseType); @@ -47,7 +40,6 @@ void assertConvertQuantifySubqueryExpression() { selectStatement.setProjections(projections); SubquerySegment subquerySegment = new SubquerySegment(0, 0, selectStatement, "sub"); QuantifySubqueryExpression expression = new QuantifySubqueryExpression(0, 0, subquerySegment, "ALL"); - SqlNode actual = QuantifySubqueryExpressionConverter.convert(expression).orElse(null); - assertNotNull(actual); + assertNotNull(QuantifySubqueryExpressionConverter.convert(expression)); } } From 83711fc86d1098af23b173d6a5c561a003e4653f Mon Sep 17 00:00:00 2001 From: zhangliang Date: Fri, 12 Dec 2025 18:14:50 +0800 Subject: [PATCH 08/13] Refactor RowExpressionConverter --- .../converter/segment/expression/ExpressionConverter.java | 2 +- .../segment/expression/impl/RowExpressionConverter.java | 5 ++--- .../segment/expression/ExpressionConverterTest.java | 2 +- .../segment/expression/impl/RowExpressionConverterTest.java | 4 +--- 4 files changed, 5 insertions(+), 8 deletions(-) diff --git a/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverter.java b/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverter.java index c2dd642629044..134ebf75573f0 100644 --- a/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverter.java +++ b/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverter.java @@ -148,7 +148,7 @@ public static Optional convert(final ExpressionSegment segment) { return Optional.of(CollateExpressionConverter.convert((CollateExpression) segment)); } if (segment instanceof RowExpression) { - return RowExpressionConverter.convert((RowExpression) segment); + return Optional.of(RowExpressionConverter.convert((RowExpression) segment)); } if (segment instanceof VariableSegment) { return VariableSegmentConverter.convert((VariableSegment) segment); diff --git a/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/RowExpressionConverter.java b/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/RowExpressionConverter.java index 3cd4b4359ed89..b4846a83ab5ba 100644 --- a/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/RowExpressionConverter.java +++ b/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/RowExpressionConverter.java @@ -28,7 +28,6 @@ import java.util.ArrayList; import java.util.List; -import java.util.Optional; /** * Row expression converter. @@ -42,11 +41,11 @@ public final class RowExpressionConverter { * @param segment row expression * @return SQL node */ - public static Optional convert(final RowExpression segment) { + public static SqlNode convert(final RowExpression segment) { List sqlNodes = new ArrayList<>(segment.getItems().size()); for (ExpressionSegment each : segment.getItems()) { ExpressionConverter.convert(each).ifPresent(sqlNodes::add); } - return Optional.of(SqlStdOperatorTable.ROW.createCall(SqlParserPos.ZERO, sqlNodes)); + return SqlStdOperatorTable.ROW.createCall(SqlParserPos.ZERO, sqlNodes); } } diff --git a/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverterTest.java b/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverterTest.java index 1154e5820a9f7..d48215188af7c 100644 --- a/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverterTest.java +++ b/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverterTest.java @@ -172,7 +172,7 @@ void assertConvertDelegatesToAllSupportedConverters() { when(CollateExpressionConverter.convert(collateExpression)).thenReturn(expectedCollateNode); SqlNode expectedRowNode = mock(SqlNode.class); RowExpression rowExpression = new RowExpression(0, 0, "row"); - when(RowExpressionConverter.convert(rowExpression)).thenReturn(Optional.of(expectedRowNode)); + when(RowExpressionConverter.convert(rowExpression)).thenReturn(expectedRowNode); SqlNode expectedVariableNode = mock(SqlNode.class); VariableSegment variableSegment = new VariableSegment(0, 0, "@@session"); when(VariableSegmentConverter.convert(variableSegment)).thenReturn(Optional.of(expectedVariableNode)); diff --git a/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/RowExpressionConverterTest.java b/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/RowExpressionConverterTest.java index 42bdb33ec6558..372870f14135d 100644 --- a/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/RowExpressionConverterTest.java +++ b/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/RowExpressionConverterTest.java @@ -35,7 +35,6 @@ import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; -import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.mockito.Mockito.when; @ExtendWith(AutoMockExtension.class) @@ -53,8 +52,7 @@ void assertConvertRowExpression() { SqlNode secondNode = SqlLiteral.createExactNumeric("2", SqlParserPos.ZERO); when(ExpressionConverter.convert(first)).thenReturn(Optional.of(firstNode)); when(ExpressionConverter.convert(second)).thenReturn(Optional.of(secondNode)); - SqlBasicCall actual = (SqlBasicCall) RowExpressionConverter.convert(expression).orElse(null); - assertNotNull(actual); + SqlBasicCall actual = (SqlBasicCall) RowExpressionConverter.convert(expression); assertThat(actual.getOperator(), is(SqlStdOperatorTable.ROW)); assertThat(actual.getOperandList(), is(Arrays.asList(firstNode, secondNode))); } From ff6f49875774552294ef7201c0ccb82d7e0dd439 Mon Sep 17 00:00:00 2001 From: zhangliang Date: Fri, 12 Dec 2025 18:16:08 +0800 Subject: [PATCH 09/13] Refactor SubqueryExpressionConverter --- .../expression/impl/SubqueryExpressionConverter.java | 6 ++---- .../segment/expression/ExpressionConverterTest.java | 2 +- .../impl/SubqueryExpressionConverterTest.java | 10 +--------- 3 files changed, 4 insertions(+), 14 deletions(-) diff --git a/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/SubqueryExpressionConverter.java b/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/SubqueryExpressionConverter.java index 7ffa60d1bf251..d5dd21a67527f 100644 --- a/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/SubqueryExpressionConverter.java +++ b/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/SubqueryExpressionConverter.java @@ -23,8 +23,6 @@ import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.subquery.SubqueryExpressionSegment; import org.apache.shardingsphere.sqlfederation.compiler.sql.ast.converter.statement.type.SelectStatementConverter; -import java.util.Optional; - /** * Subquery expression converter. */ @@ -37,7 +35,7 @@ public final class SubqueryExpressionConverter { * @param expression subquery expression segment * @return SQL node */ - public static Optional convert(final SubqueryExpressionSegment expression) { - return null == expression ? Optional.empty() : Optional.of(new SelectStatementConverter().convert(expression.getSubquery().getSelect())); + public static SqlNode convert(final SubqueryExpressionSegment expression) { + return new SelectStatementConverter().convert(expression.getSubquery().getSelect()); } } diff --git a/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverterTest.java b/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverterTest.java index d48215188af7c..2f7b5af676305 100644 --- a/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverterTest.java +++ b/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverterTest.java @@ -130,7 +130,7 @@ void assertConvertDelegatesToAllSupportedConverters() { when(ExistsSubqueryExpressionConverter.convert(existsSubqueryExpression)).thenReturn(expectedExistsSubqueryNode); SqlNode expectedSubqueryNode = mock(SqlNode.class); SubqueryExpressionSegment subqueryExpressionSegment = new SubqueryExpressionSegment(subquerySegment); - when(SubqueryExpressionConverter.convert(subqueryExpressionSegment)).thenReturn(Optional.of(expectedSubqueryNode)); + when(SubqueryExpressionConverter.convert(subqueryExpressionSegment)).thenReturn(expectedSubqueryNode); SqlBasicCall expectedInNode = mock(SqlBasicCall.class); InExpression inExpression = new InExpression(0, 0, literalSegment, literalSegment, false); when(InExpressionConverter.convert(inExpression)).thenReturn(expectedInNode); diff --git a/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/SubqueryExpressionConverterTest.java b/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/SubqueryExpressionConverterTest.java index 5199874a8799a..8f83c83c077a0 100644 --- a/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/SubqueryExpressionConverterTest.java +++ b/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/SubqueryExpressionConverterTest.java @@ -17,7 +17,6 @@ package org.apache.shardingsphere.sqlfederation.compiler.sql.ast.converter.segment.expression.impl; -import org.apache.calcite.sql.SqlNode; import org.apache.shardingsphere.database.connector.core.type.DatabaseType; import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.simple.ParameterMarkerExpressionSegment; @@ -27,18 +26,12 @@ import org.apache.shardingsphere.sql.parser.statement.core.statement.type.dml.SelectStatement; import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; class SubqueryExpressionConverterTest { private final DatabaseType databaseType = TypedSPILoader.getService(DatabaseType.class, "FIXTURE"); - @Test - void assertConvertReturnsEmptyWhenExpressionIsNull() { - assertFalse(SubqueryExpressionConverter.convert(null).isPresent()); - } - @Test void assertConvertSubqueryExpression() { SelectStatement selectStatement = new SelectStatement(databaseType); @@ -46,7 +39,6 @@ void assertConvertSubqueryExpression() { projections.getProjections().add(new ParameterMarkerExpressionSegment(0, 0, 0)); selectStatement.setProjections(projections); SubquerySegment subquerySegment = new SubquerySegment(0, 0, selectStatement, "sub"); - SqlNode actual = SubqueryExpressionConverter.convert(new SubqueryExpressionSegment(subquerySegment)).orElse(null); - assertNotNull(actual); + assertNotNull(SubqueryExpressionConverter.convert(new SubqueryExpressionSegment(subquerySegment))); } } From 58a50ff12da79b6413a2c661d49f37490ca46d1c Mon Sep 17 00:00:00 2001 From: zhangliang Date: Fri, 12 Dec 2025 18:17:46 +0800 Subject: [PATCH 10/13] Refactor TrimFunctionConverter --- .../segment/expression/impl/FunctionConverter.java | 2 +- .../segment/expression/impl/TrimFunctionConverter.java | 5 ++--- .../segment/expression/impl/FunctionConverterTest.java | 4 ++-- .../segment/expression/impl/TrimFunctionConverterTest.java | 7 ++----- 4 files changed, 7 insertions(+), 11 deletions(-) diff --git a/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/FunctionConverter.java b/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/FunctionConverter.java index 87a8c8ce1c8b4..9aae12f0f5475 100644 --- a/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/FunctionConverter.java +++ b/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/FunctionConverter.java @@ -62,7 +62,7 @@ public static Optional convert(final FunctionSegment segment) { return Optional.of(functionName); } if ("TRIM".equalsIgnoreCase(functionName.getSimple())) { - return TrimFunctionConverter.convert(segment); + return Optional.of(TrimFunctionConverter.convert(segment)); } if ("OVER".equalsIgnoreCase(functionName.getSimple())) { return WindowFunctionConverter.convert(segment); diff --git a/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/TrimFunctionConverter.java b/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/TrimFunctionConverter.java index 6512922478834..b2a2fac603aaa 100644 --- a/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/TrimFunctionConverter.java +++ b/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/TrimFunctionConverter.java @@ -36,7 +36,6 @@ import java.util.Collection; import java.util.LinkedList; import java.util.List; -import java.util.Optional; /** * Trim function converter. @@ -50,11 +49,11 @@ public final class TrimFunctionConverter { * @param segment function segment * @return SQL node */ - public static Optional convert(final FunctionSegment segment) { + public static SqlBasicCall convert(final FunctionSegment segment) { SqlIdentifier functionName = new SqlIdentifier(segment.getFunctionName(), SqlParserPos.ZERO); List functions = new LinkedList<>(); SqlStdOperatorTable.instance().lookupOperatorOverloads(functionName, null, SqlSyntax.FUNCTION, functions, SqlNameMatchers.withCaseSensitive(false)); - return Optional.of(new SqlBasicCall(functions.iterator().next(), getTrimFunctionParameters(segment.getParameters()), SqlParserPos.ZERO)); + return new SqlBasicCall(functions.iterator().next(), getTrimFunctionParameters(segment.getParameters()), SqlParserPos.ZERO); } private static List getTrimFunctionParameters(final Collection sqlSegments) { diff --git a/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/FunctionConverterTest.java b/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/FunctionConverterTest.java index cdb0c18f79c05..5df91666b89ca 100644 --- a/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/FunctionConverterTest.java +++ b/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/FunctionConverterTest.java @@ -66,8 +66,8 @@ void assertConvertReturnsCurrentUserIdentifier() { @Test void assertConvertDelegatesToTrimFunctionConverter() { FunctionSegment segment = new FunctionSegment(0, 0, "TRIM", "TRIM"); - SqlNode expected = mock(SqlNode.class); - when(TrimFunctionConverter.convert(segment)).thenReturn(Optional.of(expected)); + SqlBasicCall expected = mock(SqlBasicCall.class); + when(TrimFunctionConverter.convert(segment)).thenReturn(expected); SqlNode actual = FunctionConverter.convert(segment).orElse(null); assertThat(actual, is(expected)); } diff --git a/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/TrimFunctionConverterTest.java b/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/TrimFunctionConverterTest.java index d39890de717cd..ba90e76b969c2 100644 --- a/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/TrimFunctionConverterTest.java +++ b/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/TrimFunctionConverterTest.java @@ -33,7 +33,6 @@ import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; -import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -48,8 +47,7 @@ void assertConvertSingleParameterAddsDefaultTrimOptions() { segment.getParameters().add(parameter); SqlNode paramNode = mock(SqlNode.class); when(ExpressionConverter.convert(parameter)).thenReturn(Optional.of(paramNode)); - SqlBasicCall actual = (SqlBasicCall) TrimFunctionConverter.convert(segment).orElse(null); - assertNotNull(actual); + SqlBasicCall actual = TrimFunctionConverter.convert(segment); SqlLiteral trimFlag = (SqlLiteral) actual.getOperandList().get(0); assertThat(trimFlag.getValueAs(Flag.class), is(Flag.BOTH)); SqlLiteral padding = (SqlLiteral) actual.getOperandList().get(1); @@ -68,8 +66,7 @@ void assertConvertTwoParametersAddsDefaultFlag() { SqlNode secondNode = mock(SqlNode.class); when(ExpressionConverter.convert(first)).thenReturn(Optional.of(firstNode)); when(ExpressionConverter.convert(second)).thenReturn(Optional.of(secondNode)); - SqlBasicCall actual = (SqlBasicCall) TrimFunctionConverter.convert(segment).orElse(null); - assertNotNull(actual); + SqlBasicCall actual = TrimFunctionConverter.convert(segment); SqlLiteral trimFlag = (SqlLiteral) actual.getOperandList().get(0); assertThat(trimFlag.getValueAs(Flag.class), is(Flag.BOTH)); assertThat(actual.getOperandList().get(1), is(firstNode)); From 42e502b68aa4e8966848948bcef2d96244c5d237 Mon Sep 17 00:00:00 2001 From: zhangliang Date: Fri, 12 Dec 2025 18:19:26 +0800 Subject: [PATCH 11/13] Refactor UnaryOperationExpressionConverter --- .../converter/segment/expression/ExpressionConverter.java | 4 ++-- .../expression/impl/UnaryOperationExpressionConverter.java | 5 ++--- .../segment/expression/ExpressionConverterTest.java | 4 ++-- .../impl/UnaryOperationExpressionConverterTest.java | 4 +--- 4 files changed, 7 insertions(+), 10 deletions(-) diff --git a/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverter.java b/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverter.java index 134ebf75573f0..26538e3aeb080 100644 --- a/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverter.java +++ b/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverter.java @@ -109,7 +109,7 @@ public static Optional convert(final ExpressionSegment segment) { return Optional.of(ExistsSubqueryExpressionConverter.convert((ExistsSubqueryExpression) segment)); } if (segment instanceof SubqueryExpressionSegment) { - return SubqueryExpressionConverter.convert((SubqueryExpressionSegment) segment); + return Optional.of(SubqueryExpressionConverter.convert((SubqueryExpressionSegment) segment)); } if (segment instanceof InExpression) { return Optional.of(InExpressionConverter.convert((InExpression) segment)); @@ -154,7 +154,7 @@ public static Optional convert(final ExpressionSegment segment) { return VariableSegmentConverter.convert((VariableSegment) segment); } if (segment instanceof UnaryOperationExpression) { - return UnaryOperationExpressionConverter.convert((UnaryOperationExpression) segment); + return Optional.of(UnaryOperationExpressionConverter.convert((UnaryOperationExpression) segment)); } if (segment instanceof IntervalExpression) { return Optional.of(IntervalExpressionConverter.convert((IntervalExpression) segment)); diff --git a/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/UnaryOperationExpressionConverter.java b/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/UnaryOperationExpressionConverter.java index ff48bd5c50956..e8f00dc3f15fb 100644 --- a/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/UnaryOperationExpressionConverter.java +++ b/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/UnaryOperationExpressionConverter.java @@ -33,7 +33,6 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; -import java.util.Optional; /** * Unary operation expression converter. @@ -63,10 +62,10 @@ private static void register(final SqlOperator sqlOperator) { * @param segment unary operation expression * @return SQL node */ - public static Optional convert(final UnaryOperationExpression segment) { + public static SqlBasicCall convert(final UnaryOperationExpression segment) { SqlOperator operator = convertOperator(segment); List sqlNodes = convertSqlNodes(segment); - return Optional.of(new SqlBasicCall(operator, sqlNodes, SqlParserPos.ZERO)); + return new SqlBasicCall(operator, sqlNodes, SqlParserPos.ZERO); } private static SqlOperator convertOperator(final UnaryOperationExpression segment) { diff --git a/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverterTest.java b/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverterTest.java index 2f7b5af676305..8638b511bd076 100644 --- a/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverterTest.java +++ b/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverterTest.java @@ -176,9 +176,9 @@ void assertConvertDelegatesToAllSupportedConverters() { SqlNode expectedVariableNode = mock(SqlNode.class); VariableSegment variableSegment = new VariableSegment(0, 0, "@@session"); when(VariableSegmentConverter.convert(variableSegment)).thenReturn(Optional.of(expectedVariableNode)); - SqlNode expectedUnaryNode = mock(SqlNode.class); + SqlBasicCall expectedUnaryNode = mock(SqlBasicCall.class); UnaryOperationExpression unaryOperationExpression = new UnaryOperationExpression(0, 0, literalSegment, "+", "text"); - when(UnaryOperationExpressionConverter.convert(unaryOperationExpression)).thenReturn(Optional.of(expectedUnaryNode)); + when(UnaryOperationExpressionConverter.convert(unaryOperationExpression)).thenReturn(expectedUnaryNode); SqlBasicCall expectedIntervalNode = mock(SqlBasicCall.class); IntervalExpression intervalExpression = new IntervalExpression(0, 0, literalSegment, IntervalUnit.DAY, "interval"); when(IntervalExpressionConverter.convert(intervalExpression)).thenReturn(expectedIntervalNode); diff --git a/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/UnaryOperationExpressionConverterTest.java b/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/UnaryOperationExpressionConverterTest.java index b957ba7f986c4..daeabf2a42c1d 100644 --- a/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/UnaryOperationExpressionConverterTest.java +++ b/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/UnaryOperationExpressionConverterTest.java @@ -32,7 +32,6 @@ import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; -import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -46,8 +45,7 @@ void assertConvertSupportedOperator() { SqlNode expressionNode = mock(SqlNode.class); when(ExpressionConverter.convert(expression)).thenReturn(Optional.of(expressionNode)); UnaryOperationExpression unaryOperationExpression = new UnaryOperationExpression(0, 0, expression, "~", "~1"); - SqlBasicCall actual = (SqlBasicCall) UnaryOperationExpressionConverter.convert(unaryOperationExpression).orElse(null); - assertNotNull(actual); + SqlBasicCall actual = UnaryOperationExpressionConverter.convert(unaryOperationExpression); assertThat(actual.getOperator(), is(SQLExtensionOperatorTable.TILDE)); assertThat(actual.getOperandList().get(0), is(expressionNode)); } From 0a2f072c0e6ce8adb3e7267d396976389691ed3f Mon Sep 17 00:00:00 2001 From: zhangliang Date: Fri, 12 Dec 2025 18:20:42 +0800 Subject: [PATCH 12/13] Refactor VariableSegmentConverter --- .../converter/segment/expression/ExpressionConverter.java | 2 +- .../segment/expression/impl/VariableSegmentConverter.java | 7 ++----- .../segment/expression/ExpressionConverterTest.java | 4 ++-- .../expression/impl/VariableSegmentConverterTest.java | 8 +------- 4 files changed, 6 insertions(+), 15 deletions(-) diff --git a/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverter.java b/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverter.java index 26538e3aeb080..0d07bfe97708d 100644 --- a/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverter.java +++ b/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverter.java @@ -151,7 +151,7 @@ public static Optional convert(final ExpressionSegment segment) { return Optional.of(RowExpressionConverter.convert((RowExpression) segment)); } if (segment instanceof VariableSegment) { - return VariableSegmentConverter.convert((VariableSegment) segment); + return Optional.of(VariableSegmentConverter.convert((VariableSegment) segment)); } if (segment instanceof UnaryOperationExpression) { return Optional.of(UnaryOperationExpressionConverter.convert((UnaryOperationExpression) segment)); diff --git a/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/VariableSegmentConverter.java b/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/VariableSegmentConverter.java index b5c220aef102f..22a9d695594c0 100644 --- a/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/VariableSegmentConverter.java +++ b/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/VariableSegmentConverter.java @@ -20,12 +20,9 @@ import lombok.AccessLevel; import lombok.NoArgsConstructor; import org.apache.calcite.sql.SqlIdentifier; -import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.parser.SqlParserPos; import org.apache.shardingsphere.sql.parser.statement.core.segment.dal.VariableSegment; -import java.util.Optional; - /** * Variable segment converter. */ @@ -38,7 +35,7 @@ public final class VariableSegmentConverter { * @param segment variable segment * @return SQL node */ - public static Optional convert(final VariableSegment segment) { - return Optional.of(new SqlIdentifier(segment.getText(), SqlParserPos.ZERO)); + public static SqlIdentifier convert(final VariableSegment segment) { + return new SqlIdentifier(segment.getText(), SqlParserPos.ZERO); } } diff --git a/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverterTest.java b/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverterTest.java index 8638b511bd076..c52a8d468abd6 100644 --- a/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverterTest.java +++ b/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverterTest.java @@ -173,9 +173,9 @@ void assertConvertDelegatesToAllSupportedConverters() { SqlNode expectedRowNode = mock(SqlNode.class); RowExpression rowExpression = new RowExpression(0, 0, "row"); when(RowExpressionConverter.convert(rowExpression)).thenReturn(expectedRowNode); - SqlNode expectedVariableNode = mock(SqlNode.class); + SqlIdentifier expectedVariableNode = mock(SqlIdentifier.class); VariableSegment variableSegment = new VariableSegment(0, 0, "@@session"); - when(VariableSegmentConverter.convert(variableSegment)).thenReturn(Optional.of(expectedVariableNode)); + when(VariableSegmentConverter.convert(variableSegment)).thenReturn(expectedVariableNode); SqlBasicCall expectedUnaryNode = mock(SqlBasicCall.class); UnaryOperationExpression unaryOperationExpression = new UnaryOperationExpression(0, 0, literalSegment, "+", "text"); when(UnaryOperationExpressionConverter.convert(unaryOperationExpression)).thenReturn(expectedUnaryNode); diff --git a/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/VariableSegmentConverterTest.java b/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/VariableSegmentConverterTest.java index 3effa2808047d..322a976277cd6 100644 --- a/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/VariableSegmentConverterTest.java +++ b/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/VariableSegmentConverterTest.java @@ -17,23 +17,17 @@ package org.apache.shardingsphere.sqlfederation.compiler.sql.ast.converter.segment.expression.impl; -import org.apache.calcite.sql.SqlIdentifier; -import org.apache.calcite.sql.SqlNode; import org.apache.shardingsphere.sql.parser.statement.core.segment.dal.VariableSegment; import org.junit.jupiter.api.Test; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; -import static org.junit.jupiter.api.Assertions.assertNotNull; class VariableSegmentConverterTest { @Test void assertConvertVariableSegment() { VariableSegment variableSegment = new VariableSegment(0, 0, "@@session.tx"); - SqlNode actual = VariableSegmentConverter.convert(variableSegment).orElse(null); - assertNotNull(actual); - SqlIdentifier identifier = (SqlIdentifier) actual; - assertThat(identifier.getSimple(), is("@@session.tx")); + assertThat(VariableSegmentConverter.convert(variableSegment).getSimple(), is("@@session.tx")); } } From 4c30073d184137ea235a5a9fa90c304ddb6505ef Mon Sep 17 00:00:00 2001 From: zhangliang Date: Fri, 12 Dec 2025 18:22:34 +0800 Subject: [PATCH 13/13] Refactor WindowFunctionConverter --- .../segment/expression/impl/FunctionConverter.java | 2 +- .../segment/expression/impl/WindowFunctionConverter.java | 9 ++++----- .../segment/expression/impl/FunctionConverterTest.java | 4 ++-- .../expression/impl/WindowFunctionConverterTest.java | 7 ++----- 4 files changed, 9 insertions(+), 13 deletions(-) diff --git a/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/FunctionConverter.java b/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/FunctionConverter.java index 9aae12f0f5475..f7e4478641b92 100644 --- a/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/FunctionConverter.java +++ b/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/FunctionConverter.java @@ -65,7 +65,7 @@ public static Optional convert(final FunctionSegment segment) { return Optional.of(TrimFunctionConverter.convert(segment)); } if ("OVER".equalsIgnoreCase(functionName.getSimple())) { - return WindowFunctionConverter.convert(segment); + return Optional.of(WindowFunctionConverter.convert(segment)); } List functions = new LinkedList<>(); SqlStdOperatorTable.instance().lookupOperatorOverloads(functionName, null, SqlSyntax.FUNCTION, functions, SqlNameMatchers.withCaseSensitive(false)); diff --git a/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/WindowFunctionConverter.java b/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/WindowFunctionConverter.java index 4d4b9f4d024df..84fc0a4131640 100644 --- a/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/WindowFunctionConverter.java +++ b/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/WindowFunctionConverter.java @@ -37,7 +37,6 @@ import java.util.Collection; import java.util.LinkedList; import java.util.List; -import java.util.Optional; /** * Window function converter. @@ -51,11 +50,11 @@ public final class WindowFunctionConverter { * @param segment function segment * @return SQL node */ - public static Optional convert(final FunctionSegment segment) { + public static SqlBasicCall convert(final FunctionSegment segment) { SqlIdentifier functionName = new SqlIdentifier(segment.getFunctionName(), SqlParserPos.ZERO); List functions = new LinkedList<>(); SqlStdOperatorTable.instance().lookupOperatorOverloads(functionName, null, SqlSyntax.BINARY, functions, SqlNameMatchers.withCaseSensitive(false)); - return Optional.of(new SqlBasicCall(functions.iterator().next(), getWindowFunctionParameters(segment.getParameters()), SqlParserPos.ZERO)); + return new SqlBasicCall(functions.iterator().next(), getWindowFunctionParameters(segment.getParameters()), SqlParserPos.ZERO); } private static List getWindowFunctionParameters(final Collection sqlSegments) { @@ -64,8 +63,8 @@ private static List getWindowFunctionParameters(final Collection