/** * Get actual data source names. * * @return actual data source names */ public Collection<String> getActualDatasourceNames() { Collection<String> result = new LinkedHashSet<>(actualDataNodes.size()); for (DataNode each : actualDataNodes) { result.add(each.getDataSourceName()); } return result; }
/** * Get data node groups. * * @return data node groups, key is data source name, value is tables belong to this data source */ public Map<String, List<DataNode>> getDataNodeGroups() { Map<String, List<DataNode>> result = new LinkedHashMap<>(actualDataNodes.size(), 1); for (DataNode each : actualDataNodes) { String dataSourceName = each.getDataSourceName(); if (!result.containsKey(dataSourceName)) { result.put(dataSourceName, new LinkedList<DataNode>()); } result.get(dataSourceName).add(each); } return result; }
/** * Get actual table names via target data source name. * * @param targetDataSource target data source name * @return names of actual tables */ public Collection<String> getActualTableNames(final String targetDataSource) { Collection<String> result = new LinkedHashSet<>(actualDataNodes.size()); for (DataNode each : actualDataNodes) { if (targetDataSource.equals(each.getDataSourceName())) { result.add(each.getTableName()); } } return result; }
private List<DataNode> generateDataNodes(final List<String> actualDataNodes, final Collection<String> dataSourceNames) { List<DataNode> result = new LinkedList<>(); int index = 0; for (String each : actualDataNodes) { DataNode dataNode = new DataNode(each); if (!dataSourceNames.contains(dataNode.getDataSourceName())) { throw new ShardingException("Cannot find data source in sharding rule, invalid actual data node is: '%s'", each); } result.add(dataNode); dataNodeIndexMap.put(dataNode, index); index++; } return result; }
/** * Find data node by data source and logic table. * * @param dataSourceName data source name * @param logicTableName logic table name * @return data node */ public DataNode getDataNode(final String dataSourceName, final String logicTableName) { TableRule tableRule = getTableRule(logicTableName); for (DataNode each : tableRule.getActualDataNodes()) { if (shardingDataSourceNames.getDataSourceNames().contains(each.getDataSourceName()) && each.getDataSourceName().equals(dataSourceName)) { return each; } } throw new ShardingConfigurationException("Cannot find actual data node for data source name: '%s' and logic table name: '%s'", dataSourceName, logicTableName); }
@Override public Collection<TableMetaData> execute(final Collection<DataNode> dataNodes, final boolean isTrunkThread, final Map<String, Object> shardingExecuteDataMap) throws SQLException { String dataSourceName = dataNodes.iterator().next().getDataSourceName(); DataSourceMetaData dataSourceMetaData = shardingDataSourceMetaData.getActualDataSourceMetaData(dataSourceName); String catalog = null == dataSourceMetaData ? null : dataSourceMetaData.getSchemaName(); return load(shardingDataSourceNames.getRawMasterDataSourceName(dataSourceName), catalog, dataNodes); } });
private void processInsertShardingCondition(final TableUnit tableUnit, final InsertShardingCondition shardingCondition, final List<String> expressions, final List<Object> parameters) { for (DataNode each : shardingCondition.getDataNodes()) { if (each.getDataSourceName().equals(tableUnit.getDataSourceName()) && each.getTableName().equals(tableUnit.getRoutingTables().iterator().next().getActualTableName())) { expressions.add(shardingCondition.getInsertValueExpression()); parameters.addAll(shardingCondition.getParameters()); return; } } if (shardingCondition.getDataNodes().isEmpty()) { expressions.add(shardingCondition.getInsertValueExpression()); parameters.addAll(shardingCondition.getParameters()); } } }
private Collection<TableUnit> getAllTableUnits(final String logicTableName) { Collection<TableUnit> result = new LinkedList<>(); TableRule tableRule = shardingRule.getTableRule(logicTableName); for (DataNode each : tableRule.getActualDataNodes()) { TableUnit tableUnit = new TableUnit(each.getDataSourceName()); tableUnit.getRoutingTables().add(new RoutingTable(logicTableName, each.getTableName())); result.add(tableUnit); } return result; } }
private RoutingResult generateRoutingResult(final Collection<DataNode> routedDataNodes) { RoutingResult result = new RoutingResult(); for (DataNode each : routedDataNodes) { TableUnit tableUnit = new TableUnit(each.getDataSourceName()); tableUnit.getRoutingTables().add(new RoutingTable(logicTableName, each.getTableName())); result.getTableUnits().getTableUnits().add(tableUnit); } return result; }
String logicTableName = logicTables.iterator().next(); DataNode dataNode = shardingRule.getDataNode(logicTableName); TableUnit tableUnit = new TableUnit(dataNode.getDataSourceName()); tableUnit.getRoutingTables().add(new RoutingTable(logicTableName, dataNode.getTableName())); result.getTableUnits().getTableUnits().add(tableUnit); Set<String> currentDataSourceNames = new HashSet<>(tableRule.getActualDatasourceNames().size()); for (DataNode eachDataNode : tableRule.getActualDataNodes()) { currentDataSourceNames.add(eachDataNode.getDataSourceName());