This is an automated email from the ASF dual-hosted git repository.
zhangliang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git
The following commit(s) were added to refs/heads/master by this push:
new 0518cbefd0d Refactor CaseWhenExpressionConverter and
CollateExpressionConverter (#37362)
0518cbefd0d is described below
commit 0518cbefd0d4dcb773404f487c4e73ab0368ae73
Author: Liang Zhang <[email protected]>
AuthorDate: Fri Dec 12 16:37:55 2025 +0800
Refactor CaseWhenExpressionConverter and CollateExpressionConverter (#37362)
---
.../converter/segment/expression/ExpressionConverter.java | 4 ++--
.../segment/expression/impl/CaseWhenExpressionConverter.java | 12 ++++++------
.../segment/expression/impl/CollateExpressionConverter.java | 5 ++---
.../segment/expression/ExpressionConverterTest.java | 9 +++++----
.../expression/impl/CaseWhenExpressionConverterTest.java | 12 +++++-------
.../expression/impl/CollateExpressionConverterTest.java | 7 ++-----
6 files changed, 22 insertions(+), 27 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 d983ef3b676..8d664f408e4 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
@@ -130,7 +130,7 @@ public final class ExpressionConverter {
return DataTypeExpressionConverter.convert((DataTypeSegment)
segment);
}
if (segment instanceof CaseWhenExpression) {
- return CaseWhenExpressionConverter.convert((CaseWhenExpression)
segment);
+ return
Optional.of(CaseWhenExpressionConverter.convert((CaseWhenExpression) segment));
}
if (segment instanceof NotExpression) {
return NotExpressionConverter.convert((NotExpression) segment);
@@ -145,7 +145,7 @@ public final class ExpressionConverter {
return MatchExpressionConverter.convert((MatchAgainstExpression)
segment);
}
if (segment instanceof CollateExpression) {
- return CollateExpressionConverter.convert((CollateExpression)
segment);
+ return
Optional.of(CollateExpressionConverter.convert((CollateExpression) segment));
}
if (segment instanceof RowExpression) {
return RowExpressionConverter.convert((RowExpression) segment);
diff --git
a/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/CaseWhenExpressionConverter.java
b/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/CaseWhenExpressionConverter.java
index d88254c34fe..f67b0e12386 100644
---
a/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/CaseWhenExpressionConverter.java
+++
b/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/CaseWhenExpressionConverter.java
@@ -47,22 +47,22 @@ public final class CaseWhenExpressionConverter {
* @param segment case when expression
* @return SQL node
*/
- public static Optional<SqlNode> convert(final CaseWhenExpression segment) {
+ public static SqlCase convert(final CaseWhenExpression segment) {
Collection<SqlNode> whenExprs =
convertWhenExprs(segment.getCaseExpr(), segment.getWhenExprs());
Collection<SqlNode> thenExprs = new LinkedList<>();
segment.getThenExprs().forEach(each ->
ExpressionConverter.convert(each).ifPresent(thenExprs::add));
Optional<SqlNode> elseExpr =
ExpressionConverter.convert(segment.getElseExpr());
- return Optional.of(new SqlCase(SqlParserPos.ZERO, null, new
SqlNodeList(whenExprs, SqlParserPos.ZERO), new SqlNodeList(thenExprs,
SqlParserPos.ZERO),
- elseExpr.orElseGet(() -> SqlLiteral.createCharString("NULL",
SqlParserPos.ZERO))));
+ return new SqlCase(SqlParserPos.ZERO, null, new SqlNodeList(whenExprs,
SqlParserPos.ZERO), new SqlNodeList(thenExprs, SqlParserPos.ZERO),
+ elseExpr.orElseGet(() -> SqlLiteral.createCharString("NULL",
SqlParserPos.ZERO)));
}
private static Collection<SqlNode> convertWhenExprs(final
ExpressionSegment caseExpr, final Collection<ExpressionSegment> whenExprs) {
Collection<SqlNode> result = new LinkedList<>();
for (ExpressionSegment each : whenExprs) {
- if (null != caseExpr) {
- convertCaseExpr(caseExpr, each).ifPresent(result::add);
- } else {
+ if (null == caseExpr) {
ExpressionConverter.convert(each).ifPresent(result::add);
+ } else {
+ convertCaseExpr(caseExpr, each).ifPresent(result::add);
}
}
return result;
diff --git
a/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/CollateExpressionConverter.java
b/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/CollateExpressionConverter.java
index f5e863b8b27..cd8f4ab05c9 100644
---
a/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/CollateExpressionConverter.java
+++
b/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/CollateExpressionConverter.java
@@ -29,7 +29,6 @@ import
org.apache.shardingsphere.sqlfederation.compiler.sql.ast.converter.segmen
import java.util.LinkedList;
import java.util.List;
-import java.util.Optional;
/**
* Collate expression converter.
@@ -43,10 +42,10 @@ public final class CollateExpressionConverter {
* @param segment collate expression
* @return SQL node
*/
- public static Optional<SqlNode> convert(final CollateExpression segment) {
+ public static SqlBasicCall convert(final CollateExpression segment) {
List<SqlNode> sqlNodes = new LinkedList<>();
sqlNodes.add(segment.getExpr().flatMap(ExpressionConverter::convert).orElse(SqlNodeList.EMPTY));
sqlNodes.add(ExpressionConverter.convert(segment.getCollateName()).orElse(SqlNodeList.EMPTY));
- return Optional.of(new SqlBasicCall(SQLExtensionOperatorTable.COLLATE,
sqlNodes, SqlParserPos.ZERO));
+ return new SqlBasicCall(SQLExtensionOperatorTable.COLLATE, 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 b4e9b4e7437..6ae46c5b2c4 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
@@ -19,6 +19,7 @@ package
org.apache.shardingsphere.sqlfederation.compiler.sql.ast.converter.segme
import org.apache.calcite.sql.SqlBasicCall;
import org.apache.calcite.sql.SqlNode;
+import org.apache.calcite.sql.fun.SqlCase;
import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
import
org.apache.shardingsphere.infra.exception.generic.UnsupportedSQLOperationException;
import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
@@ -149,9 +150,9 @@ class ExpressionConverterTest {
dataTypeSegment.setDataTypeName("int");
SqlNode expectedDataTypeNode = mock(SqlNode.class);
when(DataTypeExpressionConverter.convert(dataTypeSegment)).thenReturn(Optional.of(expectedDataTypeNode));
- SqlNode expectedCaseWhenNode = mock(SqlNode.class);
+ SqlCase expectedCaseWhenNode = mock(SqlCase.class);
CaseWhenExpression caseWhenExpression = new CaseWhenExpression(0, 0,
literalSegment, Collections.singleton(literalSegment),
Collections.singleton(literalSegment), literalSegment);
-
when(CaseWhenExpressionConverter.convert(caseWhenExpression)).thenReturn(Optional.of(expectedCaseWhenNode));
+
when(CaseWhenExpressionConverter.convert(caseWhenExpression)).thenReturn(expectedCaseWhenNode);
SqlNode expectedNotNode = mock(SqlNode.class);
NotExpression notExpression = new NotExpression(0, 0, literalSegment,
true);
when(NotExpressionConverter.convert(notExpression)).thenReturn(Optional.of(expectedNotNode));
@@ -164,9 +165,9 @@ class ExpressionConverterTest {
SqlNode expectedMatchNode = mock(SqlNode.class);
MatchAgainstExpression matchAgainstExpression = new
MatchAgainstExpression(0, 0, literalSegment, "search", "text");
when(MatchExpressionConverter.convert(matchAgainstExpression)).thenReturn(Optional.of(expectedMatchNode));
- SqlNode expectedCollateNode = mock(SqlNode.class);
+ SqlBasicCall expectedCollateNode = mock(SqlBasicCall.class);
CollateExpression collateExpression = new CollateExpression(0, 0,
literalSegment, literalSegment);
-
when(CollateExpressionConverter.convert(collateExpression)).thenReturn(Optional.of(expectedCollateNode));
+
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));
diff --git
a/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/CaseWhenExpressionConverterTest.java
b/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/CaseWhenExpressionConverterTest.java
index 041da02576b..be5bbdbec9a 100644
---
a/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/CaseWhenExpressionConverterTest.java
+++
b/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/CaseWhenExpressionConverterTest.java
@@ -37,6 +37,7 @@ import java.util.Optional;
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.assertNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@@ -60,8 +61,7 @@ class CaseWhenExpressionConverterTest {
when(ExpressionConverter.convert(whenExpr)).thenReturn(Optional.of(whenNode));
when(ExpressionConverter.convert(thenExpr)).thenReturn(Optional.of(thenNode));
when(ExpressionConverter.convert(elseExpr)).thenReturn(Optional.of(elseNode));
- SqlCase actual = (SqlCase)
CaseWhenExpressionConverter.convert(expression).orElse(null);
- assertNotNull(actual);
+ SqlCase actual = CaseWhenExpressionConverter.convert(expression);
SqlBasicCall whenCall = (SqlBasicCall) actual.getWhenOperands().get(0);
assertThat(whenCall.getOperator(), is(SqlStdOperatorTable.EQUALS));
assertThat(whenCall.getOperandList().get(0), is(caseNode));
@@ -80,9 +80,8 @@ class CaseWhenExpressionConverterTest {
when(ExpressionConverter.convert(whenExpr)).thenReturn(Optional.of(whenNode));
when(ExpressionConverter.convert(thenExpr)).thenReturn(Optional.of(thenNode));
when(ExpressionConverter.convert(null)).thenReturn(Optional.empty());
- SqlCase actual = (SqlCase)
CaseWhenExpressionConverter.convert(expression).orElse(null);
- assertNotNull(actual);
- assertThat(actual.getValueOperand(), is((SqlNode) null));
+ SqlCase actual = CaseWhenExpressionConverter.convert(expression);
+ assertNull(actual.getValueOperand());
assertThat(actual.getWhenOperands().get(0), is(whenNode));
assertThat(actual.getThenOperands().get(0), is(thenNode));
assertNotNull(actual.getElseOperand());
@@ -101,8 +100,7 @@ class CaseWhenExpressionConverterTest {
when(ExpressionConverter.convert(whenExpr)).thenReturn(Optional.empty());
when(ExpressionConverter.convert(thenExpr)).thenReturn(Optional.of(thenNode));
when(ExpressionConverter.convert(null)).thenReturn(Optional.empty());
- SqlCase actual = (SqlCase)
CaseWhenExpressionConverter.convert(expression).orElse(null);
- assertNotNull(actual);
+ SqlCase actual = CaseWhenExpressionConverter.convert(expression);
assertTrue(actual.getWhenOperands().isEmpty());
assertThat(actual.getThenOperands().get(0), is(thenNode));
}
diff --git
a/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/CollateExpressionConverterTest.java
b/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/CollateExpressionConverterTest.java
index 8977e4a70c8..9343550f672 100644
---
a/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/CollateExpressionConverterTest.java
+++
b/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/CollateExpressionConverterTest.java
@@ -35,7 +35,6 @@ import java.util.Optional;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.isA;
-import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@@ -53,8 +52,7 @@ class CollateExpressionConverterTest {
SqlNode collateNode = mock(SqlNode.class);
when(ExpressionConverter.convert(expr)).thenReturn(Optional.of(exprNode));
when(ExpressionConverter.convert(collateName)).thenReturn(Optional.of(collateNode));
- SqlBasicCall actual = (SqlBasicCall)
CollateExpressionConverter.convert(collateExpression).orElse(null);
- assertNotNull(actual);
+ SqlBasicCall actual =
CollateExpressionConverter.convert(collateExpression);
assertThat(actual.getOperator(),
is(SQLExtensionOperatorTable.COLLATE));
assertThat(actual.getOperandList().get(0), is(exprNode));
assertThat(actual.getOperandList().get(1), is(collateNode));
@@ -65,8 +63,7 @@ class CollateExpressionConverterTest {
LiteralExpressionSegment collateName = new LiteralExpressionSegment(0,
0, "collation");
CollateExpression collateExpression = new CollateExpression(0, 0,
collateName, null);
when(ExpressionConverter.convert(collateName)).thenReturn(Optional.empty());
- SqlBasicCall actual = (SqlBasicCall)
CollateExpressionConverter.convert(collateExpression).orElse(null);
- assertNotNull(actual);
+ SqlBasicCall actual =
CollateExpressionConverter.convert(collateExpression);
assertThat(actual.getOperandList().get(0), isA(SqlNodeList.class));
assertTrue(((SqlNodeList) actual.getOperandList().get(0)).isEmpty());
assertThat(actual.getOperandList().get(1), isA(SqlNodeList.class));