From 7858a1efc085074c866252f7587b62371b3d4258 Mon Sep 17 00:00:00 2001 From: Kanha gupta Date: Sat, 14 Oct 2023 05:02:48 +0530 Subject: [PATCH 1/3] Basic support for MERGE queries --- .../converter/SQLNodeConverterEngine.java | 5 +++ .../merge/MergeStatementConverter.java | 36 +++++++++++++++++++ .../converter/SQLNodeConverterEngineIT.java | 5 ++- .../src/test/resources/converter/merge.xml | 22 ++++++++++++ 4 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/converter/statement/merge/MergeStatementConverter.java create mode 100644 test/it/optimizer/src/test/resources/converter/merge.xml diff --git a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/converter/SQLNodeConverterEngine.java b/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/converter/SQLNodeConverterEngine.java index eb8a934fa9f64..bdd58388aa322 100644 --- a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/converter/SQLNodeConverterEngine.java +++ b/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/converter/SQLNodeConverterEngine.java @@ -26,9 +26,11 @@ import org.apache.shardingsphere.sql.parser.sql.common.statement.dml.InsertStatement; import org.apache.shardingsphere.sql.parser.sql.common.statement.dml.SelectStatement; import org.apache.shardingsphere.sql.parser.sql.common.statement.dml.UpdateStatement; +import org.apache.shardingsphere.sql.parser.sql.common.statement.dml.MergeStatement; import org.apache.shardingsphere.sqlfederation.compiler.converter.statement.delete.DeleteStatementConverter; import org.apache.shardingsphere.sqlfederation.compiler.converter.statement.explain.ExplainStatementConverter; import org.apache.shardingsphere.sqlfederation.compiler.converter.statement.insert.InsertStatementConverter; +import org.apache.shardingsphere.sqlfederation.compiler.converter.statement.merge.MergeStatementConverter; import org.apache.shardingsphere.sqlfederation.compiler.converter.statement.update.UpdateStatementConverter; import org.apache.shardingsphere.sqlfederation.exception.OptimizationSQLNodeConvertException; import org.apache.shardingsphere.sqlfederation.compiler.converter.statement.select.SelectStatementConverter; @@ -62,6 +64,9 @@ public static SqlNode convert(final SQLStatement statement) { if (statement instanceof InsertStatement) { return new InsertStatementConverter().convert((InsertStatement) statement); } + if (statement instanceof MergeStatement) { + return new MergeStatementConverter().convert((MergeStatement) statement); + } throw new OptimizationSQLNodeConvertException(statement); } } diff --git a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/converter/statement/merge/MergeStatementConverter.java b/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/converter/statement/merge/MergeStatementConverter.java new file mode 100644 index 0000000000000..589c305e6f15d --- /dev/null +++ b/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/converter/statement/merge/MergeStatementConverter.java @@ -0,0 +1,36 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.sqlfederation.compiler.converter.statement.merge; + +import org.apache.calcite.sql.SqlMerge; +import org.apache.calcite.sql.SqlNode; +import org.apache.calcite.sql.parser.SqlParserPos; +import org.apache.shardingsphere.sql.parser.sql.common.statement.dml.MergeStatement; +import org.apache.shardingsphere.sqlfederation.compiler.converter.segment.expression.ExpressionConverter; +import org.apache.shardingsphere.sqlfederation.compiler.converter.segment.from.TableConverter; +import org.apache.shardingsphere.sqlfederation.compiler.converter.statement.SQLStatementConverter; + +public final class MergeStatementConverter implements SQLStatementConverter { + @Override + public SqlNode convert(final MergeStatement mergeStatement) { + SqlNode targetTable = new TableConverter().convert(mergeStatement.getTarget()).orElseThrow(IllegalStateException::new); + SqlNode condition = new ExpressionConverter().convert(mergeStatement.getExpression().getExpr()).get(); + SqlNode sourceTable = new TableConverter().convert(mergeStatement.getSource()).orElseThrow(IllegalStateException::new); + return new SqlMerge(SqlParserPos.ZERO, targetTable, condition, sourceTable, null, null, null, null); + } +} diff --git a/test/it/optimizer/src/test/java/org/apache/shardingsphere/test/it/optimizer/converter/SQLNodeConverterEngineIT.java b/test/it/optimizer/src/test/java/org/apache/shardingsphere/test/it/optimizer/converter/SQLNodeConverterEngineIT.java index 708fb470cc222..b8944e705016b 100644 --- a/test/it/optimizer/src/test/java/org/apache/shardingsphere/test/it/optimizer/converter/SQLNodeConverterEngineIT.java +++ b/test/it/optimizer/src/test/java/org/apache/shardingsphere/test/it/optimizer/converter/SQLNodeConverterEngineIT.java @@ -65,6 +65,8 @@ class SQLNodeConverterEngineIT { private static final String UPDATE_STATEMENT_PREFIX = "UPDATE"; private static final String INSERT_STATEMENT_PREFIX = "INSERT"; + + private static final String MERGE_STATEMENT_PREFIX = "MERGE"; @ParameterizedTest(name = "{0} ({1}) -> {2}") @ArgumentsSource(TestCaseArgumentsProvider.class) @@ -111,7 +113,8 @@ private boolean isSupportedSQLCase(final InternalSQLParserTestParameter testPara || testParam.getSqlCaseId().toUpperCase().startsWith(DELETE_STATEMENT_PREFIX) || testParam.getSqlCaseId().toUpperCase().startsWith(EXPLAIN_STATEMENT_PREFIX) || testParam.getSqlCaseId().toUpperCase().startsWith(UPDATE_STATEMENT_PREFIX) - || testParam.getSqlCaseId().toUpperCase().startsWith(INSERT_STATEMENT_PREFIX); + || testParam.getSqlCaseId().toUpperCase().startsWith(INSERT_STATEMENT_PREFIX) + || testParam.getSqlCaseId().toUpperCase().startsWith(MERGE_STATEMENT_PREFIX); } } } diff --git a/test/it/optimizer/src/test/resources/converter/merge.xml b/test/it/optimizer/src/test/resources/converter/merge.xml new file mode 100644 index 0000000000000..b2d0ca14c7ef0 --- /dev/null +++ b/test/it/optimizer/src/test/resources/converter/merge.xml @@ -0,0 +1,22 @@ + + + + + + + From 9b42707e3723af2e56ff84af2d373b9254557e9f Mon Sep 17 00:00:00 2001 From: Kanha gupta Date: Sat, 14 Oct 2023 05:25:41 +0530 Subject: [PATCH 2/3] error resolve --- .../converter/statement/merge/MergeStatementConverter.java | 3 ++- .../test/it/optimizer/converter/SQLNodeConverterEngineIT.java | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/converter/statement/merge/MergeStatementConverter.java b/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/converter/statement/merge/MergeStatementConverter.java index 589c305e6f15d..3ef917f79810c 100644 --- a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/converter/statement/merge/MergeStatementConverter.java +++ b/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/converter/statement/merge/MergeStatementConverter.java @@ -26,11 +26,12 @@ import org.apache.shardingsphere.sqlfederation.compiler.converter.statement.SQLStatementConverter; public final class MergeStatementConverter implements SQLStatementConverter { + @Override public SqlNode convert(final MergeStatement mergeStatement) { SqlNode targetTable = new TableConverter().convert(mergeStatement.getTarget()).orElseThrow(IllegalStateException::new); SqlNode condition = new ExpressionConverter().convert(mergeStatement.getExpression().getExpr()).get(); SqlNode sourceTable = new TableConverter().convert(mergeStatement.getSource()).orElseThrow(IllegalStateException::new); - return new SqlMerge(SqlParserPos.ZERO, targetTable, condition, sourceTable, null, null, null, null); + return new SqlMerge(SqlParserPos.ZERO, targetTable, condition, sourceTable, null, null, null, null); } } diff --git a/test/it/optimizer/src/test/java/org/apache/shardingsphere/test/it/optimizer/converter/SQLNodeConverterEngineIT.java b/test/it/optimizer/src/test/java/org/apache/shardingsphere/test/it/optimizer/converter/SQLNodeConverterEngineIT.java index b8944e705016b..55a6b0f89e730 100644 --- a/test/it/optimizer/src/test/java/org/apache/shardingsphere/test/it/optimizer/converter/SQLNodeConverterEngineIT.java +++ b/test/it/optimizer/src/test/java/org/apache/shardingsphere/test/it/optimizer/converter/SQLNodeConverterEngineIT.java @@ -65,7 +65,7 @@ class SQLNodeConverterEngineIT { private static final String UPDATE_STATEMENT_PREFIX = "UPDATE"; private static final String INSERT_STATEMENT_PREFIX = "INSERT"; - + private static final String MERGE_STATEMENT_PREFIX = "MERGE"; @ParameterizedTest(name = "{0} ({1}) -> {2}") From fe1789492e3c9fef0892a24ee918984ee940dbbd Mon Sep 17 00:00:00 2001 From: Kanha gupta Date: Sun, 15 Oct 2023 03:41:51 +0530 Subject: [PATCH 3/3] java doc add --- .../converter/statement/merge/MergeStatementConverter.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/converter/statement/merge/MergeStatementConverter.java b/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/converter/statement/merge/MergeStatementConverter.java index 3ef917f79810c..d19b2c26adfcf 100644 --- a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/converter/statement/merge/MergeStatementConverter.java +++ b/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/converter/statement/merge/MergeStatementConverter.java @@ -25,6 +25,9 @@ import org.apache.shardingsphere.sqlfederation.compiler.converter.segment.from.TableConverter; import org.apache.shardingsphere.sqlfederation.compiler.converter.statement.SQLStatementConverter; +/** + * Merge statement converter. + */ public final class MergeStatementConverter implements SQLStatementConverter { @Override