Loading sharding-core/sharding-core-parse/sharding-core-parse-common/src/main/java/org/apache/shardingsphere/core/parse/antlr/extractor/impl/dml/PredicateExtractor.java +17 −17 Original line number Diff line number Diff line Loading @@ -28,8 +28,8 @@ import org.apache.shardingsphere.core.parse.antlr.extractor.util.ExtractorUtils; import org.apache.shardingsphere.core.parse.antlr.extractor.util.RuleName; import org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.column.ColumnSegment; import org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.condition.AndConditionSegment; import org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.condition.ConditionSegment; import org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.condition.OrConditionSegment; import org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.condition.PredicateSegment; import org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.expr.BetweenValueExpressionSegment; import org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.expr.CompareValueExpressionSegment; import org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.expr.ExpressionSegment; Loading Loading @@ -93,13 +93,13 @@ public final class PredicateExtractor { } return Optional.absent(); } Optional<ConditionSegment> condition = extractPredicate(parameterMarkerIndexes, exprNode); if (!condition.isPresent()) { Optional<PredicateSegment> predicate = extractPredicate(parameterMarkerIndexes, exprNode); if (!predicate.isPresent()) { return Optional.absent(); } OrConditionSegment result = new OrConditionSegment(); AndConditionSegment newAndCondition = new AndConditionSegment(); newAndCondition.getConditions().add(condition.get()); newAndCondition.getPredicates().add(predicate.get()); result.getAndConditions().add(newAndCondition); return Optional.of(result); } Loading @@ -113,8 +113,8 @@ public final class PredicateExtractor { return Optional.absent(); } private Optional<ConditionSegment> extractPredicate(final Map<ParserRuleContext, Integer> parameterMarkerIndexes, final ParserRuleContext exprNode) { Optional<ConditionSegment> result = extractComparisonPredicate(parameterMarkerIndexes, exprNode); private Optional<PredicateSegment> extractPredicate(final Map<ParserRuleContext, Integer> parameterMarkerIndexes, final ParserRuleContext exprNode) { Optional<PredicateSegment> result = extractComparisonPredicate(parameterMarkerIndexes, exprNode); if (result.isPresent()) { return result; } Loading @@ -141,7 +141,7 @@ public final class PredicateExtractor { return Optional.absent(); } private Optional<ConditionSegment> extractComparisonPredicate(final Map<ParserRuleContext, Integer> parameterMarkerIndexes, final ParserRuleContext exprNode) { private Optional<PredicateSegment> extractComparisonPredicate(final Map<ParserRuleContext, Integer> parameterMarkerIndexes, final ParserRuleContext exprNode) { Optional<ParserRuleContext> comparisonOperatorNode = ExtractorUtils.findFirstChildNode(exprNode, RuleName.COMPARISON_OPERATOR); if (!comparisonOperatorNode.isPresent()) { return Optional.absent(); Loading @@ -158,23 +158,23 @@ public final class PredicateExtractor { ? (ParserRuleContext) comparisonOperatorNode.get().parent.getChild(2) : (ParserRuleContext) comparisonOperatorNode.get().parent.getChild(0); Optional<? extends ExpressionSegment> sqlExpression = expressionExtractor.extract(parameterMarkerIndexes, valueNode); String compareOperator = comparisonOperatorNode.get().getText(); return sqlExpression.isPresent() ? Optional.of(new ConditionSegment(column.get(), compareOperator, new CompareValueExpressionSegment(sqlExpression.get(), compareOperator), booleanPrimaryNode.getStop().getStopIndex())) : Optional.<ConditionSegment>absent(); return sqlExpression.isPresent() ? Optional.of(new PredicateSegment(column.get(), compareOperator, new CompareValueExpressionSegment(sqlExpression.get(), compareOperator), booleanPrimaryNode.getStop().getStopIndex())) : Optional.<PredicateSegment>absent(); } private Optional<ConditionSegment> extractBetweenPredicate(final Map<ParserRuleContext, Integer> parameterMarkerIndexes, final ParserRuleContext predicateNode, final ColumnSegment column) { private Optional<PredicateSegment> extractBetweenPredicate(final Map<ParserRuleContext, Integer> parameterMarkerIndexes, final ParserRuleContext predicateNode, final ColumnSegment column) { Optional<? extends ExpressionSegment> beginSQLExpression = expressionExtractor.extract(parameterMarkerIndexes, (ParserRuleContext) predicateNode.getChild(2)); Optional<? extends ExpressionSegment> endSQLExpression = expressionExtractor.extract(parameterMarkerIndexes, (ParserRuleContext) predicateNode.getChild(4)); return beginSQLExpression.isPresent() && endSQLExpression.isPresent() ? Optional.of(new ConditionSegment( ? Optional.of(new PredicateSegment( column, ShardingOperator.BETWEEN.name(), new BetweenValueExpressionSegment(beginSQLExpression.get(), endSQLExpression.get()), predicateNode.getStop().getStopIndex())) : Optional.<ConditionSegment>absent(); : Optional.<PredicateSegment>absent(); } private Optional<ConditionSegment> extractInPredicate(final Map<ParserRuleContext, Integer> parameterMarkerIndexes, final ParserRuleContext predicateNode, final ColumnSegment column) { private Optional<PredicateSegment> extractInPredicate(final Map<ParserRuleContext, Integer> parameterMarkerIndexes, final ParserRuleContext predicateNode, final ColumnSegment column) { Collection<ExpressionSegment> sqlExpressions = extractExpressionSegments(parameterMarkerIndexes, predicateNode); return sqlExpressions.isEmpty() ? Optional.<ConditionSegment>absent() : Optional.of(new ConditionSegment(column, ShardingOperator.IN.name(), new InValueExpressionSegment(sqlExpressions), predicateNode.getStop().getStopIndex())); return sqlExpressions.isEmpty() ? Optional.<PredicateSegment>absent() : Optional.of(new PredicateSegment(column, ShardingOperator.IN.name(), new InValueExpressionSegment(sqlExpressions), predicateNode.getStop().getStopIndex())); } private Collection<ExpressionSegment> extractExpressionSegments(final Map<ParserRuleContext, Integer> parameterMarkerIndexes, final ParserRuleContext predicateNode) { Loading @@ -201,8 +201,8 @@ public final class PredicateExtractor { for (AndConditionSegment each : leftOrCondition.getAndConditions()) { for (AndConditionSegment eachRightOr : rightOrCondition.getAndConditions()) { AndConditionSegment tempList = new AndConditionSegment(); tempList.getConditions().addAll(each.getConditions()); tempList.getConditions().addAll(eachRightOr.getConditions()); tempList.getPredicates().addAll(each.getPredicates()); tempList.getPredicates().addAll(eachRightOr.getPredicates()); result.getAndConditions().add(tempList); } } Loading sharding-core/sharding-core-parse/sharding-core-parse-common/src/main/java/org/apache/shardingsphere/core/parse/antlr/filler/encrypt/dml/EncryptOrConditionFiller.java +18 −18 Original line number Diff line number Diff line Loading @@ -23,8 +23,8 @@ 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.sql.segment.dml.condition.AndConditionSegment; import org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.condition.ConditionSegment; import org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.condition.OrConditionSegment; import org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.condition.PredicateSegment; import org.apache.shardingsphere.core.parse.antlr.sql.statement.SQLStatement; import org.apache.shardingsphere.core.parse.antlr.sql.statement.dml.SelectStatement; import org.apache.shardingsphere.core.parse.antlr.sql.token.EncryptColumnToken; Loading Loading @@ -84,23 +84,23 @@ public class EncryptOrConditionFiller implements SQLSegmentFiller<OrConditionSeg OrCondition result = new OrCondition(); Set<Integer> filledConditionStopIndexes = new HashSet<>(); for (AndConditionSegment each : orCondition.getAndConditions()) { for (ConditionSegment condition : each.getConditions()) { if (null == condition.getColumn()) { for (PredicateSegment predicate : each.getPredicates()) { if (null == predicate.getColumn()) { continue; } if (filledConditionStopIndexes.contains(condition.getStopIndex())) { if (filledConditionStopIndexes.contains(predicate.getStopIndex())) { continue; } else { filledConditionStopIndexes.add(condition.getStopIndex()); filledConditionStopIndexes.add(predicate.getStopIndex()); } Column column = new Column(condition.getColumn().getName(), getTableName(sqlStatement, condition)); fillEncryptCondition(column, condition, sqlStatement); Column column = new Column(predicate.getColumn().getName(), getTableName(sqlStatement, predicate)); fillEncryptCondition(column, predicate, sqlStatement); } } return result; } private void fillEncryptCondition(final Column column, final ConditionSegment condition, final SQLStatement sqlStatement) { private void fillEncryptCondition(final Column column, final PredicateSegment predicate, final SQLStatement sqlStatement) { if (!encryptRule.getEncryptorEngine().getShardingEncryptor(column.getTableName(), column.getName()).isPresent()) { return; } Loading @@ -111,32 +111,32 @@ public class EncryptOrConditionFiller implements SQLSegmentFiller<OrConditionSeg } else { andCondition = sqlStatement.getEncryptConditions().getOrCondition().getAndConditions().get(0); } andCondition.getConditions().add(condition.getExpression().buildCondition(column, sqlStatement.getLogicSQL())); sqlStatement.getSQLTokens().add(new EncryptColumnToken(condition.getColumn().getStartIndex(), condition.getStopIndex(), column, true)); andCondition.getConditions().add(predicate.getExpression().buildCondition(column, sqlStatement.getLogicSQL())); sqlStatement.getSQLTokens().add(new EncryptColumnToken(predicate.getColumn().getStartIndex(), predicate.getStopIndex(), column, true)); } // TODO hongjun: find table from parent select statement, should find table in subquery level only private String getTableName(final SQLStatement sqlStatement, final ConditionSegment conditionSegment) { private String getTableName(final SQLStatement sqlStatement, final PredicateSegment predicateSegment) { if (!(sqlStatement instanceof SelectStatement)) { return getTableName(sqlStatement.getTables(), conditionSegment); return getTableName(sqlStatement.getTables(), predicateSegment); } SelectStatement currentSelectStatement = (SelectStatement) sqlStatement; while (null != currentSelectStatement.getParentStatement()) { currentSelectStatement = currentSelectStatement.getParentStatement(); String tableName = getTableName(currentSelectStatement.getTables(), conditionSegment); String tableName = getTableName(currentSelectStatement.getTables(), predicateSegment); if (!"".equals(tableName)) { return tableName; } } return getTableName(currentSelectStatement.getTables(), conditionSegment); return getTableName(currentSelectStatement.getTables(), predicateSegment); } private String getTableName(final Tables tables, final ConditionSegment conditionSegment) { if (conditionSegment.getColumn().getOwner().isPresent()) { Optional<Table> table = tables.find(conditionSegment.getColumn().getOwner().get()); private String getTableName(final Tables tables, final PredicateSegment predicateSegment) { if (predicateSegment.getColumn().getOwner().isPresent()) { Optional<Table> table = tables.find(predicateSegment.getColumn().getOwner().get()); return table.isPresent() ? table.get().getName() : ""; } else { return getTableNameFromMetaData(tables, conditionSegment.getColumn().getName()); return getTableNameFromMetaData(tables, predicateSegment.getColumn().getName()); } } Loading sharding-core/sharding-core-parse/sharding-core-parse-common/src/main/java/org/apache/shardingsphere/core/parse/antlr/filler/sharding/dml/OrConditionFiller.java +35 −36 Original line number Diff line number Diff line Loading @@ -25,8 +25,8 @@ 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.sql.segment.dml.column.ColumnSegment; import org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.condition.AndConditionSegment; import org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.condition.ConditionSegment; import org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.condition.OrConditionSegment; import org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.condition.PredicateSegment; import org.apache.shardingsphere.core.parse.antlr.sql.statement.SQLStatement; import org.apache.shardingsphere.core.parse.antlr.sql.statement.dml.SelectStatement; import org.apache.shardingsphere.core.parse.antlr.sql.token.EncryptColumnToken; Loading @@ -34,7 +34,6 @@ import org.apache.shardingsphere.core.parse.antlr.sql.token.TableToken; import org.apache.shardingsphere.core.parse.old.lexer.token.Symbol; import org.apache.shardingsphere.core.parse.old.parser.context.condition.AndCondition; import org.apache.shardingsphere.core.parse.old.parser.context.condition.Column; import org.apache.shardingsphere.core.parse.old.parser.context.condition.Condition; import org.apache.shardingsphere.core.parse.old.parser.context.condition.OrCondition; import org.apache.shardingsphere.core.parse.old.parser.context.table.Table; import org.apache.shardingsphere.core.parse.old.parser.context.table.Tables; Loading Loading @@ -104,26 +103,26 @@ public final class OrConditionFiller implements SQLSegmentFiller<OrConditionSegm private OrCondition filterCondition(final ShardingTableMetaData shardingTableMetaData, final SQLStatement sqlStatement, final OrConditionSegment orCondition, final ShardingRule shardingRule) { OrCondition result = new OrCondition(); for (AndConditionSegment each : orCondition.getAndConditions()) { List<ConditionSegment> shardingCondition = new LinkedList<>(); List<PredicateSegment> predicates = new LinkedList<>(); boolean needSharding = false; for (ConditionSegment condition : each.getConditions()) { if (null == condition.getColumn()) { for (PredicateSegment predicate : each.getPredicates()) { if (null == predicate.getColumn()) { continue; } addTableTokenForColumn(shardingTableMetaData, sqlStatement, condition.getColumn()); if (condition.getExpression() instanceof ColumnSegment) { addTableTokenForColumn(shardingTableMetaData, sqlStatement, (ColumnSegment) condition.getExpression()); addTableTokenForColumn(shardingTableMetaData, sqlStatement, predicate.getColumn()); if (predicate.getExpression() instanceof ColumnSegment) { addTableTokenForColumn(shardingTableMetaData, sqlStatement, (ColumnSegment) predicate.getExpression()); needSharding = true; continue; } Column column = new Column(condition.getColumn().getName(), getTableName(shardingTableMetaData, shardingRule, sqlStatement, condition)); if (isShardingCondition(condition.getOperator()) && shardingRule.isShardingColumn(column.getName(), column.getTableName())) { shardingCondition.add(condition); Column column = new Column(predicate.getColumn().getName(), getTableName(shardingTableMetaData, shardingRule, sqlStatement, predicate)); if (isShardingCondition(predicate.getOperator()) && shardingRule.isShardingColumn(column.getName(), column.getTableName())) { predicates.add(predicate); needSharding = true; } } if (needSharding) { fillResult(shardingTableMetaData, sqlStatement, shardingRule, result, shardingCondition); fillResult(shardingTableMetaData, sqlStatement, shardingRule, result, predicates); } else { result.getAndConditions().clear(); break; Loading @@ -131,20 +130,20 @@ public final class OrConditionFiller implements SQLSegmentFiller<OrConditionSegm } Set<Integer> filledConditionStopIndexes = new HashSet<>(); for (AndConditionSegment each : orCondition.getAndConditions()) { for (ConditionSegment condition : each.getConditions()) { if (null == condition.getColumn()) { for (PredicateSegment predicate : each.getPredicates()) { if (null == predicate.getColumn()) { continue; } if (condition.getExpression() instanceof ColumnSegment) { if (predicate.getExpression() instanceof ColumnSegment) { continue; } if (filledConditionStopIndexes.contains(condition.getStopIndex())) { if (filledConditionStopIndexes.contains(predicate.getStopIndex())) { continue; } else { filledConditionStopIndexes.add(condition.getStopIndex()); filledConditionStopIndexes.add(predicate.getStopIndex()); } Column column = new Column(condition.getColumn().getName(), getTableName(shardingTableMetaData, shardingRule, sqlStatement, condition)); fillEncryptCondition(column, condition, shardingRule, sqlStatement); Column column = new Column(predicate.getColumn().getName(), getTableName(shardingTableMetaData, shardingRule, sqlStatement, predicate)); fillEncryptCondition(column, predicate, shardingRule, sqlStatement); } } return result; Loading @@ -161,20 +160,20 @@ public final class OrConditionFiller implements SQLSegmentFiller<OrConditionSegm } private void fillResult(final ShardingTableMetaData shardingTableMetaData, final SQLStatement sqlStatement, final ShardingRule shardingRule, final OrCondition orCondition, final List<ConditionSegment> shardingCondition) { final SQLStatement sqlStatement, final ShardingRule shardingRule, final OrCondition orCondition, final List<PredicateSegment> shardingCondition) { if (shardingCondition.isEmpty()) { return; } AndCondition andConditionResult = new AndCondition(); orCondition.getAndConditions().add(andConditionResult); for (ConditionSegment eachCondition : shardingCondition) { Optional<String> tableName = getTableName(sqlStatement, eachCondition); Column column = new Column(eachCondition.getColumn().getName(), tableName.isPresent() ? tableName.get() : getTableName(shardingTableMetaData, shardingRule, sqlStatement, eachCondition)); andConditionResult.getConditions().add(eachCondition.getExpression().buildCondition(column, sqlStatement.getLogicSQL())); for (PredicateSegment each : shardingCondition) { Optional<String> tableName = getTableName(sqlStatement, each); Column column = new Column(each.getColumn().getName(), tableName.isPresent() ? tableName.get() : getTableName(shardingTableMetaData, shardingRule, sqlStatement, each)); andConditionResult.getConditions().add(each.getExpression().buildCondition(column, sqlStatement.getLogicSQL())); } } private void fillEncryptCondition(final Column column, final ConditionSegment condition, final ShardingRule shardingRule, final SQLStatement sqlStatement) { private void fillEncryptCondition(final Column column, final PredicateSegment predicateSegment, final ShardingRule shardingRule, final SQLStatement sqlStatement) { if (!shardingRule.getShardingEncryptorEngine().getShardingEncryptor(column.getTableName(), column.getName()).isPresent()) { return; } Loading @@ -185,8 +184,8 @@ public final class OrConditionFiller implements SQLSegmentFiller<OrConditionSegm } else { andCondition = sqlStatement.getEncryptConditions().getOrCondition().getAndConditions().get(0); } andCondition.getConditions().add(condition.getExpression().buildCondition(column, sqlStatement.getLogicSQL())); sqlStatement.getSQLTokens().add(new EncryptColumnToken(condition.getColumn().getStartIndex(), condition.getStopIndex(), column, true)); andCondition.getConditions().add(predicateSegment.getExpression().buildCondition(column, sqlStatement.getLogicSQL())); sqlStatement.getSQLTokens().add(new EncryptColumnToken(predicateSegment.getColumn().getStartIndex(), predicateSegment.getStopIndex(), column, true)); } private boolean isShardingCondition(final String operator) { Loading @@ -194,22 +193,22 @@ public final class OrConditionFiller implements SQLSegmentFiller<OrConditionSegm } // 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 ConditionSegment conditionSegment) { 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(), conditionSegment); return getTableName(shardingTableMetaData, shardingRule, sqlStatement.getTables(), predicateSegment); } SelectStatement currentSelectStatement = (SelectStatement) sqlStatement; while (null != currentSelectStatement.getParentStatement()) { currentSelectStatement = currentSelectStatement.getParentStatement(); String tableName = getTableName(shardingTableMetaData, shardingRule, currentSelectStatement.getTables(), conditionSegment); String tableName = getTableName(shardingTableMetaData, shardingRule, currentSelectStatement.getTables(), predicateSegment); if (!"".equals(tableName)) { return tableName; } } return getTableName(shardingTableMetaData, shardingRule, currentSelectStatement.getTables(), conditionSegment); return getTableName(shardingTableMetaData, shardingRule, currentSelectStatement.getTables(), predicateSegment); } private Optional<String> getTableName(final SQLStatement sqlStatement, final ConditionSegment conditionSegment) { private Optional<String> getTableName(final SQLStatement sqlStatement, final PredicateSegment conditionSegment) { if (conditionSegment.getColumn().getOwner().isPresent()) { Optional<Table> table = sqlStatement.getTables().find(conditionSegment.getColumn().getOwner().get()); if (table.isPresent()) { Loading @@ -219,16 +218,16 @@ public final class OrConditionFiller implements SQLSegmentFiller<OrConditionSegm return Optional.absent(); } private String getTableName(final ShardingTableMetaData shardingTableMetaData, final ShardingRule shardingRule, final Tables tables, final ConditionSegment conditionSegment) { private String getTableName(final ShardingTableMetaData shardingTableMetaData, final ShardingRule shardingRule, final Tables tables, final PredicateSegment predicateSegment) { Collection<String> shardingLogicTableNames = shardingRule.getShardingLogicTableNames(tables.getTableNames()); if (tables.isSingleTable() || tables.isSameTable() || 1 == shardingLogicTableNames.size() || shardingRule.isAllBindingTables(shardingLogicTableNames)) { return tables.getSingleTableName(); } if (conditionSegment.getColumn().getOwner().isPresent()) { Optional<Table> table = tables.find(conditionSegment.getColumn().getOwner().get()); if (predicateSegment.getColumn().getOwner().isPresent()) { Optional<Table> table = tables.find(predicateSegment.getColumn().getOwner().get()); return table.isPresent() ? table.get().getName() : ""; } else { return getTableNameFromMetaData(shardingTableMetaData, tables, conditionSegment.getColumn().getName()); return getTableNameFromMetaData(shardingTableMetaData, tables, predicateSegment.getColumn().getName()); } } Loading sharding-core/sharding-core-parse/sharding-core-parse-common/src/main/java/org/apache/shardingsphere/core/parse/antlr/sql/segment/dml/condition/AndConditionSegment.java +1 −1 Original line number Diff line number Diff line Loading @@ -33,5 +33,5 @@ import java.util.List; @Getter public final class AndConditionSegment implements SQLSegment { private List<ConditionSegment> conditions = new LinkedList<>(); private List<PredicateSegment> predicates = new LinkedList<>(); } sharding-core/sharding-core-parse/sharding-core-parse-common/src/main/java/org/apache/shardingsphere/core/parse/antlr/sql/segment/dml/condition/ConditionSegment.java→sharding-core/sharding-core-parse/sharding-core-parse-common/src/main/java/org/apache/shardingsphere/core/parse/antlr/sql/segment/dml/condition/PredicateSegment.java +2 −2 Original line number Diff line number Diff line Loading @@ -24,13 +24,13 @@ import org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.column.ColumnS import org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.expr.SQLRightValueExpressionSegment; /** * Condition segment. * Predicate segment. * * @author duhongjun */ @RequiredArgsConstructor @Getter public final class ConditionSegment implements SQLSegment { public final class PredicateSegment implements SQLSegment { private final ColumnSegment column; Loading Loading
sharding-core/sharding-core-parse/sharding-core-parse-common/src/main/java/org/apache/shardingsphere/core/parse/antlr/extractor/impl/dml/PredicateExtractor.java +17 −17 Original line number Diff line number Diff line Loading @@ -28,8 +28,8 @@ import org.apache.shardingsphere.core.parse.antlr.extractor.util.ExtractorUtils; import org.apache.shardingsphere.core.parse.antlr.extractor.util.RuleName; import org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.column.ColumnSegment; import org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.condition.AndConditionSegment; import org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.condition.ConditionSegment; import org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.condition.OrConditionSegment; import org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.condition.PredicateSegment; import org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.expr.BetweenValueExpressionSegment; import org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.expr.CompareValueExpressionSegment; import org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.expr.ExpressionSegment; Loading Loading @@ -93,13 +93,13 @@ public final class PredicateExtractor { } return Optional.absent(); } Optional<ConditionSegment> condition = extractPredicate(parameterMarkerIndexes, exprNode); if (!condition.isPresent()) { Optional<PredicateSegment> predicate = extractPredicate(parameterMarkerIndexes, exprNode); if (!predicate.isPresent()) { return Optional.absent(); } OrConditionSegment result = new OrConditionSegment(); AndConditionSegment newAndCondition = new AndConditionSegment(); newAndCondition.getConditions().add(condition.get()); newAndCondition.getPredicates().add(predicate.get()); result.getAndConditions().add(newAndCondition); return Optional.of(result); } Loading @@ -113,8 +113,8 @@ public final class PredicateExtractor { return Optional.absent(); } private Optional<ConditionSegment> extractPredicate(final Map<ParserRuleContext, Integer> parameterMarkerIndexes, final ParserRuleContext exprNode) { Optional<ConditionSegment> result = extractComparisonPredicate(parameterMarkerIndexes, exprNode); private Optional<PredicateSegment> extractPredicate(final Map<ParserRuleContext, Integer> parameterMarkerIndexes, final ParserRuleContext exprNode) { Optional<PredicateSegment> result = extractComparisonPredicate(parameterMarkerIndexes, exprNode); if (result.isPresent()) { return result; } Loading @@ -141,7 +141,7 @@ public final class PredicateExtractor { return Optional.absent(); } private Optional<ConditionSegment> extractComparisonPredicate(final Map<ParserRuleContext, Integer> parameterMarkerIndexes, final ParserRuleContext exprNode) { private Optional<PredicateSegment> extractComparisonPredicate(final Map<ParserRuleContext, Integer> parameterMarkerIndexes, final ParserRuleContext exprNode) { Optional<ParserRuleContext> comparisonOperatorNode = ExtractorUtils.findFirstChildNode(exprNode, RuleName.COMPARISON_OPERATOR); if (!comparisonOperatorNode.isPresent()) { return Optional.absent(); Loading @@ -158,23 +158,23 @@ public final class PredicateExtractor { ? (ParserRuleContext) comparisonOperatorNode.get().parent.getChild(2) : (ParserRuleContext) comparisonOperatorNode.get().parent.getChild(0); Optional<? extends ExpressionSegment> sqlExpression = expressionExtractor.extract(parameterMarkerIndexes, valueNode); String compareOperator = comparisonOperatorNode.get().getText(); return sqlExpression.isPresent() ? Optional.of(new ConditionSegment(column.get(), compareOperator, new CompareValueExpressionSegment(sqlExpression.get(), compareOperator), booleanPrimaryNode.getStop().getStopIndex())) : Optional.<ConditionSegment>absent(); return sqlExpression.isPresent() ? Optional.of(new PredicateSegment(column.get(), compareOperator, new CompareValueExpressionSegment(sqlExpression.get(), compareOperator), booleanPrimaryNode.getStop().getStopIndex())) : Optional.<PredicateSegment>absent(); } private Optional<ConditionSegment> extractBetweenPredicate(final Map<ParserRuleContext, Integer> parameterMarkerIndexes, final ParserRuleContext predicateNode, final ColumnSegment column) { private Optional<PredicateSegment> extractBetweenPredicate(final Map<ParserRuleContext, Integer> parameterMarkerIndexes, final ParserRuleContext predicateNode, final ColumnSegment column) { Optional<? extends ExpressionSegment> beginSQLExpression = expressionExtractor.extract(parameterMarkerIndexes, (ParserRuleContext) predicateNode.getChild(2)); Optional<? extends ExpressionSegment> endSQLExpression = expressionExtractor.extract(parameterMarkerIndexes, (ParserRuleContext) predicateNode.getChild(4)); return beginSQLExpression.isPresent() && endSQLExpression.isPresent() ? Optional.of(new ConditionSegment( ? Optional.of(new PredicateSegment( column, ShardingOperator.BETWEEN.name(), new BetweenValueExpressionSegment(beginSQLExpression.get(), endSQLExpression.get()), predicateNode.getStop().getStopIndex())) : Optional.<ConditionSegment>absent(); : Optional.<PredicateSegment>absent(); } private Optional<ConditionSegment> extractInPredicate(final Map<ParserRuleContext, Integer> parameterMarkerIndexes, final ParserRuleContext predicateNode, final ColumnSegment column) { private Optional<PredicateSegment> extractInPredicate(final Map<ParserRuleContext, Integer> parameterMarkerIndexes, final ParserRuleContext predicateNode, final ColumnSegment column) { Collection<ExpressionSegment> sqlExpressions = extractExpressionSegments(parameterMarkerIndexes, predicateNode); return sqlExpressions.isEmpty() ? Optional.<ConditionSegment>absent() : Optional.of(new ConditionSegment(column, ShardingOperator.IN.name(), new InValueExpressionSegment(sqlExpressions), predicateNode.getStop().getStopIndex())); return sqlExpressions.isEmpty() ? Optional.<PredicateSegment>absent() : Optional.of(new PredicateSegment(column, ShardingOperator.IN.name(), new InValueExpressionSegment(sqlExpressions), predicateNode.getStop().getStopIndex())); } private Collection<ExpressionSegment> extractExpressionSegments(final Map<ParserRuleContext, Integer> parameterMarkerIndexes, final ParserRuleContext predicateNode) { Loading @@ -201,8 +201,8 @@ public final class PredicateExtractor { for (AndConditionSegment each : leftOrCondition.getAndConditions()) { for (AndConditionSegment eachRightOr : rightOrCondition.getAndConditions()) { AndConditionSegment tempList = new AndConditionSegment(); tempList.getConditions().addAll(each.getConditions()); tempList.getConditions().addAll(eachRightOr.getConditions()); tempList.getPredicates().addAll(each.getPredicates()); tempList.getPredicates().addAll(eachRightOr.getPredicates()); result.getAndConditions().add(tempList); } } Loading
sharding-core/sharding-core-parse/sharding-core-parse-common/src/main/java/org/apache/shardingsphere/core/parse/antlr/filler/encrypt/dml/EncryptOrConditionFiller.java +18 −18 Original line number Diff line number Diff line Loading @@ -23,8 +23,8 @@ 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.sql.segment.dml.condition.AndConditionSegment; import org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.condition.ConditionSegment; import org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.condition.OrConditionSegment; import org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.condition.PredicateSegment; import org.apache.shardingsphere.core.parse.antlr.sql.statement.SQLStatement; import org.apache.shardingsphere.core.parse.antlr.sql.statement.dml.SelectStatement; import org.apache.shardingsphere.core.parse.antlr.sql.token.EncryptColumnToken; Loading Loading @@ -84,23 +84,23 @@ public class EncryptOrConditionFiller implements SQLSegmentFiller<OrConditionSeg OrCondition result = new OrCondition(); Set<Integer> filledConditionStopIndexes = new HashSet<>(); for (AndConditionSegment each : orCondition.getAndConditions()) { for (ConditionSegment condition : each.getConditions()) { if (null == condition.getColumn()) { for (PredicateSegment predicate : each.getPredicates()) { if (null == predicate.getColumn()) { continue; } if (filledConditionStopIndexes.contains(condition.getStopIndex())) { if (filledConditionStopIndexes.contains(predicate.getStopIndex())) { continue; } else { filledConditionStopIndexes.add(condition.getStopIndex()); filledConditionStopIndexes.add(predicate.getStopIndex()); } Column column = new Column(condition.getColumn().getName(), getTableName(sqlStatement, condition)); fillEncryptCondition(column, condition, sqlStatement); Column column = new Column(predicate.getColumn().getName(), getTableName(sqlStatement, predicate)); fillEncryptCondition(column, predicate, sqlStatement); } } return result; } private void fillEncryptCondition(final Column column, final ConditionSegment condition, final SQLStatement sqlStatement) { private void fillEncryptCondition(final Column column, final PredicateSegment predicate, final SQLStatement sqlStatement) { if (!encryptRule.getEncryptorEngine().getShardingEncryptor(column.getTableName(), column.getName()).isPresent()) { return; } Loading @@ -111,32 +111,32 @@ public class EncryptOrConditionFiller implements SQLSegmentFiller<OrConditionSeg } else { andCondition = sqlStatement.getEncryptConditions().getOrCondition().getAndConditions().get(0); } andCondition.getConditions().add(condition.getExpression().buildCondition(column, sqlStatement.getLogicSQL())); sqlStatement.getSQLTokens().add(new EncryptColumnToken(condition.getColumn().getStartIndex(), condition.getStopIndex(), column, true)); andCondition.getConditions().add(predicate.getExpression().buildCondition(column, sqlStatement.getLogicSQL())); sqlStatement.getSQLTokens().add(new EncryptColumnToken(predicate.getColumn().getStartIndex(), predicate.getStopIndex(), column, true)); } // TODO hongjun: find table from parent select statement, should find table in subquery level only private String getTableName(final SQLStatement sqlStatement, final ConditionSegment conditionSegment) { private String getTableName(final SQLStatement sqlStatement, final PredicateSegment predicateSegment) { if (!(sqlStatement instanceof SelectStatement)) { return getTableName(sqlStatement.getTables(), conditionSegment); return getTableName(sqlStatement.getTables(), predicateSegment); } SelectStatement currentSelectStatement = (SelectStatement) sqlStatement; while (null != currentSelectStatement.getParentStatement()) { currentSelectStatement = currentSelectStatement.getParentStatement(); String tableName = getTableName(currentSelectStatement.getTables(), conditionSegment); String tableName = getTableName(currentSelectStatement.getTables(), predicateSegment); if (!"".equals(tableName)) { return tableName; } } return getTableName(currentSelectStatement.getTables(), conditionSegment); return getTableName(currentSelectStatement.getTables(), predicateSegment); } private String getTableName(final Tables tables, final ConditionSegment conditionSegment) { if (conditionSegment.getColumn().getOwner().isPresent()) { Optional<Table> table = tables.find(conditionSegment.getColumn().getOwner().get()); private String getTableName(final Tables tables, final PredicateSegment predicateSegment) { if (predicateSegment.getColumn().getOwner().isPresent()) { Optional<Table> table = tables.find(predicateSegment.getColumn().getOwner().get()); return table.isPresent() ? table.get().getName() : ""; } else { return getTableNameFromMetaData(tables, conditionSegment.getColumn().getName()); return getTableNameFromMetaData(tables, predicateSegment.getColumn().getName()); } } Loading
sharding-core/sharding-core-parse/sharding-core-parse-common/src/main/java/org/apache/shardingsphere/core/parse/antlr/filler/sharding/dml/OrConditionFiller.java +35 −36 Original line number Diff line number Diff line Loading @@ -25,8 +25,8 @@ 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.sql.segment.dml.column.ColumnSegment; import org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.condition.AndConditionSegment; import org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.condition.ConditionSegment; import org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.condition.OrConditionSegment; import org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.condition.PredicateSegment; import org.apache.shardingsphere.core.parse.antlr.sql.statement.SQLStatement; import org.apache.shardingsphere.core.parse.antlr.sql.statement.dml.SelectStatement; import org.apache.shardingsphere.core.parse.antlr.sql.token.EncryptColumnToken; Loading @@ -34,7 +34,6 @@ import org.apache.shardingsphere.core.parse.antlr.sql.token.TableToken; import org.apache.shardingsphere.core.parse.old.lexer.token.Symbol; import org.apache.shardingsphere.core.parse.old.parser.context.condition.AndCondition; import org.apache.shardingsphere.core.parse.old.parser.context.condition.Column; import org.apache.shardingsphere.core.parse.old.parser.context.condition.Condition; import org.apache.shardingsphere.core.parse.old.parser.context.condition.OrCondition; import org.apache.shardingsphere.core.parse.old.parser.context.table.Table; import org.apache.shardingsphere.core.parse.old.parser.context.table.Tables; Loading Loading @@ -104,26 +103,26 @@ public final class OrConditionFiller implements SQLSegmentFiller<OrConditionSegm private OrCondition filterCondition(final ShardingTableMetaData shardingTableMetaData, final SQLStatement sqlStatement, final OrConditionSegment orCondition, final ShardingRule shardingRule) { OrCondition result = new OrCondition(); for (AndConditionSegment each : orCondition.getAndConditions()) { List<ConditionSegment> shardingCondition = new LinkedList<>(); List<PredicateSegment> predicates = new LinkedList<>(); boolean needSharding = false; for (ConditionSegment condition : each.getConditions()) { if (null == condition.getColumn()) { for (PredicateSegment predicate : each.getPredicates()) { if (null == predicate.getColumn()) { continue; } addTableTokenForColumn(shardingTableMetaData, sqlStatement, condition.getColumn()); if (condition.getExpression() instanceof ColumnSegment) { addTableTokenForColumn(shardingTableMetaData, sqlStatement, (ColumnSegment) condition.getExpression()); addTableTokenForColumn(shardingTableMetaData, sqlStatement, predicate.getColumn()); if (predicate.getExpression() instanceof ColumnSegment) { addTableTokenForColumn(shardingTableMetaData, sqlStatement, (ColumnSegment) predicate.getExpression()); needSharding = true; continue; } Column column = new Column(condition.getColumn().getName(), getTableName(shardingTableMetaData, shardingRule, sqlStatement, condition)); if (isShardingCondition(condition.getOperator()) && shardingRule.isShardingColumn(column.getName(), column.getTableName())) { shardingCondition.add(condition); Column column = new Column(predicate.getColumn().getName(), getTableName(shardingTableMetaData, shardingRule, sqlStatement, predicate)); if (isShardingCondition(predicate.getOperator()) && shardingRule.isShardingColumn(column.getName(), column.getTableName())) { predicates.add(predicate); needSharding = true; } } if (needSharding) { fillResult(shardingTableMetaData, sqlStatement, shardingRule, result, shardingCondition); fillResult(shardingTableMetaData, sqlStatement, shardingRule, result, predicates); } else { result.getAndConditions().clear(); break; Loading @@ -131,20 +130,20 @@ public final class OrConditionFiller implements SQLSegmentFiller<OrConditionSegm } Set<Integer> filledConditionStopIndexes = new HashSet<>(); for (AndConditionSegment each : orCondition.getAndConditions()) { for (ConditionSegment condition : each.getConditions()) { if (null == condition.getColumn()) { for (PredicateSegment predicate : each.getPredicates()) { if (null == predicate.getColumn()) { continue; } if (condition.getExpression() instanceof ColumnSegment) { if (predicate.getExpression() instanceof ColumnSegment) { continue; } if (filledConditionStopIndexes.contains(condition.getStopIndex())) { if (filledConditionStopIndexes.contains(predicate.getStopIndex())) { continue; } else { filledConditionStopIndexes.add(condition.getStopIndex()); filledConditionStopIndexes.add(predicate.getStopIndex()); } Column column = new Column(condition.getColumn().getName(), getTableName(shardingTableMetaData, shardingRule, sqlStatement, condition)); fillEncryptCondition(column, condition, shardingRule, sqlStatement); Column column = new Column(predicate.getColumn().getName(), getTableName(shardingTableMetaData, shardingRule, sqlStatement, predicate)); fillEncryptCondition(column, predicate, shardingRule, sqlStatement); } } return result; Loading @@ -161,20 +160,20 @@ public final class OrConditionFiller implements SQLSegmentFiller<OrConditionSegm } private void fillResult(final ShardingTableMetaData shardingTableMetaData, final SQLStatement sqlStatement, final ShardingRule shardingRule, final OrCondition orCondition, final List<ConditionSegment> shardingCondition) { final SQLStatement sqlStatement, final ShardingRule shardingRule, final OrCondition orCondition, final List<PredicateSegment> shardingCondition) { if (shardingCondition.isEmpty()) { return; } AndCondition andConditionResult = new AndCondition(); orCondition.getAndConditions().add(andConditionResult); for (ConditionSegment eachCondition : shardingCondition) { Optional<String> tableName = getTableName(sqlStatement, eachCondition); Column column = new Column(eachCondition.getColumn().getName(), tableName.isPresent() ? tableName.get() : getTableName(shardingTableMetaData, shardingRule, sqlStatement, eachCondition)); andConditionResult.getConditions().add(eachCondition.getExpression().buildCondition(column, sqlStatement.getLogicSQL())); for (PredicateSegment each : shardingCondition) { Optional<String> tableName = getTableName(sqlStatement, each); Column column = new Column(each.getColumn().getName(), tableName.isPresent() ? tableName.get() : getTableName(shardingTableMetaData, shardingRule, sqlStatement, each)); andConditionResult.getConditions().add(each.getExpression().buildCondition(column, sqlStatement.getLogicSQL())); } } private void fillEncryptCondition(final Column column, final ConditionSegment condition, final ShardingRule shardingRule, final SQLStatement sqlStatement) { private void fillEncryptCondition(final Column column, final PredicateSegment predicateSegment, final ShardingRule shardingRule, final SQLStatement sqlStatement) { if (!shardingRule.getShardingEncryptorEngine().getShardingEncryptor(column.getTableName(), column.getName()).isPresent()) { return; } Loading @@ -185,8 +184,8 @@ public final class OrConditionFiller implements SQLSegmentFiller<OrConditionSegm } else { andCondition = sqlStatement.getEncryptConditions().getOrCondition().getAndConditions().get(0); } andCondition.getConditions().add(condition.getExpression().buildCondition(column, sqlStatement.getLogicSQL())); sqlStatement.getSQLTokens().add(new EncryptColumnToken(condition.getColumn().getStartIndex(), condition.getStopIndex(), column, true)); andCondition.getConditions().add(predicateSegment.getExpression().buildCondition(column, sqlStatement.getLogicSQL())); sqlStatement.getSQLTokens().add(new EncryptColumnToken(predicateSegment.getColumn().getStartIndex(), predicateSegment.getStopIndex(), column, true)); } private boolean isShardingCondition(final String operator) { Loading @@ -194,22 +193,22 @@ public final class OrConditionFiller implements SQLSegmentFiller<OrConditionSegm } // 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 ConditionSegment conditionSegment) { 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(), conditionSegment); return getTableName(shardingTableMetaData, shardingRule, sqlStatement.getTables(), predicateSegment); } SelectStatement currentSelectStatement = (SelectStatement) sqlStatement; while (null != currentSelectStatement.getParentStatement()) { currentSelectStatement = currentSelectStatement.getParentStatement(); String tableName = getTableName(shardingTableMetaData, shardingRule, currentSelectStatement.getTables(), conditionSegment); String tableName = getTableName(shardingTableMetaData, shardingRule, currentSelectStatement.getTables(), predicateSegment); if (!"".equals(tableName)) { return tableName; } } return getTableName(shardingTableMetaData, shardingRule, currentSelectStatement.getTables(), conditionSegment); return getTableName(shardingTableMetaData, shardingRule, currentSelectStatement.getTables(), predicateSegment); } private Optional<String> getTableName(final SQLStatement sqlStatement, final ConditionSegment conditionSegment) { private Optional<String> getTableName(final SQLStatement sqlStatement, final PredicateSegment conditionSegment) { if (conditionSegment.getColumn().getOwner().isPresent()) { Optional<Table> table = sqlStatement.getTables().find(conditionSegment.getColumn().getOwner().get()); if (table.isPresent()) { Loading @@ -219,16 +218,16 @@ public final class OrConditionFiller implements SQLSegmentFiller<OrConditionSegm return Optional.absent(); } private String getTableName(final ShardingTableMetaData shardingTableMetaData, final ShardingRule shardingRule, final Tables tables, final ConditionSegment conditionSegment) { private String getTableName(final ShardingTableMetaData shardingTableMetaData, final ShardingRule shardingRule, final Tables tables, final PredicateSegment predicateSegment) { Collection<String> shardingLogicTableNames = shardingRule.getShardingLogicTableNames(tables.getTableNames()); if (tables.isSingleTable() || tables.isSameTable() || 1 == shardingLogicTableNames.size() || shardingRule.isAllBindingTables(shardingLogicTableNames)) { return tables.getSingleTableName(); } if (conditionSegment.getColumn().getOwner().isPresent()) { Optional<Table> table = tables.find(conditionSegment.getColumn().getOwner().get()); if (predicateSegment.getColumn().getOwner().isPresent()) { Optional<Table> table = tables.find(predicateSegment.getColumn().getOwner().get()); return table.isPresent() ? table.get().getName() : ""; } else { return getTableNameFromMetaData(shardingTableMetaData, tables, conditionSegment.getColumn().getName()); return getTableNameFromMetaData(shardingTableMetaData, tables, predicateSegment.getColumn().getName()); } } Loading
sharding-core/sharding-core-parse/sharding-core-parse-common/src/main/java/org/apache/shardingsphere/core/parse/antlr/sql/segment/dml/condition/AndConditionSegment.java +1 −1 Original line number Diff line number Diff line Loading @@ -33,5 +33,5 @@ import java.util.List; @Getter public final class AndConditionSegment implements SQLSegment { private List<ConditionSegment> conditions = new LinkedList<>(); private List<PredicateSegment> predicates = new LinkedList<>(); }
sharding-core/sharding-core-parse/sharding-core-parse-common/src/main/java/org/apache/shardingsphere/core/parse/antlr/sql/segment/dml/condition/ConditionSegment.java→sharding-core/sharding-core-parse/sharding-core-parse-common/src/main/java/org/apache/shardingsphere/core/parse/antlr/sql/segment/dml/condition/PredicateSegment.java +2 −2 Original line number Diff line number Diff line Loading @@ -24,13 +24,13 @@ import org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.column.ColumnS import org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.expr.SQLRightValueExpressionSegment; /** * Condition segment. * Predicate segment. * * @author duhongjun */ @RequiredArgsConstructor @Getter public final class ConditionSegment implements SQLSegment { public final class PredicateSegment implements SQLSegment { private final ColumnSegment column; Loading