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-cdh5.7
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();
         }

Reply via email to