Repository: kylin Updated Branches: refs/heads/yang21 ca2e07170 -> cb0a1a395
if outer query does not have aggr, join columns with subquery should not be added to groupbycolumns Project: http://git-wip-us.apache.org/repos/asf/kylin/repo Commit: http://git-wip-us.apache.org/repos/asf/kylin/commit/cb0a1a39 Tree: http://git-wip-us.apache.org/repos/asf/kylin/tree/cb0a1a39 Diff: http://git-wip-us.apache.org/repos/asf/kylin/diff/cb0a1a39 Branch: refs/heads/yang21 Commit: cb0a1a39555994b481da7b9151b4bc8a3955c179 Parents: dc01e15 Author: Hongbin Ma <mahong...@apache.org> Authored: Thu Nov 3 18:32:19 2016 +0800 Committer: Hongbin Ma <mahong...@apache.org> Committed: Thu Nov 3 18:32:59 2016 +0800 ---------------------------------------------------------------------- .../org/apache/kylin/metadata/realization/SQLDigest.java | 4 +++- .../kylin/storage/gtrecord/GTCubeStorageQueryBase.java | 8 ++++++++ .../java/org/apache/kylin/storage/hbase/ITStorageTest.java | 2 +- .../java/org/apache/kylin/query/relnode/OLAPContext.java | 3 ++- .../java/org/apache/kylin/query/relnode/OLAPJoinRel.java | 5 ++--- 5 files changed, 16 insertions(+), 6 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/kylin/blob/cb0a1a39/core-metadata/src/main/java/org/apache/kylin/metadata/realization/SQLDigest.java ---------------------------------------------------------------------- diff --git a/core-metadata/src/main/java/org/apache/kylin/metadata/realization/SQLDigest.java b/core-metadata/src/main/java/org/apache/kylin/metadata/realization/SQLDigest.java index d2bba66..3aa39e4 100644 --- a/core-metadata/src/main/java/org/apache/kylin/metadata/realization/SQLDigest.java +++ b/core-metadata/src/main/java/org/apache/kylin/metadata/realization/SQLDigest.java @@ -39,6 +39,7 @@ public class SQLDigest { public Collection<JoinDesc> joinDescs; public Collection<TblColRef> allColumns; public Collection<TblColRef> groupbyColumns; + public Collection<TblColRef> subqueryJoinParticipants; public Collection<TblColRef> filterColumns; public Collection<TblColRef> metricColumns; public Collection<FunctionDesc> aggregations; @@ -48,12 +49,13 @@ public class SQLDigest { //initialized when org.apache.kylin.query.routing.QueryRouter.selectRealization() public SQLDigest(String factTable, TupleFilter filter, Collection<JoinDesc> joinDescs, Collection<TblColRef> allColumns, // - Collection<TblColRef> groupbyColumns, Collection<TblColRef> filterColumns, Collection<TblColRef> aggregatedColumns, Collection<FunctionDesc> aggregateFunnc, Collection<MeasureDesc> sortMeasures, Collection<OrderEnum> sortOrders) { + Collection<TblColRef> groupbyColumns, Collection<TblColRef> subqueryJoinParticipants, Collection<TblColRef> filterColumns, Collection<TblColRef> aggregatedColumns, Collection<FunctionDesc> aggregateFunnc, Collection<MeasureDesc> sortMeasures, Collection<OrderEnum> sortOrders) { this.factTable = factTable; this.filter = filter; this.joinDescs = joinDescs; this.allColumns = allColumns; this.groupbyColumns = groupbyColumns; + this.subqueryJoinParticipants = subqueryJoinParticipants; this.filterColumns = filterColumns; this.metricColumns = aggregatedColumns; this.aggregations = aggregateFunnc; http://git-wip-us.apache.org/repos/asf/kylin/blob/cb0a1a39/core-storage/src/main/java/org/apache/kylin/storage/gtrecord/GTCubeStorageQueryBase.java ---------------------------------------------------------------------- diff --git a/core-storage/src/main/java/org/apache/kylin/storage/gtrecord/GTCubeStorageQueryBase.java b/core-storage/src/main/java/org/apache/kylin/storage/gtrecord/GTCubeStorageQueryBase.java index fa23be1..86d66af 100644 --- a/core-storage/src/main/java/org/apache/kylin/storage/gtrecord/GTCubeStorageQueryBase.java +++ b/core-storage/src/main/java/org/apache/kylin/storage/gtrecord/GTCubeStorageQueryBase.java @@ -74,6 +74,14 @@ public abstract class GTCubeStorageQueryBase implements IStorageQuery { @Override public ITupleIterator search(StorageContext context, SQLDigest sqlDigest, TupleInfo returnTupleInfo) { + //deal with participant columns in subquery join + if (sqlDigest.isRawQuery) { + sqlDigest.allColumns.addAll(sqlDigest.subqueryJoinParticipants); + } else { + sqlDigest.groupbyColumns.addAll(sqlDigest.subqueryJoinParticipants); + sqlDigest.allColumns.addAll(sqlDigest.subqueryJoinParticipants); + } + //cope with queries with no aggregations RawQueryLastHacker.hackNoAggregations(sqlDigest, cubeDesc); http://git-wip-us.apache.org/repos/asf/kylin/blob/cb0a1a39/kylin-it/src/test/java/org/apache/kylin/storage/hbase/ITStorageTest.java ---------------------------------------------------------------------- diff --git a/kylin-it/src/test/java/org/apache/kylin/storage/hbase/ITStorageTest.java b/kylin-it/src/test/java/org/apache/kylin/storage/hbase/ITStorageTest.java index 136342d..bb3257b 100644 --- a/kylin-it/src/test/java/org/apache/kylin/storage/hbase/ITStorageTest.java +++ b/kylin-it/src/test/java/org/apache/kylin/storage/hbase/ITStorageTest.java @@ -144,7 +144,7 @@ public class ITStorageTest extends HBaseMetadataTestCase { int count = 0; ITupleIterator iterator = null; try { - SQLDigest sqlDigest = new SQLDigest("default.test_kylin_fact", filter, null, Collections.<TblColRef> emptySet(), groups, Collections.<TblColRef> emptySet(), Collections.<TblColRef> emptySet(), aggregations, new ArrayList<MeasureDesc>(), new ArrayList<SQLDigest.OrderEnum>()); + SQLDigest sqlDigest = new SQLDigest("default.test_kylin_fact", filter, null, Collections.<TblColRef> emptySet(), groups, Collections.<TblColRef> emptySet(), Collections.<TblColRef> emptySet(), Collections.<TblColRef> emptySet(), aggregations, new ArrayList<MeasureDesc>(), new ArrayList<SQLDigest.OrderEnum>()); iterator = storageEngine.search(context, sqlDigest, StorageMockUtils.newTupleInfo(groups, aggregations)); while (iterator.hasNext()) { ITuple tuple = iterator.next(); http://git-wip-us.apache.org/repos/asf/kylin/blob/cb0a1a39/query/src/main/java/org/apache/kylin/query/relnode/OLAPContext.java ---------------------------------------------------------------------- diff --git a/query/src/main/java/org/apache/kylin/query/relnode/OLAPContext.java b/query/src/main/java/org/apache/kylin/query/relnode/OLAPContext.java index 41a3b4d..19980b7 100644 --- a/query/src/main/java/org/apache/kylin/query/relnode/OLAPContext.java +++ b/query/src/main/java/org/apache/kylin/query/relnode/OLAPContext.java @@ -118,6 +118,7 @@ public class OLAPContext { public Collection<TblColRef> allColumns = new HashSet<TblColRef>(); public Collection<TblColRef> groupByColumns = new ArrayList<TblColRef>(); + public Collection<TblColRef> subqueryJoinParticipants = new HashSet<TblColRef>();//subqueryJoinParticipants will be added to groupByColumns(only when other group by co-exists) and allColumns public Collection<TblColRef> metricsColumns = new HashSet<TblColRef>(); public List<FunctionDesc> aggregations = new ArrayList<FunctionDesc>(); public Collection<TblColRef> filterColumns = new HashSet<TblColRef>(); @@ -144,7 +145,7 @@ public class OLAPContext { public SQLDigest getSQLDigest() { if (sqlDigest == null) - sqlDigest = new SQLDigest(firstTableScan.getTableName(), filter, joins, allColumns, groupByColumns, filterColumns, metricsColumns, aggregations, sortMeasures, sortOrders); + sqlDigest = new SQLDigest(firstTableScan.getTableName(), filter, joins, allColumns, groupByColumns, subqueryJoinParticipants, filterColumns, metricsColumns, aggregations, sortMeasures, sortOrders); return sqlDigest; } http://git-wip-us.apache.org/repos/asf/kylin/blob/cb0a1a39/query/src/main/java/org/apache/kylin/query/relnode/OLAPJoinRel.java ---------------------------------------------------------------------- diff --git a/query/src/main/java/org/apache/kylin/query/relnode/OLAPJoinRel.java b/query/src/main/java/org/apache/kylin/query/relnode/OLAPJoinRel.java index 2a143fb..c445671 100644 --- a/query/src/main/java/org/apache/kylin/query/relnode/OLAPJoinRel.java +++ b/query/src/main/java/org/apache/kylin/query/relnode/OLAPJoinRel.java @@ -48,9 +48,9 @@ import org.apache.calcite.rel.core.JoinInfo; import org.apache.calcite.rel.core.JoinRelType; import org.apache.calcite.rel.metadata.RelMetadataQuery; import org.apache.calcite.rel.type.RelDataType; +import org.apache.calcite.rel.type.RelDataTypeFactory.FieldInfoBuilder; import org.apache.calcite.rel.type.RelDataTypeField; import org.apache.calcite.rel.type.RelDataTypeFieldImpl; -import org.apache.calcite.rel.type.RelDataTypeFactory.FieldInfoBuilder; import org.apache.calcite.rex.RexCall; import org.apache.calcite.rex.RexInputRef; import org.apache.calcite.rex.RexNode; @@ -165,8 +165,7 @@ public class OLAPJoinRel extends EnumerableJoin implements OLAPRel { for (Map.Entry<TblColRef, TblColRef> columnPair : joinCol.entrySet()) { TblColRef fromCol = (rightHasSubquery ? columnPair.getKey() : columnPair.getValue()); - this.context.groupByColumns.add(fromCol); - this.context.allColumns.add(fromCol); + this.context.subqueryJoinParticipants.add(fromCol); } joinCol.clear(); }