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));

Reply via email to