jcamachor commented on a change in pull request #567: HIVE-21382: Group by keys 
reduction optimization - keys are not reduced in query23
URL: https://github.com/apache/hive/pull/567#discussion_r265644194
 
 

 ##########
 File path: 
ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveRelFieldTrimmer.java
 ##########
 @@ -320,43 +322,101 @@ private boolean isRexLiteral(final RexNode rexNode) {
   // if those are columns are not being used further up
   private ImmutableBitSet generateGroupSetIfCardinalitySame(final Aggregate 
aggregate,
                                         final ImmutableBitSet 
originalGroupSet, final ImmutableBitSet fieldsUsed) {
-    Pair<RelOptTable, List<Integer>> tabToOrgCol = 
HiveRelOptUtil.getColumnOriginSet(aggregate.getInput(),
-                                                                               
      originalGroupSet);
-    if(tabToOrgCol == null) {
-      return originalGroupSet;
-    }
-    RelOptHiveTable tbl = (RelOptHiveTable)tabToOrgCol.left;
-    List<Integer> backtrackedGBList = tabToOrgCol.right;
-    ImmutableBitSet backtrackedGBSet = 
ImmutableBitSet.builder().addAll(backtrackedGBList).build();
 
-    List<ImmutableBitSet> allKeys = tbl.getNonNullableKeys();
-    ImmutableBitSet currentKey = null;
-    for(ImmutableBitSet key:allKeys) {
-      if(backtrackedGBSet.contains(key)) {
-        // only if grouping sets consist of keys
-        currentKey = key;
-        break;
+    RexBuilder rexBuilder = aggregate.getCluster().getRexBuilder();
+    RelMetadataQuery mq = aggregate.getCluster().getMetadataQuery();
+
+    // map from backtracked table ref to list of gb keys and list of 
corresponding backtracked columns
+    Map<RexTableInputRef.RelTableRef, List<Pair<Integer, Integer>>> 
mapGBKeysLineage= new HashMap<>();
+
+    // map from table ref to list of columns (from gb keys) which are 
candidate to be removed
+    Map<RexTableInputRef.RelTableRef, List<Integer>> candidateKeys = new 
HashMap<>();
+
+    for(int key:originalGroupSet) {
+      RexNode inputRef = rexBuilder.makeInputRef(aggregate.getInput(), key);
+      Set<RexNode> exprLineage = mq.getExpressionLineage(aggregate.getInput(), 
inputRef);
+      if(exprLineage != null && exprLineage.size() == 1){
+        RexNode expr = exprLineage.iterator().next();
+        if(expr instanceof RexTableInputRef) {
+          RexTableInputRef tblRef = (RexTableInputRef)expr;
+          Pair<RelOptTable, Integer> baseTable = 
Pair.of(tblRef.getTableRef().getTable(),
 
 Review comment:
   This variable seems to be left from old patch, it is not used anymore so it 
can be removed.

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


With regards,
Apache Git Services

Reply via email to