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(); }
/** * Judge logic tables is all belong to binding tables. * * @param logicTableNames logic table names * @return logic tables is all belong to binding tables or not */ public boolean isAllBindingTables(final Collection<String> logicTableNames) { if (logicTableNames.isEmpty()) { return false; } Optional<BindingTableRule> bindingTableRule = findBindingTableRule(logicTableNames); if (!bindingTableRule.isPresent()) { return false; } Collection<String> result = new TreeSet<>(String.CASE_INSENSITIVE_ORDER); result.addAll(bindingTableRule.get().getAllLogicTables()); return !result.isEmpty() && result.containsAll(logicTableNames); }
/** * 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); }
private List<ShardingValue> getShardingValuesFromShardingConditions(final Collection<String> shardingColumns, final ShardingCondition shardingCondition) { List<ShardingValue> result = new ArrayList<>(shardingColumns.size()); for (ShardingValue each : shardingCondition.getShardingValues()) { Optional<BindingTableRule> bindingTableRule = shardingRule.findBindingTableRule(logicTableName); if ((logicTableName.equals(each.getLogicTableName()) || bindingTableRule.isPresent() && bindingTableRule.get().hasLogicTable(logicTableName)) && shardingColumns.contains(each.getColumnName())) { result.add(each); } } return result; }
private Map<String, String> getTableTokens(final TableUnit tableUnit) { Map<String, String> result = new HashMap<>(); for (RoutingTable each : tableUnit.getRoutingTables()) { String logicTableName = each.getLogicTableName().toLowerCase(); result.put(logicTableName, each.getActualTableName()); Optional<BindingTableRule> bindingTableRule = shardingRule.findBindingTableRule(logicTableName); if (bindingTableRule.isPresent()) { result.putAll(getBindingTableTokens(tableUnit.getDataSourceName(), each, bindingTableRule.get())); } } 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()); }
result.add(new StandardRoutingEngine(shardingRule, tableRule.get().getLogicTable(), shardingConditions).route()); Optional<BindingTableRule> bindingTableRule = shardingRule.findBindingTableRule(each); if (bindingTableRule.isPresent()) { bindingTableNames.addAll(Lists.transform(bindingTableRule.get().getTableRules(), new Function<TableRule, String>() {
@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()); } } }
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."); } }