Commit 69e32f82 authored by terrymanu's avatar terrymanu
Browse files

refactor DDLRoutingEngine=> BroadcastRoutingEngine

parent ea7938fc
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -36,11 +36,11 @@ import io.shardingjdbc.core.routing.type.RoutingEngine;
import io.shardingjdbc.core.routing.type.RoutingResult;
import io.shardingjdbc.core.routing.type.TableUnit;
import io.shardingjdbc.core.routing.type.all.DatabaseAllRoutingEngine;
import io.shardingjdbc.core.routing.type.broadcast.BroadcastRoutingEngine;
import io.shardingjdbc.core.routing.type.complex.CartesianDataSource;
import io.shardingjdbc.core.routing.type.complex.CartesianRoutingResult;
import io.shardingjdbc.core.routing.type.complex.CartesianTableReference;
import io.shardingjdbc.core.routing.type.complex.ComplexRoutingEngine;
import io.shardingjdbc.core.routing.type.ddl.DDLRoutingEngine;
import io.shardingjdbc.core.routing.type.ignore.IgnoreRoutingEngine;
import io.shardingjdbc.core.routing.type.show.ShowRoutingEngine;
import io.shardingjdbc.core.routing.type.simple.SimpleRoutingEngine;
@@ -120,7 +120,7 @@ public final class ParsingSQLRouter implements SQLRouter {
        if (sqlStatement instanceof IgnoreStatement) {
            routingEngine = new IgnoreRoutingEngine();
        } else if (sqlStatement instanceof DDLStatement) {
            routingEngine = new DDLRoutingEngine(shardingRule, parameters, (DDLStatement) sqlStatement);
            routingEngine = new BroadcastRoutingEngine(shardingRule, sqlStatement);
        } else if (sqlStatement instanceof ShowStatement) {
            routingEngine = new ShowRoutingEngine(shardingRule, (ShowStatement) sqlStatement);
        } else if (sqlStatement instanceof DescStatement) {
+81 −0
Original line number Diff line number Diff line
@@ -15,47 +15,67 @@
 * </p>
 */

package io.shardingjdbc.core.routing.type.ddl;
package io.shardingjdbc.core.routing.type.broadcast;

import com.google.common.base.Preconditions;
import io.shardingjdbc.core.parsing.parser.sql.SQLStatement;
import io.shardingjdbc.core.parsing.parser.sql.ddl.DDLStatement;
import io.shardingjdbc.core.parsing.parser.token.IndexToken;
import io.shardingjdbc.core.routing.type.RoutingEngine;
import io.shardingjdbc.core.routing.type.RoutingResult;
import io.shardingjdbc.core.routing.type.simple.SimpleRoutingEngine;
import io.shardingjdbc.core.routing.type.TableUnit;
import io.shardingjdbc.core.rule.DataNode;
import io.shardingjdbc.core.rule.ShardingRule;
import io.shardingjdbc.core.rule.TableRule;
import lombok.RequiredArgsConstructor;

import java.util.List;
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedList;

/**
 * DDL routing engine.
 * Broadcast routing engine.
 * 
 * @author caohao
 * @author zhangliang
 */
@RequiredArgsConstructor
public final class DDLRoutingEngine implements RoutingEngine {
public final class BroadcastRoutingEngine implements RoutingEngine {
    
    private final ShardingRule shardingRule;
    
    private final List<Object> parameters;
    
    private final DDLStatement ddlStatement;
    private final SQLStatement sqlStatement;
    
    @Override
    public RoutingResult route() {
        return new SimpleRoutingEngine(shardingRule, parameters, getLogicTableName(), ddlStatement).route();
        RoutingResult result = new RoutingResult();
        for (String each : getLogicTableNames()) {
            result.getTableUnits().getTableUnits().addAll(getAllTableUnits(each));
        }
        return result;
    }
    
    private String getLogicTableName() {
        if (ddlStatement.getTables().isEmpty()) {
            return shardingRule.getLogicTableName(getIndexToken().getIndexName());
    private Collection<String> getLogicTableNames() {
        if (isOperateIndexWithoutTable()) {
            return Collections.singletonList(shardingRule.getLogicTableName(getIndexToken().getIndexName()));
        }
        return ddlStatement.getTables().getSingleTableName();
        return sqlStatement.getTables().getTableNames();
    }
    
    private boolean isOperateIndexWithoutTable() {
        return sqlStatement instanceof DDLStatement && sqlStatement.getTables().isEmpty();
    }
    
    private IndexToken getIndexToken() {
        Preconditions.checkState(1 == ddlStatement.getSqlTokens().size());
        return (IndexToken) ddlStatement.getSqlTokens().get(0);
        Preconditions.checkState(1 == sqlStatement.getSqlTokens().size());
        return (IndexToken) sqlStatement.getSqlTokens().get(0);
    }
    
    private Collection<TableUnit> getAllTableUnits(final String logicTableName) {
        Collection<TableUnit> result = new LinkedList<>();
        TableRule tableRule = shardingRule.getTableRule(logicTableName);
        for (DataNode each : tableRule.getActualDataNodes()) {
            result.add(new TableUnit(each.getDataSourceName(), logicTableName, each.getTableName()));
        }
        return result;
    }
}