This is an automated email from the ASF dual-hosted git repository.

zabetak pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hive.git


The following commit(s) were added to refs/heads/master by this push:
     new 314e67fbafa HIVE-29380: Drop synthetic HiveProject and 
HiveFilterProjectTSTransposeRule (#6241)
314e67fbafa is described below

commit 314e67fbafae7fa8728d5918af79c7d062204aef
Author: Stamatis Zampetakis <[email protected]>
AuthorDate: Fri Jan 2 20:11:44 2026 +0100

    HIVE-29380: Drop synthetic HiveProject and HiveFilterProjectTSTransposeRule 
(#6241)
---
 .../calcite/reloperators/HiveProject.java          |  27 +----
 .../calcite/reloperators/HiveTableScan.java        |   7 +-
 .../rules/HiveFilterProjectTSTransposeRule.java    | 134 ---------------------
 .../rules/HiveFilterProjectTransposeRule.java      |  41 +++++--
 .../calcite/rules/HiveRelFieldTrimmer.java         |   6 +-
 .../hadoop/hive/ql/parse/CalcitePlanner.java       |   7 +-
 6 files changed, 34 insertions(+), 188 deletions(-)

diff --git 
a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/reloperators/HiveProject.java
 
b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/reloperators/HiveProject.java
index 46edad00f7a..fa0bbb307a1 100644
--- 
a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/reloperators/HiveProject.java
+++ 
b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/reloperators/HiveProject.java
@@ -26,12 +26,10 @@
 import org.apache.calcite.rel.RelCollation;
 import org.apache.calcite.rel.RelNode;
 import org.apache.calcite.rel.RelShuttle;
-import org.apache.calcite.rel.RelWriter;
 import org.apache.calcite.rel.core.Project;
 import org.apache.calcite.rel.type.RelDataType;
 import org.apache.calcite.rex.RexNode;
 import org.apache.calcite.rex.RexUtil;
-import org.apache.calcite.sql.SqlExplainLevel;
 import org.apache.calcite.sql.validate.SqlValidatorUtil;
 import org.apache.calcite.util.Util;
 import org.apache.hadoop.hive.ql.optimizer.calcite.CalciteSemanticException;
@@ -46,8 +44,6 @@ public class HiveProject extends Project implements 
HiveRelNode {
   // Information about correlations within a subquery.
   private final CorrelationInfoSupplier correlationInfos;
 
-  private boolean isSysnthetic;
-
   /**
    * Creates a HiveProject.
    * @param cluster
@@ -110,22 +106,7 @@ public static HiveProject create(RelOptCluster cluster, 
RelNode child, List<? ex
   @Override
   public Project copy(RelTraitSet traitSet, RelNode input, List<RexNode> exps, 
RelDataType rowType) {
     assert traitSet.containsIfApplicable(HiveRelNode.CONVENTION);
-    HiveProject hp = new HiveProject(getCluster(), traitSet, input, exps, 
rowType);
-    if (this.isSynthetic()) {
-      hp.setSynthetic();
-    }
-
-    return hp;
-  }
-
-  // TODO: this should come through RelBuilder to the constructor as opposed to
-  // set method. This requires calcite change
-  public void setSynthetic() {
-    this.isSysnthetic = true;
-  }
-
-  public boolean isSynthetic() {
-    return isSysnthetic;
+    return new HiveProject(getCluster(), traitSet, input, exps, rowType);
   }
 
   //required for HiveRelDecorrelator
@@ -136,12 +117,6 @@ public boolean isSynthetic() {
     return shuttle.visit(this);
   }
 
-  @Override
-  public RelWriter explainTerms(RelWriter pw) {
-    return super.explainTerms(pw)
-        .itemIf("synthetic", this.isSysnthetic, pw.getDetailLevel() == 
SqlExplainLevel.DIGEST_ATTRIBUTES);
-  }
-
   public List<HiveCorrelationInfo> getCorrelationInfos() {
     return correlationInfos.get();
   }
diff --git 
a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/reloperators/HiveTableScan.java
 
b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/reloperators/HiveTableScan.java
index 2c3e4c6e6e3..05e8b448f62 100644
--- 
a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/reloperators/HiveTableScan.java
+++ 
b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/reloperators/HiveTableScan.java
@@ -261,13 +261,8 @@ public RelNode project(ImmutableBitSet fieldsUsed, 
Set<RelDataTypeField> extraFi
         fieldNames));
 
     // 5. Add Proj on top of TS
-    HiveProject hp = (HiveProject) relBuilder.push(newHT)
+    return relBuilder.push(newHT)
         .project(exprList, new ArrayList<String>(fieldNames)).build();
-
-    // 6. Set synthetic flag, so that we would push filter below this one
-    hp.setSynthetic();
-
-    return hp;
   }
 
   public List<Integer> getNeededColIndxsFrmReloptHT() {
diff --git 
a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveFilterProjectTSTransposeRule.java
 
b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveFilterProjectTSTransposeRule.java
deleted file mode 100644
index 6eace95a4a2..00000000000
--- 
a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveFilterProjectTSTransposeRule.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.hadoop.hive.ql.optimizer.calcite.rules;
-
-import org.apache.calcite.adapter.druid.DruidQuery;
-import org.apache.calcite.plan.RelOptRule;
-import org.apache.calcite.plan.RelOptRuleCall;
-import org.apache.calcite.rel.RelNode;
-import org.apache.calcite.rel.core.Filter;
-import org.apache.calcite.rel.core.Project;
-import org.apache.calcite.rel.core.RelFactories;
-import org.apache.calcite.rel.core.RelFactories.FilterFactory;
-import org.apache.calcite.rel.core.RelFactories.ProjectFactory;
-import org.apache.calcite.rel.core.TableScan;
-import org.apache.calcite.rel.rules.ProjectMergeRule;
-import org.apache.calcite.rel.type.RelDataTypeFactory;
-import org.apache.calcite.rex.RexCall;
-import org.apache.calcite.rex.RexNode;
-import org.apache.calcite.rex.RexOver;
-import org.apache.calcite.rex.RexUtil;
-import org.apache.hadoop.hive.ql.optimizer.calcite.HiveRelFactories;
-import org.apache.hadoop.hive.ql.optimizer.calcite.HiveRelOptUtil;
-import org.apache.hadoop.hive.ql.optimizer.calcite.reloperators.HiveProject;
-
-import java.util.Collections;
-
-//TODO: Remove this once Calcite FilterProjectTransposeRule can take rule 
operand
-public class HiveFilterProjectTSTransposeRule extends RelOptRule {
-
-  public final static HiveFilterProjectTSTransposeRule INSTANCE =
-      new HiveFilterProjectTSTransposeRule(
-          Filter.class, HiveRelFactories.HIVE_FILTER_FACTORY, 
HiveProject.class,
-          HiveRelFactories.HIVE_PROJECT_FACTORY, TableScan.class, 
ProjectMergeRule.DEFAULT_BLOAT);
-
-  public final static  HiveFilterProjectTSTransposeRule INSTANCE_DRUID =
-      new HiveFilterProjectTSTransposeRule(
-          Filter.class, HiveRelFactories.HIVE_FILTER_FACTORY, 
HiveProject.class,
-          HiveRelFactories.HIVE_PROJECT_FACTORY, DruidQuery.class, 
ProjectMergeRule.DEFAULT_BLOAT);
-
-  private final RelFactories.FilterFactory  filterFactory;
-  private final RelFactories.ProjectFactory projectFactory;
-  private final int bloat;
-
-  private HiveFilterProjectTSTransposeRule(Class<? extends Filter> filterClass,
-      FilterFactory filterFactory, Class<? extends Project> projectClass,
-      ProjectFactory projectFactory, Class<? extends RelNode> tsClass,
-      int bloat) {
-    super(operand(filterClass, operand(projectClass, operand(tsClass, 
none()))));
-    this.filterFactory = filterFactory;
-    this.projectFactory = projectFactory;
-    this.bloat = bloat;
-  }
-
-  @Override
-  public boolean matches(RelOptRuleCall call) {
-    final HiveProject projRel = call.rel(1);
-
-    // Assumption:
-    // 1. This will be run last after PP, Col Pruning in the PreJoinOrder
-    // optimizations.
-    // 2. If ProjectRel is not synthetic then PPD would have already pushed
-    // relevant pieces down and hence no point in running PPD again.
-    // 3. For synthetic Projects we don't care about non deterministic UDFs
-    if (!projRel.isSynthetic()) {
-      return false;
-    }
-
-    return super.matches(call);
-  }
-
-  // ~ Methods ----------------------------------------------------------------
-
-  // implement RelOptRule
-  public void onMatch(RelOptRuleCall call) {
-    final Filter filter = call.rel(0);
-    final Project project = call.rel(1);
-
-    if (RexOver.containsOver(project.getProjects(), null)) {
-      // In general a filter cannot be pushed below a windowing calculation.
-      // Applying the filter before the aggregation function changes
-      // the results of the windowing invocation.
-      //
-      // When the filter is on the PARTITION BY expression of the OVER clause
-      // it can be pushed down. For now we don't support this.
-      return;
-    }
-
-    if (RexUtil.containsCorrelation(filter.getCondition())) {
-      // If there is a correlation condition anywhere in the filter, don't
-      // push this filter past project since in some cases it can prevent a
-      // Correlate from being de-correlated.
-      return;
-    }
-
-    // convert the filter to one that references the child of the project
-    RexNode newCondition = 
HiveRelOptUtil.pushPastProjectUnlessBloat(filter.getCondition(), project, 
bloat);
-    if (newCondition == null) {
-      return;
-    }
-
-    // Remove cast of BOOLEAN NOT NULL to BOOLEAN or vice versa. Filter accepts
-    // nullable and not-nullable conditions, but a CAST might get in the way of
-    // other rewrites.
-    final RelDataTypeFactory typeFactory = 
filter.getCluster().getTypeFactory();
-    if (RexUtil.isNullabilityCast(typeFactory, newCondition)) {
-      newCondition = ((RexCall) newCondition).getOperands().get(0);
-    }
-
-    RelNode newFilterRel = filterFactory == null ? 
filter.copy(filter.getTraitSet(),
-        project.getInput(), newCondition) : 
filterFactory.createFilter(project.getInput(),
-        newCondition);
-
-    RelNode newProjRel = projectFactory == null ? 
project.copy(project.getTraitSet(), newFilterRel,
-        project.getProjects(), project.getRowType()) : 
projectFactory.createProject(newFilterRel,
-        Collections.emptyList(), project.getProjects(), 
project.getRowType().getFieldNames());
-
-    call.transformTo(newProjRel);
-  }
-}
diff --git 
a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveFilterProjectTransposeRule.java
 
b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveFilterProjectTransposeRule.java
index 819231cb54d..5db95b0ca48 100644
--- 
a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveFilterProjectTransposeRule.java
+++ 
b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveFilterProjectTransposeRule.java
@@ -23,7 +23,9 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.function.Predicate;
 
+import org.apache.calcite.adapter.druid.DruidQuery;
 import org.apache.calcite.plan.RelOptCluster;
 import org.apache.calcite.plan.RelOptPredicateList;
 import org.apache.calcite.plan.RelOptRuleCall;
@@ -35,6 +37,7 @@
 import org.apache.calcite.rel.core.Filter;
 import org.apache.calcite.rel.core.Join;
 import org.apache.calcite.rel.core.Project;
+import org.apache.calcite.rel.metadata.RelMetadataQuery;
 import org.apache.calcite.rel.rules.FilterProjectTransposeRule;
 import org.apache.calcite.rel.rules.ProjectMergeRule;
 import org.apache.calcite.rel.type.RelDataTypeFactory;
@@ -59,14 +62,22 @@
 import org.apache.hadoop.hive.ql.optimizer.calcite.HiveCalciteUtil;
 import org.apache.hadoop.hive.ql.optimizer.calcite.HiveRelFactories;
 import org.apache.hadoop.hive.ql.optimizer.calcite.HiveRelOptUtil;
-import 
org.apache.hadoop.hive.ql.optimizer.calcite.HiveRelOptUtil.RewritablePKFKJoinInfo;
 import org.apache.hadoop.hive.ql.optimizer.calcite.reloperators.HiveProject;
+import org.apache.hadoop.hive.ql.optimizer.calcite.reloperators.HiveTableScan;
 
 public class HiveFilterProjectTransposeRule extends FilterProjectTransposeRule 
{
 
+  private static RelOptRuleOperand joinOperand() {
+    Predicate<Join> isRewritable = join -> {
+      RelMetadataQuery mq = join.getCluster().getMetadataQuery();
+      return HiveRelOptUtil.isRewritablePKFKJoin(join, join.getLeft(), 
join.getRight(), mq).rewritable;
+    };
+    return operandJ(Join.class, null, isRewritable, any());
+  }
+
   public static final HiveFilterProjectTransposeRule 
DETERMINISTIC_WINDOWING_ON_NON_FILTERING_JOIN =
       new HiveFilterProjectTransposeRule(
-          operand(Filter.class, operand(Project.class, operand(Join.class, 
any()))),
+          operand(Filter.class, operand(Project.class, joinOperand())),
           HiveRelFactories.HIVE_BUILDER, true, true, 
ProjectMergeRule.DEFAULT_BLOAT);
 
   public static final HiveFilterProjectTransposeRule DETERMINISTIC_WINDOWING =
@@ -75,7 +86,7 @@ public class HiveFilterProjectTransposeRule extends 
FilterProjectTransposeRule {
 
   public static final HiveFilterProjectTransposeRule 
DETERMINISTIC_ON_NON_FILTERING_JOIN =
       new HiveFilterProjectTransposeRule(
-          operand(Filter.class, operand(Project.class, operand(Join.class, 
any()))),
+          operand(Filter.class, operand(Project.class, joinOperand())),
           HiveRelFactories.HIVE_BUILDER, true, false, 
ProjectMergeRule.DEFAULT_BLOAT);
 
   public static final HiveFilterProjectTransposeRule DETERMINISTIC =
@@ -86,6 +97,20 @@ public class HiveFilterProjectTransposeRule extends 
FilterProjectTransposeRule {
           new HiveFilterProjectTransposeRule(Filter.class, HiveProject.class,
                   HiveRelFactories.HIVE_BUILDER, false, false, 
ProjectMergeRule.DEFAULT_BLOAT);
 
+  public static final HiveFilterProjectTransposeRule SCAN = new 
HiveFilterProjectTransposeRule(
+      operand(Filter.class, operand(HiveProject.class, 
operand(HiveTableScan.class, none()))),
+      HiveRelFactories.HIVE_BUILDER,
+      false,
+      false,
+      ProjectMergeRule.DEFAULT_BLOAT);
+
+  public static final HiveFilterProjectTransposeRule DRUID = new 
HiveFilterProjectTransposeRule(
+      operand(Filter.class, operand(HiveProject.class, 
operand(DruidQuery.class, none()))),
+      HiveRelFactories.HIVE_BUILDER,
+      false,
+      false,
+      ProjectMergeRule.DEFAULT_BLOAT);
+
   private final boolean onlyDeterministic;
 
   private final boolean pushThroughWindowing;
@@ -127,16 +152,6 @@ public boolean matches(RelOptRuleCall call) {
     if (this.onlyDeterministic && !HiveCalciteUtil.isDeterministic(condition)) 
{
       return false;
     }
-
-    if (call.rels.length > 2) {
-      final Join joinRel = call.rel(2);
-      RewritablePKFKJoinInfo joinInfo = HiveRelOptUtil.isRewritablePKFKJoin(
-          joinRel, joinRel.getLeft(), joinRel.getRight(), 
call.getMetadataQuery());
-      if (!joinInfo.rewritable) {
-        return false;
-      }
-    }
-
     return super.matches(call);
   }
 
diff --git 
a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveRelFieldTrimmer.java
 
b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveRelFieldTrimmer.java
index 3d507f4ebf9..f6f011fe582 100644
--- 
a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveRelFieldTrimmer.java
+++ 
b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveRelFieldTrimmer.java
@@ -69,7 +69,6 @@
 import org.apache.hadoop.hive.ql.optimizer.calcite.RelOptHiveTable;
 import org.apache.hadoop.hive.ql.optimizer.calcite.reloperators.HiveAggregate;
 import org.apache.hadoop.hive.ql.optimizer.calcite.reloperators.HiveMultiJoin;
-import org.apache.hadoop.hive.ql.optimizer.calcite.reloperators.HiveProject;
 import 
org.apache.hadoop.hive.ql.optimizer.calcite.reloperators.HiveSortExchange;
 import 
org.apache.hadoop.hive.ql.optimizer.calcite.reloperators.HiveTableFunctionScan;
 import org.apache.hadoop.hive.ql.optimizer.calcite.reloperators.HiveTableScan;
@@ -390,10 +389,7 @@ private static RelNode project(DruidQuery dq, 
ImmutableBitSet fieldsUsed,
               true));
       nameList.add(extraField.getName());
     }
-
-    HiveProject hp = (HiveProject) relBuilder.push(dq).project(exprList, 
nameList).build();
-    hp.setSynthetic();
-    return hp;
+    return relBuilder.push(dq).project(exprList, nameList).build();
   }
 
   private boolean isRexLiteral(final RexNode rexNode) {
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/CalcitePlanner.java 
b/ql/src/java/org/apache/hadoop/hive/ql/parse/CalcitePlanner.java
index eb24496743f..f1e9da25ebe 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/parse/CalcitePlanner.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/CalcitePlanner.java
@@ -229,7 +229,6 @@
 import org.apache.hadoop.hive.ql.optimizer.calcite.rules.HiveFieldTrimmerRule;
 import 
org.apache.hadoop.hive.ql.optimizer.calcite.rules.HiveFilterAggregateTransposeRule;
 import org.apache.hadoop.hive.ql.optimizer.calcite.rules.HiveFilterJoinRule;
-import 
org.apache.hadoop.hive.ql.optimizer.calcite.rules.HiveFilterProjectTSTransposeRule;
 import 
org.apache.hadoop.hive.ql.optimizer.calcite.rules.HiveFilterProjectTransposeRule;
 import 
org.apache.hadoop.hive.ql.optimizer.calcite.rules.HiveFilterSetOpTransposeRule;
 import 
org.apache.hadoop.hive.ql.optimizer.calcite.rules.HiveFilterSortPredicates;
@@ -1933,7 +1932,7 @@ protected RelNode applyPreJoinOrderingTransforms(RelNode 
basePlan, RelMetadataPr
       // matches FIL-PROJ-TS
       // Also merge, remove and reduce Project if possible
       generatePartialProgram(program, true, HepMatchOrder.TOP_DOWN,
-          HiveFilterProjectTSTransposeRule.INSTANCE, 
HiveFilterProjectTSTransposeRule.INSTANCE_DRUID,
+          HiveFilterProjectTransposeRule.SCAN, 
HiveFilterProjectTransposeRule.DRUID,
           HiveProjectFilterPullUpConstantsRule.INSTANCE, 
HiveProjectMergeRule.INSTANCE,
           ProjectRemoveRule.Config.DEFAULT.toRule(), 
HiveSortMergeRule.INSTANCE);
 
@@ -2100,7 +2099,7 @@ private RelNode rewriteUsingViews(RelOptPlanner planner, 
RelNode basePlan,
       // Unboxing rule
       planner.addRule(HiveMaterializedViewBoxing.INSTANCE_UNBOXING);
       // Partition pruner rule
-      planner.addRule(HiveFilterProjectTSTransposeRule.INSTANCE);
+      planner.addRule(HiveFilterProjectTransposeRule.SCAN);
       planner.addRule(new HivePartitionPruneRule(conf));
 
       // Optimize plan
@@ -2411,7 +2410,7 @@ private RelNode applyPostJoinOrderingTransform(RelNode 
basePlan, RelMetadataProv
         generatePartialProgram(program, false, HepMatchOrder.DEPTH_FIRST,
             ProjectRemoveRule.Config.DEFAULT.toRule(), new 
ProjectMergeRule(false, HiveRelFactories.HIVE_BUILDER));
         generatePartialProgram(program, true, HepMatchOrder.TOP_DOWN,
-            HiveFilterProjectTSTransposeRule.INSTANCE, 
HiveFilterProjectTSTransposeRule.INSTANCE_DRUID,
+            HiveFilterProjectTransposeRule.SCAN, 
HiveFilterProjectTransposeRule.DRUID,
             HiveProjectFilterPullUpConstantsRule.INSTANCE);
 
         // 9.2.  Introduce exchange operators below join/multijoin operators

Reply via email to