提交 d4c965d7 编写于 作者: T terrymanu

for ##2441, unify fields sequence of LimitSegment & Limit

上级 3775c962
......@@ -49,12 +49,7 @@ public final class LimitExtractor implements OptionalSQLSegmentExtractor {
Optional<ParserRuleContext> limitNode = ExtractorUtils.findFirstChildNode(ancestorNode, RuleName.LIMIT_CLAUSE);
return limitNode.isPresent()
? Optional.of(new LimitSegment(limitNode.get().getStart().getStartIndex(), limitNode.get().getStop().getStopIndex(),
extractRowCount(limitNode.get(), parameterMarkerIndexes).orNull(), extractOffset(limitNode.get(), parameterMarkerIndexes).orNull())) : Optional.<LimitSegment>absent();
}
private Optional<LimitValueSegment> extractRowCount(final ParserRuleContext limitNode, final Map<ParserRuleContext, Integer> parameterMarkerIndexes) {
Optional<ParserRuleContext> rowCountNode = ExtractorUtils.findFirstChildNode(limitNode, RuleName.LIMIT_ROW_COUNT);
return rowCountNode.isPresent() ? Optional.of(extractLimitValue(rowCountNode.get(), parameterMarkerIndexes)) : Optional.<LimitValueSegment>absent();
extractOffset(limitNode.get(), parameterMarkerIndexes).orNull(), extractRowCount(limitNode.get(), parameterMarkerIndexes).orNull())) : Optional.<LimitSegment>absent();
}
private Optional<LimitValueSegment> extractOffset(final ParserRuleContext limitNode, final Map<ParserRuleContext, Integer> parameterMarkerIndexes) {
......@@ -62,6 +57,11 @@ public final class LimitExtractor implements OptionalSQLSegmentExtractor {
return offsetNode.isPresent() ? Optional.of(extractLimitValue(offsetNode.get(), parameterMarkerIndexes)) : Optional.<LimitValueSegment>absent();
}
private Optional<LimitValueSegment> extractRowCount(final ParserRuleContext limitNode, final Map<ParserRuleContext, Integer> parameterMarkerIndexes) {
Optional<ParserRuleContext> rowCountNode = ExtractorUtils.findFirstChildNode(limitNode, RuleName.LIMIT_ROW_COUNT);
return rowCountNode.isPresent() ? Optional.of(extractLimitValue(rowCountNode.get(), parameterMarkerIndexes)) : Optional.<LimitValueSegment>absent();
}
private LimitValueSegment extractLimitValue(final ParserRuleContext limitValueNode, final Map<ParserRuleContext, Integer> parameterMarkerIndexes) {
Optional<ParameterMarkerExpressionSegment> parameterMarkerExpression = parameterMarkerExpressionExtractor.extract(limitValueNode, parameterMarkerIndexes);
if (parameterMarkerExpression.isPresent()) {
......
......@@ -109,7 +109,7 @@ public final class SelectItemFiller implements SQLSegmentFiller<SelectItemSegmen
}
private void fillTopSegment(final TopSegment topSegment, final SelectStatement selectStatement) {
selectStatement.setLimit(new LimitSegment(topSegment.getStartIndex(), topSegment.getStopIndex(), topSegment.getTop(), null));
selectStatement.setLimit(new LimitSegment(topSegment.getStartIndex(), topSegment.getStopIndex(), null, topSegment.getTop()));
selectStatement.getItems().add(new CommonSelectItem("rownum", Optional.of(topSegment.getRowNumberAlias())));
}
}
......@@ -103,23 +103,23 @@ public final class ShardingRowNumberPredicateFiller implements SQLSegmentFiller<
for (PredicateSegment each : rowNumberPredicates) {
ExpressionSegment expression = ((PredicateCompareRightValue) each.getRightValue()).getExpression();
switch (((PredicateCompareRightValue) each.getRightValue()).getOperator()) {
case "<":
rowCount = createLimitValueSegment(expression, false);
break;
case "<=":
rowCount = createLimitValueSegment(expression, true);
break;
case ">":
offset = createLimitValueSegment(expression, false);
break;
case ">=":
offset = createLimitValueSegment(expression, true);
break;
case "<":
rowCount = createLimitValueSegment(expression, false);
break;
case "<=":
rowCount = createLimitValueSegment(expression, true);
break;
default:
break;
}
}
selectStatement.setLimit(new LimitSegment(-1, -1, rowCount, offset));
selectStatement.setLimit(new LimitSegment(-1, -1, offset, rowCount));
}
private LimitValueSegment createLimitValueSegment(final ExpressionSegment expression, final boolean boundOpened) {
......
......@@ -35,18 +35,9 @@ public final class LimitSegment implements SQLSegment {
private final int stopIndex;
private final LimitValueSegment rowCount;
private final LimitValueSegment offset;
/**
* Get row count.
*
* @return row count
*/
public Optional<LimitValueSegment> getRowCount() {
return Optional.fromNullable(rowCount);
}
private final LimitValueSegment rowCount;
/**
* Get offset.
......@@ -56,4 +47,13 @@ public final class LimitSegment implements SQLSegment {
public Optional<LimitValueSegment> getOffset() {
return Optional.fromNullable(offset);
}
/**
* Get row count.
*
* @return row count
*/
public Optional<LimitValueSegment> getRowCount() {
return Optional.fromNullable(rowCount);
}
}
......@@ -339,14 +339,14 @@ public final class ShardingSQLRewriterTest {
@Test
public void assertRewriteForLimit() {
LimitValueSegment rowCountSQLSegment = new NumberLiteralLimitValueSegment(36, 36, 2, false);
LimitValueSegment offsetSQLSegment = new NumberLiteralLimitValueSegment(33, 33, 2, true);
selectStatement.setLimit(new LimitSegment(0, 0, rowCountSQLSegment, offsetSQLSegment));
LimitValueSegment rowCountSQLSegment = new NumberLiteralLimitValueSegment(36, 36, 2, false);
selectStatement.setLimit(new LimitSegment(0, 0, offsetSQLSegment, rowCountSQLSegment));
selectStatement.addSQLToken(new TableToken(17, 23, "table_x", QuoteCharacter.NONE));
routeResult = new SQLRouteResult(selectStatement);
Limit limit = new Limit();
limit.setRowCount(new LimitValue(2, -1, rowCountSQLSegment));
limit.setOffset(new LimitValue(2, -1, offsetSQLSegment));
limit.setRowCount(new LimitValue(2, -1, rowCountSQLSegment));
routeResult.setLimit(limit);
routeResult.setRoutingResult(new RoutingResult());
selectStatement.setLogicSQL("SELECT x.id FROM table_x x LIMIT 2, 2");
......@@ -356,14 +356,14 @@ public final class ShardingSQLRewriterTest {
@Test
public void assertRewriteForRowNum() {
LimitValueSegment rowCountSQLSegment = new NumberLiteralLimitValueSegment(98, 98, 4, false);
LimitValueSegment offsetSQLSegment = new NumberLiteralLimitValueSegment(119, 119, 2, true);
selectStatement.setLimit(new LimitSegment(0, 0, rowCountSQLSegment, offsetSQLSegment));
LimitValueSegment rowCountSQLSegment = new NumberLiteralLimitValueSegment(98, 98, 4, false);
selectStatement.setLimit(new LimitSegment(0, 0, offsetSQLSegment, rowCountSQLSegment));
selectStatement.addSQLToken(new TableToken(68, 74, "table_x", QuoteCharacter.NONE));
routeResult = new SQLRouteResult(selectStatement);
Limit limit = new Limit();
limit.setRowCount(new LimitValue(4, -1, rowCountSQLSegment));
limit.setOffset(new LimitValue(2, -1, offsetSQLSegment));
limit.setRowCount(new LimitValue(4, -1, rowCountSQLSegment));
routeResult.setLimit(limit);
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");
......@@ -374,14 +374,14 @@ public final class ShardingSQLRewriterTest {
@Test
public void assertRewriteForTopAndRowNumber() {
LimitValueSegment rowCountSQLSegment = new NumberLiteralLimitValueSegment(26, 26, 4, false);
LimitValueSegment offsetSQLSegment = new NumberLiteralLimitValueSegment(123, 123, 2, true);
selectStatement.setLimit(new LimitSegment(0, 0, rowCountSQLSegment, offsetSQLSegment));
LimitValueSegment rowCountSQLSegment = new NumberLiteralLimitValueSegment(26, 26, 4, false);
selectStatement.setLimit(new LimitSegment(0, 0, offsetSQLSegment, rowCountSQLSegment));
selectStatement.addSQLToken(new TableToken(85, 91, "table_x", QuoteCharacter.NONE));
routeResult = new SQLRouteResult(selectStatement);
Limit limit = new Limit();
limit.setRowCount(new LimitValue(4, -1, rowCountSQLSegment));
limit.setOffset(new LimitValue(2, -1, offsetSQLSegment));
limit.setRowCount(new LimitValue(4, -1, rowCountSQLSegment));
routeResult.setLimit(limit);
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");
......@@ -392,9 +392,9 @@ public final class ShardingSQLRewriterTest {
@Test
public void assertRewriteForLimitForMemoryGroupBy() {
LimitValueSegment rowCountSQLSegment = new NumberLiteralLimitValueSegment(36, 36, 2, false);
LimitValueSegment offsetSQLSegment = new NumberLiteralLimitValueSegment(33, 33, 2, true);
selectStatement.setLimit(new LimitSegment(0, 0, rowCountSQLSegment, offsetSQLSegment));
LimitValueSegment rowCountSQLSegment = new NumberLiteralLimitValueSegment(36, 36, 2, false);
selectStatement.setLimit(new LimitSegment(0, 0, offsetSQLSegment, rowCountSQLSegment));
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));
......@@ -402,8 +402,8 @@ public final class ShardingSQLRewriterTest {
selectStatement.addSQLToken(new TableToken(17, 23, "table_x", QuoteCharacter.NONE));
routeResult = new SQLRouteResult(selectStatement);
Limit limit = new Limit();
limit.setRowCount(new LimitValue(4, -1, rowCountSQLSegment));
limit.setOffset(new LimitValue(2, -1, offsetSQLSegment));
limit.setRowCount(new LimitValue(4, -1, rowCountSQLSegment));
routeResult.setLimit(limit);
routeResult.setRoutingResult(new RoutingResult());
selectStatement.setLogicSQL("SELECT x.id FROM table_x x LIMIT 2, 2");
......@@ -413,9 +413,9 @@ public final class ShardingSQLRewriterTest {
@Test
public void assertRewriteForRowNumForMemoryGroupBy() {
LimitValueSegment rowCountSQLSegment = new NumberLiteralLimitValueSegment(98, 98, 4, false);
LimitValueSegment offsetSQLSegment = new NumberLiteralLimitValueSegment(119, 119, 2, true);
selectStatement.setLimit(new LimitSegment(0, 0, rowCountSQLSegment, offsetSQLSegment));
LimitValueSegment rowCountSQLSegment = new NumberLiteralLimitValueSegment(98, 98, 4, false);
selectStatement.setLimit(new LimitSegment(0, 0, offsetSQLSegment, rowCountSQLSegment));
selectStatement.addSQLToken(new TableToken(68, 74, "table_x", QuoteCharacter.NONE));
ColumnSegment columnSegment = new ColumnSegment(0, 0, "id");
columnSegment.setOwner(new TableSegment(0, 0, "x"));
......@@ -423,8 +423,8 @@ public final class ShardingSQLRewriterTest {
selectStatement.getGroupByItems().add(new ColumnOrderByItemSegment(0, 0, columnSegment, OrderDirection.DESC, OrderDirection.ASC));
routeResult = new SQLRouteResult(selectStatement);
Limit limit = new Limit();
limit.setRowCount(new LimitValue(4, -1, rowCountSQLSegment));
limit.setOffset(new LimitValue(2, -1, offsetSQLSegment));
limit.setRowCount(new LimitValue(4, -1, rowCountSQLSegment));
routeResult.setLimit(limit);
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");
......@@ -435,9 +435,9 @@ public final class ShardingSQLRewriterTest {
@Test
public void assertRewriteForTopAndRowNumberForMemoryGroupBy() {
LimitValueSegment rowCountSQLSegment = new NumberLiteralLimitValueSegment(26, 26, 4, false);
LimitValueSegment offsetSQLSegment = new NumberLiteralLimitValueSegment(123, 123, 2, true);
selectStatement.setLimit(new LimitSegment(0, 0, rowCountSQLSegment, offsetSQLSegment));
LimitValueSegment rowCountSQLSegment = new NumberLiteralLimitValueSegment(26, 26, 4, false);
selectStatement.setLimit(new LimitSegment(0, 0, offsetSQLSegment, rowCountSQLSegment));
selectStatement.addSQLToken(new TableToken(85, 91, "table_x", QuoteCharacter.NONE));
ColumnSegment columnSegment = new ColumnSegment(0, 0, "id");
columnSegment.setOwner(new TableSegment(0, 0, "x"));
......@@ -445,8 +445,8 @@ public final class ShardingSQLRewriterTest {
selectStatement.getGroupByItems().add(new ColumnOrderByItemSegment(0, 0, columnSegment, OrderDirection.DESC, OrderDirection.ASC));
routeResult = new SQLRouteResult(selectStatement);
Limit limit = new Limit();
limit.setRowCount(new LimitValue(4, -1, rowCountSQLSegment));
limit.setOffset(new LimitValue(2, -1, offsetSQLSegment));
limit.setRowCount(new LimitValue(4, -1, rowCountSQLSegment));
routeResult.setLimit(limit);
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");
......@@ -457,14 +457,14 @@ public final class ShardingSQLRewriterTest {
@Test
public void assertRewriteForLimitForNotRewriteLimit() {
LimitValueSegment rowCountSQLSegment = new NumberLiteralLimitValueSegment(36, 36, 2, false);
LimitValueSegment offsetSQLSegment = new NumberLiteralLimitValueSegment(33, 33, 2, true);
selectStatement.setLimit(new LimitSegment(0, 0, rowCountSQLSegment, offsetSQLSegment));
LimitValueSegment rowCountSQLSegment = new NumberLiteralLimitValueSegment(36, 36, 2, false);
selectStatement.setLimit(new LimitSegment(0, 0, offsetSQLSegment, rowCountSQLSegment));
selectStatement.addSQLToken(new TableToken(17, 23, "table_x", QuoteCharacter.NONE));
routeResult = new SQLRouteResult(selectStatement);
Limit limit = new Limit();
limit.setRowCount(new LimitValue(4, -1, rowCountSQLSegment));
limit.setOffset(new LimitValue(2, -1, offsetSQLSegment));
limit.setRowCount(new LimitValue(4, -1, rowCountSQLSegment));
routeResult.setLimit(limit);
RoutingResult routingResult = new RoutingResult();
routingResult.getRoutingUnits().add(new RoutingUnit("ds"));
......@@ -476,14 +476,14 @@ public final class ShardingSQLRewriterTest {
@Test
public void assertRewriteForRowNumForNotRewriteLimit() {
LimitValueSegment rowCountSQLSegment = new NumberLiteralLimitValueSegment(98, 98, 4, false);
LimitValueSegment offsetSQLSegment = new NumberLiteralLimitValueSegment(119, 119, 2, true);
selectStatement.setLimit(new LimitSegment(0, 0, rowCountSQLSegment, offsetSQLSegment));
LimitValueSegment rowCountSQLSegment = new NumberLiteralLimitValueSegment(98, 98, 4, false);
selectStatement.setLimit(new LimitSegment(0, 0, offsetSQLSegment, rowCountSQLSegment));
selectStatement.addSQLToken(new TableToken(68, 74, "table_x", QuoteCharacter.NONE));
routeResult = new SQLRouteResult(selectStatement);
Limit limit = new Limit();
limit.setRowCount(new LimitValue(4, -1, rowCountSQLSegment));
limit.setOffset(new LimitValue(2, -1, offsetSQLSegment));
limit.setRowCount(new LimitValue(4, -1, rowCountSQLSegment));
routeResult.setLimit(limit);
RoutingResult routingResult = new RoutingResult();
routingResult.getRoutingUnits().add(new RoutingUnit("ds"));
......@@ -496,14 +496,14 @@ public final class ShardingSQLRewriterTest {
@Test
public void assertRewriteForTopAndRowNumberForNotRewriteLimit() {
LimitValueSegment rowCountSQLSegment = new NumberLiteralLimitValueSegment(26, 26, 4, false);
LimitValueSegment offsetSQLSegment = new NumberLiteralLimitValueSegment(123, 123, 2, true);
selectStatement.setLimit(new LimitSegment(0, 0, rowCountSQLSegment, offsetSQLSegment));
LimitValueSegment rowCountSQLSegment = new NumberLiteralLimitValueSegment(26, 26, 4, false);
selectStatement.setLimit(new LimitSegment(0, 0, offsetSQLSegment, rowCountSQLSegment));
selectStatement.addSQLToken(new TableToken(85, 91, "table_x", QuoteCharacter.NONE));
routeResult = new SQLRouteResult(selectStatement);
Limit limit = new Limit();
limit.setRowCount(new LimitValue(4, -1, rowCountSQLSegment));
limit.setOffset(new LimitValue(2, -1, offsetSQLSegment));
limit.setRowCount(new LimitValue(4, -1, rowCountSQLSegment));
routeResult.setLimit(limit);
RoutingResult routingResult = new RoutingResult();
routingResult.getRoutingUnits().add(new RoutingUnit("ds"));
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册