diff --git a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/rewriter/parameter/ShardingParameterRewriter.java b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/rewriter/parameter/ShardingParameterRewriter.java index 1451e39a488578193d16f7ebba89f3d91c44723c..d5f4d3d398f566c70eb70c049f8877cf72459cb3 100644 --- a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/rewriter/parameter/ShardingParameterRewriter.java +++ b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/rewriter/parameter/ShardingParameterRewriter.java @@ -44,6 +44,6 @@ public final class ShardingParameterRewriter implements ParameterRewriter { private void rewriteLimit(final SelectStatement selectStatement, final ParameterBuilder parameterBuilder) { boolean isNeedFetchAll = (!selectStatement.getGroupByItems().isEmpty() || !selectStatement.getAggregationSelectItems().isEmpty()) && !selectStatement.isSameGroupByAndOrderByItems(); - parameterBuilder.getReplacedIndexAndParameters().putAll(sqlRouteResult.getLimit().getRevisedIndexAndParameters(isNeedFetchAll, databaseType.name())); + parameterBuilder.getReplacedIndexAndParameters().putAll(sqlRouteResult.getLimit().getRevisedParameters(isNeedFetchAll, databaseType.name())); } } diff --git a/sharding-core/sharding-core-route/src/main/java/org/apache/shardingsphere/core/route/limit/Limit.java b/sharding-core/sharding-core-route/src/main/java/org/apache/shardingsphere/core/route/limit/Limit.java index 244f8d7fecc1991f4d5a621f64006ca8981f36c7..4310bdb5a039d5e2d6b6b6362d74c743bcab6b40 100644 --- a/sharding-core/sharding-core-route/src/main/java/org/apache/shardingsphere/core/route/limit/Limit.java +++ b/sharding-core/sharding-core-route/src/main/java/org/apache/shardingsphere/core/route/limit/Limit.java @@ -18,7 +18,6 @@ package org.apache.shardingsphere.core.route.limit; import lombok.Getter; -import lombok.ToString; import org.apache.shardingsphere.core.parse.sql.segment.dml.limit.LimitValueSegment; import org.apache.shardingsphere.core.parse.sql.segment.dml.limit.NumberLiteralLimitValueSegment; import org.apache.shardingsphere.core.parse.sql.segment.dml.limit.ParameterMarkerLimitValueSegment; @@ -28,14 +27,13 @@ import java.util.List; import java.util.Map; /** - * Limit object. + * Limit. * * @author zhangliang * @author caohao * @author zhangyonglun */ @Getter -@ToString public final class Limit { private final LimitValue offset; @@ -50,8 +48,7 @@ public final class Limit { private LimitValue createLimitValue(final LimitValueSegment limitValueSegment, final List parameters) { int segmentValue = limitValueSegment instanceof ParameterMarkerLimitValueSegment ? (int) parameters.get(((ParameterMarkerLimitValueSegment) limitValueSegment).getParameterIndex()) : ((NumberLiteralLimitValueSegment) limitValueSegment).getValue(); - int index = limitValueSegment instanceof ParameterMarkerLimitValueSegment ? ((ParameterMarkerLimitValueSegment) limitValueSegment).getParameterIndex() : -1; - return new LimitValue(segmentValue, index, limitValueSegment); + return new LimitValue(limitValueSegment, segmentValue); } /** @@ -73,32 +70,30 @@ public final class Limit { } /** - * Revise parameters. + * Get revise parameters. * * @param isFetchAll is fetch all data or not * @param databaseType database type - * @return revised indexes and parameters + * @return revised parameters and parameters' indexes */ - public Map getRevisedIndexAndParameters(final boolean isFetchAll, final String databaseType) { + public Map getRevisedParameters(final boolean isFetchAll, final String databaseType) { Map result = new HashMap<>(2, 1); - int rewriteOffset = 0; - int rewriteRowCount; - if (isFetchAll) { - rewriteRowCount = Integer.MAX_VALUE; - } else if (isNeedRewriteRowCount(databaseType)) { - rewriteRowCount = null == rowCount ? -1 : getOffsetValue() + rowCount.getValue(); - } else { - rewriteRowCount = rowCount.getValue(); - } - if (null != offset && offset.getIndex() > -1) { - result.put(offset.getIndex(), rewriteOffset); + if (null != offset && offset.getLimitValueSegment() instanceof ParameterMarkerLimitValueSegment) { + result.put(((ParameterMarkerLimitValueSegment) offset.getLimitValueSegment()).getParameterIndex(), 0); } - if (null != rowCount && rowCount.getIndex() > -1) { - result.put(rowCount.getIndex(), rewriteRowCount); + if (null != rowCount && rowCount.getLimitValueSegment() instanceof ParameterMarkerLimitValueSegment) { + result.put(((ParameterMarkerLimitValueSegment) rowCount.getLimitValueSegment()).getParameterIndex(), getRewriteRowCount(isFetchAll, databaseType)); } return result; } + private int getRewriteRowCount(final boolean isFetchAll, final String databaseType) { + if (isFetchAll) { + return Integer.MAX_VALUE; + } + return isNeedRewriteRowCount(databaseType) ? getOffsetValue() + rowCount.getValue() : rowCount.getValue(); + } + /** * Judge is need rewrite row count or not. * diff --git a/sharding-core/sharding-core-route/src/main/java/org/apache/shardingsphere/core/route/limit/LimitValue.java b/sharding-core/sharding-core-route/src/main/java/org/apache/shardingsphere/core/route/limit/LimitValue.java index 988d4c447171bea724abe7b46bf67bcdaaf3eea2..35cb7164027b0dfc35f7df5c028e30960e628431 100644 --- a/sharding-core/sharding-core-route/src/main/java/org/apache/shardingsphere/core/route/limit/LimitValue.java +++ b/sharding-core/sharding-core-route/src/main/java/org/apache/shardingsphere/core/route/limit/LimitValue.java @@ -17,10 +17,8 @@ package org.apache.shardingsphere.core.route.limit; -import lombok.AllArgsConstructor; import lombok.Getter; -import lombok.Setter; -import lombok.ToString; +import lombok.RequiredArgsConstructor; import org.apache.shardingsphere.core.parse.sql.segment.dml.limit.LimitValueSegment; /** @@ -28,15 +26,11 @@ import org.apache.shardingsphere.core.parse.sql.segment.dml.limit.LimitValueSegm * * @author zhangliang */ -@AllArgsConstructor +@RequiredArgsConstructor @Getter -@Setter -@ToString public final class LimitValue { - private int value; + private final LimitValueSegment limitValueSegment; - private int index; - - private LimitValueSegment limitValueSegment; + private final int value; }