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