private Optional<String> findMasterDataSourceName(final String masterSlaveRuleName) { for (MasterSlaveRule each : masterSlaveRules) { if (each.getName().equals(masterSlaveRuleName)) { return Optional.of(each.getMasterDataSourceName()); } } return Optional.absent(); }
private Map<String, DataSourceMetaData> getDataSourceMetaDataMapForMasterSlave(final ShardingRule shardingRule, final Map<String, DataSourceMetaData> dataSourceMetaDataMap) { Map<String, DataSourceMetaData> result = new LinkedHashMap<>(dataSourceMetaDataMap); for (Entry<String, DataSourceMetaData> entry : dataSourceMetaDataMap.entrySet()) { Optional<MasterSlaveRule> masterSlaveRule = shardingRule.findMasterSlaveRule(entry.getKey()); if (masterSlaveRule.isPresent() && masterSlaveRule.get().getMasterDataSourceName().equals(entry.getKey())) { reviseMasterSlaveMetaData(result, entry.getValue(), masterSlaveRule.get()); } } return result; }
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); } }
/** * Convert to SQL unit. * * @param masterSlaveRule master slave rule * @param shardingDataSourceMetaData sharding data source meta data * @return SQL */ public String toSQL(final MasterSlaveRule masterSlaveRule, final ShardingDataSourceMetaData shardingDataSourceMetaData) { StringBuilder result = new StringBuilder(); for (Object each : segments) { if (each instanceof SchemaPlaceholder) { result.append(shardingDataSourceMetaData.getActualDataSourceMetaData(masterSlaveRule.getMasterDataSourceName()).getSchemaName()); } else { result.append(each); } } return result.toString(); }
private Collection<String> route(final SQLType sqlType) { if (isMasterRoute(sqlType)) { MasterVisitedManager.setMasterVisited(); return Collections.singletonList(masterSlaveRule.getMasterDataSourceName()); } return Collections.singletonList(masterSlaveRule.getLoadBalanceAlgorithm().getDataSource( masterSlaveRule.getName(), masterSlaveRule.getMasterDataSourceName(), new ArrayList<>(masterSlaveRule.getSlaveDataSourceNames()))); }
private Map<String, RuleConfiguration> getRuleConfigurationMap() { MasterSlaveRule masterSlaveRule = dataSource.getMasterSlaveRule(); Map<String, RuleConfiguration> result = new HashMap<>(); result.put(ShardingConstant.LOGIC_SCHEMA_NAME, new MasterSlaveRuleConfiguration( masterSlaveRule.getName(), masterSlaveRule.getMasterDataSourceName(), masterSlaveRule.getSlaveDataSourceNames(), masterSlaveRule.getLoadBalanceAlgorithm())); return result; }
private void route(final MasterSlaveRule masterSlaveRule, final SQLRouteResult sqlRouteResult) { Collection<RouteUnit> toBeRemoved = new LinkedList<>(); Collection<RouteUnit> toBeAdded = new LinkedList<>(); for (RouteUnit each : sqlRouteResult.getRouteUnits()) { if (!masterSlaveRule.getName().equalsIgnoreCase(each.getDataSourceName())) { continue; } toBeRemoved.add(each); if (isMasterRoute(sqlRouteResult.getSqlStatement().getType())) { MasterVisitedManager.setMasterVisited(); toBeAdded.add(new RouteUnit(masterSlaveRule.getMasterDataSourceName(), each.getSqlUnit())); } else { toBeAdded.add(new RouteUnit(masterSlaveRule.getLoadBalanceAlgorithm().getDataSource( masterSlaveRule.getName(), masterSlaveRule.getMasterDataSourceName(), new ArrayList<>(masterSlaveRule.getSlaveDataSourceNames())), each.getSqlUnit())); } } sqlRouteResult.getRouteUnits().removeAll(toBeRemoved); sqlRouteResult.getRouteUnits().addAll(toBeAdded); }