/** * Get sharding logic table names. * * @param logicTableNames logic table names * @return sharding logic table names */ public Collection<String> getShardingLogicTableNames(final Collection<String> logicTableNames) { Collection<String> result = new LinkedList<>(); for (String each : logicTableNames) { Optional<TableRule> tableRule = findTableRule(each); if (tableRule.isPresent()) { result.add(each); } } return result; }
/** * Judge logic tables is all belong to default data source. * * @param logicTableNames logic table names * @return logic tables is all belong to default data source */ public boolean isAllInDefaultDataSource(final Collection<String> logicTableNames) { for (String each : logicTableNames) { if (findTableRule(each).isPresent() || isBroadcastTable(each)) { return false; } } return !logicTableNames.isEmpty(); }
/** * 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); }
/** * Generate key. * * @param logicTableName logic table name * @return generated key */ public Comparable<?> generateKey(final String logicTableName) { Optional<TableRule> tableRule = findTableRule(logicTableName); if (!tableRule.isPresent()) { throw new ShardingConfigurationException("Cannot find strategy for generate keys."); } ShardingKeyGenerator shardingKeyGenerator = null == tableRule.get().getShardingKeyGenerator() ? defaultShardingKeyGenerator : tableRule.get().getShardingKeyGenerator(); return shardingKeyGenerator.generateKey(); }
private Optional<GeneratedKey> createGeneratedKey(final InsertStatement insertStatement) { String logicTableName = insertStatement.getTables().getSingleTableName(); Optional<TableRule> tableRule = shardingRule.findTableRule(logicTableName); if (!tableRule.isPresent()) { return Optional.absent(); } Optional<Column> generateKeyColumn = shardingRule.findGenerateKeyColumn(logicTableName); if (!generateKeyColumn.isPresent()) { return Optional.absent(); } GeneratedKey result = new GeneratedKey(generateKeyColumn.get()); for (int i = 0; i < insertStatement.getInsertValues().getInsertValues().size(); i++) { result.getGeneratedKeys().add(shardingRule.generateKey(logicTableName)); } return Optional.of(result); }
private void checkSubqueryShardingValues(final SQLStatement sqlStatement, final Conditions conditions, final ShardingConditions shardingConditions) { for (String each : sqlStatement.getTables().getTableNames()) { Optional<TableRule> tableRule = shardingRule.findTableRule(each); if (tableRule.isPresent() && shardingRule.isRoutingByHint(tableRule.get()) && HintManagerHolder.getDatabaseShardingValue(each).isPresent() && HintManagerHolder.getTableShardingValue(each).isPresent()) { return; } } Preconditions.checkState(!shardingConditions.getShardingConditions().isEmpty(), "Must have sharding column with subquery."); Preconditions.checkState(isShardingOperatorAllEqual(conditions), "Only support sharding by '=' with subquery."); Preconditions.checkState(isListShardingValue(shardingConditions), "Only support sharding by '=' with subquery."); if (shardingConditions.getShardingConditions().size() > 1) { Preconditions.checkState(isSameShardingCondition(shardingConditions), "Sharding value must same with subquery."); } }
Collection<String> bindingTableNames = new TreeSet<>(String.CASE_INSENSITIVE_ORDER); for (String each : logicTables) { Optional<TableRule> tableRule = shardingRule.findTableRule(each); if (tableRule.isPresent()) { if (!bindingTableNames.contains(each)) {
/** * Get table rule. * * @param logicTableName logic table name * @return table rule */ public TableRule getTableRule(final String logicTableName) { Optional<TableRule> tableRule = findTableRule(logicTableName); if (tableRule.isPresent()) { return tableRule.get(); } if (isBroadcastTable(logicTableName)) { return new TableRule(shardingDataSourceNames.getDataSourceNames(), logicTableName); } if (!Strings.isNullOrEmpty(shardingDataSourceNames.getDefaultDataSourceName())) { return new TableRule(shardingDataSourceNames.getDefaultDataSourceName(), logicTableName); } throw new ShardingConfigurationException("Cannot find table rule and default data source with logic table: '%s'", logicTableName); }
private void parseLike(final DALStatement dalStatement) { int beginPosition = lexerEngine.getCurrentToken().getEndPosition() - lexerEngine.getCurrentToken().getLiterals().length() - 1; String literals = lexerEngine.getCurrentToken().getLiterals(); if (shardingRule.findTableRule(literals).isPresent() || shardingRule.isBroadcastTable(literals)) { dalStatement.addSQLToken(new TableToken(beginPosition, 0, SQLUtil.getExactlyValue(literals), SQLUtil.getLeftDelimiter(literals), SQLUtil.getRightDelimiter(literals))); dalStatement.getTables().add(new Table(SQLUtil.getExactlyValue(literals), Optional.<String>absent())); } } }
private SelectItem parseCommonOrStarSelectItem(final SelectStatement selectStatement) { String literals = lexerEngine.getCurrentToken().getLiterals(); int position = lexerEngine.getCurrentToken().getEndPosition() - literals.length(); StringBuilder result = new StringBuilder(); result.append(literals); lexerEngine.nextToken(); if (lexerEngine.equalAny(Symbol.LEFT_PAREN)) { result.append(lexerEngine.skipParentheses(selectStatement)); } else if (lexerEngine.equalAny(Symbol.DOT)) { String tableName = SQLUtil.getExactlyValue(literals); if (shardingRule.findTableRule(tableName).isPresent() || shardingRule.isBroadcastTable(tableName) || shardingRule.findBindingTableRule(tableName).isPresent()) { selectStatement.addSQLToken(new TableToken(position, 0, SQLUtil.getExactlyValue(literals), SQLUtil.getLeftDelimiter(literals), SQLUtil.getRightDelimiter(literals))); } result.append(lexerEngine.getCurrentToken().getLiterals()); lexerEngine.nextToken(); if (lexerEngine.equalAny(Symbol.STAR)) { return parseStarSelectItem(literals); } result.append(lexerEngine.getCurrentToken().getLiterals()); lexerEngine.nextToken(); } return new CommonSelectItem(SQLUtil.getExactlyValue(result + parseRestSelectItem(selectStatement)), aliasExpressionParser.parseSelectItemAlias()); }
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."); } }