@Override public String apply(final TableRule input) { return input.getLogicTable(); } }));
/** * Is routing by hint. * * @param tableRule table rule * @return route by hint is true */ public boolean isRoutingByHint(final TableRule tableRule) { return this.getDatabaseShardingStrategy(tableRule) instanceof HintShardingStrategy && this.getTableShardingStrategy(tableRule) instanceof HintShardingStrategy; } }
/** * Get random data source name. * * @return random data source name. */ public String getRandomDataSourceName() { return getRandomDataSourceName(dataSourceNames); }
private void reviseMasterSlaveMetaData(final Map<String, DataSourceMetaData> dataSourceMetaDataMap, final DataSourceMetaData masterSlaveDataSourceMetaData, final MasterSlaveRule masterSlaveRule) { dataSourceMetaDataMap.put(masterSlaveRule.getName(), masterSlaveDataSourceMetaData); dataSourceMetaDataMap.remove(masterSlaveRule.getMasterDataSourceName()); for (String each : masterSlaveRule.getSlaveDataSourceNames()) { dataSourceMetaDataMap.remove(each); } }
public ShardingRule(final ShardingRuleConfiguration shardingRuleConfig, final Collection<String> dataSourceNames) { Preconditions.checkArgument(!dataSourceNames.isEmpty(), "Data sources cannot be empty."); this.shardingRuleConfig = shardingRuleConfig; shardingDataSourceNames = new ShardingDataSourceNames(shardingRuleConfig, dataSourceNames); tableRules = createTableRules(shardingRuleConfig); bindingTableRules = createBindingTableRules(shardingRuleConfig.getBindingTableGroups()); broadcastTables = shardingRuleConfig.getBroadcastTables(); defaultDatabaseShardingStrategy = createDefaultShardingStrategy(shardingRuleConfig.getDefaultDatabaseShardingStrategyConfig()); defaultTableShardingStrategy = createDefaultShardingStrategy(shardingRuleConfig.getDefaultTableShardingStrategyConfig()); defaultShardingKeyGenerator = createDefaultKeyGenerator(shardingRuleConfig.getDefaultKeyGeneratorConfig()); masterSlaveRules = createMasterSlaveRules(shardingRuleConfig.getMasterSlaveRuleConfigs()); }
/** * 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); }
/** * Judge contains table in sharding rule. * * @param logicTableName logic table name * @return contains table in sharding rule or not */ public boolean contains(final String logicTableName) { return findTableRule(logicTableName).isPresent() || findBindingTableRule(logicTableName).isPresent() || isBroadcastTable(logicTableName); }
/** * Find data node by logic table name. * * @param logicTableName logic table name * @return data node */ public DataNode getDataNode(final String logicTableName) { TableRule tableRule = getTableRule(logicTableName); return tableRule.getActualDataNodes().get(0); }
private BindingTableRule createBindingTableRule(final String bindingTableGroup) { List<TableRule> tableRules = new LinkedList<>(); for (String each : Splitter.on(",").trimResults().splitToList(bindingTableGroup)) { tableRules.add(getTableRule(each)); } return new BindingTableRule(tableRules); }
/** * Judge is sharding column or not. * * @param column column object * @return is sharding column or not */ public boolean isShardingColumn(final Column column) { for (TableRule each : tableRules) { if (each.getLogicTable().equalsIgnoreCase(column.getTableName()) && isShardingColumn(each, column)) { return true; } } return false; }
private Collection<TableRule> createTableRules(final ShardingRuleConfiguration shardingRuleConfig) { Collection<TableRuleConfiguration> tableRuleConfigurations = shardingRuleConfig.getTableRuleConfigs(); Collection<TableRule> result = new ArrayList<>(tableRuleConfigurations.size()); for (TableRuleConfiguration each : tableRuleConfigurations) { result.add(new TableRule(each, shardingDataSourceNames, getDefaultGenerateKeyColumn(shardingRuleConfig))); } return result; }
private boolean isBindingTable(final ListShardingValue shardingValue1, final ListShardingValue shardingValue2) { Optional<BindingTableRule> bindingRule = shardingRule.findBindingTableRule(shardingValue1.getLogicTableName()); return bindingRule.isPresent() && bindingRule.get().hasLogicTable(shardingValue2.getLogicTableName()); }
/** * Get table sharding strategy. * * <p> * Use default table sharding strategy if not found. * </p> * * @param tableRule table rule * @return table sharding strategy */ public ShardingStrategy getTableShardingStrategy(final TableRule tableRule) { return null == tableRule.getTableShardingStrategy() ? defaultTableShardingStrategy : tableRule.getTableShardingStrategy(); }
public ShardingDataSourceNames(final ShardingRuleConfiguration shardingRuleConfig, final Collection<String> rawDataSourceNames) { this.shardingRuleConfig = shardingRuleConfig; dataSourceNames = getAllDataSourceNames(rawDataSourceNames); }
/** * Get database sharding strategy. * * <p> * Use default database sharding strategy if not found. * </p> * * @param tableRule table rule * @return database sharding strategy */ public ShardingStrategy getDatabaseShardingStrategy(final TableRule tableRule) { return null == tableRule.getDatabaseShardingStrategy() ? defaultDatabaseShardingStrategy : tableRule.getDatabaseShardingStrategy(); }
boolean isExisted(final String actualTableName) { for (DataNode each : actualDataNodes) { if (each.getTableName().equalsIgnoreCase(actualTableName)) { return true; } } return false; } }
private Optional<BindingTableRule> findBindingTableRule(final Collection<String> logicTableNames) { for (String each : logicTableNames) { Optional<BindingTableRule> result = findBindingTableRule(each); if (result.isPresent()) { return result; } } return Optional.absent(); }
private Collection<DataNode> getDataNodes(final TableRule tableRule) { if (shardingRule.isRoutingByHint(tableRule)) { return routeByHint(tableRule); } if (isRoutingByShardingConditions(tableRule)) { return routeByShardingConditions(tableRule); } return routeByMixedConditions(tableRule); }
private boolean isRoutingByShardingConditions(final TableRule tableRule) { return !(shardingRule.getDatabaseShardingStrategy(tableRule) instanceof HintShardingStrategy || shardingRule.getTableShardingStrategy(tableRule) instanceof HintShardingStrategy); }
@Override public String apply(final TableRule input) { return input.getLogicTable().toLowerCase(); } });