This is an automated email from the ASF dual-hosted git repository.
panjuan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git
The following commit(s) were added to refs/heads/master by this push:
new 499fc0b fix oracle pagination wrong result (#12199)
499fc0b is described below
commit 499fc0b734066b1a65a5a28d460fa7d7bc764bf6
Author: Zhengqiang Duan <[email protected]>
AuthorDate: Sun Sep 5 14:15:46 2021 +0800
fix oracle pagination wrong result (#12199)
* fix oracle pagination wrong result
* optimize logic
* optimize logic
---
.../impl/EncryptProjectionTokenGenerator.java | 2 +-
.../pagination/engine/PaginationContextEngine.java | 21 +++-
.../engine/RowNumberPaginationContextEngine.java | 21 ++--
.../engine/TopPaginationContextEngine.java | 9 +-
.../select/projection/ProjectionsContext.java | 5 +-
.../select/projection/engine/ProjectionEngine.java | 75 +++++++----
.../engine/ProjectionsContextEngine.java | 137 +++++++--------------
.../projection/impl/ShorthandProjection.java | 11 +-
.../statement/dml/SelectStatementContext.java | 40 ++----
.../RowNumberPaginationContextEngineTest.java | 14 +--
.../engine/TopPaginationContextEngineTest.java | 14 +--
.../projection/engine/ProjectionEngineTest.java | 35 +++---
.../engine/ProjectionsContextEngineTest.java | 28 ++---
13 files changed, 200 insertions(+), 212 deletions(-)
diff --git
a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/impl/EncryptProjectionTokenGenerator.java
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/impl/EncryptProjectionTokenGenerator.java
index acdaf1b..e49030e 100644
---
a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/impl/EncryptProjectionTokenGenerator.java
+++
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/impl/EncryptProjectionTokenGenerator.java
@@ -108,7 +108,7 @@ public final class EncryptProjectionTokenGenerator extends
BaseEncryptSQLTokenGe
private SubstitutableColumnNameToken generateSQLToken(final
ShorthandProjectionSegment segment,
final
ShorthandProjection shorthandProjection, final String tableName, final
EncryptTable encryptTable, final DatabaseType databaseType) {
List<ColumnProjection> projections = new LinkedList<>();
- for (ColumnProjection each : shorthandProjection.getActualColumns()) {
+ for (ColumnProjection each :
shorthandProjection.getActualColumns().values()) {
if (encryptTable.getLogicColumns().contains(each.getName())) {
projections.add(new ColumnProjection(null == each.getOwner() ?
null : each.getOwner(), getEncryptColumnName(tableName, each.getName()),
each.getName()));
} else {
diff --git
a/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/pagination/engine/PaginationContextEngine.java
b/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/pagination/engine/PaginationContextEngine.java
index 0ee803a..dbe12e0 100644
---
a/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/pagination/engine/PaginationContextEngine.java
+++
b/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/pagination/engine/PaginationContextEngine.java
@@ -19,6 +19,7 @@ package
org.apache.shardingsphere.infra.binder.segment.select.pagination.engine;
import
org.apache.shardingsphere.infra.binder.segment.select.pagination.PaginationContext;
import
org.apache.shardingsphere.infra.binder.segment.select.projection.ProjectionsContext;
+import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ExpressionSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ProjectionSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.pagination.limit.LimitSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.pagination.top.TopProjectionSegment;
@@ -26,12 +27,16 @@ import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.predicate.Whe
import
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SubqueryTableSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.SelectStatement;
import org.apache.shardingsphere.sql.parser.sql.common.util.SQLUtil;
+import org.apache.shardingsphere.sql.parser.sql.common.util.WhereExtractUtil;
import
org.apache.shardingsphere.sql.parser.sql.dialect.handler.dml.SelectStatementHandler;
import
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.OracleStatement;
import
org.apache.shardingsphere.sql.parser.sql.dialect.statement.sqlserver.SQLServerStatement;
+import java.util.Collection;
+import java.util.LinkedList;
import java.util.List;
import java.util.Optional;
+import java.util.stream.Collectors;
/**
* Pagination context engine.
@@ -52,16 +57,24 @@ public final class PaginationContextEngine {
return new
LimitPaginationContextEngine().createPaginationContext(limitSegment.get(),
parameters);
}
Optional<TopProjectionSegment> topProjectionSegment =
findTopProjection(selectStatement);
- Optional<WhereSegment> whereSegment = selectStatement.getWhere();
+ Collection<ExpressionSegment> expressions =
getWhereSegments(selectStatement).stream().map(WhereSegment::getExpr).collect(Collectors.toList());
if (topProjectionSegment.isPresent()) {
- return new
TopPaginationContextEngine().createPaginationContext(topProjectionSegment.get(),
whereSegment.map(WhereSegment::getExpr).orElse(null), parameters);
+ return new
TopPaginationContextEngine().createPaginationContext(topProjectionSegment.get(),
expressions, parameters);
}
- if (whereSegment.isPresent() &&
containsRowNumberPagination(selectStatement)) {
- return new
RowNumberPaginationContextEngine().createPaginationContext(whereSegment.get().getExpr(),
projectionsContext, parameters);
+ if (!expressions.isEmpty() &&
containsRowNumberPagination(selectStatement)) {
+ return new
RowNumberPaginationContextEngine().createPaginationContext(expressions,
projectionsContext, parameters);
}
return new PaginationContext(null, null, parameters);
}
+ private Collection<WhereSegment> getWhereSegments(final SelectStatement
selectStatement) {
+ Collection<WhereSegment> result = new LinkedList<>();
+ selectStatement.getWhere().ifPresent(result::add);
+
result.addAll(WhereExtractUtil.getSubqueryWhereSegments(selectStatement));
+ result.addAll(WhereExtractUtil.getJoinWhereSegments(selectStatement));
+ return result;
+ }
+
private boolean containsRowNumberPagination(final SelectStatement
selectStatement) {
return selectStatement instanceof OracleStatement || selectStatement
instanceof SQLServerStatement;
}
diff --git
a/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/pagination/engine/RowNumberPaginationContextEngine.java
b/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/pagination/engine/RowNumberPaginationContextEngine.java
index 4fb7b1e..57e8bbc 100644
---
a/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/pagination/engine/RowNumberPaginationContextEngine.java
+++
b/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/pagination/engine/RowNumberPaginationContextEngine.java
@@ -31,37 +31,38 @@ import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.predicate.And
import
org.apache.shardingsphere.sql.parser.sql.common.util.ExpressionExtractUtil;
import java.util.Collection;
-import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Optional;
+import java.util.TreeSet;
+import java.util.stream.Collectors;
/**
* Pagination context engine for row number.
*/
public final class RowNumberPaginationContextEngine {
- private static final Collection<String> ROW_NUMBER_IDENTIFIERS = new
HashSet<>();
+ private static final Collection<String> ROW_NUMBER_IDENTIFIERS = new
TreeSet<>(String.CASE_INSENSITIVE_ORDER);
static {
- ROW_NUMBER_IDENTIFIERS.add("rownum");
+ ROW_NUMBER_IDENTIFIERS.add("ROWNUM");
ROW_NUMBER_IDENTIFIERS.add("ROW_NUMBER");
}
/**
* Create pagination context.
*
- * @param where where condition
+ * @param expressions expressions
* @param projectionsContext projections context
* @param parameters SQL parameters
* @return pagination context
*/
- public PaginationContext createPaginationContext(final ExpressionSegment
where, final ProjectionsContext projectionsContext, final List<Object>
parameters) {
+ public PaginationContext createPaginationContext(final
Collection<ExpressionSegment> expressions, final ProjectionsContext
projectionsContext, final List<Object> parameters) {
Optional<String> rowNumberAlias = isRowNumberAlias(projectionsContext);
if (!rowNumberAlias.isPresent()) {
return new PaginationContext(null, null, parameters);
}
- Collection<AndPredicate> andPredicates =
ExpressionExtractUtil.getAndPredicates(where);
+ Collection<AndPredicate> andPredicates =
expressions.stream().flatMap(each ->
ExpressionExtractUtil.getAndPredicates(each).stream()).collect(Collectors.toList());
Collection<BinaryOperationExpression> rowNumberPredicates =
getRowNumberPredicates(andPredicates, rowNumberAlias.get());
return rowNumberPredicates.isEmpty() ? new PaginationContext(null,
null, parameters) : createPaginationWithRowNumber(rowNumberPredicates,
parameters);
}
@@ -91,8 +92,12 @@ public final class RowNumberPaginationContextEngine {
private boolean isRowNumberColumn(final ExpressionSegment predicate, final
String rowNumberAlias) {
if (predicate instanceof BinaryOperationExpression) {
ExpressionSegment left = ((BinaryOperationExpression)
predicate).getLeft();
- return left instanceof ColumnSegment ?
ROW_NUMBER_IDENTIFIERS.contains(((ColumnSegment)
left).getIdentifier().getValue())
- || ((ColumnSegment)
left).getIdentifier().getValue().equalsIgnoreCase(rowNumberAlias) : false;
+ if (left instanceof ColumnSegment) {
+ String leftColumnValue = ((ColumnSegment)
left).getIdentifier().getValue();
+ return ROW_NUMBER_IDENTIFIERS.contains(leftColumnValue) ||
leftColumnValue.equalsIgnoreCase(rowNumberAlias);
+ } else {
+ return false;
+ }
}
return false;
}
diff --git
a/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/pagination/engine/TopPaginationContextEngine.java
b/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/pagination/engine/TopPaginationContextEngine.java
index 364b083..a4fd084 100644
---
a/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/pagination/engine/TopPaginationContextEngine.java
+++
b/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/pagination/engine/TopPaginationContextEngine.java
@@ -34,6 +34,7 @@ import
org.apache.shardingsphere.sql.parser.sql.common.util.ExpressionExtractUti
import java.util.Collection;
import java.util.List;
import java.util.Optional;
+import java.util.stream.Collectors;
/**
* Pagination context engine for top.
@@ -44,13 +45,13 @@ public final class TopPaginationContextEngine {
* Create pagination context.
*
* @param topProjectionSegment top projection segment
- * @param where where condition
+ * @param expressions expressions
* @param parameters SQL parameters
* @return pagination context
*/
- public PaginationContext createPaginationContext(final
TopProjectionSegment topProjectionSegment, final ExpressionSegment where, final
List<Object> parameters) {
- Collection<AndPredicate> andPredicates =
ExpressionExtractUtil.getAndPredicates(where);
- Optional<ExpressionSegment> rowNumberPredicate = null != where ?
getRowNumberPredicate(andPredicates, topProjectionSegment.getAlias()) :
Optional.empty();
+ public PaginationContext createPaginationContext(final
TopProjectionSegment topProjectionSegment, final Collection<ExpressionSegment>
expressions, final List<Object> parameters) {
+ Collection<AndPredicate> andPredicates =
expressions.stream().flatMap(each ->
ExpressionExtractUtil.getAndPredicates(each).stream()).collect(Collectors.toList());
+ Optional<ExpressionSegment> rowNumberPredicate =
!expressions.isEmpty() ? getRowNumberPredicate(andPredicates,
topProjectionSegment.getAlias()) : Optional.empty();
Optional<PaginationValueSegment> offset =
rowNumberPredicate.isPresent() ?
createOffsetWithRowNumber(rowNumberPredicate.get()) : Optional.empty();
PaginationValueSegment rowCount = topProjectionSegment.getTop();
return new PaginationContext(offset.orElse(null), rowCount,
parameters);
diff --git
a/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/ProjectionsContext.java
b/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/ProjectionsContext.java
index 86c8faa..e338d1c 100644
---
a/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/ProjectionsContext.java
+++
b/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/ProjectionsContext.java
@@ -69,6 +69,9 @@ public final class ProjectionsContext {
*/
public Optional<String> findAlias(final String projectionName) {
for (Projection each : projections) {
+ if (each instanceof ShorthandProjection && ((ShorthandProjection)
each).getActualColumns().containsKey(projectionName.toLowerCase())) {
+ return ((ShorthandProjection)
each).getActualColumns().get(projectionName.toLowerCase()).getAlias();
+ }
if
(projectionName.equalsIgnoreCase(SQLUtil.getExactlyValue(each.getExpression())))
{
return each.getAlias();
}
@@ -134,7 +137,7 @@ public final class ProjectionsContext {
List<Projection> result = new ArrayList<>();
for (Projection each : projections) {
if (each instanceof ShorthandProjection) {
- result.addAll(((ShorthandProjection) each).getActualColumns());
+ result.addAll(((ShorthandProjection)
each).getActualColumns().values());
} else if (!(each instanceof DerivedProjection)) {
result.add(each);
}
diff --git
a/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/engine/ProjectionEngine.java
b/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/engine/ProjectionEngine.java
index ddccea7..d4f312c 100644
---
a/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/engine/ProjectionEngine.java
+++
b/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/engine/ProjectionEngine.java
@@ -36,11 +36,17 @@ import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.Expressi
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ProjectionSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ShorthandProjectionSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.SubqueryProjectionSegment;
+import
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.JoinTableSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment;
+import
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SubqueryTableSegment;
+import
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.TableSegment;
+import
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.SelectStatement;
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedHashSet;
+import java.util.LinkedList;
+import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;
@@ -61,13 +67,13 @@ public final class ProjectionEngine {
/**
* Create projection.
*
- * @param tableSegments table segments
+ * @param table table segment
* @param projectionSegment projection segment
* @return projection
*/
- public Optional<Projection> createProjection(final
Collection<SimpleTableSegment> tableSegments, final ProjectionSegment
projectionSegment) {
+ public Optional<Projection> createProjection(final TableSegment table,
final ProjectionSegment projectionSegment) {
if (projectionSegment instanceof ShorthandProjectionSegment) {
- return Optional.of(createProjection(tableSegments,
(ShorthandProjectionSegment) projectionSegment));
+ return Optional.of(createProjection(table,
(ShorthandProjectionSegment) projectionSegment));
}
if (projectionSegment instanceof ColumnProjectionSegment) {
return Optional.of(createProjection((ColumnProjectionSegment)
projectionSegment));
@@ -92,10 +98,13 @@ public final class ProjectionEngine {
return new SubqueryProjection(projectionSegment.getText(),
projectionSegment.getAlias().orElse(null));
}
- private ShorthandProjection createProjection(final
Collection<SimpleTableSegment> tableSegments, final ShorthandProjectionSegment
projectionSegment) {
+ private ShorthandProjection createProjection(final TableSegment table,
final ShorthandProjectionSegment projectionSegment) {
String owner = projectionSegment.getOwner().map(ownerSegment ->
ownerSegment.getIdentifier().getValue()).orElse(null);
- Collection<ColumnProjection> shorthandColumns =
getShorthandColumns(tableSegments, owner);
- return new ShorthandProjection(owner, shorthandColumns);
+ Collection<ColumnProjection> columnProjections = new LinkedHashSet<>();
+
columnProjections.addAll(getShorthandColumnsFromSimpleTableSegment(table,
owner));
+
columnProjections.addAll(getShorthandColumnsFromSubqueryTableSegment(table));
+
columnProjections.addAll(getShorthandColumnsFromJoinTableSegment(table,
projectionSegment));
+ return new ShorthandProjection(owner, columnProjections);
}
private ColumnProjection createProjection(final ColumnProjectionSegment
projectionSegment) {
@@ -128,28 +137,52 @@ public final class ProjectionEngine {
return result;
}
- private Collection<ColumnProjection> getShorthandColumns(final
Collection<SimpleTableSegment> tables, final String owner) {
- return null == owner ? getUnqualifiedShorthandColumns(tables) :
getQualifiedShorthandColumns(tables, owner);
- }
-
- private Collection<ColumnProjection> getUnqualifiedShorthandColumns(final
Collection<SimpleTableSegment> tables) {
- Collection<ColumnProjection> result = new LinkedHashSet<>();
- for (SimpleTableSegment each : tables) {
- String tableName = each.getTableName().getIdentifier().getValue();
- String owner = each.getAlias().orElse(tableName);
+ private Collection<ColumnProjection>
getShorthandColumnsFromSimpleTableSegment(final TableSegment table, final
String owner) {
+ if (!(table instanceof SimpleTableSegment)) {
+ return Collections.emptyList();
+ }
+ String tableName = ((SimpleTableSegment)
table).getTableName().getIdentifier().getValue();
+ String tableAlias = table.getAlias().orElse(tableName);
+ Collection<ColumnProjection> result = new LinkedList<>();
+ if (null == owner) {
+ schema.getAllColumnNames(tableName).stream().map(columnName -> new
ColumnProjection(tableAlias, columnName, null)).forEach(result::add);
+ } else if (owner.equalsIgnoreCase(tableAlias)) {
schema.getAllColumnNames(tableName).stream().map(columnName -> new
ColumnProjection(owner, columnName, null)).forEach(result::add);
}
return result;
}
- private Collection<ColumnProjection> getQualifiedShorthandColumns(final
Collection<SimpleTableSegment> tables, final String owner) {
- for (SimpleTableSegment each : tables) {
- String tableName = each.getTableName().getIdentifier().getValue();
- if (owner.equalsIgnoreCase(each.getAlias().orElse(tableName))) {
- return
schema.getAllColumnNames(tableName).stream().map(columnName -> new
ColumnProjection(owner, columnName, null)).collect(Collectors.toList());
+ private Collection<ColumnProjection>
getShorthandColumnsFromSubqueryTableSegment(final TableSegment table) {
+ if (!(table instanceof SubqueryTableSegment)) {
+ return Collections.emptyList();
+ }
+ SelectStatement subSelectStatement = ((SubqueryTableSegment)
table).getSubquery().getSelect();
+ Collection<Projection> projections =
subSelectStatement.getProjections().getProjections().stream().map(each
+ -> createProjection(subSelectStatement.getFrom(),
each).orElse(null)).filter(Objects::nonNull).collect(Collectors.toList());
+ return getColumnProjections(projections);
+ }
+
+ private Collection<ColumnProjection>
getShorthandColumnsFromJoinTableSegment(final TableSegment table, final
ProjectionSegment projectionSegment) {
+ if (!(table instanceof JoinTableSegment)) {
+ return Collections.emptyList();
+ }
+ Collection<Projection> projections = new LinkedList<>();
+ createProjection(((JoinTableSegment) table).getLeft(),
projectionSegment).ifPresent(projections::add);
+ createProjection(((JoinTableSegment) table).getRight(),
projectionSegment).ifPresent(projections::add);
+ return getColumnProjections(projections);
+ }
+
+ private Collection<ColumnProjection> getColumnProjections(final
Collection<Projection> projections) {
+ Collection<ColumnProjection> result = new LinkedList<>();
+ for (Projection each : projections) {
+ if (each instanceof ColumnProjection) {
+ result.add((ColumnProjection) each);
+ }
+ if (each instanceof ShorthandProjection) {
+ result.addAll(((ShorthandProjection)
each).getActualColumns().values());
}
}
- return Collections.emptyList();
+ return result;
}
private void appendAverageDistinctDerivedProjection(final
AggregationDistinctProjection averageDistinctProjection) {
diff --git
a/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/engine/ProjectionsContextEngine.java
b/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/engine/ProjectionsContextEngine.java
index 5ebf243..9c4d397 100644
---
a/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/engine/ProjectionsContextEngine.java
+++
b/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/engine/ProjectionsContextEngine.java
@@ -17,185 +17,134 @@
package
org.apache.shardingsphere.infra.binder.segment.select.projection.engine;
-import com.google.common.base.Preconditions;
import
org.apache.shardingsphere.infra.binder.segment.select.groupby.GroupByContext;
import
org.apache.shardingsphere.infra.binder.segment.select.orderby.OrderByContext;
import
org.apache.shardingsphere.infra.binder.segment.select.orderby.OrderByItem;
import
org.apache.shardingsphere.infra.binder.segment.select.projection.DerivedColumn;
import
org.apache.shardingsphere.infra.binder.segment.select.projection.Projection;
import
org.apache.shardingsphere.infra.binder.segment.select.projection.ProjectionsContext;
+import
org.apache.shardingsphere.infra.binder.segment.select.projection.impl.ColumnProjection;
import
org.apache.shardingsphere.infra.binder.segment.select.projection.impl.DerivedProjection;
import
org.apache.shardingsphere.infra.binder.segment.select.projection.impl.ShorthandProjection;
import org.apache.shardingsphere.infra.database.type.DatabaseType;
import org.apache.shardingsphere.infra.metadata.schema.ShardingSphereSchema;
+import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.ColumnSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ProjectionSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ProjectionsSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.order.item.ColumnOrderByItemSegment;
-import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.order.item.ExpressionOrderByItemSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.order.item.IndexOrderByItemSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.order.item.OrderByItemSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.order.item.TextOrderByItemSegment;
-import
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment;
+import
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.TableSegment;
import org.apache.shardingsphere.sql.parser.sql.common.util.SQLUtil;
import java.util.Collection;
import java.util.LinkedList;
-import java.util.Optional;
/**
* Projections context engine.
*/
public final class ProjectionsContextEngine {
- private final ShardingSphereSchema schema;
-
private final ProjectionEngine projectionEngine;
public ProjectionsContextEngine(final ShardingSphereSchema schema, final
DatabaseType databaseType) {
- this.schema = schema;
projectionEngine = new ProjectionEngine(schema, databaseType);
}
/**
* Create projections context.
*
- * @param tables tables
- * @param projectionsSegment projection Segments
+ * @param table table segment
+ * @param projectionsSegment projection segments
* @param groupByContext group by context
* @param orderByContext order by context
* @return projections context
*/
- public ProjectionsContext createProjectionsContext(final
Collection<SimpleTableSegment> tables, final ProjectionsSegment
projectionsSegment,
+ public ProjectionsContext createProjectionsContext(final TableSegment
table, final ProjectionsSegment projectionsSegment,
final GroupByContext
groupByContext, final OrderByContext orderByContext) {
- Collection<Projection> projections = getProjections(tables,
projectionsSegment);
+ Collection<Projection> projections = getProjections(table,
projectionsSegment);
ProjectionsContext result = new
ProjectionsContext(projectionsSegment.getStartIndex(),
projectionsSegment.getStopIndex(), projectionsSegment.isDistinctRow(),
projections);
- result.getProjections().addAll(getDerivedGroupByColumns(projections,
groupByContext, tables));
- result.getProjections().addAll(getDerivedOrderByColumns(projections,
orderByContext, tables));
+
result.getProjections().addAll(getDerivedGroupByColumns(groupByContext,
projections));
+
result.getProjections().addAll(getDerivedOrderByColumns(orderByContext,
projections));
return result;
}
- private Collection<Projection> getProjections(final
Collection<SimpleTableSegment> tableSegments, final ProjectionsSegment
projectionsSegment) {
+ private Collection<Projection> getProjections(final TableSegment table,
final ProjectionsSegment projectionsSegment) {
Collection<Projection> result = new LinkedList<>();
for (ProjectionSegment each : projectionsSegment.getProjections()) {
- projectionEngine.createProjection(tableSegments,
each).ifPresent(result::add);
+ projectionEngine.createProjection(table,
each).ifPresent(result::add);
}
return result;
}
- private Collection<Projection> getDerivedGroupByColumns(final
Collection<Projection> projections, final GroupByContext groupByContext, final
Collection<SimpleTableSegment> tables) {
- return getDerivedOrderColumns(projections, groupByContext.getItems(),
DerivedColumn.GROUP_BY_ALIAS, tables);
+ private Collection<Projection> getDerivedGroupByColumns(final
GroupByContext groupByContext, final Collection<Projection> projections) {
+ return getDerivedOrderColumns(groupByContext.getItems(),
DerivedColumn.GROUP_BY_ALIAS, projections);
}
- private Collection<Projection> getDerivedOrderByColumns(final
Collection<Projection> projections, final OrderByContext orderByContext, final
Collection<SimpleTableSegment> tables) {
- return getDerivedOrderColumns(projections, orderByContext.getItems(),
DerivedColumn.ORDER_BY_ALIAS, tables);
+ private Collection<Projection> getDerivedOrderByColumns(final
OrderByContext orderByContext, final Collection<Projection> projections) {
+ return getDerivedOrderColumns(orderByContext.getItems(),
DerivedColumn.ORDER_BY_ALIAS, projections);
}
- private Collection<Projection> getDerivedOrderColumns(final
Collection<Projection> projections,
- final
Collection<OrderByItem> orderItems, final DerivedColumn derivedColumn, final
Collection<SimpleTableSegment> tables) {
+ private Collection<Projection> getDerivedOrderColumns(final
Collection<OrderByItem> orderItems, final DerivedColumn derivedColumn, final
Collection<Projection> projections) {
Collection<Projection> result = new LinkedList<>();
int derivedColumnOffset = 0;
for (OrderByItem each : orderItems) {
- if (!containsProjection(projections, each.getSegment(), tables)) {
+ if (!containsProjection(each.getSegment(), projections)) {
result.add(new DerivedProjection(((TextOrderByItemSegment)
each.getSegment()).getText(),
derivedColumn.getDerivedColumnAlias(derivedColumnOffset++), each.getSegment()));
}
}
return result;
}
- private boolean containsProjection(final Collection<Projection>
projections, final OrderByItemSegment orderByItemSegment, final
Collection<SimpleTableSegment> tables) {
- return containsItemInShorthandProjection(projections,
orderByItemSegment, tables) || containsProjection(projections,
orderByItemSegment);
- }
-
- private boolean containsProjection(final Collection<Projection>
projections, final OrderByItemSegment orderItem) {
- if (orderItem instanceof IndexOrderByItemSegment) {
+ private boolean containsProjection(final OrderByItemSegment orderByItem,
final Collection<Projection> projections) {
+ if (orderByItem instanceof IndexOrderByItemSegment) {
return true;
}
for (Projection each : projections) {
- if (isSameAlias(each, (TextOrderByItemSegment) orderItem) ||
isSameQualifiedName(each, (TextOrderByItemSegment) orderItem)) {
+ if (orderByItem instanceof ColumnOrderByItemSegment &&
isSameColumn(each, ((ColumnOrderByItemSegment) orderByItem).getColumn())) {
+ return true;
+ }
+ String text = ((TextOrderByItemSegment) orderByItem).getText();
+ if (isSameAlias(each, text) || isSameQualifiedName(each, text)) {
return true;
}
}
return false;
}
- private boolean containsItemInShorthandProjection(final
Collection<Projection> projections, final OrderByItemSegment
orderByItemSegment, final Collection<SimpleTableSegment> tables) {
- return isUnqualifiedShorthandProjection(projections,
orderByItemSegment) || containsItemWithOwnerInShorthandProjections(projections,
orderByItemSegment, tables)
- || containsItemWithoutOwnerInShorthandProjections(projections,
orderByItemSegment, tables);
- }
-
- private boolean isUnqualifiedShorthandProjection(final
Collection<Projection> projections, final OrderByItemSegment
orderByItemSegment) {
- if (1 != projections.size() || orderByItemSegment instanceof
ExpressionOrderByItemSegment) {
+ private boolean isSameColumn(final Projection projection, final
ColumnSegment columnSegment) {
+ Collection<ColumnProjection> columns =
getColumnProjections(projection);
+ if (columns.isEmpty()) {
return false;
}
- Projection projection = projections.iterator().next();
- return projection instanceof ShorthandProjection &&
!((ShorthandProjection) projection).getOwner().isPresent();
- }
-
- private boolean containsItemWithOwnerInShorthandProjections(final
Collection<Projection> projections, final OrderByItemSegment orderItem, final
Collection<SimpleTableSegment> tables) {
- return orderItem instanceof ColumnOrderByItemSegment &&
((ColumnOrderByItemSegment) orderItem).getColumn().getOwner().isPresent()
- && findShorthandProjection(projections,
((ColumnOrderByItemSegment)
orderItem).getColumn().getOwner().get().getIdentifier().getValue(),
tables).isPresent();
- }
-
- private Optional<ShorthandProjection> findShorthandProjection(final
Collection<Projection> projections, final String tableNameOrAlias, final
Collection<SimpleTableSegment> tables) {
- SimpleTableSegment tableSegment = find(tableNameOrAlias, tables);
- for (Projection each : projections) {
- if (!(each instanceof ShorthandProjection)) {
- continue;
- }
- ShorthandProjection shorthandProjection = (ShorthandProjection)
each;
- if (shorthandProjection.getOwner().isPresent() && find(
- shorthandProjection.getOwner().get(),
tables).getTableName().getIdentifier().getValue().equalsIgnoreCase(tableSegment.getTableName().getIdentifier().getValue()))
{
- return Optional.of(shorthandProjection);
- }
+ if (columnSegment.getOwner().isPresent()) {
+ return columns.stream().anyMatch(each -> isSameQualifiedName(each,
columnSegment.getQualifiedName()));
+ } else {
+ return columns.stream().anyMatch(each -> isSameName(each,
columnSegment.getQualifiedName()));
}
- return Optional.empty();
}
- private boolean containsItemWithoutOwnerInShorthandProjections(final
Collection<Projection> projections, final OrderByItemSegment orderItem, final
Collection<SimpleTableSegment> tables) {
- if (!(orderItem instanceof ColumnOrderByItemSegment)) {
- return false;
+ private Collection<ColumnProjection> getColumnProjections(final Projection
projection) {
+ Collection<ColumnProjection> result = new LinkedList<>();
+ if (projection instanceof ColumnProjection) {
+ result.add((ColumnProjection) projection);
}
- if (!((ColumnOrderByItemSegment)
orderItem).getColumn().getOwner().isPresent()) {
- for (ShorthandProjection each :
getQualifiedShorthandProjections(projections)) {
- if (isSameProjection(each, (ColumnOrderByItemSegment)
orderItem, tables)) {
- return true;
- }
- }
- }
- return false;
- }
-
- private Collection<ShorthandProjection>
getQualifiedShorthandProjections(final Collection<Projection> projections) {
- Collection<ShorthandProjection> result = new LinkedList<>();
- for (Projection each : projections) {
- if (each instanceof ShorthandProjection && ((ShorthandProjection)
each).getOwner().isPresent()) {
- result.add((ShorthandProjection) each);
- }
+ if (projection instanceof ShorthandProjection) {
+ result.addAll(((ShorthandProjection)
projection).getActualColumns().values());
}
return result;
}
- private boolean isSameProjection(final ShorthandProjection
shorthandProjection, final ColumnOrderByItemSegment orderItem, final
Collection<SimpleTableSegment> tables) {
- Preconditions.checkState(shorthandProjection.getOwner().isPresent());
- SimpleTableSegment tableSegment =
find(shorthandProjection.getOwner().get(), tables);
- return
schema.containsColumn(tableSegment.getTableName().getIdentifier().getValue(),
orderItem.getColumn().getIdentifier().getValue());
- }
-
- private boolean isSameAlias(final Projection projection, final
TextOrderByItemSegment orderItem) {
- return projection.getAlias().isPresent()
- &&
(SQLUtil.getExactlyValue(orderItem.getText()).equalsIgnoreCase(projection.getAlias().get())
|| orderItem.getText().equalsIgnoreCase(projection.getExpression()));
+ private boolean isSameName(final ColumnProjection projection, final String
text) {
+ return
SQLUtil.getExactlyValue(text).equalsIgnoreCase(projection.getName());
}
- private boolean isSameQualifiedName(final Projection projection, final
TextOrderByItemSegment orderItem) {
- return !projection.getAlias().isPresent() &&
projection.getExpression().equalsIgnoreCase(orderItem.getText());
+ private boolean isSameAlias(final Projection projection, final String
text) {
+ return projection.getAlias().isPresent() &&
SQLUtil.getExactlyValue(text).equalsIgnoreCase(projection.getAlias().get());
}
- private SimpleTableSegment find(final String tableNameOrAlias, final
Collection<SimpleTableSegment> tables) {
- for (SimpleTableSegment each : tables) {
- if
(tableNameOrAlias.equalsIgnoreCase(each.getTableName().getIdentifier().getValue())
|| tableNameOrAlias.equalsIgnoreCase(each.getAlias().orElse(null))) {
- return each;
- }
- }
- throw new IllegalStateException("Can not find owner from table.");
+ private boolean isSameQualifiedName(final Projection projection, final
String text) {
+ return
SQLUtil.getExactlyValue(text).equalsIgnoreCase(projection.getExpression());
}
}
diff --git
a/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/impl/ShorthandProjection.java
b/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/impl/ShorthandProjection.java
index 91246e0..4be2404 100644
---
a/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/impl/ShorthandProjection.java
+++
b/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/impl/ShorthandProjection.java
@@ -20,17 +20,17 @@ package
org.apache.shardingsphere.infra.binder.segment.select.projection.impl;
import com.google.common.base.Strings;
import lombok.EqualsAndHashCode;
import lombok.Getter;
-import lombok.RequiredArgsConstructor;
import lombok.ToString;
import
org.apache.shardingsphere.infra.binder.segment.select.projection.Projection;
import java.util.Collection;
+import java.util.LinkedHashMap;
+import java.util.Map;
import java.util.Optional;
/**
* Shorthand projection.
*/
-@RequiredArgsConstructor
@Getter
@EqualsAndHashCode
@ToString
@@ -38,7 +38,12 @@ public final class ShorthandProjection implements Projection
{
private final String owner;
- private final Collection<ColumnProjection> actualColumns;
+ private final Map<String, ColumnProjection> actualColumns = new
LinkedHashMap<>();
+
+ public ShorthandProjection(final String owner, final
Collection<ColumnProjection> columnProjections) {
+ this.owner = owner;
+ columnProjections.forEach(each ->
actualColumns.put(each.getExpression().toLowerCase(), each));
+ }
@Override
public String getExpression() {
diff --git
a/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/dml/SelectStatementContext.java
b/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/dml/SelectStatementContext.java
index 3911fac..472dc86 100644
---
a/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/dml/SelectStatementContext.java
+++
b/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/dml/SelectStatementContext.java
@@ -31,6 +31,7 @@ import
org.apache.shardingsphere.infra.binder.segment.select.projection.Projecti
import
org.apache.shardingsphere.infra.binder.segment.select.projection.engine.ProjectionsContextEngine;
import
org.apache.shardingsphere.infra.binder.segment.select.projection.impl.AggregationDistinctProjection;
import
org.apache.shardingsphere.infra.binder.segment.select.projection.impl.AggregationProjection;
+import
org.apache.shardingsphere.infra.binder.segment.select.projection.impl.ColumnProjection;
import org.apache.shardingsphere.infra.binder.segment.table.TablesContext;
import
org.apache.shardingsphere.infra.binder.statement.CommonSQLStatementContext;
import org.apache.shardingsphere.infra.binder.type.TableAvailable;
@@ -44,20 +45,16 @@ import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.Aggregat
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.order.item.ColumnOrderByItemSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.order.item.ExpressionOrderByItemSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.order.item.IndexOrderByItemSegment;
+import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.order.item.OrderByItemSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.order.item.TextOrderByItemSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.predicate.WhereSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.JoinTableSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment;
-import
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SubqueryTableSegment;
-import
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.TableNameSegment;
-import
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.TableSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.SelectStatement;
import org.apache.shardingsphere.sql.parser.sql.common.util.SQLUtil;
import
org.apache.shardingsphere.sql.parser.sql.common.util.SubqueryExtractUtil;
-import
org.apache.shardingsphere.sql.parser.sql.common.value.identifier.IdentifierValue;
import java.util.Collection;
-import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Optional;
@@ -90,7 +87,7 @@ public final class SelectStatementContext extends
CommonSQLStatementContext<Sele
groupByContext = new
GroupByContextEngine().createGroupByContext(sqlStatement);
orderByContext = new OrderByContextEngine().createOrderBy(schema,
sqlStatement, groupByContext);
projectionsContext = new ProjectionsContextEngine(schema,
getDatabaseType())
- .createProjectionsContext(getFromSimpleTableSegments(),
getSqlStatement().getProjections(), groupByContext, orderByContext);
+ .createProjectionsContext(getSqlStatement().getFrom(),
getSqlStatement().getProjections(), groupByContext, orderByContext);
paginationContext = new
PaginationContextEngine().createPaginationContext(sqlStatement,
projectionsContext, parameters);
Collection<SubquerySegment> subquerySegments =
SubqueryExtractUtil.getSubquerySegments(getSqlStatement());
containsSubquery = !subquerySegments.isEmpty();
@@ -170,7 +167,7 @@ public final class SelectStatementContext extends
CommonSQLStatementContext<Sele
continue;
}
}
- String columnLabel = getAlias(((TextOrderByItemSegment)
each.getSegment()).getText()).orElseGet(() ->
getOrderItemText((TextOrderByItemSegment) each.getSegment()));
+ String columnLabel = getAlias(each.getSegment()).orElseGet(() ->
getOrderItemText((TextOrderByItemSegment) each.getSegment()));
Preconditions.checkState(columnLabelIndexMap.containsKey(columnLabel), "Can't
find index: %s", each);
if (columnLabelIndexMap.containsKey(columnLabel)) {
each.setIndex(columnLabelIndexMap.get(columnLabel));
@@ -178,11 +175,11 @@ public final class SelectStatementContext extends
CommonSQLStatementContext<Sele
}
}
- private Optional<String> getAlias(final String name) {
+ private Optional<String> getAlias(final OrderByItemSegment orderByItem) {
if (projectionsContext.isUnqualifiedShorthandProjection()) {
return Optional.empty();
}
- String rawName = SQLUtil.getExactlyValue(name);
+ String rawName = SQLUtil.getExactlyValue(((TextOrderByItemSegment)
orderByItem).getText());
for (Projection each : projectionsContext.getProjections()) {
if
(SQLUtil.getExactlyExpression(rawName).equalsIgnoreCase(SQLUtil.getExactlyExpression(SQLUtil.getExactlyValue(each.getExpression()))))
{
return each.getAlias();
@@ -190,10 +187,17 @@ public final class SelectStatementContext extends
CommonSQLStatementContext<Sele
if (rawName.equalsIgnoreCase(each.getAlias().orElse(null))) {
return Optional.of(rawName);
}
+ if (isSameColumnName(each, rawName)) {
+ return each.getAlias();
+ }
}
return Optional.empty();
}
+ private boolean isSameColumnName(final Projection projection, final String
name) {
+ return projection instanceof ColumnProjection &&
name.equalsIgnoreCase(((ColumnProjection) projection).getName());
+ }
+
private String getOrderItemText(final TextOrderByItemSegment
orderByItemSegment) {
return orderByItemSegment instanceof ColumnOrderByItemSegment
? ((ColumnOrderByItemSegment)
orderByItemSegment).getColumn().getIdentifier().getValue() :
((ExpressionOrderByItemSegment) orderByItemSegment).getExpression();
@@ -223,22 +227,4 @@ public final class SelectStatementContext extends
CommonSQLStatementContext<Sele
tableExtractor.extractTablesFromSelect(getSqlStatement());
return tableExtractor.getRewriteTables();
}
-
- /**
- * Get tables with from clause.
- *
- * @return tables with from clause
- */
- public Collection<SimpleTableSegment> getFromSimpleTableSegments() {
- Collection<SimpleTableSegment> result = new LinkedList<>();
- TableExtractor extractor = new TableExtractor();
-
result.addAll(extractor.extractTablesWithFromClause(getSqlStatement()));
-
result.addAll(getTemporarySimpleTableSegments(extractor.getTableContext()));
- return result;
- }
-
- private Collection<SimpleTableSegment>
getTemporarySimpleTableSegments(final Collection<TableSegment> tableSegments) {
- return tableSegments.stream().filter(each -> each instanceof
SubqueryTableSegment).map(each -> new SimpleTableSegment(
- new TableNameSegment(each.getStartIndex(),
each.getStopIndex(), new
IdentifierValue(each.getAlias().orElse(""))))).collect(Collectors.toList());
- }
}
diff --git
a/shardingsphere-infra/shardingsphere-infra-binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/select/pagination/engine/RowNumberPaginationContextEngineTest.java
b/shardingsphere-infra/shardingsphere-infra-binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/select/pagination/engine/RowNumberPaginationContextEngineTest.java
index af2387b..687092e 100644
---
a/shardingsphere-infra/shardingsphere-infra-binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/select/pagination/engine/RowNumberPaginationContextEngineTest.java
+++
b/shardingsphere-infra/shardingsphere-infra-binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/select/pagination/engine/RowNumberPaginationContextEngineTest.java
@@ -17,9 +17,9 @@
package
org.apache.shardingsphere.infra.binder.segment.select.pagination.engine;
+import
org.apache.shardingsphere.infra.binder.segment.select.pagination.PaginationContext;
import
org.apache.shardingsphere.infra.binder.segment.select.projection.Projection;
import
org.apache.shardingsphere.infra.binder.segment.select.projection.ProjectionsContext;
-import
org.apache.shardingsphere.infra.binder.segment.select.pagination.PaginationContext;
import
org.apache.shardingsphere.infra.binder.segment.select.projection.impl.ColumnProjection;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.ColumnSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.BinaryOperationExpression;
@@ -50,7 +50,7 @@ public final class RowNumberPaginationContextEngineTest {
@Test
public void assertCreatePaginationContextWhenRowNumberAliasNotPresent() {
ProjectionsContext projectionsContext = new ProjectionsContext(0, 0,
false, Collections.emptyList());
- PaginationContext paginationContext = new
RowNumberPaginationContextEngine().createPaginationContext(null,
projectionsContext, Collections.emptyList());
+ PaginationContext paginationContext = new
RowNumberPaginationContextEngine().createPaginationContext(Collections.emptyList(),
projectionsContext, Collections.emptyList());
assertFalse(paginationContext.getOffsetSegment().isPresent());
assertFalse(paginationContext.getRowCountSegment().isPresent());
}
@@ -59,7 +59,7 @@ public final class RowNumberPaginationContextEngineTest {
public void
assertCreatePaginationContextWhenRowNumberAliasIsPresentAndRowNumberPredicatesIsEmpty()
{
Projection projectionWithRowNumberAlias = new ColumnProjection(null,
ROW_NUMBER_COLUMN_NAME, ROW_NUMBER_COLUMN_ALIAS);
ProjectionsContext projectionsContext = new ProjectionsContext(0, 0,
false, Collections.singleton(projectionWithRowNumberAlias));
- PaginationContext paginationContext = new
RowNumberPaginationContextEngine().createPaginationContext(null,
projectionsContext, Collections.emptyList());
+ PaginationContext paginationContext = new
RowNumberPaginationContextEngine().createPaginationContext(Collections.emptyList(),
projectionsContext, Collections.emptyList());
assertFalse(paginationContext.getOffsetSegment().isPresent());
assertFalse(paginationContext.getRowCountSegment().isPresent());
}
@@ -92,7 +92,7 @@ public final class RowNumberPaginationContextEngineTest {
ColumnSegment left = new ColumnSegment(0, 10, new
IdentifierValue(ROW_NUMBER_COLUMN_NAME));
BinaryOperationExpression predicateSegment = new
BinaryOperationExpression(0, 0, left, null, null, null);
andPredicate.getPredicates().addAll(Collections.singleton(predicateSegment));
- PaginationContext paginationContext = new
RowNumberPaginationContextEngine().createPaginationContext(null,
projectionsContext, Collections.emptyList());
+ PaginationContext paginationContext = new
RowNumberPaginationContextEngine().createPaginationContext(Collections.emptyList(),
projectionsContext, Collections.emptyList());
assertFalse(paginationContext.getOffsetSegment().isPresent());
assertFalse(paginationContext.getRowCountSegment().isPresent());
}
@@ -105,7 +105,7 @@ public final class RowNumberPaginationContextEngineTest {
ParameterMarkerExpressionSegment right = new
ParameterMarkerExpressionSegment(0, 10, 0);
BinaryOperationExpression expression = new
BinaryOperationExpression(0, 0, left, right, ">", null);
PaginationContext paginationContext = new
RowNumberPaginationContextEngine()
- .createPaginationContext(expression, projectionsContext,
Collections.singletonList(1));
+
.createPaginationContext(Collections.singletonList(expression),
projectionsContext, Collections.singletonList(1));
Optional<PaginationValueSegment> offSetSegmentPaginationValue =
paginationContext.getOffsetSegment();
assertTrue(offSetSegmentPaginationValue.isPresent());
assertThat(offSetSegmentPaginationValue.get(),
instanceOf(ParameterMarkerRowNumberValueSegment.class));
@@ -118,7 +118,7 @@ public final class RowNumberPaginationContextEngineTest {
ColumnSegment left = new ColumnSegment(0, 10, new
IdentifierValue(ROW_NUMBER_COLUMN_NAME));
LiteralExpressionSegment right = new LiteralExpressionSegment(0, 10,
100);
BinaryOperationExpression expression = new
BinaryOperationExpression(0, 0, left, right, operator, null);
- PaginationContext paginationContext = new
RowNumberPaginationContextEngine().createPaginationContext(expression,
projectionsContext, Collections.emptyList());
+ PaginationContext paginationContext = new
RowNumberPaginationContextEngine().createPaginationContext(Collections.singletonList(expression),
projectionsContext, Collections.emptyList());
assertFalse(paginationContext.getOffsetSegment().isPresent());
Optional<PaginationValueSegment> paginationValueSegmentOptional =
paginationContext.getRowCountSegment();
assertTrue(paginationValueSegmentOptional.isPresent());
@@ -137,7 +137,7 @@ public final class RowNumberPaginationContextEngineTest {
LiteralExpressionSegment right = new LiteralExpressionSegment(0, 10,
100);
BinaryOperationExpression expression = new
BinaryOperationExpression(0, 0, left, right, operator, null);
PaginationContext rowNumberPaginationContextEngine = new
RowNumberPaginationContextEngine()
- .createPaginationContext(expression, projectionsContext,
Collections.emptyList());
+
.createPaginationContext(Collections.singletonList(expression),
projectionsContext, Collections.emptyList());
Optional<PaginationValueSegment> paginationValueSegment =
rowNumberPaginationContextEngine.getOffsetSegment();
assertTrue(paginationValueSegment.isPresent());
PaginationValueSegment actualPaginationValueSegment =
paginationValueSegment.get();
diff --git
a/shardingsphere-infra/shardingsphere-infra-binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/select/pagination/engine/TopPaginationContextEngineTest.java
b/shardingsphere-infra/shardingsphere-infra-binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/select/pagination/engine/TopPaginationContextEngineTest.java
index 9f7fa6c..5c395fb 100644
---
a/shardingsphere-infra/shardingsphere-infra-binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/select/pagination/engine/TopPaginationContextEngineTest.java
+++
b/shardingsphere-infra/shardingsphere-infra-binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/select/pagination/engine/TopPaginationContextEngineTest.java
@@ -28,12 +28,10 @@ import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.pagination.Pa
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.pagination.rownum.NumberLiteralRowNumberValueSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.pagination.rownum.ParameterMarkerRowNumberValueSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.pagination.top.TopProjectionSegment;
-import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.predicate.AndPredicate;
import
org.apache.shardingsphere.sql.parser.sql.common.value.identifier.IdentifierValue;
import org.junit.Before;
import org.junit.Test;
-import java.util.Collection;
import java.util.Collections;
import java.util.List;
@@ -55,9 +53,8 @@ public final class TopPaginationContextEngineTest {
@Test
public void
assertCreatePaginationContextWhenRowNumberPredicateNotPresent() {
TopProjectionSegment topProjectionSegment = new
TopProjectionSegment(0, 10, null, "rowNumberAlias");
- Collection<AndPredicate> andPredicates = Collections.emptyList();
List<Object> parameters = Collections.emptyList();
- PaginationContext paginationContext =
topPaginationContextEngine.createPaginationContext(topProjectionSegment, null,
parameters);
+ PaginationContext paginationContext =
topPaginationContextEngine.createPaginationContext(topProjectionSegment,
Collections.emptyList(), parameters);
assertFalse(paginationContext.getOffsetSegment().isPresent());
assertFalse(paginationContext.getRowCountSegment().isPresent());
}
@@ -77,7 +74,8 @@ public final class TopPaginationContextEngineTest {
String name = "rowNumberAlias";
ColumnSegment columnSegment = new ColumnSegment(0, 10, new
IdentifierValue(name));
InExpression inExpression = new InExpression(0, 0, columnSegment, new
ListExpression(0, 0), false);
- PaginationContext paginationContext =
topPaginationContextEngine.createPaginationContext(new TopProjectionSegment(0,
10, null, name), inExpression, Collections.emptyList());
+ PaginationContext paginationContext =
topPaginationContextEngine.createPaginationContext(
+ new TopProjectionSegment(0, 10, null, name),
Collections.singletonList(inExpression), Collections.emptyList());
assertFalse(paginationContext.getOffsetSegment().isPresent());
assertFalse(paginationContext.getRowCountSegment().isPresent());
}
@@ -88,7 +86,8 @@ public final class TopPaginationContextEngineTest {
ColumnSegment left = new ColumnSegment(0, 10, new
IdentifierValue(name));
ParameterMarkerExpressionSegment right = new
ParameterMarkerExpressionSegment(0, 10, 0);
BinaryOperationExpression expression = new
BinaryOperationExpression(0, 0, left, right, ">", null);
- PaginationContext paginationContext =
topPaginationContextEngine.createPaginationContext(new TopProjectionSegment(0,
10, null, name), expression, Collections.singletonList(1));
+ PaginationContext paginationContext =
topPaginationContextEngine.createPaginationContext(
+ new TopProjectionSegment(0, 10, null, name),
Collections.singletonList(expression), Collections.singletonList(1));
assertTrue(paginationContext.getOffsetSegment().isPresent());
PaginationValueSegment paginationValueSegment =
paginationContext.getOffsetSegment().get();
assertThat(paginationValueSegment,
instanceOf(ParameterMarkerRowNumberValueSegment.class));
@@ -104,7 +103,8 @@ public final class TopPaginationContextEngineTest {
ColumnSegment left = new ColumnSegment(0, 10, new
IdentifierValue(name));
LiteralExpressionSegment right = new LiteralExpressionSegment(0, 10,
100);
BinaryOperationExpression expression = new
BinaryOperationExpression(0, 0, left, right, operator, null);
- PaginationContext paginationContext =
topPaginationContextEngine.createPaginationContext(new TopProjectionSegment(0,
10, null, name), expression, Collections.emptyList());
+ PaginationContext paginationContext =
topPaginationContextEngine.createPaginationContext(
+ new TopProjectionSegment(0, 10, null, name),
Collections.singletonList(expression), Collections.emptyList());
assertTrue(paginationContext.getOffsetSegment().isPresent());
PaginationValueSegment paginationValueSegment =
paginationContext.getOffsetSegment().get();
assertThat(paginationValueSegment,
instanceOf(NumberLiteralRowNumberValueSegment.class));
diff --git
a/shardingsphere-infra/shardingsphere-infra-binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/select/projection/engine/ProjectionEngineTest.java
b/shardingsphere-infra/shardingsphere-infra-binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/select/projection/engine/ProjectionEngineTest.java
index 5fc722b..6d48084 100644
---
a/shardingsphere-infra/shardingsphere-infra-binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/select/projection/engine/ProjectionEngineTest.java
+++
b/shardingsphere-infra/shardingsphere-infra-binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/select/projection/engine/ProjectionEngineTest.java
@@ -17,7 +17,6 @@
package
org.apache.shardingsphere.infra.binder.segment.select.projection.engine;
-import com.google.common.collect.Sets;
import
org.apache.shardingsphere.infra.binder.segment.select.projection.Projection;
import
org.apache.shardingsphere.infra.binder.segment.select.projection.impl.AggregationDistinctProjection;
import
org.apache.shardingsphere.infra.binder.segment.select.projection.impl.AggregationProjection;
@@ -37,6 +36,7 @@ import
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.AliasSegm
import
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.OwnerSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.TableNameSegment;
+import
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.TableSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.value.identifier.IdentifierValue;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -44,9 +44,8 @@ import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.LinkedList;
+import java.util.LinkedHashMap;
+import java.util.Map;
import java.util.Optional;
import static org.hamcrest.CoreMatchers.instanceOf;
@@ -54,6 +53,7 @@ import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
@@ -67,36 +67,37 @@ public final class ProjectionEngineTest {
@Test
public void assertCreateProjectionWhenProjectionSegmentNotMatched() {
- assertFalse(new ProjectionEngine(schema,
databaseType).createProjection(Collections.emptyList(), null).isPresent());
+ assertFalse(new ProjectionEngine(schema,
databaseType).createProjection(mock(TableSegment.class), null).isPresent());
}
@Test
public void
assertCreateProjectionWhenProjectionSegmentInstanceOfShorthandProjectionSegment()
{
ShorthandProjectionSegment shorthandProjectionSegment = new
ShorthandProjectionSegment(0, 0);
shorthandProjectionSegment.setOwner(new OwnerSegment(0, 0, new
IdentifierValue("tbl")));
- Optional<Projection> actual = new ProjectionEngine(schema,
databaseType).createProjection(Collections.emptyList(),
shorthandProjectionSegment);
+ Optional<Projection> actual = new ProjectionEngine(schema,
databaseType).createProjection(mock(TableSegment.class),
shorthandProjectionSegment);
assertTrue(actual.isPresent());
assertThat(actual.get(), instanceOf(ShorthandProjection.class));
}
@Test
public void
assertCreateProjectionWhenProjectionSegmentInstanceOfShorthandProjectionSegmentAndDuplicateTableSegment()
{
- Collection<SimpleTableSegment> tableSegments = new LinkedList<>();
- tableSegments.add(new SimpleTableSegment(new TableNameSegment(0, 0,
new IdentifierValue("t_order"))));
- tableSegments.add(new SimpleTableSegment(new TableNameSegment(0, 0,
new IdentifierValue("t_order"))));
+ SimpleTableSegment table = new SimpleTableSegment(new
TableNameSegment(0, 0, new IdentifierValue("t_order")));
when(schema.getAllColumnNames("t_order")).thenReturn(Arrays.asList("order_id",
"content"));
- Optional<Projection> actual = new ProjectionEngine(schema,
databaseType).createProjection(tableSegments, new ShorthandProjectionSegment(0,
0));
+ Optional<Projection> actual = new ProjectionEngine(schema,
databaseType).createProjection(table, new ShorthandProjectionSegment(0, 0));
assertTrue(actual.isPresent());
assertThat(actual.get(), instanceOf(ShorthandProjection.class));
assertThat(((ShorthandProjection)
actual.get()).getActualColumns().size(), is(2));
- assertThat(((ShorthandProjection) actual.get()).getActualColumns(),
is(Sets.newHashSet(new ColumnProjection("t_order", "order_id", null), new
ColumnProjection("t_order", "content", null))));
+ Map<String, ColumnProjection> actualColumns = new LinkedHashMap<>();
+ actualColumns.put("t_order.order_id", new ColumnProjection("t_order",
"order_id", null));
+ actualColumns.put("t_order.content", new ColumnProjection("t_order",
"content", null));
+ assertThat(((ShorthandProjection) actual.get()).getActualColumns(),
is(actualColumns));
}
@Test
public void
assertCreateProjectionWhenProjectionSegmentInstanceOfColumnProjectionSegment() {
ColumnProjectionSegment columnProjectionSegment = new
ColumnProjectionSegment(new ColumnSegment(0, 10, new IdentifierValue("name")));
columnProjectionSegment.setAlias(new AliasSegment(0, 0, new
IdentifierValue("alias")));
- Optional<Projection> actual = new ProjectionEngine(schema,
databaseType).createProjection(Collections.emptyList(),
columnProjectionSegment);
+ Optional<Projection> actual = new ProjectionEngine(schema,
databaseType).createProjection(mock(TableSegment.class),
columnProjectionSegment);
assertTrue(actual.isPresent());
assertThat(actual.get(), instanceOf(ColumnProjection.class));
}
@@ -104,7 +105,7 @@ public final class ProjectionEngineTest {
@Test
public void
assertCreateProjectionWhenProjectionSegmentInstanceOfExpressionProjectionSegment()
{
ExpressionProjectionSegment expressionProjectionSegment = new
ExpressionProjectionSegment(0, 10, "text");
- Optional<Projection> actual = new ProjectionEngine(schema,
databaseType).createProjection(Collections.emptyList(),
expressionProjectionSegment);
+ Optional<Projection> actual = new ProjectionEngine(schema,
databaseType).createProjection(mock(TableSegment.class),
expressionProjectionSegment);
assertTrue(actual.isPresent());
assertThat(actual.get(), instanceOf(ExpressionProjection.class));
}
@@ -112,7 +113,7 @@ public final class ProjectionEngineTest {
@Test
public void
assertCreateProjectionWhenProjectionSegmentInstanceOfAggregationDistinctProjectionSegment()
{
AggregationDistinctProjectionSegment
aggregationDistinctProjectionSegment = new
AggregationDistinctProjectionSegment(0, 10, AggregationType.COUNT, "(1)",
"distinctExpression");
- Optional<Projection> actual = new ProjectionEngine(schema,
databaseType).createProjection(Collections.emptyList(),
aggregationDistinctProjectionSegment);
+ Optional<Projection> actual = new ProjectionEngine(schema,
databaseType).createProjection(mock(TableSegment.class),
aggregationDistinctProjectionSegment);
assertTrue(actual.isPresent());
assertThat(actual.get(),
instanceOf(AggregationDistinctProjection.class));
}
@@ -120,7 +121,7 @@ public final class ProjectionEngineTest {
@Test
public void
assertCreateProjectionWhenProjectionSegmentInstanceOfAggregationProjectionSegment()
{
AggregationProjectionSegment aggregationProjectionSegment = new
AggregationProjectionSegment(0, 10, AggregationType.COUNT, "(1)");
- Optional<Projection> actual = new ProjectionEngine(schema,
databaseType).createProjection(Collections.emptyList(),
aggregationProjectionSegment);
+ Optional<Projection> actual = new ProjectionEngine(schema,
databaseType).createProjection(mock(TableSegment.class),
aggregationProjectionSegment);
assertTrue(actual.isPresent());
assertThat(actual.get(), instanceOf(AggregationProjection.class));
}
@@ -128,7 +129,7 @@ public final class ProjectionEngineTest {
@Test
public void
assertCreateProjectionWhenProjectionSegmentInstanceOfAggregationDistinctProjectionSegmentAndAggregationTypeIsAvg()
{
AggregationDistinctProjectionSegment
aggregationDistinctProjectionSegment = new
AggregationDistinctProjectionSegment(0, 10, AggregationType.AVG, "(1)",
"distinctExpression");
- Optional<Projection> actual = new ProjectionEngine(schema,
databaseType).createProjection(Collections.emptyList(),
aggregationDistinctProjectionSegment);
+ Optional<Projection> actual = new ProjectionEngine(schema,
databaseType).createProjection(mock(TableSegment.class),
aggregationDistinctProjectionSegment);
assertTrue(actual.isPresent());
assertThat(actual.get(),
instanceOf(AggregationDistinctProjection.class));
}
@@ -136,7 +137,7 @@ public final class ProjectionEngineTest {
@Test
public void
assertCreateProjectionWhenProjectionSegmentInstanceOfAggregationProjectionSegmentAndAggregationTypeIsAvg()
{
AggregationProjectionSegment aggregationProjectionSegment = new
AggregationProjectionSegment(0, 10, AggregationType.AVG, "(1)");
- Optional<Projection> actual = new ProjectionEngine(schema,
databaseType).createProjection(Collections.emptyList(),
aggregationProjectionSegment);
+ Optional<Projection> actual = new ProjectionEngine(schema,
databaseType).createProjection(mock(TableSegment.class),
aggregationProjectionSegment);
assertTrue(actual.isPresent());
assertThat(actual.get(), instanceOf(AggregationProjection.class));
}
diff --git
a/shardingsphere-infra/shardingsphere-infra-binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/select/projection/engine/ProjectionsContextEngineTest.java
b/shardingsphere-infra/shardingsphere-infra-binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/select/projection/engine/ProjectionsContextEngineTest.java
index a1d5621..9e42664 100644
---
a/shardingsphere-infra/shardingsphere-infra-binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/select/projection/engine/ProjectionsContextEngineTest.java
+++
b/shardingsphere-infra/shardingsphere-infra-binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/select/projection/engine/ProjectionsContextEngineTest.java
@@ -51,7 +51,6 @@ import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import java.util.Arrays;
-import java.util.Collection;
import java.util.Collections;
import static org.hamcrest.CoreMatchers.is;
@@ -94,11 +93,10 @@ public final class ProjectionsContextEngineTest {
private void assertProjectionsContextCreatedProperly(final SelectStatement
selectStatement) {
selectStatement.setProjections(new ProjectionsSegment(0, 0));
SelectStatementContext selectStatementContext =
createSelectStatementContext(selectStatement);
- Collection<SimpleTableSegment> tables =
selectStatementContext.getAllTables();
ProjectionsSegment projectionsSegment =
selectStatement.getProjections();
ProjectionsContextEngine projectionsContextEngine = new
ProjectionsContextEngine(null, selectStatementContext.getDatabaseType());
ProjectionsContext actual = projectionsContextEngine
- .createProjectionsContext(tables, projectionsSegment, new
GroupByContext(Collections.emptyList()), new
OrderByContext(Collections.emptyList(), false));
+ .createProjectionsContext(selectStatement.getFrom(),
projectionsSegment, new GroupByContext(Collections.emptyList()), new
OrderByContext(Collections.emptyList(), false));
assertNotNull(actual);
}
@@ -135,9 +133,8 @@ public final class ProjectionsContextEngineTest {
shorthandProjectionSegment.setOwner(owner);
projectionsSegment.getProjections().addAll(Collections.singleton(shorthandProjectionSegment));
SelectStatementContext selectStatementContext =
createSelectStatementContext(selectStatement);
- Collection<SimpleTableSegment> tables =
selectStatementContext.getAllTables();
ProjectionsContext actual = new ProjectionsContextEngine(schema,
selectStatementContext.getDatabaseType())
- .createProjectionsContext(tables, projectionsSegment, new
GroupByContext(Collections.emptyList()), new
OrderByContext(Collections.emptyList(), false));
+ .createProjectionsContext(selectStatement.getFrom(),
projectionsSegment, new GroupByContext(Collections.emptyList()), new
OrderByContext(Collections.emptyList(), false));
assertNotNull(actual);
}
@@ -176,9 +173,8 @@ public final class ProjectionsContextEngineTest {
OrderByItem orderByItem = new OrderByItem(new
IndexOrderByItemSegment(0, 1, 0, OrderDirection.ASC));
OrderByContext orderByContext = new
OrderByContext(Collections.singletonList(orderByItem), true);
SelectStatementContext selectStatementContext =
createSelectStatementContext(selectStatement);
- Collection<SimpleTableSegment> tables =
selectStatementContext.getAllTables();
ProjectionsContext actual = new ProjectionsContextEngine(schema,
selectStatementContext.getDatabaseType())
- .createProjectionsContext(tables, projectionsSegment, new
GroupByContext(Collections.emptyList()), orderByContext);
+ .createProjectionsContext(selectStatement.getFrom(),
projectionsSegment, new GroupByContext(Collections.emptyList()),
orderByContext);
assertNotNull(actual);
}
@@ -217,9 +213,8 @@ public final class ProjectionsContextEngineTest {
OrderByItem orderByItem = new OrderByItem(new
ExpressionOrderByItemSegment(0, 1, "", OrderDirection.ASC));
OrderByContext orderByContext = new
OrderByContext(Collections.singletonList(orderByItem), true);
SelectStatementContext selectStatementContext =
createSelectStatementContext(selectStatement);
- Collection<SimpleTableSegment> tables =
selectStatementContext.getAllTables();
ProjectionsContext actual = new ProjectionsContextEngine(schema,
selectStatementContext.getDatabaseType())
- .createProjectionsContext(tables, projectionsSegment, new
GroupByContext(Collections.emptyList()), orderByContext);
+ .createProjectionsContext(selectStatement.getFrom(),
projectionsSegment, new GroupByContext(Collections.emptyList()),
orderByContext);
assertNotNull(actual);
}
@@ -266,9 +261,8 @@ public final class ProjectionsContextEngineTest {
OrderByItem orderByItem = new OrderByItem(new
ColumnOrderByItemSegment(new ColumnSegment(0, 0, new IdentifierValue("name")),
OrderDirection.ASC));
OrderByContext orderByContext = new
OrderByContext(Collections.singletonList(orderByItem), true);
SelectStatementContext selectStatementContext =
createSelectStatementContext(selectStatement);
- Collection<SimpleTableSegment> tables =
selectStatementContext.getAllTables();
ProjectionsContext actual = new ProjectionsContextEngine(schema,
selectStatementContext.getDatabaseType())
- .createProjectionsContext(tables, projectionsSegment, new
GroupByContext(Collections.emptyList()), orderByContext);
+ .createProjectionsContext(selectStatement.getFrom(),
projectionsSegment, new GroupByContext(Collections.emptyList()),
orderByContext);
assertNotNull(actual);
}
@@ -308,9 +302,8 @@ public final class ProjectionsContextEngineTest {
OrderByItem orderByItem = new OrderByItem(new
ColumnOrderByItemSegment(new ColumnSegment(0, 0, new IdentifierValue("name")),
OrderDirection.ASC));
OrderByContext orderByContext = new
OrderByContext(Collections.singletonList(orderByItem), true);
SelectStatementContext selectStatementContext =
createSelectStatementContext(selectStatement);
- Collection<SimpleTableSegment> tables =
selectStatementContext.getAllTables();
ProjectionsContext actual = new ProjectionsContextEngine(schema,
selectStatementContext.getDatabaseType())
- .createProjectionsContext(tables, projectionsSegment, new
GroupByContext(Collections.emptyList()), orderByContext);
+ .createProjectionsContext(selectStatement.getFrom(),
projectionsSegment, new GroupByContext(Collections.emptyList()),
orderByContext);
assertNotNull(actual);
}
@@ -358,9 +351,8 @@ public final class ProjectionsContextEngineTest {
OrderByItem orderByItem = new OrderByItem(new
ColumnOrderByItemSegment(new ColumnSegment(0, 0, new IdentifierValue("name")),
OrderDirection.ASC));
OrderByContext orderByContext = new
OrderByContext(Collections.singleton(orderByItem), false);
SelectStatementContext selectStatementContext =
createSelectStatementContext(selectStatement);
- Collection<SimpleTableSegment> tables =
selectStatementContext.getAllTables();
ProjectionsContext actual = new ProjectionsContextEngine(schema,
selectStatementContext.getDatabaseType())
- .createProjectionsContext(tables, projectionsSegment, new
GroupByContext(Collections.emptyList()), orderByContext);
+ .createProjectionsContext(selectStatement.getFrom(),
projectionsSegment, new GroupByContext(Collections.emptyList()),
orderByContext);
assertNotNull(actual);
}
@@ -405,7 +397,7 @@ public final class ProjectionsContextEngineTest {
GroupByContext groupByContext = new
GroupByContext(Collections.singleton(groupByItem));
SelectStatementContext selectStatementContext =
createSelectStatementContext(selectStatement);
ProjectionsContext actual = new ProjectionsContextEngine(schema,
selectStatementContext.getDatabaseType())
-
.createProjectionsContext(selectStatementContext.getFromSimpleTableSegments(),
projectionsSegment, groupByContext, new OrderByContext(Collections.emptyList(),
false));
+ .createProjectionsContext(selectStatement.getFrom(),
projectionsSegment, groupByContext, new OrderByContext(Collections.emptyList(),
false));
assertNotNull(actual);
}
@@ -450,7 +442,7 @@ public final class ProjectionsContextEngineTest {
GroupByContext groupByContext = new
GroupByContext(Collections.singleton(groupByItem));
SelectStatementContext selectStatementContext =
createSelectStatementContext(selectStatement);
ProjectionsContext actual = new ProjectionsContextEngine(schema,
selectStatementContext.getDatabaseType())
-
.createProjectionsContext(selectStatementContext.getFromSimpleTableSegments(),
projectionsSegment, groupByContext, new OrderByContext(Collections.emptyList(),
false));
+ .createProjectionsContext(selectStatement.getFrom(),
projectionsSegment, groupByContext, new OrderByContext(Collections.emptyList(),
false));
assertNotNull(actual);
}
@@ -465,7 +457,7 @@ public final class ProjectionsContextEngineTest {
OrderByContext orderByContext = new
OrderByContext(Collections.singleton(orderByItem), false);
SelectStatementContext selectStatementContext =
createSelectStatementContext(selectStatement);
ProjectionsContext actual = new ProjectionsContextEngine(schema,
selectStatementContext.getDatabaseType())
-
.createProjectionsContext(selectStatementContext.getFromSimpleTableSegments(),
projectionsSegment, new GroupByContext(Collections.emptyList()),
orderByContext);
+ .createProjectionsContext(selectStatement.getFrom(),
projectionsSegment, new GroupByContext(Collections.emptyList()),
orderByContext);
assertThat(actual.getProjections().size(), is(2));
}
}