Commit 84cffcbc authored by terrymanu's avatar terrymanu
Browse files

for #2084, refactor XXXOrPredicateFiller.getTableNameFromMetaData

parent 6a95d27f
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -28,9 +28,9 @@ import java.util.Collection;
 *
 * @author panjuan
 */
@Getter
public final class EncryptRule implements BaseRule {
    
    @Getter
    private final ShardingEncryptorEngine encryptorEngine;
    
    public EncryptRule(final EncryptRuleConfiguration encryptRuleConfiguration) {
+10 −13
Original line number Diff line number Diff line
@@ -20,7 +20,6 @@ package org.apache.shardingsphere.core.parse.antlr.filler.encrypt.dml;
import com.google.common.base.Optional;
import lombok.Setter;
import org.apache.shardingsphere.core.metadata.table.ShardingTableMetaData;
import org.apache.shardingsphere.core.metadata.table.TableMetaData;
import org.apache.shardingsphere.core.parse.antlr.filler.api.EncryptRuleAwareFiller;
import org.apache.shardingsphere.core.parse.antlr.filler.api.SQLSegmentFiller;
import org.apache.shardingsphere.core.parse.antlr.filler.api.ShardingTableMetaDataAwareFiller;
@@ -64,11 +63,12 @@ public final class EncryptOrPredicateFiller implements SQLSegmentFiller<OrPredic
    }
    
    private void fill(final Column column, final PredicateSegment predicate, final SQLStatement sqlStatement) {
        // TODO panjuan: spilt EncryptRule and EncryptorEngine, cannot pass EncryptorEngine to parse module
        if (!encryptRule.getEncryptorEngine().getShardingEncryptor(column.getTableName(), column.getName()).isPresent()) {
            return;
        }
        AndCondition andCondition;
        if (0 == sqlStatement.getEncryptConditions().getOrCondition().getAndConditions().size()) {
        if (sqlStatement.getEncryptConditions().getOrCondition().getAndConditions().isEmpty()) {
            andCondition = new AndCondition();
            sqlStatement.getEncryptConditions().getOrCondition().getAndConditions().add(andCondition);
        } else {
@@ -81,37 +81,34 @@ public final class EncryptOrPredicateFiller implements SQLSegmentFiller<OrPredic
    // TODO hongjun: find table from parent select statement, should find table in subquery level only
    private String getTableName(final PredicateSegment predicateSegment, final SQLStatement sqlStatement) {
        if (!(sqlStatement instanceof SelectStatement)) {
            return getTableName(sqlStatement.getTables(), predicateSegment);
            return sqlStatement.getTables().getSingleTableName();
        }
        SelectStatement currentSelectStatement = (SelectStatement) sqlStatement;
        while (null != currentSelectStatement.getParentStatement()) {
            currentSelectStatement = currentSelectStatement.getParentStatement();
            String tableName = getTableName(currentSelectStatement.getTables(), predicateSegment);
            String tableName = getTableName(predicateSegment, currentSelectStatement.getTables());
            if (!"".equals(tableName)) {
                return tableName;
            }
        }
        return getTableName(currentSelectStatement.getTables(), predicateSegment);
        return getTableName(predicateSegment, currentSelectStatement.getTables());
    }
    
    private String getTableName(final Tables tables, final PredicateSegment predicateSegment) {
    private String getTableName(final PredicateSegment predicateSegment, final Tables tables) {
        if (predicateSegment.getColumn().getOwner().isPresent()) {
            Optional<Table> table = tables.find(predicateSegment.getColumn().getOwner().get());
            return table.isPresent() ? table.get().getName() : "";
        } else {
            return getTableNameFromMetaData(tables, predicateSegment.getColumn().getName());
            return getTableNameFromMetaData(predicateSegment.getColumn().getName(), tables);
        }
    }
    
    private String getTableNameFromMetaData(final Tables tables, final String columnName) {
    private String getTableNameFromMetaData(final String columnName, final Tables tables) {
        for (String each : tables.getTableNames()) {
            TableMetaData tableMetaData = shardingTableMetaData.get(each);
            if (null != tableMetaData) {
                if (tableMetaData.getColumns().containsKey(columnName)) {
            if (shardingTableMetaData.containsColumn(each, columnName)) {
                return each;
            }
        }
        }
        return "";
    }
}
+3 −7
Original line number Diff line number Diff line
@@ -21,7 +21,6 @@ import com.google.common.base.Optional;
import lombok.Setter;
import org.apache.shardingsphere.core.constant.ShardingOperator;
import org.apache.shardingsphere.core.metadata.table.ShardingTableMetaData;
import org.apache.shardingsphere.core.metadata.table.TableMetaData;
import org.apache.shardingsphere.core.parse.antlr.filler.api.SQLSegmentFiller;
import org.apache.shardingsphere.core.parse.antlr.filler.api.ShardingRuleAwareFiller;
import org.apache.shardingsphere.core.parse.antlr.filler.api.ShardingTableMetaDataAwareFiller;
@@ -169,7 +168,7 @@ public final class ShardingOrPredicateFiller implements SQLSegmentFiller<OrPredi
    // TODO hongjun: find table from parent select statement, should find table in subquery level only
    private String getTableName(final ShardingTableMetaData shardingTableMetaData, final ShardingRule shardingRule, final SQLStatement sqlStatement, final PredicateSegment predicateSegment) {
        if (!(sqlStatement instanceof SelectStatement)) {
            return getTableName(shardingTableMetaData, shardingRule, sqlStatement.getTables(), predicateSegment);
            return sqlStatement.getTables().getSingleTableName();
        }
        SelectStatement currentSelectStatement = (SelectStatement) sqlStatement;
        while (null != currentSelectStatement.getParentStatement()) {
@@ -207,13 +206,10 @@ public final class ShardingOrPredicateFiller implements SQLSegmentFiller<OrPredi
    
    private String getTableNameFromMetaData(final ShardingTableMetaData shardingTableMetaData, final Tables tables, final String columnName) {
        for (String each : tables.getTableNames()) {
            TableMetaData tableMetaData = shardingTableMetaData.get(each);
            if (null != tableMetaData) {
                if (tableMetaData.getColumns().containsKey(columnName)) {
            if (shardingTableMetaData.containsColumn(each, columnName)) {
                return each;
            }
        }
        }
        return "";
    }
}