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 b44d8c7f107 Refactor FunctionConverter (#37369)
b44d8c7f107 is described below
commit b44d8c7f10710af3d7c9fd06dc4d7e83ec01a560
Author: Liang Zhang <[email protected]>
AuthorDate: Fri Dec 12 23:33:06 2025 +0800
Refactor FunctionConverter (#37369)
---
.../segment/expression/ExpressionConverter.java | 2 +-
.../segment/expression/impl/FunctionConverter.java | 21 ++++++++++-----------
.../segment/expression/ExpressionConverterTest.java | 2 +-
.../expression/impl/FunctionConverterTest.java | 19 ++++++-------------
4 files changed, 18 insertions(+), 26 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 0d07bfe9770..a2329f481b7 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
@@ -121,7 +121,7 @@ public final class ExpressionConverter {
return
Optional.of(ParameterMarkerExpressionConverter.convert((ParameterMarkerExpressionSegment)
segment));
}
if (segment instanceof FunctionSegment) {
- return FunctionConverter.convert((FunctionSegment) segment);
+ return Optional.of(FunctionConverter.convert((FunctionSegment)
segment));
}
if (segment instanceof AggregationProjectionSegment) {
return
AggregationProjectionConverter.convert((AggregationProjectionSegment) segment);
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 f7e4478641b..1a69b1faad1 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
@@ -41,7 +41,6 @@ import java.util.Collection;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
-import java.util.Optional;
/**
* Function converter.
@@ -55,29 +54,29 @@ public final class FunctionConverter {
* @param segment function segment
* @return SQL node
*/
- public static Optional<SqlNode> convert(final FunctionSegment segment) {
+ public static SqlNode convert(final FunctionSegment segment) {
SqlIdentifier functionName = new
SqlIdentifier(getQualifiedFunctionNames(segment), SqlParserPos.ZERO);
- // TODO optimize sql parse logic for select current_user.
+ // TODO optimize SQL parse logic for select current_user
if ("CURRENT_USER".equalsIgnoreCase(functionName.getSimple())) {
- return Optional.of(functionName);
+ return functionName;
}
if ("TRIM".equalsIgnoreCase(functionName.getSimple())) {
- return Optional.of(TrimFunctionConverter.convert(segment));
+ return TrimFunctionConverter.convert(segment);
}
if ("OVER".equalsIgnoreCase(functionName.getSimple())) {
- return Optional.of(WindowFunctionConverter.convert(segment));
+ return WindowFunctionConverter.convert(segment);
}
List<SqlOperator> functions = new LinkedList<>();
SqlStdOperatorTable.instance().lookupOperatorOverloads(functionName,
null, SqlSyntax.FUNCTION, functions, SqlNameMatchers.withCaseSensitive(false));
if (!functions.isEmpty() && segment.getWindow().isPresent()) {
SqlBasicCall functionCall = new
SqlBasicCall(functions.iterator().next(),
getFunctionParameters(segment.getParameters()), SqlParserPos.ZERO);
SqlWindow sqlWindow =
WindowConverter.convertWindowItem(segment.getWindow().get());
- return Optional.of(new SqlBasicCall(SqlStdOperatorTable.OVER, new
SqlNode[]{functionCall, sqlWindow}, SqlParserPos.ZERO));
+ return new SqlBasicCall(SqlStdOperatorTable.OVER, new
SqlNode[]{functionCall, sqlWindow}, SqlParserPos.ZERO);
}
- return Optional.of(functions.isEmpty()
- ? new SqlBasicCall(new SqlUnresolvedFunction(functionName,
null, null, null, null, SqlFunctionCategory.USER_DEFINED_FUNCTION),
getFunctionParameters(segment.getParameters()),
- SqlParserPos.ZERO)
- : new SqlBasicCall(functions.iterator().next(),
getFunctionParameters(segment.getParameters()), SqlParserPos.ZERO));
+ SqlOperator operator = functions.isEmpty()
+ ? new SqlUnresolvedFunction(functionName, null, null, null,
null, SqlFunctionCategory.USER_DEFINED_FUNCTION)
+ : functions.iterator().next();
+ return new SqlBasicCall(operator,
getFunctionParameters(segment.getParameters()), SqlParserPos.ZERO);
}
private static List<String> getQualifiedFunctionNames(final
FunctionSegment 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 c52a8d468ab..7fce651ac09 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
@@ -142,7 +142,7 @@ class ExpressionConverterTest {
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));
+
when(FunctionConverter.convert(functionSegment)).thenReturn(expectedFunctionNode);
SqlNode expectedAggregationNode = mock(SqlNode.class);
AggregationProjectionSegment aggregationSegment = new
AggregationProjectionSegment(0, 0, AggregationType.COUNT, "count(expr)");
when(AggregationProjectionConverter.convert(aggregationSegment)).thenReturn(Optional.of(expectedAggregationNode));
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 39ef00d5efb..53b2e76612e 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
@@ -47,7 +47,6 @@ import java.util.Optional;
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;
@@ -58,8 +57,7 @@ class FunctionConverterTest {
@Test
void assertConvertReturnsCurrentUserIdentifier() {
FunctionSegment segment = new FunctionSegment(0, 0, "CURRENT_USER",
"CURRENT_USER");
- SqlIdentifier actual = (SqlIdentifier)
FunctionConverter.convert(segment).orElse(null);
- assertNotNull(actual);
+ SqlIdentifier actual = (SqlIdentifier)
FunctionConverter.convert(segment);
assertThat(actual.getSimple(), is("CURRENT_USER"));
}
@@ -68,8 +66,7 @@ class FunctionConverterTest {
FunctionSegment segment = new FunctionSegment(0, 0, "TRIM", "TRIM");
SqlBasicCall expected = mock(SqlBasicCall.class);
when(TrimFunctionConverter.convert(segment)).thenReturn(expected);
- SqlNode actual = FunctionConverter.convert(segment).orElse(null);
- assertThat(actual, is(expected));
+ assertThat(FunctionConverter.convert(segment), is(expected));
}
@Test
@@ -77,8 +74,7 @@ class FunctionConverterTest {
FunctionSegment segment = new FunctionSegment(0, 0, "OVER", "OVER");
SqlBasicCall expected = mock(SqlBasicCall.class);
when(WindowFunctionConverter.convert(segment)).thenReturn(expected);
- SqlNode actual = FunctionConverter.convert(segment).orElse(null);
- assertThat(actual, is(expected));
+ assertThat(FunctionConverter.convert(segment), is(expected));
}
@Test
@@ -92,8 +88,7 @@ class FunctionConverterTest {
SqlWindow windowNode = mock(SqlWindow.class);
when(ExpressionConverter.convert(param)).thenReturn(Optional.of(paramNode));
when(WindowConverter.convertWindowItem(windowItemSegment)).thenReturn(windowNode);
- SqlBasicCall actual = (SqlBasicCall)
FunctionConverter.convert(segment).orElse(null);
- assertNotNull(actual);
+ SqlBasicCall actual = (SqlBasicCall)
FunctionConverter.convert(segment);
assertThat(actual.getOperator(), is(SqlStdOperatorTable.OVER));
SqlBasicCall functionCall = (SqlBasicCall)
actual.getOperandList().get(0);
assertThat(functionCall.getOperator().getName(), is("COUNT"));
@@ -113,8 +108,7 @@ class FunctionConverterTest {
SqlNode secondNode = mock(SqlNode.class);
when(ExpressionConverter.convert(firstParam)).thenReturn(Optional.of(new
SqlNodeList(Arrays.asList(nodeInList, listSecondNode), SqlParserPos.ZERO)));
when(ExpressionConverter.convert(secondParam)).thenReturn(Optional.of(secondNode));
- SqlBasicCall actual = (SqlBasicCall)
FunctionConverter.convert(segment).orElse(null);
- assertNotNull(actual);
+ SqlBasicCall actual = (SqlBasicCall)
FunctionConverter.convert(segment);
assertThat(actual.getOperator().getName(), is("SUM"));
assertThat(actual.getOperandList(), is(Arrays.asList(nodeInList,
listSecondNode, secondNode)));
}
@@ -129,8 +123,7 @@ class FunctionConverterTest {
SqlNode paramNode = mock(SqlNode.class);
when(OwnerConverter.convert(owner)).thenReturn(new ArrayList<>());
when(ExpressionConverter.convert(param)).thenReturn(Optional.of(paramNode));
- SqlBasicCall actual = (SqlBasicCall)
FunctionConverter.convert(segment).orElse(null);
- assertNotNull(actual);
+ SqlBasicCall actual = (SqlBasicCall)
FunctionConverter.convert(segment);
assertThat(actual.getOperator(),
instanceOf(SqlUnresolvedFunction.class));
SqlIdentifier functionName = actual.getOperator().getNameAsId();
assertThat(functionName.names,
is(Collections.singletonList("custom_func")));