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 7eebe94b57e Remove immature MergeStatementBinder (#32057)
7eebe94b57e is described below

commit 7eebe94b57eb2e65563c7138e7385cc1a040fa8f
Author: Liang Zhang <[email protected]>
AuthorDate: Wed Jul 10 20:02:05 2024 +0800

    Remove immature MergeStatementBinder (#32057)
---
 .../binder/statement/dml/MergeStatementBinder.java | 212 ---------------------
 .../infra/binder/type/DMLStatementBindEngine.java  |   5 -
 .../binder/statement/MergeStatementBinderTest.java | 177 -----------------
 3 files changed, 394 deletions(-)

diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/dml/MergeStatementBinder.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/dml/MergeStatementBinder.java
deleted file mode 100644
index 1b177ffb710..00000000000
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/dml/MergeStatementBinder.java
+++ /dev/null
@@ -1,212 +0,0 @@
-/*
- * 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.infra.binder.statement.dml;
-
-import com.cedarsoftware.util.CaseInsensitiveMap;
-import lombok.SneakyThrows;
-import org.apache.shardingsphere.infra.binder.segment.SegmentType;
-import 
org.apache.shardingsphere.infra.binder.segment.column.InsertColumnsSegmentBinder;
-import 
org.apache.shardingsphere.infra.binder.segment.expression.ExpressionSegmentBinder;
-import 
org.apache.shardingsphere.infra.binder.segment.expression.impl.ColumnSegmentBinder;
-import org.apache.shardingsphere.infra.binder.segment.from.TableSegmentBinder;
-import 
org.apache.shardingsphere.infra.binder.segment.from.TableSegmentBinderContext;
-import 
org.apache.shardingsphere.infra.binder.segment.parameter.ParameterMarkerSegmentBinder;
-import org.apache.shardingsphere.infra.binder.segment.where.WhereSegmentBinder;
-import org.apache.shardingsphere.infra.binder.statement.SQLStatementBinder;
-import 
org.apache.shardingsphere.infra.binder.statement.SQLStatementBinderContext;
-import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
-import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.assignment.ColumnAssignmentSegment;
-import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.assignment.InsertValuesSegment;
-import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.assignment.SetAssignmentSegment;
-import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.ColumnSegment;
-import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.InsertColumnsSegment;
-import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.ExpressionSegment;
-import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.ExpressionWithParamsSegment;
-import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.simple.ParameterMarkerExpressionSegment;
-import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ColumnProjectionSegment;
-import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ProjectionSegment;
-import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.ParameterMarkerSegment;
-import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.bounded.ColumnSegmentBoundedInfo;
-import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment;
-import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SubqueryTableSegment;
-import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.TableSegment;
-import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dml.InsertStatement;
-import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dml.MergeStatement;
-import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dml.UpdateStatement;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.LinkedHashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Merge statement binder.
- */
-public final class MergeStatementBinder implements 
SQLStatementBinder<MergeStatement> {
-    
-    @Override
-    public MergeStatement bind(final MergeStatement sqlStatement, final 
ShardingSphereMetaData metaData, final String currentDatabaseName) {
-        return bind(sqlStatement, metaData, currentDatabaseName, 
Collections.emptyMap());
-    }
-    
-    private MergeStatement bind(final MergeStatement sqlStatement, final 
ShardingSphereMetaData metaData, final String currentDatabaseName,
-                                final Map<String, TableSegmentBinderContext> 
externalTableBinderContexts) {
-        MergeStatement result = copy(sqlStatement);
-        SQLStatementBinderContext statementBinderContext = new 
SQLStatementBinderContext(sqlStatement, metaData, currentDatabaseName);
-        
statementBinderContext.getExternalTableBinderContexts().putAll(externalTableBinderContexts);
-        Map<String, TableSegmentBinderContext> targetTableBinderContexts = new 
CaseInsensitiveMap<>();
-        TableSegment boundedTargetTableSegment = 
TableSegmentBinder.bind(sqlStatement.getTarget(), statementBinderContext, 
targetTableBinderContexts, Collections.emptyMap());
-        Map<String, TableSegmentBinderContext> sourceTableBinderContexts = new 
CaseInsensitiveMap<>();
-        TableSegment boundedSourceTableSegment = 
TableSegmentBinder.bind(sqlStatement.getSource(), statementBinderContext, 
sourceTableBinderContexts, Collections.emptyMap());
-        result.setTarget(boundedTargetTableSegment);
-        result.setSource(boundedSourceTableSegment);
-        Map<String, TableSegmentBinderContext> tableBinderContexts = new 
LinkedHashMap<>();
-        tableBinderContexts.putAll(sourceTableBinderContexts);
-        tableBinderContexts.putAll(targetTableBinderContexts);
-        if (null != sqlStatement.getExpression()) {
-            ExpressionWithParamsSegment expression = new 
ExpressionWithParamsSegment(sqlStatement.getExpression().getStartIndex(), 
sqlStatement.getExpression().getStopIndex(),
-                    
ExpressionSegmentBinder.bind(sqlStatement.getExpression().getExpr(), 
SegmentType.JOIN_ON, statementBinderContext, tableBinderContexts, 
Collections.emptyMap()));
-            
expression.getParameterMarkerSegments().addAll(sqlStatement.getExpression().getParameterMarkerSegments());
-            result.setExpression(expression);
-        }
-        sqlStatement.getInsert().ifPresent(
-                optional -> result.setInsert(bindMergeInsert(optional, 
(SimpleTableSegment) boundedTargetTableSegment, statementBinderContext, 
targetTableBinderContexts, sourceTableBinderContexts)));
-        sqlStatement.getUpdate().ifPresent(
-                optional -> result.setUpdate(bindMergeUpdate(optional, 
(SimpleTableSegment) boundedTargetTableSegment, statementBinderContext, 
targetTableBinderContexts, sourceTableBinderContexts)));
-        addParameterMarkerSegments(result);
-        return result;
-    }
-    
-    @SneakyThrows(ReflectiveOperationException.class)
-    private MergeStatement copy(final MergeStatement sqlStatement) {
-        MergeStatement result = 
sqlStatement.getClass().getDeclaredConstructor().newInstance();
-        result.getCommentSegments().addAll(sqlStatement.getCommentSegments());
-        return result;
-    }
-    
-    private void addParameterMarkerSegments(final MergeStatement 
mergeStatement) {
-        // TODO bind parameter marker segments for merge statement
-        
mergeStatement.addParameterMarkerSegments(getSourceSubqueryTableProjectionParameterMarkers(mergeStatement.getSource()));
-        mergeStatement.getInsert().ifPresent(optional -> 
mergeStatement.addParameterMarkerSegments(optional.getParameterMarkerSegments()));
-        mergeStatement.getUpdate().ifPresent(optional -> 
mergeStatement.addParameterMarkerSegments(optional.getParameterMarkerSegments()));
-    }
-    
-    private Collection<ParameterMarkerSegment> 
getSourceSubqueryTableProjectionParameterMarkers(final TableSegment 
tableSegment) {
-        if (!(tableSegment instanceof SubqueryTableSegment)) {
-            return Collections.emptyList();
-        }
-        SubqueryTableSegment subqueryTable = (SubqueryTableSegment) 
tableSegment;
-        Collection<ParameterMarkerSegment> result = new LinkedList<>();
-        for (ProjectionSegment each : 
subqueryTable.getSubquery().getSelect().getProjections().getProjections()) {
-            if (each instanceof ParameterMarkerExpressionSegment) {
-                result.add((ParameterMarkerSegment) each);
-            }
-        }
-        return result;
-    }
-    
-    @SneakyThrows
-    private InsertStatement bindMergeInsert(final InsertStatement 
sqlStatement, final SimpleTableSegment tableSegment, final 
SQLStatementBinderContext statementBinderContext,
-                                            final Map<String, 
TableSegmentBinderContext> targetTableBinderContexts, final Map<String, 
TableSegmentBinderContext> sourceTableBinderContexts) {
-        SQLStatementBinderContext insertStatementBinderContext = new 
SQLStatementBinderContext(statementBinderContext.getMetaData(), 
statementBinderContext.getCurrentDatabaseName(),
-                statementBinderContext.getDatabaseType(), 
statementBinderContext.getVariableNames());
-        
insertStatementBinderContext.getExternalTableBinderContexts().putAll(statementBinderContext.getExternalTableBinderContexts());
-        
insertStatementBinderContext.getExternalTableBinderContexts().putAll(sourceTableBinderContexts);
-        InsertStatement result = 
sqlStatement.getClass().getDeclaredConstructor().newInstance();
-        result.setTable(tableSegment);
-        sqlStatement.getInsertColumns()
-                .ifPresent(optional -> 
result.setInsertColumns(InsertColumnsSegmentBinder.bind(sqlStatement.getInsertColumns().get(),
 statementBinderContext, targetTableBinderContexts)));
-        sqlStatement.getInsertSelect().ifPresent(result::setInsertSelect);
-        Collection<InsertValuesSegment> insertValues = new LinkedList<>();
-        Map<ParameterMarkerSegment, ColumnSegmentBoundedInfo> 
parameterMarkerSegmentBoundedInfos = new LinkedHashMap<>();
-        List<ColumnSegment> columnSegments = new 
ArrayList<>(result.getInsertColumns().map(InsertColumnsSegment::getColumns)
-                .orElseGet(() -> 
getVisibleColumns(targetTableBinderContexts.values().iterator().next().getProjectionSegments())));
-        for (InsertValuesSegment each : sqlStatement.getValues()) {
-            List<ExpressionSegment> values = new LinkedList<>();
-            int index = 0;
-            for (ExpressionSegment expression : each.getValues()) {
-                values.add(ExpressionSegmentBinder.bind(expression, 
SegmentType.VALUES, insertStatementBinderContext, targetTableBinderContexts, 
sourceTableBinderContexts));
-                if (expression instanceof ParameterMarkerSegment) {
-                    
parameterMarkerSegmentBoundedInfos.put((ParameterMarkerSegment) expression, 
columnSegments.get(index).getColumnBoundedInfo());
-                }
-                index++;
-            }
-            insertValues.add(new InsertValuesSegment(each.getStartIndex(), 
each.getStopIndex(), values));
-        }
-        result.getValues().addAll(insertValues);
-        
sqlStatement.getOnDuplicateKeyColumns().ifPresent(result::setOnDuplicateKeyColumns);
-        sqlStatement.getSetAssignment().ifPresent(result::setSetAssignment);
-        sqlStatement.getWithSegment().ifPresent(result::setWithSegment);
-        sqlStatement.getOutputSegment().ifPresent(result::setOutputSegment);
-        
sqlStatement.getMultiTableInsertType().ifPresent(result::setMultiTableInsertType);
-        
sqlStatement.getMultiTableInsertIntoSegment().ifPresent(result::setMultiTableInsertIntoSegment);
-        
sqlStatement.getMultiTableConditionalIntoSegment().ifPresent(result::setMultiTableConditionalIntoSegment);
-        
sqlStatement.getReturningSegment().ifPresent(result::setReturningSegment);
-        sqlStatement.getWhere().ifPresent(optional -> 
result.setWhere(WhereSegmentBinder.bind(optional, insertStatementBinderContext, 
targetTableBinderContexts, sourceTableBinderContexts)));
-        
result.addParameterMarkerSegments(ParameterMarkerSegmentBinder.bind(sqlStatement.getParameterMarkerSegments(),
 parameterMarkerSegmentBoundedInfos));
-        result.getCommentSegments().addAll(sqlStatement.getCommentSegments());
-        return result;
-    }
-    
-    private Collection<ColumnSegment> getVisibleColumns(final 
Collection<ProjectionSegment> projectionSegments) {
-        Collection<ColumnSegment> result = new LinkedList<>();
-        for (ProjectionSegment each : projectionSegments) {
-            if (each instanceof ColumnProjectionSegment && each.isVisible()) {
-                result.add(((ColumnProjectionSegment) each).getColumn());
-            }
-        }
-        return result;
-    }
-    
-    @SneakyThrows
-    private UpdateStatement bindMergeUpdate(final UpdateStatement 
sqlStatement, final SimpleTableSegment tableSegment, final 
SQLStatementBinderContext statementBinderContext,
-                                            final Map<String, 
TableSegmentBinderContext> targetTableBinderContexts, final Map<String, 
TableSegmentBinderContext> sourceTableBinderContexts) {
-        UpdateStatement result = 
sqlStatement.getClass().getDeclaredConstructor().newInstance();
-        result.setTable(tableSegment);
-        Collection<ColumnAssignmentSegment> assignments = new LinkedList<>();
-        SQLStatementBinderContext updateStatementBinderContext = new 
SQLStatementBinderContext(statementBinderContext.getMetaData(), 
statementBinderContext.getCurrentDatabaseName(),
-                statementBinderContext.getDatabaseType(), 
statementBinderContext.getVariableNames());
-        
updateStatementBinderContext.getExternalTableBinderContexts().putAll(statementBinderContext.getExternalTableBinderContexts());
-        
updateStatementBinderContext.getExternalTableBinderContexts().putAll(sourceTableBinderContexts);
-        Map<ParameterMarkerSegment, ColumnSegmentBoundedInfo> 
parameterMarkerSegmentBoundedInfos = new 
LinkedHashMap<>(sqlStatement.getSetAssignment().getAssignments().size(), 1F);
-        for (ColumnAssignmentSegment each : 
sqlStatement.getSetAssignment().getAssignments()) {
-            List<ColumnSegment> columnSegments = new 
ArrayList<>(each.getColumns().size());
-            each.getColumns().forEach(column -> columnSegments.add(
-                    ColumnSegmentBinder.bind(column, 
SegmentType.SET_ASSIGNMENT, updateStatementBinderContext, 
targetTableBinderContexts, Collections.emptyMap())));
-            ExpressionSegment expression = 
ExpressionSegmentBinder.bind(each.getValue(), SegmentType.SET_ASSIGNMENT, 
updateStatementBinderContext, targetTableBinderContexts, 
Collections.emptyMap());
-            ColumnAssignmentSegment columnAssignmentSegment = new 
ColumnAssignmentSegment(each.getStartIndex(), each.getStopIndex(), 
columnSegments, expression);
-            assignments.add(columnAssignmentSegment);
-            if (expression instanceof ParameterMarkerSegment) {
-                
parameterMarkerSegmentBoundedInfos.put((ParameterMarkerSegment) expression, 
columnAssignmentSegment.getColumns().get(0).getColumnBoundedInfo());
-            }
-        }
-        SetAssignmentSegment setAssignmentSegment = new 
SetAssignmentSegment(sqlStatement.getSetAssignment().getStartIndex(), 
sqlStatement.getSetAssignment().getStopIndex(), assignments);
-        result.setSetAssignment(setAssignmentSegment);
-        sqlStatement.getWhere().ifPresent(optional -> 
result.setWhere(WhereSegmentBinder.bind(optional, updateStatementBinderContext, 
targetTableBinderContexts, Collections.emptyMap())));
-        sqlStatement.getDeleteWhere().ifPresent(optional -> 
result.setDeleteWhere(WhereSegmentBinder.bind(optional, 
updateStatementBinderContext, targetTableBinderContexts, 
Collections.emptyMap())));
-        sqlStatement.getOrderBy().ifPresent(result::setOrderBy);
-        sqlStatement.getLimit().ifPresent(result::setLimit);
-        sqlStatement.getWithSegment().ifPresent(result::setWithSegment);
-        
result.addParameterMarkerSegments(ParameterMarkerSegmentBinder.bind(sqlStatement.getParameterMarkerSegments(),
 parameterMarkerSegmentBoundedInfos));
-        result.getCommentSegments().addAll(sqlStatement.getCommentSegments());
-        return result;
-    }
-}
diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/type/DMLStatementBindEngine.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/type/DMLStatementBindEngine.java
index a8da53fdf01..72bbd3fdc65 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/type/DMLStatementBindEngine.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/type/DMLStatementBindEngine.java
@@ -20,14 +20,12 @@ package org.apache.shardingsphere.infra.binder.type;
 import lombok.RequiredArgsConstructor;
 import 
org.apache.shardingsphere.infra.binder.statement.dml.DeleteStatementBinder;
 import 
org.apache.shardingsphere.infra.binder.statement.dml.InsertStatementBinder;
-import 
org.apache.shardingsphere.infra.binder.statement.dml.MergeStatementBinder;
 import 
org.apache.shardingsphere.infra.binder.statement.dml.SelectStatementBinder;
 import 
org.apache.shardingsphere.infra.binder.statement.dml.UpdateStatementBinder;
 import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dml.DMLStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dml.DeleteStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dml.InsertStatement;
-import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dml.MergeStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dml.SelectStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dml.UpdateStatement;
 
@@ -60,9 +58,6 @@ public final class DMLStatementBindEngine {
         if (statement instanceof DeleteStatement) {
             return new DeleteStatementBinder().bind((DeleteStatement) 
statement, metaData, currentDatabaseName);
         }
-        if (statement instanceof MergeStatement) {
-            return new MergeStatementBinder().bind((MergeStatement) statement, 
metaData, currentDatabaseName);
-        }
         return statement;
     }
 }
diff --git 
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/statement/MergeStatementBinderTest.java
 
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/statement/MergeStatementBinderTest.java
deleted file mode 100644
index ba288eaa953..00000000000
--- 
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/statement/MergeStatementBinderTest.java
+++ /dev/null
@@ -1,177 +0,0 @@
-/*
- * 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.infra.binder.statement;
-
-import 
org.apache.shardingsphere.infra.binder.statement.dml.MergeStatementBinder;
-import org.apache.shardingsphere.infra.database.core.DefaultDatabase;
-import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
-import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereColumn;
-import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
-import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.assignment.ColumnAssignmentSegment;
-import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.assignment.SetAssignmentSegment;
-import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.ColumnSegment;
-import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.BinaryOperationExpression;
-import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.ExpressionWithParamsSegment;
-import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.simple.LiteralExpressionSegment;
-import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.subquery.SubquerySegment;
-import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ExpressionProjectionSegment;
-import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ProjectionsSegment;
-import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.predicate.WhereSegment;
-import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.AliasSegment;
-import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.OwnerSegment;
-import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment;
-import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SubqueryTableSegment;
-import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.TableNameSegment;
-import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dml.MergeStatement;
-import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dml.UpdateStatement;
-import 
org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
-import 
org.apache.shardingsphere.sql.parser.statement.oracle.dml.OracleMergeStatement;
-import 
org.apache.shardingsphere.sql.parser.statement.oracle.dml.OracleSelectStatement;
-import 
org.apache.shardingsphere.sql.parser.statement.oracle.dml.OracleUpdateStatement;
-import org.junit.jupiter.api.Test;
-
-import java.sql.Types;
-import java.util.Arrays;
-import java.util.Collections;
-
-import static org.hamcrest.CoreMatchers.instanceOf;
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.CoreMatchers.not;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-class MergeStatementBinderTest {
-    
-    @Test
-    void assertBind() {
-        MergeStatement mergeStatement = new OracleMergeStatement();
-        SimpleTableSegment targetTable = new SimpleTableSegment(new 
TableNameSegment(0, 0, new IdentifierValue("t_order")));
-        targetTable.setAlias(new AliasSegment(0, 0, new IdentifierValue("a")));
-        mergeStatement.setTarget(targetTable);
-        SimpleTableSegment sourceTable = new SimpleTableSegment(new 
TableNameSegment(0, 0, new IdentifierValue("t_order_item")));
-        sourceTable.setAlias(new AliasSegment(0, 0, new IdentifierValue("b")));
-        mergeStatement.setSource(sourceTable);
-        mergeStatement.setExpression(new ExpressionWithParamsSegment(0, 0, new 
BinaryOperationExpression(0, 0, new ColumnSegment(0, 0, new 
IdentifierValue("id")),
-                new ColumnSegment(0, 0, new IdentifierValue("order_id")), "=", 
"id = order_id")));
-        UpdateStatement updateStatement = new OracleUpdateStatement();
-        updateStatement.setTable(targetTable);
-        ColumnSegment targetTableColumn = new ColumnSegment(0, 0, new 
IdentifierValue("status"));
-        targetTableColumn.setOwner(new OwnerSegment(0, 0, new 
IdentifierValue("a")));
-        ColumnSegment sourceTableColumn = new ColumnSegment(0, 0, new 
IdentifierValue("status"));
-        sourceTableColumn.setOwner(new OwnerSegment(0, 0, new 
IdentifierValue("b")));
-        SetAssignmentSegment setAssignmentSegment = new 
SetAssignmentSegment(0, 0,
-                Collections.singletonList(new ColumnAssignmentSegment(0, 0, 
Collections.singletonList(targetTableColumn), sourceTableColumn)));
-        updateStatement.setSetAssignment(setAssignmentSegment);
-        updateStatement.setWhere(new WhereSegment(0, 0, new 
BinaryOperationExpression(0, 0, new ColumnSegment(0, 0, new 
IdentifierValue("item_id")),
-                new LiteralExpressionSegment(0, 0, 1), "=", "item_id = 1")));
-        mergeStatement.setUpdate(updateStatement);
-        MergeStatement actual = new 
MergeStatementBinder().bind(mergeStatement, createMetaData(), 
DefaultDatabase.LOGIC_NAME);
-        assertThat(actual, not(mergeStatement));
-        assertThat(actual.getSource(), not(mergeStatement.getSource()));
-        assertThat(actual.getSource(), instanceOf(SimpleTableSegment.class));
-        assertThat(actual.getTarget(), not(mergeStatement.getTarget()));
-        assertThat(actual.getTarget(), instanceOf(SimpleTableSegment.class));
-        assertTrue(actual.getUpdate().isPresent());
-        assertThat(actual.getUpdate().get(), not(mergeStatement.getUpdate()));
-        
assertThat(actual.getUpdate().get().getSetAssignment().getAssignments().iterator().next().getValue(),
 instanceOf(ColumnSegment.class));
-        assertThat(((ColumnSegment) 
actual.getUpdate().get().getSetAssignment().getAssignments().iterator().next().getValue()).getColumnBoundedInfo().getOriginalTable().getValue(),
-                is("t_order_item"));
-    }
-    
-    private ShardingSphereMetaData createMetaData() {
-        ShardingSphereSchema schema = mock(ShardingSphereSchema.class, 
RETURNS_DEEP_STUBS);
-        
when(schema.getTable("t_order").getColumnValues()).thenReturn(Arrays.asList(
-                new ShardingSphereColumn("id", Types.INTEGER, true, false, 
false, true, false, false),
-                new ShardingSphereColumn("user_id", Types.INTEGER, false, 
false, false, true, false, false),
-                new ShardingSphereColumn("status", Types.INTEGER, false, 
false, false, true, false, false)));
-        
when(schema.getTable("t_order_item").getColumnValues()).thenReturn(Arrays.asList(
-                new ShardingSphereColumn("item_id", Types.INTEGER, true, 
false, false, true, false, false),
-                new ShardingSphereColumn("order_id", Types.INTEGER, false, 
false, false, true, false, false),
-                new ShardingSphereColumn("status", Types.INTEGER, false, 
false, false, true, false, false)));
-        ShardingSphereMetaData result = mock(ShardingSphereMetaData.class, 
RETURNS_DEEP_STUBS);
-        
when(result.getDatabase(DefaultDatabase.LOGIC_NAME).getSchema(DefaultDatabase.LOGIC_NAME)).thenReturn(schema);
-        
when(result.containsDatabase(DefaultDatabase.LOGIC_NAME)).thenReturn(true);
-        
when(result.getDatabase(DefaultDatabase.LOGIC_NAME).containsSchema(DefaultDatabase.LOGIC_NAME)).thenReturn(true);
-        
when(result.getDatabase(DefaultDatabase.LOGIC_NAME).getSchema(DefaultDatabase.LOGIC_NAME).containsTable("t_order")).thenReturn(true);
-        
when(result.getDatabase(DefaultDatabase.LOGIC_NAME).getSchema(DefaultDatabase.LOGIC_NAME).containsTable("t_order_item")).thenReturn(true);
-        return result;
-    }
-    
-    @Test
-    void assertBindWithSubQuery() {
-        MergeStatement mergeStatement = new OracleMergeStatement();
-        SimpleTableSegment targetTable = new SimpleTableSegment(new 
TableNameSegment(0, 0, new IdentifierValue("t_order")));
-        targetTable.setAlias(new AliasSegment(0, 0, new IdentifierValue("a")));
-        mergeStatement.setTarget(targetTable);
-        ProjectionsSegment projectionsSegment = new ProjectionsSegment(0, 0);
-        ExpressionProjectionSegment expressionProjectionSegment = new 
ExpressionProjectionSegment(0, 0, "status + 1", new 
BinaryOperationExpression(0, 0,
-                new ColumnSegment(0, 0, new IdentifierValue("status")), new 
LiteralExpressionSegment(0, 0, 1), "+", "status + 1"));
-        expressionProjectionSegment.setAlias(new AliasSegment(0, 0, new 
IdentifierValue("new_status")));
-        projectionsSegment.getProjections().add(expressionProjectionSegment);
-        OracleSelectStatement oracleSelectStatement = new 
OracleSelectStatement();
-        oracleSelectStatement.setProjections(projectionsSegment);
-        oracleSelectStatement.setFrom(new SimpleTableSegment(new 
TableNameSegment(0, 0, new IdentifierValue("t_order_item"))));
-        SubqueryTableSegment subqueryTableSegment = new 
SubqueryTableSegment(0, 0, new SubquerySegment(0, 0, oracleSelectStatement, 
""));
-        subqueryTableSegment.setAlias(new AliasSegment(0, 0, new 
IdentifierValue("b")));
-        mergeStatement.setSource(subqueryTableSegment);
-        UpdateStatement updateStatement = new OracleUpdateStatement();
-        ColumnSegment targetTableColumn = new ColumnSegment(0, 0, new 
IdentifierValue("status"));
-        targetTableColumn.setOwner(new OwnerSegment(0, 0, new 
IdentifierValue("a")));
-        ColumnSegment sourceTableColumn = new ColumnSegment(0, 0, new 
IdentifierValue("new_status"));
-        SetAssignmentSegment setAssignmentSegment = new 
SetAssignmentSegment(0, 0,
-                Collections.singletonList(new ColumnAssignmentSegment(0, 0, 
Collections.singletonList(targetTableColumn), sourceTableColumn)));
-        updateStatement.setSetAssignment(setAssignmentSegment);
-        mergeStatement.setUpdate(updateStatement);
-        MergeStatement actual = new 
MergeStatementBinder().bind(mergeStatement, createMetaData(), 
DefaultDatabase.LOGIC_NAME);
-        assertThat(actual, not(mergeStatement));
-    }
-    
-    @Test
-    void assertBindUpdateDeleteWhere() {
-        MergeStatement mergeStatement = new OracleMergeStatement();
-        SimpleTableSegment targetTable = new SimpleTableSegment(new 
TableNameSegment(0, 0, new IdentifierValue("t_order")));
-        targetTable.setAlias(new AliasSegment(0, 0, new IdentifierValue("a")));
-        mergeStatement.setTarget(targetTable);
-        SimpleTableSegment sourceTable = new SimpleTableSegment(new 
TableNameSegment(0, 0, new IdentifierValue("t_order_item")));
-        sourceTable.setAlias(new AliasSegment(0, 0, new IdentifierValue("b")));
-        mergeStatement.setSource(sourceTable);
-        OracleUpdateStatement updateStatement = new OracleUpdateStatement();
-        updateStatement.setTable(targetTable);
-        ColumnSegment targetTableColumn = new ColumnSegment(0, 0, new 
IdentifierValue("status"));
-        targetTableColumn.setOwner(new OwnerSegment(0, 0, new 
IdentifierValue("a")));
-        ColumnSegment sourceTableColumn = new ColumnSegment(0, 0, new 
IdentifierValue("status"));
-        sourceTableColumn.setOwner(new OwnerSegment(0, 0, new 
IdentifierValue("b")));
-        SetAssignmentSegment setAssignmentSegment = new 
SetAssignmentSegment(0, 0,
-                Collections.singletonList(new ColumnAssignmentSegment(0, 0, 
Collections.singletonList(targetTableColumn), sourceTableColumn)));
-        updateStatement.setSetAssignment(setAssignmentSegment);
-        updateStatement.setDeleteWhere(new WhereSegment(0, 0, new 
BinaryOperationExpression(0, 0, new ColumnSegment(0, 0, new 
IdentifierValue("item_id")),
-                new LiteralExpressionSegment(0, 0, 1), "=", "item_id = 1")));
-        mergeStatement.setUpdate(updateStatement);
-        MergeStatement actual = new 
MergeStatementBinder().bind(mergeStatement, createMetaData(), 
DefaultDatabase.LOGIC_NAME);
-        assertTrue(actual.getUpdate().isPresent());
-        assertThat(actual.getUpdate().get(), 
instanceOf(OracleUpdateStatement.class));
-        assertTrue(actual.getUpdate().get().getDeleteWhere().isPresent());
-        assertThat(actual.getUpdate().get().getDeleteWhere().get().getExpr(), 
instanceOf(BinaryOperationExpression.class));
-        assertThat(((BinaryOperationExpression) 
actual.getUpdate().get().getDeleteWhere().get().getExpr()).getLeft(), 
instanceOf(ColumnSegment.class));
-        assertThat(((ColumnSegment) ((BinaryOperationExpression) 
actual.getUpdate().get().getDeleteWhere().get().getExpr()).getLeft())
-                .getColumnBoundedInfo().getOriginalTable().getValue(), 
is("t_order_item"));
-    }
-}

Reply via email to