/** * Load table meta data. * * @param logicTableName logic table name * @param shardingRule sharding rule * @return table meta data * @throws SQLException SQL exception */ public TableMetaData load(final String logicTableName, final ShardingRule shardingRule) throws SQLException { List<TableMetaData> actualTableMetaDataList = load(getDataNodeGroups(logicTableName, shardingRule), shardingRule.getShardingDataSourceNames()); checkUniformed(logicTableName, actualTableMetaDataList); return actualTableMetaDataList.iterator().next(); }
@Override public RoutingResult route() { RoutingResult result = new RoutingResult(); List<RoutingTable> routingTables = new ArrayList<>(logicTables.size()); for (String each : logicTables) { routingTables.add(new RoutingTable(each, each)); } TableUnit tableUnit = new TableUnit(shardingRule.getShardingDataSourceNames().getDefaultDataSourceName()); tableUnit.getRoutingTables().addAll(routingTables); result.getTableUnits().getTableUnits().add(tableUnit); return result; } }
@Override public RoutingResult route() { RoutingResult result = new RoutingResult(); for (String each : shardingRule.getShardingDataSourceNames().getDataSourceNames()) { if (shardingDataSourceMetaData.getAllInstanceDataSourceNames().contains(each)) { result.getTableUnits().getTableUnits().add(new TableUnit(each)); } } return result; } }
@Override public RoutingResult route() { RoutingResult result = new RoutingResult(); for (String each : shardingRule.getShardingDataSourceNames().getDataSourceNames()) { result.getTableUnits().getTableUnits().add(new TableUnit(each)); } return result; } }
@Override // TODO insert SQL need parse gen key public SQLRouteResult route(final String logicSQL, final List<Object> parameters, final SQLStatement sqlStatement) { SQLRouteResult result = new SQLRouteResult(sqlStatement); RoutingResult routingResult = new DatabaseHintRoutingEngine( shardingRule.getShardingDataSourceNames().getDataSourceNames(), (HintShardingStrategy) shardingRule.getDefaultDatabaseShardingStrategy()).route(); for (TableUnit each : routingResult.getTableUnits().getTableUnits()) { result.getRouteUnits().add(new RouteUnit(each.getDataSourceName(), new SQLUnit(logicSQL, new ArrayList<>(Collections.singleton(parameters))))); } if (showSQL) { SQLLogger.logSQL(logicSQL, sqlStatement, result.getRouteUnits()); } return result; } }
routingTables.add(new RoutingTable(each, each)); TableUnit tableUnit = new TableUnit(shardingRule.getShardingDataSourceNames().getRandomDataSourceName()); tableUnit.getRoutingTables().addAll(routingTables); result.getTableUnits().getTableUnits().add(tableUnit); } else if (logicTables.isEmpty()) { result.getTableUnits().getTableUnits().add(new TableUnit(shardingRule.getShardingDataSourceNames().getRandomDataSourceName())); } else if (1 == logicTables.size()) { String logicTableName = logicTables.iterator().next(); throw new ShardingConfigurationException("Cannot find actual datasource intersection for logic tables: %s", logicTables); TableUnit tableUnit = new TableUnit(shardingRule.getShardingDataSourceNames().getRandomDataSourceName(availableDatasourceNames)); tableUnit.getRoutingTables().addAll(routingTables); result.getTableUnits().getTableUnits().add(tableUnit);
@Override public void fill(final TableSegment sqlSegment, final SQLStatement sqlStatement, final String sql, final ShardingRule shardingRule, final ShardingTableMetaData shardingTableMetaData) { boolean fill = false; String tableName = sqlSegment.getName(); if (shardingRule.contains(tableName) || shardingRule.isBroadcastTable(tableName) || shardingRule.findBindingTableRule(tableName).isPresent() || shardingRule.getShardingDataSourceNames().getDataSourceNames().contains(shardingRule.getShardingDataSourceNames().getDefaultDataSourceName())) { fill = true; } else { if (!(sqlStatement instanceof SelectStatement) && sqlStatement.getTables().isEmpty()) { fill = true; } } if (fill) { sqlStatement.getTables().add(new Table(sqlSegment.getName(), sqlSegment.getAlias())); sqlStatement.getSQLTokens().add(sqlSegment.getToken()); } } }
protected final void parseTableFactor(final SQLStatement sqlStatement, final boolean isSingleTableOnly) { final int beginPosition = lexerEngine.getCurrentToken().getEndPosition() - lexerEngine.getCurrentToken().getLiterals().length(); String literals = lexerEngine.getCurrentToken().getLiterals(); int skippedSchemaNameLength = 0; lexerEngine.nextToken(); if (lexerEngine.skipIfEqual(Symbol.DOT)) { skippedSchemaNameLength = literals.length() + Symbol.DOT.getLiterals().length(); literals = lexerEngine.getCurrentToken().getLiterals(); lexerEngine.nextToken(); } String tableName = SQLUtil.getExactlyValue(literals); if (Strings.isNullOrEmpty(tableName)) { return; } if (isSingleTableOnly || shardingRule.findTableRule(tableName).isPresent() || shardingRule.isBroadcastTable(tableName) || shardingRule.findBindingTableRule(tableName).isPresent() || shardingRule.getShardingDataSourceNames().getDataSourceNames().contains(shardingRule.getShardingDataSourceNames().getDefaultDataSourceName())) { sqlStatement.addSQLToken(new TableToken(beginPosition, skippedSchemaNameLength, tableName, SQLUtil.getLeftDelimiter(literals), SQLUtil.getRightDelimiter(literals))); sqlStatement.getTables().add(new Table(tableName, aliasExpressionParser.parseTableAlias(sqlStatement, true, tableName))); } else { aliasExpressionParser.parseTableAlias(); } parseForceIndex(tableName, sqlStatement); parseJoinTable(sqlStatement); if (isSingleTableOnly && !sqlStatement.getTables().isSingleTable()) { throw new SQLParsingUnsupportedException("Cannot support Multiple-Table."); } }