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 1480d40953f Refactor constructor of MergeStatement to empty
buildAttributes (#38343)
1480d40953f is described below
commit 1480d40953f7fbf9cd1d19b45cde0d7f9e65e2d8
Author: Liang Zhang <[email protected]>
AuthorDate: Wed Mar 4 20:29:07 2026 +0800
Refactor constructor of MergeStatement to empty buildAttributes (#38343)
---
.../ast/converter/SQLNodeConverterEngineTest.java | 2 +-
.../type/MergeStatementConverterTest.java | 17 ++++----
.../type/FirebirdDMLStatementVisitor.java | 13 +++---
.../statement/type/HiveDMLStatementVisitor.java | 8 ++--
.../statement/type/OracleDMLStatementVisitor.java | 28 ++++++-------
.../statement/SQLServerStatementVisitor.java | 23 +++++------
.../core/statement/type/dml/MergeStatement.java | 46 ++++++++++++++--------
7 files changed, 75 insertions(+), 62 deletions(-)
diff --git
a/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/SQLNodeConverterEngineTest.java
b/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/SQLNodeConverterEngineTest.java
index 3f562429804..ec3c3bef47c 100644
---
a/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/SQLNodeConverterEngineTest.java
+++
b/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/SQLNodeConverterEngineTest.java
@@ -83,7 +83,7 @@ class SQLNodeConverterEngineTest {
try (
MockedConstruction<MergeStatementConverter> ignored =
mockConstruction(MergeStatementConverter.class,
(mock, context) ->
when(mock.convert(any(MergeStatement.class))).thenReturn(mergeSqlNode))) {
- assertThat(SQLNodeConverterEngine.convert(new
MergeStatement(databaseType)), is(mergeSqlNode));
+
assertThat(SQLNodeConverterEngine.convert(MergeStatement.builder().databaseType(databaseType).build()),
is(mergeSqlNode));
}
}
diff --git
a/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/statement/type/MergeStatementConverterTest.java
b/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/statement/type/MergeStatementConverterTest.java
index 3d6a92b5474..c47a956e2ff 100644
---
a/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/statement/type/MergeStatementConverterTest.java
+++
b/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/statement/type/MergeStatementConverterTest.java
@@ -51,8 +51,7 @@ class MergeStatementConverterTest {
@Test
void assertConvertWithUpdate() {
- MergeStatement mergeStatement =
createMergeStatement(createSimpleTableSegment("target_table"),
createSimpleTableSegment("source_table"));
- mergeStatement.setUpdate(createUpdateStatement());
+ MergeStatement mergeStatement =
createMergeStatement(createSimpleTableSegment("target_table"),
createSimpleTableSegment("source_table"), createUpdateStatement());
SqlMerge actual = (SqlMerge) new
MergeStatementConverter().convert(mergeStatement);
assertThat(actual.getCondition(), isA(SqlNode.class));
assertThat(actual.getUpdateCall(), isA(SqlUpdate.class));
@@ -67,21 +66,21 @@ class MergeStatementConverterTest {
@Test
void assertConvertUpdateWithEmptyTable() {
- MergeStatement mergeStatement =
createMergeStatement(createSimpleTableSegment("target_table"),
createSimpleTableSegment("source_table"));
UpdateStatement updateStatement = createUpdateStatement();
updateStatement.setTable(createSimpleTableSegment("DUAL"));
- mergeStatement.setUpdate(updateStatement);
+ MergeStatement mergeStatement =
createMergeStatement(createSimpleTableSegment("target_table"),
createSimpleTableSegment("source_table"), updateStatement);
SqlMerge actual = (SqlMerge) new
MergeStatementConverter().convert(mergeStatement);
assertNotNull(actual.getUpdateCall());
assertThat(actual.getUpdateCall().getTargetTable(),
is(SqlNodeList.EMPTY));
}
private MergeStatement createMergeStatement(final SimpleTableSegment
target, final SimpleTableSegment source) {
- MergeStatement result = new MergeStatement(databaseType);
- result.setTarget(target);
- result.setSource(source);
- result.setExpression(new ExpressionWithParamsSegment(0, 0, new
ParameterMarkerExpressionSegment(0, 0, 0)));
- return result;
+ return createMergeStatement(target, source, null);
+ }
+
+ private MergeStatement createMergeStatement(final SimpleTableSegment
target, final SimpleTableSegment source, final UpdateStatement updateStatement)
{
+ return
MergeStatement.builder().databaseType(databaseType).target(target).source(source)
+ .expression(new ExpressionWithParamsSegment(0, 0, new
ParameterMarkerExpressionSegment(0, 0, 0))).update(updateStatement).build();
}
private UpdateStatement createUpdateStatement() {
diff --git
a/parser/sql/engine/dialect/firebird/src/main/java/org/apache/shardingsphere/sql/parser/engine/firebird/visitor/statement/type/FirebirdDMLStatementVisitor.java
b/parser/sql/engine/dialect/firebird/src/main/java/org/apache/shardingsphere/sql/parser/engine/firebird/visitor/statement/type/FirebirdDMLStatementVisitor.java
index 4f44684b875..3691ce0f4e2 100644
---
a/parser/sql/engine/dialect/firebird/src/main/java/org/apache/shardingsphere/sql/parser/engine/firebird/visitor/statement/type/FirebirdDMLStatementVisitor.java
+++
b/parser/sql/engine/dialect/firebird/src/main/java/org/apache/shardingsphere/sql/parser/engine/firebird/visitor/statement/type/FirebirdDMLStatementVisitor.java
@@ -579,11 +579,12 @@ public final class FirebirdDMLStatementVisitor extends
FirebirdStatementVisitor
@Override
public ASTNode visitMerge(final MergeContext ctx) {
- MergeStatement result = new MergeStatement(getDatabaseType());
- result.setTarget((TableSegment) visit(ctx.intoClause()));
- result.setSource((TableSegment) visit(ctx.usingClause()));
- // add mergeWhenNotMatched and mergeWhenMatched part
- // add RETURNING part
- return result;
+ return MergeStatement.builder()
+ .databaseType(getDatabaseType())
+ .target((TableSegment) visit(ctx.intoClause()))
+ .source((TableSegment) visit(ctx.usingClause()))
+ // add mergeWhenNotMatched and mergeWhenMatched part
+ // add RETURNING part
+ .build();
}
}
diff --git
a/parser/sql/engine/dialect/hive/src/main/java/org/apache/shardingsphere/sql/parser/engine/hive/visitor/statement/type/HiveDMLStatementVisitor.java
b/parser/sql/engine/dialect/hive/src/main/java/org/apache/shardingsphere/sql/parser/engine/hive/visitor/statement/type/HiveDMLStatementVisitor.java
index a705f478130..8fdaa01307d 100644
---
a/parser/sql/engine/dialect/hive/src/main/java/org/apache/shardingsphere/sql/parser/engine/hive/visitor/statement/type/HiveDMLStatementVisitor.java
+++
b/parser/sql/engine/dialect/hive/src/main/java/org/apache/shardingsphere/sql/parser/engine/hive/visitor/statement/type/HiveDMLStatementVisitor.java
@@ -1208,12 +1208,10 @@ public final class HiveDMLStatementVisitor extends
HiveStatementVisitor implemen
@Override
public ASTNode visitMerge(final MergeContext ctx) {
- MergeStatement result = new MergeStatement(getDatabaseType());
TableSegment target = (TableSegment) visit(ctx.tableName(0));
if (null != ctx.tableNameAs(0)) {
target.setAlias((AliasSegment) visit(ctx.tableNameAs(0).alias()));
}
- result.setTarget(target);
TableSegment source;
if (null != ctx.tableName(1)) {
source = (TableSegment) visit(ctx.tableName(1));
@@ -1225,9 +1223,8 @@ public final class HiveDMLStatementVisitor extends
HiveStatementVisitor implemen
if (null != ctx.tableNameAs(1)) {
source.setAlias((AliasSegment) visit(ctx.tableNameAs(1).alias()));
}
- result.setSource(source);
ExpressionWithParamsSegment onExpression = new
ExpressionWithParamsSegment(ctx.expr().start.getStartIndex(),
ctx.expr().stop.getStopIndex(), (ExpressionSegment) visit(ctx.expr()));
- result.setExpression(onExpression);
+ Collection<MergeWhenAndThenSegment> whenAndThens = new LinkedList<>();
for (MergeWhenClauseContext each : ctx.mergeWhenClause()) {
int start = each.getStart().getStartIndex();
int stop = each.getStop().getStopIndex();
@@ -1245,8 +1242,9 @@ public final class HiveDMLStatementVisitor extends
HiveStatementVisitor implemen
InsertStatement ins =
InsertStatement.builder().databaseType(getDatabaseType()).values(values).build();
seg.setInsert(ins);
}
- result.getWhenAndThens().add(seg);
+ whenAndThens.add(seg);
}
+ MergeStatement result =
MergeStatement.builder().databaseType(getDatabaseType()).target(target).source(source).expression(onExpression).whenAndThens(whenAndThens).build();
result.addParameterMarkers(getParameterMarkerSegments());
return result;
}
diff --git
a/parser/sql/engine/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/engine/oracle/visitor/statement/type/OracleDMLStatementVisitor.java
b/parser/sql/engine/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/engine/oracle/visitor/statement/type/OracleDMLStatementVisitor.java
index aec322e02d4..d6a7c2b0996 100644
---
a/parser/sql/engine/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/engine/oracle/visitor/statement/type/OracleDMLStatementVisitor.java
+++
b/parser/sql/engine/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/engine/oracle/visitor/statement/type/OracleDMLStatementVisitor.java
@@ -1348,25 +1348,25 @@ public final class OracleDMLStatementVisitor extends
OracleStatementVisitor impl
@Override
public ASTNode visitMerge(final MergeContext ctx) {
- MergeStatement result = new MergeStatement(getDatabaseType());
- result.setTarget((TableSegment) visit(ctx.intoClause()));
- result.setSource((TableSegment) visit(ctx.usingClause()));
+ TableSegment target = (TableSegment) visit(ctx.intoClause());
+ TableSegment source = (TableSegment) visit(ctx.usingClause());
ExpressionWithParamsSegment onExpression = new
ExpressionWithParamsSegment(ctx.usingClause().expr().start.getStartIndex(),
ctx.usingClause().expr().stop.getStopIndex(),
(ExpressionSegment) visit(ctx.usingClause().expr()));
onExpression.getParameterMarkerSegments().addAll(popAllStatementParameterMarkerSegments());
- result.setExpression(onExpression);
+ UpdateStatement update = null;
+ InsertStatement insert = null;
if (null != ctx.mergeUpdateClause() && null != ctx.mergeInsertClause()
&& ctx.mergeUpdateClause().start.getStartIndex() >
ctx.mergeInsertClause().start.getStartIndex()) {
- result.setInsert((InsertStatement)
visitMergeInsertClause(ctx.mergeInsertClause()));
- result.setUpdate((UpdateStatement)
visitMergeUpdateClause(ctx.mergeUpdateClause()));
- result.addParameterMarkers(ctx.getParent() instanceof
ExecuteContext ? getGlobalParameterMarkerSegments() :
popAllStatementParameterMarkerSegments());
- return result;
- }
- if (null != ctx.mergeUpdateClause()) {
- result.setUpdate((UpdateStatement)
visitMergeUpdateClause(ctx.mergeUpdateClause()));
- }
- if (null != ctx.mergeInsertClause()) {
- result.setInsert((InsertStatement)
visitMergeInsertClause(ctx.mergeInsertClause()));
+ insert = (InsertStatement)
visitMergeInsertClause(ctx.mergeInsertClause());
+ update = (UpdateStatement)
visitMergeUpdateClause(ctx.mergeUpdateClause());
+ } else {
+ if (null != ctx.mergeUpdateClause()) {
+ update = (UpdateStatement)
visitMergeUpdateClause(ctx.mergeUpdateClause());
+ }
+ if (null != ctx.mergeInsertClause()) {
+ insert = (InsertStatement)
visitMergeInsertClause(ctx.mergeInsertClause());
+ }
}
+ MergeStatement result =
MergeStatement.builder().databaseType(getDatabaseType()).target(target).source(source).expression(onExpression).update(update).insert(insert).build();
result.addParameterMarkers(ctx.getParent() instanceof ExecuteContext ?
getGlobalParameterMarkerSegments() : popAllStatementParameterMarkerSegments());
return result;
}
diff --git
a/parser/sql/engine/dialect/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/engine/sqlserver/visitor/statement/SQLServerStatementVisitor.java
b/parser/sql/engine/dialect/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/engine/sqlserver/visitor/statement/SQLServerStatementVisitor.java
index b816d657a3b..a239a70716e 100644
---
a/parser/sql/engine/dialect/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/engine/sqlserver/visitor/statement/SQLServerStatementVisitor.java
+++
b/parser/sql/engine/dialect/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/engine/sqlserver/visitor/statement/SQLServerStatementVisitor.java
@@ -2223,39 +2223,40 @@ public abstract class SQLServerStatementVisitor extends
SQLServerStatementBaseVi
@Override
public ASTNode visitMerge(final MergeContext ctx) {
- MergeStatement result = new MergeStatement(databaseType);
- result.setTarget((TableSegment)
visit(ctx.mergeIntoClause().tableReferences()));
+ MergeStatement.MergeStatementBuilder result =
MergeStatement.builder().databaseType(databaseType).target((TableSegment)
visit(ctx.mergeIntoClause().tableReferences()));
if (null != ctx.withClause()) {
- result.setWith((WithSegment) visit(ctx.withClause()));
+ result.with((WithSegment) visit(ctx.withClause()));
}
if (null != ctx.withMergeHint()) {
- result.setWithTableHint((WithTableHintSegment)
visit(ctx.withMergeHint().withTableHint()));
+ result.withTableHint((WithTableHintSegment)
visit(ctx.withMergeHint().withTableHint()));
if (null != ctx.withMergeHint().indexName()) {
Collection<IndexSegment> indexSegments = new LinkedList<>();
for (IndexNameContext each : ctx.withMergeHint().indexName()) {
indexSegments.add((IndexSegment) visit(each));
}
- result.setIndexes(indexSegments);
+ result.indexes(indexSegments);
}
}
if (null != ctx.mergeUsingClause()) {
- result.setSource((TableSegment)
visit(ctx.mergeUsingClause().tableReferences()));
+ result.source((TableSegment)
visit(ctx.mergeUsingClause().tableReferences()));
ExpressionWithParamsSegment onExpression = new
ExpressionWithParamsSegment(ctx.mergeUsingClause().expr().start.getStartIndex(),
ctx.mergeUsingClause().expr().stop.getStopIndex(),
(ExpressionSegment) visit(ctx.mergeUsingClause().expr()));
- result.setExpression(onExpression);
+ result.expression(onExpression);
}
if (null != ctx.mergeWhenClause()) {
+ Collection<MergeWhenAndThenSegment> whenAndThens = new
LinkedList<>();
for (MergeWhenClauseContext each : ctx.mergeWhenClause()) {
- result.getWhenAndThens().add((MergeWhenAndThenSegment)
visit(each));
+ whenAndThens.add((MergeWhenAndThenSegment) visit(each));
}
+ result.whenAndThens(whenAndThens);
}
if (null != ctx.outputClause()) {
- result.setOutput((OutputSegment) visit(ctx.outputClause()));
+ result.output((OutputSegment) visit(ctx.outputClause()));
}
if (null != ctx.optionHint()) {
- result.setOptionHint((OptionHintSegment) visit(ctx.optionHint()));
+ result.optionHint((OptionHintSegment) visit(ctx.optionHint()));
}
- return result;
+ return result.build();
}
@Override
diff --git
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/type/dml/MergeStatement.java
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/type/dml/MergeStatement.java
index f5f3cf8cd8a..b0e4c052e63 100644
---
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/type/dml/MergeStatement.java
+++
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/type/dml/MergeStatement.java
@@ -17,8 +17,8 @@
package org.apache.shardingsphere.sql.parser.statement.core.statement.type.dml;
+import lombok.Builder;
import lombok.Getter;
-import lombok.Setter;
import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.index.IndexSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.ExpressionWithParamsSegment;
@@ -39,35 +39,50 @@ import java.util.Optional;
* Merge statement.
*/
@Getter
-@Setter
public final class MergeStatement extends DMLStatement {
- private TableSegment target;
+ private final TableSegment target;
- private TableSegment source;
+ private final TableSegment source;
- private ExpressionWithParamsSegment expression;
+ private final ExpressionWithParamsSegment expression;
- private UpdateStatement update;
+ private final UpdateStatement update;
- private InsertStatement insert;
+ private final InsertStatement insert;
- private WithSegment with;
+ private final WithSegment with;
- private WithTableHintSegment withTableHint;
+ private final WithTableHintSegment withTableHint;
- private Collection<IndexSegment> indexes = new LinkedList<>();
+ private final Collection<IndexSegment> indexes;
- private OutputSegment output;
+ private final OutputSegment output;
- private OptionHintSegment optionHint;
+ private final OptionHintSegment optionHint;
- private Collection<MergeWhenAndThenSegment> whenAndThens = new
LinkedList<>();
+ private final Collection<MergeWhenAndThenSegment> whenAndThens;
- private SQLStatementAttributes attributes;
+ private final SQLStatementAttributes attributes;
- public MergeStatement(final DatabaseType databaseType) {
+ @Builder
+ private MergeStatement(final DatabaseType databaseType, final TableSegment
target, final TableSegment source, final ExpressionWithParamsSegment expression,
+ final UpdateStatement update, final InsertStatement
insert, final WithSegment with, final WithTableHintSegment withTableHint,
+ final Collection<IndexSegment> indexes, final
OutputSegment output, final OptionHintSegment optionHint,
+ final Collection<MergeWhenAndThenSegment>
whenAndThens) {
super(databaseType);
+ this.target = target;
+ this.source = source;
+ this.expression = expression;
+ this.update = update;
+ this.insert = insert;
+ this.with = with;
+ this.withTableHint = withTableHint;
+ this.indexes = null == indexes ? new LinkedList<>() : indexes;
+ this.output = output;
+ this.optionHint = optionHint;
+ this.whenAndThens = null == whenAndThens ? new LinkedList<>() :
whenAndThens;
+ attributes = new SQLStatementAttributes(new
WithSQLStatementAttribute(with));
}
/**
@@ -126,6 +141,5 @@ public final class MergeStatement extends DMLStatement {
@Override
public void buildAttributes() {
- attributes = new SQLStatementAttributes(new
WithSQLStatementAttribute(with));
}
}