提交 c48e56c4 编写于 作者: T terrymanu

for #2441, Limit => Pagination

上级 3f28158c
......@@ -36,7 +36,7 @@ import org.apache.shardingsphere.core.merge.dql.pagination.TopAndRowNumberDecora
import org.apache.shardingsphere.core.parse.sql.statement.dml.SelectStatement;
import org.apache.shardingsphere.core.parse.util.SQLUtil;
import org.apache.shardingsphere.core.route.SQLRouteResult;
import org.apache.shardingsphere.core.route.limit.Limit;
import org.apache.shardingsphere.core.route.pagination.Pagination;
import java.sql.SQLException;
import java.util.ArrayList;
......@@ -135,18 +135,18 @@ public final class DQLMergeEngine implements MergeEngine {
}
private MergedResult decorate(final MergedResult mergedResult) throws SQLException {
Limit limit = routeResult.getLimit();
if (null == limit || 1 == queryResults.size()) {
Pagination pagination = routeResult.getPagination();
if (null == pagination || 1 == queryResults.size()) {
return mergedResult;
}
if (DatabaseType.MySQL == databaseType || DatabaseType.PostgreSQL == databaseType || DatabaseType.H2 == databaseType) {
return new LimitDecoratorMergedResult(mergedResult, routeResult.getLimit());
return new LimitDecoratorMergedResult(mergedResult, routeResult.getPagination());
}
if (DatabaseType.Oracle == databaseType) {
return new RowNumberDecoratorMergedResult(mergedResult, routeResult.getLimit());
return new RowNumberDecoratorMergedResult(mergedResult, routeResult.getPagination());
}
if (DatabaseType.SQLServer == databaseType) {
return new TopAndRowNumberDecoratorMergedResult(mergedResult, routeResult.getLimit());
return new TopAndRowNumberDecoratorMergedResult(mergedResult, routeResult.getPagination());
}
return mergedResult;
}
......
......@@ -19,7 +19,7 @@ package org.apache.shardingsphere.core.merge.dql.pagination;
import org.apache.shardingsphere.core.merge.MergedResult;
import org.apache.shardingsphere.core.merge.dql.common.DecoratorMergedResult;
import org.apache.shardingsphere.core.route.limit.Limit;
import org.apache.shardingsphere.core.route.pagination.Pagination;
import java.sql.SQLException;
......@@ -30,20 +30,20 @@ import java.sql.SQLException;
*/
public final class LimitDecoratorMergedResult extends DecoratorMergedResult {
private final Limit limit;
private final Pagination pagination;
private final boolean skipAll;
private int rowNumber;
public LimitDecoratorMergedResult(final MergedResult mergedResult, final Limit limit) throws SQLException {
public LimitDecoratorMergedResult(final MergedResult mergedResult, final Pagination pagination) throws SQLException {
super(mergedResult);
this.limit = limit;
this.pagination = pagination;
skipAll = skipOffset();
}
private boolean skipOffset() throws SQLException {
for (int i = 0; i < limit.getOffsetValue(); i++) {
for (int i = 0; i < pagination.getOffsetValue(); i++) {
if (!getMergedResult().next()) {
return true;
}
......@@ -57,9 +57,9 @@ public final class LimitDecoratorMergedResult extends DecoratorMergedResult {
if (skipAll) {
return false;
}
if (limit.getRowCountValue() < 0) {
if (pagination.getRowCountValue() < 0) {
return getMergedResult().next();
}
return ++rowNumber <= limit.getRowCountValue() && getMergedResult().next();
return ++rowNumber <= pagination.getRowCountValue() && getMergedResult().next();
}
}
......@@ -19,7 +19,7 @@ package org.apache.shardingsphere.core.merge.dql.pagination;
import org.apache.shardingsphere.core.merge.MergedResult;
import org.apache.shardingsphere.core.merge.dql.common.DecoratorMergedResult;
import org.apache.shardingsphere.core.route.limit.Limit;
import org.apache.shardingsphere.core.route.pagination.Pagination;
import java.sql.SQLException;
......@@ -30,24 +30,24 @@ import java.sql.SQLException;
*/
public final class RowNumberDecoratorMergedResult extends DecoratorMergedResult {
private final Limit limit;
private final Pagination pagination;
private final boolean skipAll;
private int rowNumber;
public RowNumberDecoratorMergedResult(final MergedResult mergedResult, final Limit limit) throws SQLException {
public RowNumberDecoratorMergedResult(final MergedResult mergedResult, final Pagination pagination) throws SQLException {
super(mergedResult);
this.limit = limit;
this.pagination = pagination;
skipAll = skipOffset();
}
private boolean skipOffset() throws SQLException {
int end;
if (null == limit.getOffset()) {
if (null == pagination.getOffset()) {
end = 0;
} else {
end = limit.getOffset().getPaginationValueSegment().isBoundOpened() ? limit.getOffsetValue() - 1 : limit.getOffsetValue();
end = pagination.getOffset().getSegment().isBoundOpened() ? pagination.getOffsetValue() - 1 : pagination.getOffsetValue();
}
for (int i = 0; i < end; i++) {
if (!getMergedResult().next()) {
......@@ -63,12 +63,12 @@ public final class RowNumberDecoratorMergedResult extends DecoratorMergedResult
if (skipAll) {
return false;
}
if (limit.getRowCountValue() < 0) {
if (pagination.getRowCountValue() < 0) {
return getMergedResult().next();
}
if (limit.getRowCount().getPaginationValueSegment().isBoundOpened()) {
return rowNumber++ <= limit.getRowCountValue() && getMergedResult().next();
if (pagination.getRowCount().getSegment().isBoundOpened()) {
return rowNumber++ <= pagination.getRowCountValue() && getMergedResult().next();
}
return rowNumber++ < limit.getRowCountValue() && getMergedResult().next();
return rowNumber++ < pagination.getRowCountValue() && getMergedResult().next();
}
}
......@@ -19,7 +19,7 @@ package org.apache.shardingsphere.core.merge.dql.pagination;
import org.apache.shardingsphere.core.merge.MergedResult;
import org.apache.shardingsphere.core.merge.dql.common.DecoratorMergedResult;
import org.apache.shardingsphere.core.route.limit.Limit;
import org.apache.shardingsphere.core.route.pagination.Pagination;
import java.sql.SQLException;
......@@ -30,24 +30,24 @@ import java.sql.SQLException;
*/
public final class TopAndRowNumberDecoratorMergedResult extends DecoratorMergedResult {
private final Limit limit;
private final Pagination pagination;
private final boolean skipAll;
private int rowNumber;
public TopAndRowNumberDecoratorMergedResult(final MergedResult mergedResult, final Limit limit) throws SQLException {
public TopAndRowNumberDecoratorMergedResult(final MergedResult mergedResult, final Pagination pagination) throws SQLException {
super(mergedResult);
this.limit = limit;
this.pagination = pagination;
skipAll = skipOffset();
}
private boolean skipOffset() throws SQLException {
int end;
if (null == limit.getOffset()) {
if (null == pagination.getOffset()) {
end = 0;
} else {
end = limit.getOffset().getPaginationValueSegment().isBoundOpened() ? limit.getOffsetValue() - 1 : limit.getOffsetValue();
end = pagination.getOffset().getSegment().isBoundOpened() ? pagination.getOffsetValue() - 1 : pagination.getOffsetValue();
}
for (int i = 0; i < end; i++) {
if (!getMergedResult().next()) {
......@@ -63,9 +63,9 @@ public final class TopAndRowNumberDecoratorMergedResult extends DecoratorMergedR
if (skipAll) {
return false;
}
if (limit.getRowCountValue() < 0) {
if (pagination.getRowCountValue() < 0) {
return getMergedResult().next();
}
return rowNumber++ <= limit.getRowCountValue() && getMergedResult().next();
return rowNumber++ <= pagination.getRowCountValue() && getMergedResult().next();
}
}
......@@ -37,7 +37,7 @@ import org.apache.shardingsphere.core.parse.sql.segment.dml.order.item.IndexOrde
import org.apache.shardingsphere.core.parse.sql.segment.dml.pagination.PaginationSegment;
import org.apache.shardingsphere.core.parse.sql.statement.dml.SelectStatement;
import org.apache.shardingsphere.core.route.SQLRouteResult;
import org.apache.shardingsphere.core.route.limit.Limit;
import org.apache.shardingsphere.core.route.pagination.Pagination;
import org.junit.Before;
import org.junit.Test;
......@@ -91,14 +91,14 @@ public final class DQLMergeEngineTest {
@Test
public void assertBuildIteratorStreamMergedResultWithLimit() throws SQLException {
routeResult.setLimit(new Limit(new PaginationSegment(0, 0, null, null), Collections.emptyList()));
routeResult.setPagination(new Pagination(new PaginationSegment(0, 0, null, null), Collections.emptyList()));
mergeEngine = new DQLMergeEngine(DatabaseType.MySQL, routeResult, singleQueryResult);
assertThat(mergeEngine.merge(), instanceOf(IteratorStreamMergedResult.class));
}
@Test
public void assertBuildIteratorStreamMergedResultWithMySQLLimit() throws SQLException {
routeResult.setLimit(new Limit(new PaginationSegment(0, 0, null, null), Collections.emptyList()));
routeResult.setPagination(new Pagination(new PaginationSegment(0, 0, null, null), Collections.emptyList()));
mergeEngine = new DQLMergeEngine(DatabaseType.MySQL, routeResult, queryResults);
MergedResult actual = mergeEngine.merge();
assertThat(actual, instanceOf(LimitDecoratorMergedResult.class));
......@@ -107,7 +107,7 @@ public final class DQLMergeEngineTest {
@Test
public void assertBuildIteratorStreamMergedResultWithOracleLimit() throws SQLException {
routeResult.setLimit(new Limit(new PaginationSegment(0, 0, null, null), Collections.emptyList()));
routeResult.setPagination(new Pagination(new PaginationSegment(0, 0, null, null), Collections.emptyList()));
mergeEngine = new DQLMergeEngine(DatabaseType.Oracle, routeResult, queryResults);
MergedResult actual = mergeEngine.merge();
assertThat(actual, instanceOf(RowNumberDecoratorMergedResult.class));
......@@ -116,7 +116,7 @@ public final class DQLMergeEngineTest {
@Test
public void assertBuildIteratorStreamMergedResultWithSQLServerLimit() throws SQLException {
routeResult.setLimit(new Limit(new PaginationSegment(0, 0, null, null), Collections.emptyList()));
routeResult.setPagination(new Pagination(new PaginationSegment(0, 0, null, null), Collections.emptyList()));
mergeEngine = new DQLMergeEngine(DatabaseType.SQLServer, routeResult, queryResults);
MergedResult actual = mergeEngine.merge();
assertThat(actual, instanceOf(TopAndRowNumberDecoratorMergedResult.class));
......@@ -132,7 +132,7 @@ public final class DQLMergeEngineTest {
@Test
public void assertBuildOrderByStreamMergedResultWithMySQLLimit() throws SQLException {
routeResult.setLimit(new Limit(new PaginationSegment(0, 0, null, null), Collections.emptyList()));
routeResult.setPagination(new Pagination(new PaginationSegment(0, 0, null, null), Collections.emptyList()));
selectStatement.getOrderByItems().add(new IndexOrderByItemSegment(0, 0, 1, OrderDirection.DESC, OrderDirection.ASC));
mergeEngine = new DQLMergeEngine(DatabaseType.MySQL, routeResult, queryResults);
MergedResult actual = mergeEngine.merge();
......@@ -142,7 +142,7 @@ public final class DQLMergeEngineTest {
@Test
public void assertBuildOrderByStreamMergedResultWithOracleLimit() throws SQLException {
routeResult.setLimit(new Limit(new PaginationSegment(0, 0, null, null), Collections.emptyList()));
routeResult.setPagination(new Pagination(new PaginationSegment(0, 0, null, null), Collections.emptyList()));
selectStatement.getOrderByItems().add(new IndexOrderByItemSegment(0, 0, 1, OrderDirection.DESC, OrderDirection.ASC));
mergeEngine = new DQLMergeEngine(DatabaseType.Oracle, routeResult, queryResults);
MergedResult actual = mergeEngine.merge();
......@@ -152,7 +152,7 @@ public final class DQLMergeEngineTest {
@Test
public void assertBuildOrderByStreamMergedResultWithSQLServerLimit() throws SQLException {
routeResult.setLimit(new Limit(new PaginationSegment(0, 0, null, null), Collections.emptyList()));
routeResult.setPagination(new Pagination(new PaginationSegment(0, 0, null, null), Collections.emptyList()));
selectStatement.getOrderByItems().add(new IndexOrderByItemSegment(0, 0, 1, OrderDirection.DESC, OrderDirection.ASC));
mergeEngine = new DQLMergeEngine(DatabaseType.SQLServer, routeResult, queryResults);
MergedResult actual = mergeEngine.merge();
......@@ -170,7 +170,7 @@ public final class DQLMergeEngineTest {
@Test
public void assertBuildGroupByStreamMergedResultWithMySQLLimit() throws SQLException {
routeResult.setLimit(new Limit(new PaginationSegment(0, 0, null, null), Collections.emptyList()));
routeResult.setPagination(new Pagination(new PaginationSegment(0, 0, null, null), Collections.emptyList()));
selectStatement.getGroupByItems().add(new IndexOrderByItemSegment(0, 0, 1, OrderDirection.DESC, OrderDirection.ASC));
selectStatement.getOrderByItems().add(new IndexOrderByItemSegment(0, 0, 1, OrderDirection.DESC, OrderDirection.ASC));
mergeEngine = new DQLMergeEngine(DatabaseType.MySQL, routeResult, queryResults);
......@@ -181,7 +181,7 @@ public final class DQLMergeEngineTest {
@Test
public void assertBuildGroupByStreamMergedResultWithOracleLimit() throws SQLException {
routeResult.setLimit(new Limit(new PaginationSegment(0, 0, null, null), Collections.emptyList()));
routeResult.setPagination(new Pagination(new PaginationSegment(0, 0, null, null), Collections.emptyList()));
selectStatement.getGroupByItems().add(new IndexOrderByItemSegment(0, 0, 1, OrderDirection.DESC, OrderDirection.ASC));
selectStatement.getOrderByItems().add(new IndexOrderByItemSegment(0, 0, 1, OrderDirection.DESC, OrderDirection.ASC));
mergeEngine = new DQLMergeEngine(DatabaseType.Oracle, routeResult, queryResults);
......@@ -192,7 +192,7 @@ public final class DQLMergeEngineTest {
@Test
public void assertBuildGroupByStreamMergedResultWithSQLServerLimit() throws SQLException {
routeResult.setLimit(new Limit(new PaginationSegment(0, 0, null, null), Collections.emptyList()));
routeResult.setPagination(new Pagination(new PaginationSegment(0, 0, null, null), Collections.emptyList()));
selectStatement.getGroupByItems().add(new IndexOrderByItemSegment(0, 0, 1, OrderDirection.DESC, OrderDirection.ASC));
selectStatement.getOrderByItems().add(new IndexOrderByItemSegment(0, 0, 1, OrderDirection.DESC, OrderDirection.ASC));
mergeEngine = new DQLMergeEngine(DatabaseType.SQLServer, routeResult, queryResults);
......@@ -210,7 +210,7 @@ public final class DQLMergeEngineTest {
@Test
public void assertBuildGroupByMemoryMergedResultWithMySQLLimit() throws SQLException {
routeResult.setLimit(new Limit(new PaginationSegment(0, 0, null, null), Collections.emptyList()));
routeResult.setPagination(new Pagination(new PaginationSegment(0, 0, null, null), Collections.emptyList()));
selectStatement.getGroupByItems().add(new IndexOrderByItemSegment(0, 0, 1, OrderDirection.DESC, OrderDirection.ASC));
mergeEngine = new DQLMergeEngine(DatabaseType.MySQL, routeResult, queryResults);
MergedResult actual = mergeEngine.merge();
......@@ -220,7 +220,7 @@ public final class DQLMergeEngineTest {
@Test
public void assertBuildGroupByMemoryMergedResultWithOracleLimit() throws SQLException {
routeResult.setLimit(new Limit(new PaginationSegment(0, 0, null, null), Collections.emptyList()));
routeResult.setPagination(new Pagination(new PaginationSegment(0, 0, null, null), Collections.emptyList()));
selectStatement.getGroupByItems().add(new IndexOrderByItemSegment(0, 0, 1, OrderDirection.DESC, OrderDirection.ASC));
selectStatement.getOrderByItems().add(new IndexOrderByItemSegment(0, 0, 2, OrderDirection.DESC, OrderDirection.ASC));
mergeEngine = new DQLMergeEngine(DatabaseType.Oracle, routeResult, queryResults);
......@@ -231,7 +231,7 @@ public final class DQLMergeEngineTest {
@Test
public void assertBuildGroupByMemoryMergedResultWithSQLServerLimit() throws SQLException {
routeResult.setLimit(new Limit(new PaginationSegment(0, 0, null, null), Collections.emptyList()));
routeResult.setPagination(new Pagination(new PaginationSegment(0, 0, null, null), Collections.emptyList()));
selectStatement.getGroupByItems().add(new IndexOrderByItemSegment(0, 0, 1, OrderDirection.DESC, OrderDirection.ASC));
selectStatement.getGroupByItems().add(new IndexOrderByItemSegment(0, 0, 1, OrderDirection.ASC, OrderDirection.ASC));
mergeEngine = new DQLMergeEngine(DatabaseType.SQLServer, routeResult, queryResults);
......@@ -249,7 +249,7 @@ public final class DQLMergeEngineTest {
@Test
public void assertBuildGroupByMemoryMergedResultWithAggregationOnlyWithMySQLLimit() throws SQLException {
routeResult.setLimit(new Limit(new PaginationSegment(0, 0, null, null), Collections.emptyList()));
routeResult.setPagination(new Pagination(new PaginationSegment(0, 0, null, null), Collections.emptyList()));
selectStatement.getItems().add(new AggregationSelectItem(AggregationType.COUNT, "(*)", Optional.<String>absent()));
mergeEngine = new DQLMergeEngine(DatabaseType.MySQL, routeResult, queryResults);
MergedResult actual = mergeEngine.merge();
......@@ -259,7 +259,7 @@ public final class DQLMergeEngineTest {
@Test
public void assertBuildGroupByMemoryMergedResultWithAggregationOnlyWithOracleLimit() throws SQLException {
routeResult.setLimit(new Limit(new PaginationSegment(0, 0, null, null), Collections.emptyList()));
routeResult.setPagination(new Pagination(new PaginationSegment(0, 0, null, null), Collections.emptyList()));
selectStatement.getItems().add(new AggregationSelectItem(AggregationType.COUNT, "(*)", Optional.<String>absent()));
mergeEngine = new DQLMergeEngine(DatabaseType.Oracle, routeResult, queryResults);
MergedResult actual = mergeEngine.merge();
......@@ -269,7 +269,7 @@ public final class DQLMergeEngineTest {
@Test
public void assertBuildGroupByMemoryMergedResultWithAggregationOnlyWithSQLServerLimit() throws SQLException {
routeResult.setLimit(new Limit(new PaginationSegment(0, 0, null, null), Collections.emptyList()));
routeResult.setPagination(new Pagination(new PaginationSegment(0, 0, null, null), Collections.emptyList()));
selectStatement.getItems().add(new AggregationSelectItem(AggregationType.COUNT, "(*)", Optional.<String>absent()));
mergeEngine = new DQLMergeEngine(DatabaseType.SQLServer, routeResult, queryResults);
MergedResult actual = mergeEngine.merge();
......
......@@ -27,7 +27,7 @@ import org.apache.shardingsphere.core.parse.sql.segment.dml.pagination.Paginatio
import org.apache.shardingsphere.core.parse.sql.segment.dml.pagination.limit.NumberLiteralLimitValueSegment;
import org.apache.shardingsphere.core.parse.sql.statement.dml.SelectStatement;
import org.apache.shardingsphere.core.route.SQLRouteResult;
import org.apache.shardingsphere.core.route.limit.Limit;
import org.apache.shardingsphere.core.route.pagination.Pagination;
import org.junit.Before;
import org.junit.Test;
......@@ -66,12 +66,12 @@ public final class LimitDecoratorMergedResultTest {
}
SelectStatement selectStatement = new SelectStatement();
routeResult = new SQLRouteResult(selectStatement);
routeResult.setLimit(new Limit(new PaginationSegment(0, 0, null, null), Collections.emptyList()));
routeResult.setPagination(new Pagination(new PaginationSegment(0, 0, null, null), Collections.emptyList()));
}
@Test
public void assertNextForSkipAll() throws SQLException {
routeResult.setLimit(new Limit(new PaginationSegment(0, 0, new NumberLiteralLimitValueSegment(0, 0, Integer.MAX_VALUE), null), Collections.emptyList()));
routeResult.setPagination(new Pagination(new PaginationSegment(0, 0, new NumberLiteralLimitValueSegment(0, 0, Integer.MAX_VALUE), null), Collections.emptyList()));
mergeEngine = new DQLMergeEngine(DatabaseType.MySQL, routeResult, queryResults);
MergedResult actual = mergeEngine.merge();
assertFalse(actual.next());
......@@ -79,7 +79,7 @@ public final class LimitDecoratorMergedResultTest {
@Test
public void assertNextWithoutRowCount() throws SQLException {
routeResult.setLimit(new Limit(new PaginationSegment(0, 0, new NumberLiteralLimitValueSegment(0, 0, 2), null), Collections.emptyList()));
routeResult.setPagination(new Pagination(new PaginationSegment(0, 0, new NumberLiteralLimitValueSegment(0, 0, 2), null), Collections.emptyList()));
mergeEngine = new DQLMergeEngine(DatabaseType.MySQL, routeResult, queryResults);
MergedResult actual = mergeEngine.merge();
for (int i = 0; i < 6; i++) {
......@@ -90,7 +90,7 @@ public final class LimitDecoratorMergedResultTest {
@Test
public void assertNextWithRowCount() throws SQLException {
routeResult.setLimit(new Limit(new PaginationSegment(0, 0, new NumberLiteralLimitValueSegment(0, 0, 2), new NumberLiteralLimitValueSegment(0, 0, 2)), Collections.emptyList()));
routeResult.setPagination(new Pagination(new PaginationSegment(0, 0, new NumberLiteralLimitValueSegment(0, 0, 2), new NumberLiteralLimitValueSegment(0, 0, 2)), Collections.emptyList()));
mergeEngine = new DQLMergeEngine(DatabaseType.MySQL, routeResult, queryResults);
MergedResult actual = mergeEngine.merge();
assertTrue(actual.next());
......
......@@ -27,7 +27,7 @@ import org.apache.shardingsphere.core.parse.sql.segment.dml.pagination.Paginatio
import org.apache.shardingsphere.core.parse.sql.segment.dml.pagination.rownum.NumberLiteralRowNumberValueSegment;
import org.apache.shardingsphere.core.parse.sql.statement.dml.SelectStatement;
import org.apache.shardingsphere.core.route.SQLRouteResult;
import org.apache.shardingsphere.core.route.limit.Limit;
import org.apache.shardingsphere.core.route.pagination.Pagination;
import org.junit.Before;
import org.junit.Test;
......@@ -69,7 +69,7 @@ public final class RowNumberDecoratorMergedResultTest {
@Test
public void assertNextForSkipAll() throws SQLException {
routeResult.setLimit(new Limit(new PaginationSegment(0, 0, new NumberLiteralRowNumberValueSegment(0, 0, Integer.MAX_VALUE, true), null), Collections.emptyList()));
routeResult.setPagination(new Pagination(new PaginationSegment(0, 0, new NumberLiteralRowNumberValueSegment(0, 0, Integer.MAX_VALUE, true), null), Collections.emptyList()));
mergeEngine = new DQLMergeEngine(DatabaseType.Oracle, routeResult, queryResults);
MergedResult actual = mergeEngine.merge();
assertFalse(actual.next());
......@@ -77,7 +77,7 @@ public final class RowNumberDecoratorMergedResultTest {
@Test
public void assertNextWithoutOffsetWithoutRowCount() throws SQLException {
routeResult.setLimit(new Limit(new PaginationSegment(0, 0, null, null), Collections.emptyList()));
routeResult.setPagination(new Pagination(new PaginationSegment(0, 0, null, null), Collections.emptyList()));
mergeEngine = new DQLMergeEngine(DatabaseType.Oracle, routeResult, queryResults);
MergedResult actual = mergeEngine.merge();
for (int i = 0; i < 8; i++) {
......@@ -88,7 +88,7 @@ public final class RowNumberDecoratorMergedResultTest {
@Test
public void assertNextForRowCountBoundOpenedFalse() throws SQLException {
routeResult.setLimit(new Limit(
routeResult.setPagination(new Pagination(
new PaginationSegment(0, 0, new NumberLiteralRowNumberValueSegment(0, 0, 2, true), new NumberLiteralRowNumberValueSegment(0, 0, 4, false)), Collections.emptyList()));
mergeEngine = new DQLMergeEngine(DatabaseType.Oracle, routeResult, queryResults);
MergedResult actual = mergeEngine.merge();
......@@ -99,7 +99,7 @@ public final class RowNumberDecoratorMergedResultTest {
@Test
public void assertNextForRowCountBoundOpenedTrue() throws SQLException {
routeResult.setLimit(new Limit(
routeResult.setPagination(new Pagination(
new PaginationSegment(0, 0, new NumberLiteralRowNumberValueSegment(0, 0, 2, true), new NumberLiteralRowNumberValueSegment(0, 0, 4, true)), Collections.emptyList()));
mergeEngine = new DQLMergeEngine(DatabaseType.Oracle, routeResult, queryResults);
MergedResult actual = mergeEngine.merge();
......
......@@ -28,7 +28,7 @@ import org.apache.shardingsphere.core.parse.sql.segment.dml.pagination.limit.Num
import org.apache.shardingsphere.core.parse.sql.segment.dml.pagination.rownum.NumberLiteralRowNumberValueSegment;
import org.apache.shardingsphere.core.parse.sql.statement.dml.SelectStatement;
import org.apache.shardingsphere.core.route.SQLRouteResult;
import org.apache.shardingsphere.core.route.limit.Limit;
import org.apache.shardingsphere.core.route.pagination.Pagination;
import org.junit.Before;
import org.junit.Test;
......@@ -70,7 +70,7 @@ public final class TopAndRowNumberDecoratorMergedResultTest {
@Test
public void assertNextForSkipAll() throws SQLException {
routeResult.setLimit(new Limit(new PaginationSegment(0, 0, new NumberLiteralRowNumberValueSegment(0, 0, Integer.MAX_VALUE, true), null), Collections.emptyList()));
routeResult.setPagination(new Pagination(new PaginationSegment(0, 0, new NumberLiteralRowNumberValueSegment(0, 0, Integer.MAX_VALUE, true), null), Collections.emptyList()));
mergeEngine = new DQLMergeEngine(DatabaseType.SQLServer, routeResult, queryResults);
MergedResult actual = mergeEngine.merge();
assertFalse(actual.next());
......@@ -78,7 +78,7 @@ public final class TopAndRowNumberDecoratorMergedResultTest {
@Test
public void assertNextWithoutOffsetWithRowCount() throws SQLException {
routeResult.setLimit(new Limit(new PaginationSegment(0, 0, null, new NumberLiteralLimitValueSegment(0, 0, 5)), Collections.emptyList()));
routeResult.setPagination(new Pagination(new PaginationSegment(0, 0, null, new NumberLiteralLimitValueSegment(0, 0, 5)), Collections.emptyList()));
mergeEngine = new DQLMergeEngine(DatabaseType.SQLServer, routeResult, queryResults);
MergedResult actual = mergeEngine.merge();
for (int i = 0; i < 5; i++) {
......@@ -89,7 +89,7 @@ public final class TopAndRowNumberDecoratorMergedResultTest {
@Test
public void assertNextWithOffsetWithoutRowCount() throws SQLException {
routeResult.setLimit(new Limit(new PaginationSegment(0, 0, new NumberLiteralRowNumberValueSegment(0, 0, 2, true), null), Collections.emptyList()));
routeResult.setPagination(new Pagination(new PaginationSegment(0, 0, new NumberLiteralRowNumberValueSegment(0, 0, 2, true), null), Collections.emptyList()));
mergeEngine = new DQLMergeEngine(DatabaseType.SQLServer, routeResult, queryResults);
MergedResult actual = mergeEngine.merge();
for (int i = 0; i < 7; i++) {
......@@ -100,7 +100,8 @@ public final class TopAndRowNumberDecoratorMergedResultTest {
@Test
public void assertNextWithOffsetBoundOpenedFalse() throws SQLException {
routeResult.setLimit(new Limit(new PaginationSegment(0, 0, new NumberLiteralRowNumberValueSegment(0, 0, 2, false), new NumberLiteralLimitValueSegment(0, 0, 4)), Collections.emptyList()));
routeResult.setPagination(new Pagination(
new PaginationSegment(0, 0, new NumberLiteralRowNumberValueSegment(0, 0, 2, false), new NumberLiteralLimitValueSegment(0, 0, 4)), Collections.emptyList()));
mergeEngine = new DQLMergeEngine(DatabaseType.SQLServer, routeResult, queryResults);
MergedResult actual = mergeEngine.merge();
assertTrue(actual.next());
......@@ -110,7 +111,8 @@ public final class TopAndRowNumberDecoratorMergedResultTest {
@Test
public void assertNextWithOffsetBoundOpenedTrue() throws SQLException {
routeResult.setLimit(new Limit(new PaginationSegment(0, 0, new NumberLiteralRowNumberValueSegment(0, 0, 2, true), new NumberLiteralLimitValueSegment(0, 0, 4)), Collections.emptyList()));
routeResult.setPagination(new Pagination(
new PaginationSegment(0, 0, new NumberLiteralRowNumberValueSegment(0, 0, 2, true), new NumberLiteralLimitValueSegment(0, 0, 4)), Collections.emptyList()));
mergeEngine = new DQLMergeEngine(DatabaseType.SQLServer, routeResult, queryResults);
MergedResult actual = mergeEngine.merge();
assertTrue(actual.next());
......
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.shardingsphere.core.parse.sql.segment.dml.limit;
import com.google.common.base.Optional;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import org.apache.shardingsphere.core.parse.sql.segment.SQLSegment;
/**
* Limit segment.
*
* @author duhongjun
*/
@RequiredArgsConstructor
@Getter
public final class LimitSegment implements SQLSegment {
private final int startIndex;
private final int stopIndex;
private final LimitValueSegment offset;
private final LimitValueSegment rowCount;
/**
* Get offset.
*
* @return offset
*/
public Optional<LimitValueSegment> getOffset() {
return Optional.fromNullable(offset);
}
/**
* Get row count.
*
* @return row count
*/
public Optional<LimitValueSegment> getRowCount() {
return Optional.fromNullable(rowCount);
}
}
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.shardingsphere.core.parse.sql.segment.dml.limit;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import org.apache.shardingsphere.core.parse.sql.segment.SQLSegment;
/**
* Limit value segment.
*
* @author zhangliang
* @author panjuan
*/
@RequiredArgsConstructor
@Getter
public abstract class LimitValueSegment implements SQLSegment {
private final int startIndex;
private final int stopIndex;
private final boolean boundOpened;
}
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.shardingsphere.core.parse.sql.segment.dml.limit;
import lombok.Getter;
/**
* Limit value segment for number literal.
*
* @author zhangliang
*/
@Getter
public final class NumberLiteralLimitValueSegment extends LimitValueSegment {
private final int value;
public NumberLiteralLimitValueSegment(final int startIndex, final int stopIndex, final int value, final boolean boundOpened) {
super(startIndex, stopIndex, boundOpened);
this.value = value;
}
}
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.shardingsphere.core.parse.sql.segment.dml.limit;
import lombok.Getter;
/**
* Limit value segment for parameter marker.
*
* @author zhangliang
*/
@Getter
public final class ParameterMarkerLimitValueSegment extends LimitValueSegment {
private final int parameterIndex;
public ParameterMarkerLimitValueSegment(final int startIndex, final int stopIndex, final int parameterIndex, final boolean boundOpened) {
super(startIndex, stopIndex, boundOpened);
this.parameterIndex = parameterIndex;
}
}
......@@ -21,9 +21,9 @@ import org.apache.shardingsphere.core.parse.integrate.asserts.condition.Conditio
import org.apache.shardingsphere.core.parse.integrate.asserts.groupby.GroupByAssert;
import org.apache.shardingsphere.core.parse.integrate.asserts.index.IndexAssert;
import org.apache.shardingsphere.core.parse.integrate.asserts.item.ItemAssert;
import org.apache.shardingsphere.core.parse.integrate.asserts.limit.PaginationAssert;
import org.apache.shardingsphere.core.parse.integrate.asserts.meta.TableMetaDataAssert;
import org.apache.shardingsphere.core.parse.integrate.asserts.orderby.OrderByAssert;
import org.apache.shardingsphere.core.parse.integrate.asserts.pagination.PaginationAssert;
import org.apache.shardingsphere.core.parse.integrate.asserts.table.AlterTableAssert;
import org.apache.shardingsphere.core.parse.integrate.asserts.table.TableAssert;
import org.apache.shardingsphere.core.parse.integrate.jaxb.root.ParserResult;
......@@ -118,7 +118,7 @@ public final class SQLStatementAssert {
itemAssert.assertItems(actual.getItems(), expected.getSelectItems());
groupByAssert.assertGroupByItems(actual.getGroupByItems(), expected.getGroupByColumns());
orderByAssert.assertOrderByItems(actual.getOrderByItems(), expected.getOrderByColumns());
paginationAssert.assertPagination(actual.getPagination(), expected.getLimit());
paginationAssert.assertPagination(actual.getPagination(), expected.getPagination());
}
private void assertCreateTableStatement(final CreateTableStatement actual) {
......
......@@ -15,11 +15,11 @@
* limitations under the License.
*/
package org.apache.shardingsphere.core.parse.integrate.asserts.limit;
package org.apache.shardingsphere.core.parse.integrate.asserts.pagination;
import lombok.RequiredArgsConstructor;
import org.apache.shardingsphere.core.parse.integrate.asserts.SQLStatementAssertMessage;
import org.apache.shardingsphere.core.parse.integrate.jaxb.limit.ExpectedLimit;
import org.apache.shardingsphere.core.parse.integrate.jaxb.pagination.ExpectedPagination;
import org.apache.shardingsphere.core.parse.sql.segment.dml.pagination.NumberLiteralPaginationValueSegment;
import org.apache.shardingsphere.core.parse.sql.segment.dml.pagination.PaginationSegment;
import org.apache.shardingsphere.core.parse.sql.segment.dml.pagination.ParameterMarkerPaginationValueSegment;
......@@ -47,7 +47,7 @@ public final class PaginationAssert {
* @param actual actual pagination
* @param expected expected pagination
*/
public void assertPagination(final PaginationSegment actual, final ExpectedLimit expected) {
public void assertPagination(final PaginationSegment actual, final ExpectedPagination expected) {
if (null == actual) {
assertNull(assertMessage.getFullAssertMessage("Pagination should not exist: "), expected);
return;
......
......@@ -15,7 +15,7 @@
* limitations under the License.
*/
package org.apache.shardingsphere.core.parse.integrate.jaxb.limit;
package org.apache.shardingsphere.core.parse.integrate.jaxb.pagination;
import lombok.Getter;
import lombok.Setter;
......@@ -27,7 +27,7 @@ import javax.xml.bind.annotation.XmlAttribute;
@Getter
@Setter
@XmlAccessorType(XmlAccessType.FIELD)
public final class ExpectedLimit {
public final class ExpectedPagination {
@XmlAttribute
private Integer offset;
......
......@@ -24,9 +24,9 @@ import org.apache.shardingsphere.core.parse.integrate.jaxb.condition.ExpectedOrC
import org.apache.shardingsphere.core.parse.integrate.jaxb.groupby.ExpectedGroupByColumn;
import org.apache.shardingsphere.core.parse.integrate.jaxb.insert.ExpectedInsertColumnsAndValues;
import org.apache.shardingsphere.core.parse.integrate.jaxb.item.ExpectedSelectItems;
import org.apache.shardingsphere.core.parse.integrate.jaxb.limit.ExpectedLimit;
import org.apache.shardingsphere.core.parse.integrate.jaxb.meta.ExpectedTableMetaData;
import org.apache.shardingsphere.core.parse.integrate.jaxb.orderby.ExpectedOrderByColumn;
import org.apache.shardingsphere.core.parse.integrate.jaxb.pagination.ExpectedPagination;
import org.apache.shardingsphere.core.parse.integrate.jaxb.table.ExpectedAlterTable;
import org.apache.shardingsphere.core.parse.integrate.jaxb.table.ExpectedTable;
import org.apache.shardingsphere.core.parse.integrate.jaxb.token.ExpectedTokens;
......@@ -77,7 +77,7 @@ public final class ParserResult {
private List<ExpectedGroupByColumn> groupByColumns = new LinkedList<>();
@XmlElement
private ExpectedLimit limit;
private ExpectedPagination pagination;
@XmlElement
private ExpectedTableMetaData meta;
......
......@@ -187,7 +187,7 @@
<order-by-columns>
<order-by-column name="user_id" order-direction="ASC" />
</order-by-columns>
<limit row-count-index="0" row-count="5" />
<pagination row-count-index="0" row-count="5" />
</parser-result>
<parser-result sql-case-id="select_group_by_with_order_by_and_limit" parameters="5">
......@@ -208,7 +208,7 @@
<order-by-columns>
<order-by-column name="SUM(order_id)" order-direction="ASC" />
</order-by-columns>
<limit row-count-index="0" row-count="5" />
<pagination row-count-index="0" row-count="5" />
</parser-result>
<parser-result sql-case-id="select_with_item_alias_match_order_by_and_group_by_items">
......
......@@ -41,7 +41,7 @@
<order-by-columns>
<order-by-column name="item_id" owner="i" order-direction="DESC" />
</order-by-columns>
<limit offset="5" offset-index="4" />
<pagination offset="5" offset-index="4" />
</parser-result>
<parser-result sql-case-id="select_pagination_with_row_count" parameters="1, 2, 9, 10, 5">
......@@ -68,7 +68,7 @@
<order-by-columns>
<order-by-column name="item_id" owner="i" order-direction="DESC" />
</order-by-columns>
<limit row-count="5" row-count-index="4" />
<pagination row-count="5" row-count-index="4" />
</parser-result>
<parser-result sql-case-id="select_pagination_with_limit_with_back_quotes" parameters="1, 2, 9, 10, 5, 3">
......@@ -95,7 +95,7 @@
<order-by-columns>
<order-by-column name="item_id" owner="i" order-direction="DESC" />
</order-by-columns>
<limit offset="5" offset-index="4" row-count="3" row-count-index="5" />
<pagination offset="5" offset-index="4" row-count="3" row-count-index="5" />
</parser-result>
<parser-result sql-case-id="select_pagination_with_top" parameters="3, 1, 2, 9, 10">
......@@ -122,7 +122,7 @@
<order-by-columns>
<order-by-column name="item_id" owner="i" order-direction="DESC" />
</order-by-columns>
<limit row-count="3" row-count-index="0" />
<pagination row-count="3" row-count-index="0" />
</parser-result>
<parser-result sql-case-id="select_pagination_with_offset_and_limit" parameters="1, 2, 9, 10, 5, 3">
......@@ -149,7 +149,7 @@
<order-by-columns>
<order-by-column name="item_id" owner="i" order-direction="DESC" />
</order-by-columns>
<limit offset="5" offset-index="4" row-count="3" row-count-index="5" />
<pagination offset="5" offset-index="4" row-count="3" row-count-index="5" />
</parser-result>
<parser-result sql-case-id="select_pagination_with_top_for_greater_than" parameters="3, 1, 2, 9, 10, 6">
......@@ -176,7 +176,7 @@
<order-by-columns>
<order-by-column name="item_id" owner="i" order-direction="DESC" />
</order-by-columns>
<limit offset="6" offset-index="5" row-count-index="0" row-count="3" />
<pagination offset="6" offset-index="5" row-count-index="0" row-count="3" />
</parser-result>
<parser-result sql-case-id="select_pagination_with_top_for_greater_than_and_equal" parameters="3, 1, 2, 9, 10, 6">
......@@ -203,7 +203,7 @@
<order-by-columns>
<order-by-column name="item_id" owner="i" order-direction="DESC" />
</order-by-columns>
<limit offset="6" offset-index="5" row-count-index="0" row-count="3" />
<pagination offset="6" offset-index="5" row-count-index="0" row-count="3" />
</parser-result>
<parser-result sql-case-id="select_pagination_with_row_number" parameters="1, 2, 9, 10, 3">
......@@ -230,7 +230,7 @@
<order-by-columns>
<order-by-column name="item_id" owner="i" order-direction="DESC" />
</order-by-columns>
<limit row-count="3" row-count-index="4" />
<pagination row-count="3" row-count-index="4" />
</parser-result>
<parser-result sql-case-id="select_pagination_with_row_number_for_greater_than" parameters="1, 2, 9, 10, 5, 3">
......@@ -257,7 +257,7 @@
<order-by-columns>
<order-by-column name="item_id" owner="i" order-direction="DESC" />
</order-by-columns>
<limit offset="3" offset-index="5" row-count-index="4" row-count="5" />
<pagination offset="3" offset-index="5" row-count-index="4" row-count="5" />
</parser-result>
<parser-result sql-case-id="select_pagination_with_row_number_for_greater_than_and_equal" parameters="1, 2, 9, 10, 5, 3">
......@@ -284,7 +284,7 @@
<order-by-columns>
<order-by-column name="item_id" owner="i" order-direction="DESC" />
</order-by-columns>
<limit offset="3" offset-index="5" row-count-index="4" row-count="5" />
<pagination offset="3" offset-index="5" row-count-index="4" row-count="5" />
</parser-result>
<parser-result sql-case-id="select_pagination_with_row_number_not_at_end" parameters="20">
......@@ -297,7 +297,7 @@
<order-by-columns>
<order-by-column name="order_id" order-direction="ASC" />
</order-by-columns>
<limit row-count="20" row-count-index="0" />
<pagination row-count="20" row-count-index="0" />
</parser-result>
</parser-result-sets>
......@@ -44,7 +44,7 @@
<order-by-columns>
<order-by-column name="item_id" owner="i" order-direction="DESC" />
</order-by-columns>
<limit offset="5" offset-index="4" row-count="3" row-count-index="5" />
<pagination offset="5" offset-index="4" row-count="3" row-count-index="5" />
</parser-result>
<parser-result sql-case-id="select_pagination_with_diff_group_by_and_order_by" parameters="1, 2, 9, 10, 5, 3">
......@@ -74,7 +74,7 @@
<order-by-columns>
<order-by-column name="item_id" owner="i" order-direction="DESC" />
</order-by-columns>
<limit offset="5" offset-index="4" row-count="3" row-count-index="5" />
<pagination offset="5" offset-index="4" row-count="3" row-count-index="5" />
</parser-result>
<parser-result sql-case-id="select_pagination_with_top_and_group_by_and_order_by" parameters="3, 1, 2, 9, 10, 6">
......@@ -104,7 +104,7 @@
<order-by-columns>
<order-by-column name="item_id" owner="i" order-direction="DESC" />
</order-by-columns>
<limit offset="6" offset-index="5" row-count-index="0" row-count="3" />
<pagination offset="6" offset-index="5" row-count-index="0" row-count="3" />
</parser-result>
<parser-result sql-case-id="select_pagination_with_top_and_group_by_and_order_by_and_parentheses" parameters="3, 1, 2, 9, 10, 6">
......@@ -134,7 +134,7 @@
<order-by-columns>
<order-by-column name="item_id" owner="i" order-direction="DESC" />
</order-by-columns>
<limit offset="6" offset-index="5" row-count-index="0" row-count="3" />
<pagination offset="6" offset-index="5" row-count-index="0" row-count="3" />
</parser-result>
<parser-result sql-case-id="select_pagination_with_top_and_diff_group_by_and_order_by" parameters="3, 1, 2, 9, 10, 6">
......@@ -164,7 +164,7 @@
<order-by-columns>
<order-by-column name="item_id" owner="i" order-direction="DESC" />
</order-by-columns>
<limit offset="6" offset-index="5" row-count-index="0" row-count="3" />
<pagination offset="6" offset-index="5" row-count-index="0" row-count="3" />
</parser-result>
<parser-result sql-case-id="select_pagination_with_top_and_diff_group_by_and_order_by_and_parentheses" parameters="3, 1, 2, 9, 10, 6">
......@@ -194,7 +194,7 @@
<order-by-columns>
<order-by-column name="item_id" owner="i" order-direction="DESC" />
</order-by-columns>
<limit offset="6" offset-index="5" row-count-index="0" row-count="3" />
<pagination offset="6" offset-index="5" row-count-index="0" row-count="3" />
</parser-result>
<parser-result sql-case-id="select_pagination_with_row_number_and_group_by_and_order_by" parameters="1, 2, 9, 10, 5, 3">
......@@ -224,7 +224,7 @@
<order-by-columns>
<order-by-column name="item_id" owner="i" order-direction="DESC" />
</order-by-columns>
<limit offset="3" offset-index="5" row-count-index="4" row-count="5" />
<pagination offset="3" offset-index="5" row-count-index="4" row-count="5" />
</parser-result>
<parser-result sql-case-id="select_pagination_with_row_number_and_diff_group_by_and_order_by" parameters="1, 2, 9, 10, 5, 3">
......@@ -254,6 +254,6 @@
<order-by-columns>
<order-by-column name="item_id" owner="i" order-direction="DESC" />
</order-by-columns>
<limit offset="3" offset-index="5" row-count-index="4" row-count="5" />
<pagination offset="3" offset-index="5" row-count-index="4" row-count="5" />
</parser-result>
</parser-result-sets>
......@@ -37,13 +37,13 @@ public final class ShardingParameterRewriter implements ParameterRewriter {
@Override
public void rewrite(final ParameterBuilder parameterBuilder) {
if (sqlRouteResult.getSqlStatement() instanceof SelectStatement && null != sqlRouteResult.getLimit()) {
if (sqlRouteResult.getSqlStatement() instanceof SelectStatement && null != sqlRouteResult.getPagination()) {
rewriteLimit((SelectStatement) sqlRouteResult.getSqlStatement(), parameterBuilder);
}
}
private void rewriteLimit(final SelectStatement selectStatement, final ParameterBuilder parameterBuilder) {
boolean isNeedFetchAll = (!selectStatement.getGroupByItems().isEmpty() || !selectStatement.getAggregationSelectItems().isEmpty()) && !selectStatement.isSameGroupByAndOrderByItems();
parameterBuilder.getReplacedIndexAndParameters().putAll(sqlRouteResult.getLimit().getRevisedParameters(isNeedFetchAll, databaseType.name()));
parameterBuilder.getReplacedIndexAndParameters().putAll(sqlRouteResult.getPagination().getRevisedParameters(isNeedFetchAll, databaseType.name()));
}
}
......@@ -49,7 +49,7 @@ import org.apache.shardingsphere.core.rewrite.token.pojo.SelectItemPrefixToken;
import org.apache.shardingsphere.core.rewrite.token.pojo.SelectItemsToken;
import org.apache.shardingsphere.core.rewrite.token.pojo.TableToken;
import org.apache.shardingsphere.core.route.SQLRouteResult;
import org.apache.shardingsphere.core.route.limit.Limit;
import org.apache.shardingsphere.core.route.pagination.Pagination;
import org.apache.shardingsphere.core.rule.ShardingRule;
/**
......@@ -140,17 +140,17 @@ public final class ShardingSQLRewriter implements SQLRewriter {
private void appendLimitRowCountPlaceholder(final SQLBuilder sqlBuilder, final RowCountToken rowCountToken) {
SelectStatement selectStatement = (SelectStatement) sqlRouteResult.getSqlStatement();
sqlBuilder.appendPlaceholder(new LimitRowCountPlaceholder(getRowCount(rowCountToken, isRewrite(), selectStatement, sqlRouteResult.getLimit())));
sqlBuilder.appendPlaceholder(new LimitRowCountPlaceholder(getRowCount(rowCountToken, isRewrite(), selectStatement, sqlRouteResult.getPagination())));
}
private int getRowCount(final RowCountToken rowCountToken, final boolean isRewrite, final SelectStatement selectStatement, final Limit limit) {
private int getRowCount(final RowCountToken rowCountToken, final boolean isRewrite, final SelectStatement selectStatement, final Pagination pagination) {
if (!isRewrite) {
return rowCountToken.getRowCount();
}
if (isMaxRowCount(selectStatement)) {
return Integer.MAX_VALUE;
}
return limit.isNeedRewriteRowCount(databaseType.name()) ? rowCountToken.getRowCount() + limit.getOffsetValue() : rowCountToken.getRowCount();
return pagination.isNeedRewriteRowCount(databaseType.name()) ? rowCountToken.getRowCount() + pagination.getOffsetValue() : rowCountToken.getRowCount();
}
private boolean isMaxRowCount(final SelectStatement selectStatement) {
......
......@@ -64,7 +64,7 @@ import org.apache.shardingsphere.core.rewrite.rewriter.parameter.ShardingParamet
import org.apache.shardingsphere.core.rewrite.rewriter.sql.EncryptSQLRewriter;
import org.apache.shardingsphere.core.rewrite.rewriter.sql.ShardingSQLRewriter;
import org.apache.shardingsphere.core.route.SQLRouteResult;
import org.apache.shardingsphere.core.route.limit.Limit;
import org.apache.shardingsphere.core.route.pagination.Pagination;
import org.apache.shardingsphere.core.route.type.RoutingResult;
import org.apache.shardingsphere.core.route.type.RoutingUnit;
import org.apache.shardingsphere.core.route.type.TableUnit;
......@@ -347,11 +347,11 @@ public final class ShardingSQLRewriterTest {
@Test
public void assertRewriteForLimit() {
PaginationSegment limitSegment = new PaginationSegment(0, 0, new NumberLiteralLimitValueSegment(33, 33, 2), new NumberLiteralLimitValueSegment(36, 36, 2));
selectStatement.setPagination(limitSegment);
PaginationSegment paginationSegment = new PaginationSegment(0, 0, new NumberLiteralLimitValueSegment(33, 33, 2), new NumberLiteralLimitValueSegment(36, 36, 2));
selectStatement.setPagination(paginationSegment);
selectStatement.getSqlSegments().add(new TableSegment(17, 23, "table_x"));
routeResult = new SQLRouteResult(selectStatement);
routeResult.setLimit(new Limit(limitSegment, Collections.emptyList()));
routeResult.setPagination(new Pagination(paginationSegment, Collections.emptyList()));
routeResult.setRoutingResult(new RoutingResult());
selectStatement.setLogicSQL("SELECT x.id FROM table_x x LIMIT 2, 2");
SQLRewriteEngine rewriteEngine = createSQLRewriteEngine(DatabaseType.MySQL, Collections.emptyList());
......@@ -360,11 +360,11 @@ public final class ShardingSQLRewriterTest {
@Test
public void assertRewriteForRowNumber() {
PaginationSegment limitSegment = new PaginationSegment(0, 0, new NumberLiteralRowNumberValueSegment(119, 119, 2, true), new NumberLiteralRowNumberValueSegment(98, 98, 4, false));
selectStatement.setPagination(limitSegment);
PaginationSegment paginationSegment = new PaginationSegment(0, 0, new NumberLiteralRowNumberValueSegment(119, 119, 2, true), new NumberLiteralRowNumberValueSegment(98, 98, 4, false));
selectStatement.setPagination(paginationSegment);
selectStatement.getSqlSegments().add(new TableSegment(68, 74, "table_x"));
routeResult = new SQLRouteResult(selectStatement);
routeResult.setLimit(new Limit(limitSegment, Collections.emptyList()));
routeResult.setPagination(new Pagination(paginationSegment, Collections.emptyList()));
routeResult.setRoutingResult(new RoutingResult());
selectStatement.setLogicSQL("SELECT * FROM (SELECT row_.*, rownum rownum_ FROM (SELECT x.id FROM table_x x) row_ WHERE rownum<=4) t WHERE t.rownum_>2");
SQLRewriteEngine rewriteEngine = createSQLRewriteEngine(DatabaseType.Oracle, Collections.emptyList());
......@@ -374,11 +374,11 @@ public final class ShardingSQLRewriterTest {
@Test
public void assertRewriteForTopAndRowNumber() {
PaginationSegment limitSegment = new PaginationSegment(0, 0, new NumberLiteralRowNumberValueSegment(123, 123, 2, true), new NumberLiteralLimitValueSegment(26, 26, 4));
selectStatement.setPagination(limitSegment);
PaginationSegment paginationSegment = new PaginationSegment(0, 0, new NumberLiteralRowNumberValueSegment(123, 123, 2, true), new NumberLiteralLimitValueSegment(26, 26, 4));
selectStatement.setPagination(paginationSegment);
selectStatement.getSqlSegments().add(new TableSegment(85, 91, "table_x"));
routeResult = new SQLRouteResult(selectStatement);
routeResult.setLimit(new Limit(limitSegment, Collections.emptyList()));
routeResult.setPagination(new Pagination(paginationSegment, Collections.emptyList()));
routeResult.setRoutingResult(new RoutingResult());
selectStatement.setLogicSQL("SELECT * FROM (SELECT TOP(4) row_number() OVER (ORDER BY x.id) AS rownum_, x.id FROM table_x x) AS row_ WHERE row_.rownum_>2");
SQLRewriteEngine rewriteEngine = createSQLRewriteEngine(DatabaseType.SQLServer, Collections.emptyList());
......@@ -388,15 +388,15 @@ public final class ShardingSQLRewriterTest {
@Test
public void assertRewriteForLimitForMemoryGroupBy() {
PaginationSegment limitSegment = new PaginationSegment(0, 0, new NumberLiteralLimitValueSegment(33, 33, 2), new NumberLiteralLimitValueSegment(36, 36, 2));
selectStatement.setPagination(limitSegment);
PaginationSegment paginationSegment = new PaginationSegment(0, 0, new NumberLiteralLimitValueSegment(33, 33, 2), new NumberLiteralLimitValueSegment(36, 36, 2));
selectStatement.setPagination(paginationSegment);
ColumnSegment columnSegment = new ColumnSegment(0, 0, "id");
columnSegment.setOwner(new TableSegment(0, 0, "x"));
selectStatement.getOrderByItems().add(new ColumnOrderByItemSegment(0, 0, columnSegment, OrderDirection.ASC, OrderDirection.ASC));
selectStatement.getGroupByItems().add(new ColumnOrderByItemSegment(0, 0, columnSegment, OrderDirection.DESC, OrderDirection.ASC));
selectStatement.getSqlSegments().add(new TableSegment(17, 23, "table_x"));
routeResult = new SQLRouteResult(selectStatement);
routeResult.setLimit(new Limit(limitSegment, Collections.emptyList()));
routeResult.setPagination(new Pagination(paginationSegment, Collections.emptyList()));
routeResult.setRoutingResult(new RoutingResult());
selectStatement.setLogicSQL("SELECT x.id FROM table_x x LIMIT 2, 2");
SQLRewriteEngine rewriteEngine = createSQLRewriteEngine(DatabaseType.MySQL, Collections.emptyList());
......@@ -405,15 +405,15 @@ public final class ShardingSQLRewriterTest {
@Test
public void assertRewriteForRowNumForMemoryGroupBy() {
PaginationSegment limitSegment = new PaginationSegment(0, 0, new NumberLiteralRowNumberValueSegment(119, 119, 2, true), new NumberLiteralRowNumberValueSegment(98, 98, 4, false));
selectStatement.setPagination(limitSegment);
PaginationSegment paginationSegment = new PaginationSegment(0, 0, new NumberLiteralRowNumberValueSegment(119, 119, 2, true), new NumberLiteralRowNumberValueSegment(98, 98, 4, false));
selectStatement.setPagination(paginationSegment);
selectStatement.getSqlSegments().add(new TableSegment(68, 74, "table_x"));
ColumnSegment columnSegment = new ColumnSegment(0, 0, "id");
columnSegment.setOwner(new TableSegment(0, 0, "x"));
selectStatement.getOrderByItems().add(new ColumnOrderByItemSegment(0, 0, columnSegment, OrderDirection.ASC, OrderDirection.ASC));
selectStatement.getGroupByItems().add(new ColumnOrderByItemSegment(0, 0, columnSegment, OrderDirection.DESC, OrderDirection.ASC));
routeResult = new SQLRouteResult(selectStatement);
routeResult.setLimit(new Limit(limitSegment, Collections.emptyList()));
routeResult.setPagination(new Pagination(paginationSegment, Collections.emptyList()));
routeResult.setRoutingResult(new RoutingResult());
selectStatement.setLogicSQL("SELECT * FROM (SELECT row_.*, rownum rownum_ FROM (SELECT x.id FROM table_x x) row_ WHERE rownum<=4) t WHERE t.rownum_>2");
SQLRewriteEngine rewriteEngine = createSQLRewriteEngine(DatabaseType.Oracle, Collections.emptyList());
......@@ -423,15 +423,15 @@ public final class ShardingSQLRewriterTest {
@Test
public void assertRewriteForTopAndRowNumberForMemoryGroupBy() {
PaginationSegment limitSegment = new PaginationSegment(0, 0, new NumberLiteralRowNumberValueSegment(123, 123, 2, false), new NumberLiteralLimitValueSegment(26, 26, 4));
selectStatement.setPagination(limitSegment);
PaginationSegment paginationSegment = new PaginationSegment(0, 0, new NumberLiteralRowNumberValueSegment(123, 123, 2, false), new NumberLiteralLimitValueSegment(26, 26, 4));
selectStatement.setPagination(paginationSegment);
selectStatement.getSqlSegments().add(new TableSegment(85, 91, "table_x"));
ColumnSegment columnSegment = new ColumnSegment(0, 0, "id");
columnSegment.setOwner(new TableSegment(0, 0, "x"));
selectStatement.getOrderByItems().add(new ColumnOrderByItemSegment(0, 0, columnSegment, OrderDirection.ASC, OrderDirection.ASC));
selectStatement.getGroupByItems().add(new ColumnOrderByItemSegment(0, 0, columnSegment, OrderDirection.DESC, OrderDirection.ASC));
routeResult = new SQLRouteResult(selectStatement);
routeResult.setLimit(new Limit(limitSegment, Collections.emptyList()));
routeResult.setPagination(new Pagination(paginationSegment, Collections.emptyList()));
routeResult.setRoutingResult(new RoutingResult());
selectStatement.setLogicSQL("SELECT * FROM (SELECT TOP(4) row_number() OVER (ORDER BY x.id) AS rownum_, x.id FROM table_x x) AS row_ WHERE row_.rownum_>2");
SQLRewriteEngine rewriteEngine = createSQLRewriteEngine(DatabaseType.SQLServer, Collections.emptyList());
......@@ -440,12 +440,12 @@ public final class ShardingSQLRewriterTest {
}
@Test
public void assertRewriteForLimitForNotRewriteLimit() {
PaginationSegment limitSegment = new PaginationSegment(0, 0, new NumberLiteralLimitValueSegment(33, 33, 2), new NumberLiteralLimitValueSegment(36, 36, 2));
selectStatement.setPagination(limitSegment);
public void assertRewriteForLimitForNotRewritePagination() {
PaginationSegment paginationSegment = new PaginationSegment(0, 0, new NumberLiteralLimitValueSegment(33, 33, 2), new NumberLiteralLimitValueSegment(36, 36, 2));
selectStatement.setPagination(paginationSegment);
selectStatement.getSqlSegments().add(new TableSegment(17, 23, "table_x"));
routeResult = new SQLRouteResult(selectStatement);
routeResult.setLimit(new Limit(limitSegment, Collections.emptyList()));
routeResult.setPagination(new Pagination(paginationSegment, Collections.emptyList()));
RoutingResult routingResult = new RoutingResult();
routingResult.getRoutingUnits().add(new RoutingUnit("ds"));
routeResult.setRoutingResult(routingResult);
......@@ -455,12 +455,12 @@ public final class ShardingSQLRewriterTest {
}
@Test
public void assertRewriteForRowNumForNotRewriteLimit() {
PaginationSegment limitSegment = new PaginationSegment(0, 0, new NumberLiteralRowNumberValueSegment(119, 119, 2, true), new NumberLiteralRowNumberValueSegment(98, 98, 4, false));
selectStatement.setPagination(limitSegment);
public void assertRewriteForRowNumForNotRewritePagination() {
PaginationSegment paginationSegment = new PaginationSegment(0, 0, new NumberLiteralRowNumberValueSegment(119, 119, 2, true), new NumberLiteralRowNumberValueSegment(98, 98, 4, false));
selectStatement.setPagination(paginationSegment);
selectStatement.getSqlSegments().add(new TableSegment(68, 74, "table_x"));
routeResult = new SQLRouteResult(selectStatement);
routeResult.setLimit(new Limit(limitSegment, Collections.emptyList()));
routeResult.setPagination(new Pagination(paginationSegment, Collections.emptyList()));
RoutingResult routingResult = new RoutingResult();
routingResult.getRoutingUnits().add(new RoutingUnit("ds"));
routeResult.setRoutingResult(routingResult);
......@@ -471,12 +471,12 @@ public final class ShardingSQLRewriterTest {
}
@Test
public void assertRewriteForTopAndRowNumberForNotRewriteLimit() {
PaginationSegment limitSegment = new PaginationSegment(0, 0, new NumberLiteralRowNumberValueSegment(123, 123, 2, true), new NumberLiteralLimitValueSegment(26, 26, 4));
selectStatement.setPagination(limitSegment);
public void assertRewriteForTopAndRowNumberForNotRewritePagination() {
PaginationSegment paginationSegment = new PaginationSegment(0, 0, new NumberLiteralRowNumberValueSegment(123, 123, 2, true), new NumberLiteralLimitValueSegment(26, 26, 4));
selectStatement.setPagination(paginationSegment);
selectStatement.getSqlSegments().add(new TableSegment(85, 91, "table_x"));
routeResult = new SQLRouteResult(selectStatement);
routeResult.setLimit(new Limit(limitSegment, Collections.emptyList()));
routeResult.setPagination(new Pagination(paginationSegment, Collections.emptyList()));
RoutingResult routingResult = new RoutingResult();
routingResult.getRoutingUnits().add(new RoutingUnit("ds"));
routeResult.setRoutingResult(routingResult);
......
......@@ -23,7 +23,7 @@ import lombok.Setter;
import org.apache.shardingsphere.core.optimize.GeneratedKey;
import org.apache.shardingsphere.core.optimize.result.OptimizeResult;
import org.apache.shardingsphere.core.parse.sql.statement.SQLStatement;
import org.apache.shardingsphere.core.route.limit.Limit;
import org.apache.shardingsphere.core.route.pagination.Pagination;
import org.apache.shardingsphere.core.route.type.RoutingResult;
import java.util.Collection;
......@@ -45,7 +45,7 @@ public final class SQLRouteResult {
private final GeneratedKey generatedKey;
private Limit limit;
private Pagination pagination;
private RoutingResult routingResult;
......
......@@ -15,43 +15,42 @@
* limitations under the License.
*/
package org.apache.shardingsphere.core.route.limit;
package org.apache.shardingsphere.core.route.pagination;
import lombok.Getter;
import org.apache.shardingsphere.core.parse.sql.segment.dml.pagination.NumberLiteralPaginationValueSegment;
import org.apache.shardingsphere.core.parse.sql.segment.dml.pagination.PaginationSegment;
import org.apache.shardingsphere.core.parse.sql.segment.dml.pagination.PaginationValueSegment;
import org.apache.shardingsphere.core.parse.sql.segment.dml.pagination.ParameterMarkerPaginationValueSegment;
import org.apache.shardingsphere.core.parse.sql.segment.dml.pagination.limit.ParameterMarkerLimitValueSegment;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Limit.
* Pagination.
*
* @author zhangliang
* @author caohao
* @author zhangyonglun
*/
@Getter
public final class Limit {
public final class Pagination {
private final LimitValue offset;
private final PaginationValue offset;
private final LimitValue rowCount;
private final PaginationValue rowCount;
public Limit(final PaginationSegment limitSegment, final List<Object> parameters) {
offset = limitSegment.getOffset().isPresent() ? createLimitValue(limitSegment.getOffset().get(), parameters) : null;
rowCount = limitSegment.getRowCount().isPresent() ? createLimitValue(limitSegment.getRowCount().get(), parameters) : null;
public Pagination(final PaginationSegment paginationSegment, final List<Object> parameters) {
offset = paginationSegment.getOffset().isPresent() ? createPaginationValue(paginationSegment.getOffset().get(), parameters) : null;
rowCount = paginationSegment.getRowCount().isPresent() ? createPaginationValue(paginationSegment.getRowCount().get(), parameters) : null;
}
private LimitValue createLimitValue(final PaginationValueSegment paginationValueSegment, final List<Object> parameters) {
private PaginationValue createPaginationValue(final PaginationValueSegment paginationValueSegment, final List<Object> parameters) {
int segmentValue = paginationValueSegment instanceof ParameterMarkerPaginationValueSegment
? (int) parameters.get(((ParameterMarkerPaginationValueSegment) paginationValueSegment).getParameterIndex())
: ((NumberLiteralPaginationValueSegment) paginationValueSegment).getValue();
return new LimitValue(paginationValueSegment, segmentValue);
return new PaginationValue(paginationValueSegment, segmentValue);
}
/**
......@@ -81,11 +80,11 @@ public final class Limit {
*/
public Map<Integer, Object> getRevisedParameters(final boolean isFetchAll, final String databaseType) {
Map<Integer, Object> result = new HashMap<>(2, 1);
if (null != offset && offset.getPaginationValueSegment() instanceof ParameterMarkerLimitValueSegment) {
result.put(((ParameterMarkerLimitValueSegment) offset.getPaginationValueSegment()).getParameterIndex(), 0);
if (null != offset && offset.getSegment() instanceof ParameterMarkerPaginationValueSegment) {
result.put(((ParameterMarkerPaginationValueSegment) offset.getSegment()).getParameterIndex(), 0);
}
if (null != rowCount && rowCount.getPaginationValueSegment() instanceof ParameterMarkerLimitValueSegment) {
result.put(((ParameterMarkerLimitValueSegment) rowCount.getPaginationValueSegment()).getParameterIndex(), getRewriteRowCount(isFetchAll, databaseType));
if (null != rowCount && rowCount.getSegment() instanceof ParameterMarkerPaginationValueSegment) {
result.put(((ParameterMarkerPaginationValueSegment) rowCount.getSegment()).getParameterIndex(), getRewriteRowCount(isFetchAll, databaseType));
}
return result;
}
......
......@@ -15,22 +15,22 @@
* limitations under the License.
*/
package org.apache.shardingsphere.core.route.limit;
package org.apache.shardingsphere.core.route.pagination;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import org.apache.shardingsphere.core.parse.sql.segment.dml.pagination.PaginationValueSegment;
/**
* Limit value.
* Pagination value.
*
* @author zhangliang
*/
@RequiredArgsConstructor
@Getter
public final class LimitValue {
public final class PaginationValue {
private final PaginationValueSegment paginationValueSegment;
private final PaginationValueSegment segment;
private final int value;
}
......@@ -36,7 +36,7 @@ import org.apache.shardingsphere.core.parse.sql.statement.SQLStatement;
import org.apache.shardingsphere.core.parse.sql.statement.dml.InsertStatement;
import org.apache.shardingsphere.core.parse.sql.statement.dml.SelectStatement;
import org.apache.shardingsphere.core.route.SQLRouteResult;
import org.apache.shardingsphere.core.route.limit.Limit;
import org.apache.shardingsphere.core.route.pagination.Pagination;
import org.apache.shardingsphere.core.route.type.RoutingResult;
import org.apache.shardingsphere.core.rule.BindingTableRule;
import org.apache.shardingsphere.core.rule.ShardingRule;
......@@ -104,7 +104,7 @@ public final class ParsingSQLRouter implements ShardingRouter {
}
RoutingResult routingResult = RoutingEngineFactory.newInstance(shardingRule, shardingMetaData.getDataSource(), sqlStatement, optimizeResult).route();
if (sqlStatement instanceof SelectStatement && null != ((SelectStatement) sqlStatement).getPagination() && !routingResult.isSingleRouting()) {
result.setLimit(new Limit(((SelectStatement) sqlStatement).getPagination(), parameters));
result.setPagination(new Pagination(((SelectStatement) sqlStatement).getPagination(), parameters));
}
if (needMerge) {
Preconditions.checkState(1 == routingResult.getRoutingUnits().size(), "Must have one sharding with subquery.");
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册