Commit ea7938fc authored by terrymanu's avatar terrymanu
Browse files

add findDataNodeByLogicTable

parent 3bafcc56
Loading
Loading
Loading
Loading
+3 −10
Original line number Diff line number Diff line
@@ -17,14 +17,12 @@

package io.shardingjdbc.core.routing.type.unicast;

import com.google.common.base.Preconditions;
import io.shardingjdbc.core.parsing.parser.sql.SQLStatement;
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.rule.DataNode;
import io.shardingjdbc.core.rule.ShardingRule;
import io.shardingjdbc.core.rule.TableRule;
import lombok.RequiredArgsConstructor;

/**
@@ -45,14 +43,9 @@ public final class UnicastRoutingEngine implements RoutingEngine {
        if (sqlStatement.getTables().isEmpty()) {
            result.getTableUnits().getTableUnits().add(new TableUnit(shardingRule.getDataSourceMap().keySet().iterator().next(), "", ""));
        } else if (sqlStatement.getTables().isSingleTable()) {
            TableRule tableRule = shardingRule.getTableRule(sqlStatement.getTables().getSingleTableName());
            for (DataNode each : tableRule.getActualDataNodes()) {
                if (shardingRule.getDataSourceMap().containsKey(each.getDataSourceName())) {
                    result.getTableUnits().getTableUnits().add(new TableUnit(each.getDataSourceName(), tableRule.getLogicTable(), each.getTableName()));
                    break;
                }
            }
            Preconditions.checkState(1 == result.getTableUnits().getTableUnits().size(), String.format("Cannot find actual data node for logic table name: '%s'", tableRule.getLogicTable()));
            String logicTableName = sqlStatement.getTables().getSingleTableName();
            DataNode dataNode = shardingRule.findDataNodeByLogicTable(logicTableName);
            result.getTableUnits().getTableUnits().add(new TableUnit(dataNode.getDataSourceName(), logicTableName, dataNode.getTableName()));
        } else {
            throw new UnsupportedOperationException("Cannot support unicast routing for multiple tables.");
        }
+16 −0
Original line number Diff line number Diff line
@@ -303,4 +303,20 @@ public final class ShardingRule {
        }
        throw new ShardingJdbcException("Cannot find logic table name with logic index name: '%s'", logicIndexName);
    }
    
    /**
     * Find data node by logic table.
     * 
     * @param logicTableName logic table name
     * @return data node
     */
    public DataNode findDataNodeByLogicTable(final String logicTableName) {
        TableRule tableRule = getTableRule(logicTableName);
        for (DataNode each : tableRule.getActualDataNodes()) {
            if (dataSourceMap.containsKey(each.getDataSourceName())) {
                return each;
            }
        }
        throw new ShardingJdbcException("Cannot find actual data node for logic table name: '%s'", tableRule.getLogicTable());
    }
}