/** * Judge logic tables is all belong to broadcast tables. * * @param logicTableNames logic table names * @return logic tables is all belong to broadcast tables or not */ public boolean isAllBroadcastTables(final Collection<String> logicTableNames) { if (logicTableNames.isEmpty()) { return false; } for (String each : logicTableNames) { if (!isBroadcastTable(each)) { return false; } } return true; }
/** * 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); }
/** * 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())); } } }
@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."); } }