use of io.shardingjdbc.core.rewrite.placeholder.IndexPlaceholder in project sharding-jdbc by shardingjdbc.
the class SQLRewriteEngine method appendIndexPlaceholder.
private void appendIndexPlaceholder(final SQLBuilder sqlBuilder, final IndexToken indexToken, final int count, final List<SQLToken> sqlTokens) {
String indexName = indexToken.getIndexName().toLowerCase();
String logicTableName = indexToken.getTableName().toLowerCase();
if (Strings.isNullOrEmpty(logicTableName)) {
logicTableName = shardingRule.getLogicTableName(indexName);
}
sqlBuilder.appendPlaceholder(new IndexPlaceholder(indexName, logicTableName));
int beginPosition = indexToken.getBeginPosition() + indexToken.getOriginalLiterals().length();
appendRest(sqlBuilder, count, sqlTokens, beginPosition);
}
use of io.shardingjdbc.core.rewrite.placeholder.IndexPlaceholder in project sharding-jdbc by shardingjdbc.
the class SQLBuilderTest method assertIndexPlaceholderAppendTableWithTableToken.
@Test
public void assertIndexPlaceholderAppendTableWithTableToken() {
SQLBuilder sqlBuilder = new SQLBuilder();
sqlBuilder.appendLiterals("CREATE INDEX ");
sqlBuilder.appendPlaceholder(new IndexPlaceholder("index_name", "table_x"));
sqlBuilder.appendLiterals(" ON ");
sqlBuilder.appendPlaceholder(new TablePlaceholder("table_x"));
sqlBuilder.appendLiterals(" ('column')");
Map<String, String> tableTokens = new HashMap<>(1, 1);
tableTokens.put("table_x", "table_x_1");
assertThat(sqlBuilder.toSQL(tableTokens, null), is("CREATE INDEX index_name_table_x_1 ON table_x_1 ('column')"));
}
use of io.shardingjdbc.core.rewrite.placeholder.IndexPlaceholder in project sharding-jdbc by shardingjdbc.
the class SQLBuilderTest method assertIndexPlaceholderAppendTableWithoutTableToken.
@Test
public void assertIndexPlaceholderAppendTableWithoutTableToken() {
SQLBuilder sqlBuilder = new SQLBuilder();
sqlBuilder.appendLiterals("CREATE INDEX ");
sqlBuilder.appendPlaceholder(new IndexPlaceholder("index_name", "table_x"));
sqlBuilder.appendLiterals(" ON ");
sqlBuilder.appendPlaceholder(new TablePlaceholder("table_x"));
sqlBuilder.appendLiterals(" ('column')");
assertThat(sqlBuilder.toSQL(Collections.<String, String>emptyMap(), null), is("CREATE INDEX index_name ON table_x ('column')"));
}
use of io.shardingjdbc.core.rewrite.placeholder.IndexPlaceholder in project sharding-jdbc by shardingjdbc.
the class SQLBuilder method toSQL.
/**
* Convert to SQL string.
*
* @param logicAndActualTableMap logic and actual map
* @param shardingRule sharding rule
* @return SQL string
*/
public String toSQL(final Map<String, String> logicAndActualTableMap, final ShardingRule shardingRule) {
StringBuilder result = new StringBuilder();
for (Object each : segments) {
if (!(each instanceof ShardingPlaceholder)) {
result.append(each);
continue;
}
String logicTableName = ((ShardingPlaceholder) each).getLogicTableName();
String actualTableName = logicAndActualTableMap.get(logicTableName);
if (each instanceof TablePlaceholder) {
result.append(null == actualTableName ? logicTableName : actualTableName);
} else if (each instanceof SchemaPlaceholder) {
SchemaPlaceholder schemaPlaceholder = (SchemaPlaceholder) each;
Optional<TableRule> tableRule = shardingRule.tryFindTableRuleByActualTable(actualTableName);
if (!tableRule.isPresent() && Strings.isNullOrEmpty(shardingRule.getDefaultDataSourceName())) {
throw new ShardingJdbcException("Cannot found schema name '%s' in sharding rule.", schemaPlaceholder.getLogicSchemaName());
}
// TODO 目前只能找到真实数据源名称. 未来需要在初始化sharding rule时创建connection,并验证连接是否正确,并获取出真实的schema的名字, 然后在这里替换actualDataSourceName为actualSchemaName
// TODO 目前actualDataSourceName必须actualSchemaName一样,才能保证替换schema的场景不出错, 如: show columns xxx
result.append(tableRule.get().getActualDatasourceNames().iterator().next());
} else if (each instanceof IndexPlaceholder) {
IndexPlaceholder indexPlaceholder = (IndexPlaceholder) each;
result.append(indexPlaceholder.getLogicIndexName());
if (!Strings.isNullOrEmpty(actualTableName)) {
result.append("_");
result.append(actualTableName);
}
} else {
result.append(each);
}
}
return result.toString();
}
Aggregations