Commit 71ad8ca4 authored by terrymanu's avatar terrymanu
Browse files

refactor rewrite

parent 570cc1d7
Loading
Loading
Loading
Loading
+4 −28
Original line number Diff line number Diff line
@@ -59,36 +59,12 @@ public final class SQLBuilder {
    }
    
    /**
     * Append table token.
     * Append sharding placeholder.
     *
     * @param logicTableName logic table name
     * @param shardingPlaceholder sharding placeholder
     */
    public void appendTable(final String logicTableName) {
        segments.add(new TablePlaceholder(logicTableName));
        currentSegment = new StringBuilder();
        segments.add(currentSegment);
    }
    
    /**
     * Append schema token.
     *
     * @param logicSchemaName logic schema name
     * @param logicTableName logic table name
     */
    public void appendSchema(final String logicSchemaName, final String logicTableName) {
        segments.add(new SchemaPlaceholder(logicSchemaName, logicTableName));
        currentSegment = new StringBuilder();
        segments.add(currentSegment);
    }
    
    /**
     * Append index token.
     *
     * @param logicIndexName logic index name
     * @param logicTableName logic table name
     */
    public void appendIndex(final String logicIndexName, final String logicTableName) {
        segments.add(new IndexPlaceholder(logicIndexName, logicTableName));
    public void appendPlaceholder(final ShardingPlaceholder shardingPlaceholder) {
        segments.add(shardingPlaceholder);
        currentSegment = new StringBuilder();
        segments.add(currentSegment);
    }
+12 −9
Original line number Diff line number Diff line
@@ -33,6 +33,9 @@ import io.shardingjdbc.core.parsing.parser.token.RowCountToken;
import io.shardingjdbc.core.parsing.parser.token.SQLToken;
import io.shardingjdbc.core.parsing.parser.token.SchemaToken;
import io.shardingjdbc.core.parsing.parser.token.TableToken;
import io.shardingjdbc.core.rewrite.placeholder.IndexPlaceholder;
import io.shardingjdbc.core.rewrite.placeholder.SchemaPlaceholder;
import io.shardingjdbc.core.rewrite.placeholder.TablePlaceholder;
import io.shardingjdbc.core.routing.type.TableUnit;
import io.shardingjdbc.core.routing.type.complex.CartesianTableReference;
import io.shardingjdbc.core.rule.BindingTableRule;
@@ -100,11 +103,11 @@ public final class SQLRewriteEngine {
                result.appendLiterals(originalSQL.substring(0, each.getBeginPosition()));
            }
            if (each instanceof TableToken) {
                appendTableToken(result, (TableToken) each, count, sqlTokens);
                appendTablePlaceholder(result, (TableToken) each, count, sqlTokens);
            } else if (each instanceof SchemaToken) {
                appendSchemaToken(result, (SchemaToken) each, count, sqlTokens);
                appendSchemaPlaceholder(result, (SchemaToken) each, count, sqlTokens);
            } else if (each instanceof IndexToken) {
                appendIndexToken(result, (IndexToken) each, count, sqlTokens);
                appendIndexPlaceholder(result, (IndexToken) each, count, sqlTokens);
            } else if (each instanceof ItemsToken) {
                appendItemsToken(result, (ItemsToken) each, count, sqlTokens);
            } else if (each instanceof RowCountToken) {
@@ -129,25 +132,25 @@ public final class SQLRewriteEngine {
        });
    }
    
    private void appendTableToken(final SQLBuilder sqlBuilder, final TableToken tableToken, final int count, final List<SQLToken> sqlTokens) {
        sqlBuilder.appendTable(tableToken.getTableName().toLowerCase());
    private void appendTablePlaceholder(final SQLBuilder sqlBuilder, final TableToken tableToken, final int count, final List<SQLToken> sqlTokens) {
        sqlBuilder.appendPlaceholder(new TablePlaceholder(tableToken.getTableName().toLowerCase()));
        int beginPosition = tableToken.getBeginPosition() + tableToken.getOriginalLiterals().length();
        appendRest(sqlBuilder, count, sqlTokens, beginPosition);
    }
    
    private void appendSchemaToken(final SQLBuilder sqlBuilder, final SchemaToken schemaToken, final int count, final List<SQLToken> sqlTokens) {
        sqlBuilder.appendSchema(schemaToken.getSchemaName().toLowerCase(), schemaToken.getTableName());
    private void appendSchemaPlaceholder(final SQLBuilder sqlBuilder, final SchemaToken schemaToken, final int count, final List<SQLToken> sqlTokens) {
        sqlBuilder.appendPlaceholder(new SchemaPlaceholder(schemaToken.getSchemaName().toLowerCase(), schemaToken.getTableName().toLowerCase()));
        int beginPosition = schemaToken.getBeginPosition() + schemaToken.getOriginalLiterals().length();
        appendRest(sqlBuilder, count, sqlTokens, beginPosition);
    }
    
    private void appendIndexToken(final SQLBuilder sqlBuilder, final IndexToken indexToken, final int count, final List<SQLToken> sqlTokens) {
    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.appendIndex(indexName, logicTableName);
        sqlBuilder.appendPlaceholder(new IndexPlaceholder(indexName, logicTableName));
        int beginPosition = indexToken.getBeginPosition() + indexToken.getOriginalLiterals().length();
        appendRest(sqlBuilder, count, sqlTokens, beginPosition);
    }
+23 −0
Original line number Diff line number Diff line
package io.shardingjdbc.core.rewrite.placeholder;

import lombok.Getter;
import lombok.RequiredArgsConstructor;

/**
 * Index placeholder for rewrite.
 *
 * @author zhangliang
 */
@RequiredArgsConstructor
@Getter
public final class IndexPlaceholder implements ShardingPlaceholder {
    
    private final String logicIndexName;
    
    private final String logicTableName;
    
    @Override
    public String toString() {
        return logicIndexName;
    }
}
+5 −4
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@

package io.shardingjdbc.core.rewrite;

import io.shardingjdbc.core.rewrite.placeholder.TablePlaceholder;
import org.junit.Test;

import java.util.Collections;
@@ -43,10 +44,10 @@ public final class SQLBuilderTest {
    public void assertAppendTableWithoutTableToken() {
        SQLBuilder sqlBuilder = new SQLBuilder();
        sqlBuilder.appendLiterals("SELECT ");
        sqlBuilder.appendTable("table_x");
        sqlBuilder.appendPlaceholder(new TablePlaceholder("table_x"));
        sqlBuilder.appendLiterals(".id");
        sqlBuilder.appendLiterals(" FROM ");
        sqlBuilder.appendTable("table_x");
        sqlBuilder.appendPlaceholder(new TablePlaceholder("table_x"));
        assertThat(sqlBuilder.toSQL(Collections.<String, String>emptyMap(), null), is("SELECT table_x.id FROM table_x"));
    }
    
@@ -54,10 +55,10 @@ public final class SQLBuilderTest {
    public void assertAppendTableWithTableToken() {
        SQLBuilder sqlBuilder = new SQLBuilder();
        sqlBuilder.appendLiterals("SELECT ");
        sqlBuilder.appendTable("table_x");
        sqlBuilder.appendPlaceholder(new TablePlaceholder("table_x"));
        sqlBuilder.appendLiterals(".id");
        sqlBuilder.appendLiterals(" FROM ");
        sqlBuilder.appendTable("table_x");
        sqlBuilder.appendPlaceholder(new TablePlaceholder("table_x"));
        Map<String, String> tableTokens = new HashMap<>(1, 1);
        tableTokens.put("table_x", "table_x_1");
        assertThat(sqlBuilder.toSQL(tableTokens, null), is("SELECT table_x_1.id FROM table_x_1"));