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

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


The following commit(s) were added to refs/heads/master by this push:
     new fa7584cfa36 [opt](mv) simplify get base column names' way (#62228)
fa7584cfa36 is described below

commit fa7584cfa36dd96c63203ef8353b4171628af8c2
Author: morrySnow <[email protected]>
AuthorDate: Thu Apr 9 16:33:49 2026 +0800

    [opt](mv) simplify get base column names' way (#62228)
    
    ### What problem does this PR solve?
    
    Problem Summary:
    
    try to simplify MvColumnItem get base column names' way.
    The target is not rely on tuple descriptor anymore.
---
 .../doris/alter/MaterializedViewHandler.java       |  6 +-
 .../main/java/org/apache/doris/analysis/Expr.java  | 15 -----
 .../org/apache/doris/analysis/MVColumnItem.java    | 71 ++++++++--------------
 .../java/org/apache/doris/analysis/SlotRef.java    | 28 ---------
 .../org/apache/doris/analysis/VirtualSlotRef.java  |  7 ---
 .../commands/CreateMaterializedViewCommand.java    |  4 +-
 .../doris/alter/MaterializedViewHandlerTest.java   |  2 -
 7 files changed, 30 insertions(+), 103 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/alter/MaterializedViewHandler.java 
b/fe/fe-core/src/main/java/org/apache/doris/alter/MaterializedViewHandler.java
index 3252dcde68d..ff12224ba87 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/alter/MaterializedViewHandler.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/alter/MaterializedViewHandler.java
@@ -241,7 +241,7 @@ public class MaterializedViewHandler extends AlterHandler {
             // Step2: create mv job
             RollupJobV2 rollupJobV2 =
                     createMaterializedViewJob(null, mvIndexName, 
baseIndexName, mvColumns,
-                            
createMvCommand.getWhereClauseItemColumn(olapTable),
+                            createMvCommand.getWhereClauseItemColumn(),
                             createMvCommand.getProperties(), olapTable, db, 
baseIndexId,
                             createMvCommand.getMVKeysType(), 
createMvCommand.getOriginStatement(),
                             sessionVariables);
@@ -594,7 +594,7 @@ public class MaterializedViewHandler extends AlterHandler {
                                 "The mvItem[" + mvColumnItem.getName() + "] 
require slot because it is value column");
                     }
                 }
-                newMVColumns.add(mvColumnItem.toMVColumn(olapTable, 
sessionVariables));
+                newMVColumns.add(mvColumnItem.toMVColumn(sessionVariables));
             }
         } else {
             for (MVColumnItem mvColumnItem : mvColumnItemList) {
@@ -603,7 +603,7 @@ public class MaterializedViewHandler extends AlterHandler {
                     throw new DdlException("Base columns is null");
                 }
 
-                newMVColumns.add(mvColumnItem.toMVColumn(olapTable, 
sessionVariables));
+                newMVColumns.add(mvColumnItem.toMVColumn(sessionVariables));
             }
         }
 
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/Expr.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/Expr.java
index 1bf6552c8c9..cd7dda376c8 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/Expr.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/Expr.java
@@ -36,10 +36,8 @@ import com.google.common.collect.Lists;
 import com.google.gson.annotations.SerializedName;
 
 import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
-import java.util.Map;
 import java.util.Set;
 import java.util.function.Supplier;
 
@@ -292,19 +290,6 @@ public abstract class Expr extends TreeNode<Expr> 
implements Cloneable {
         return true;
     }
 
-    public Map<Long, Set<String>> getTableIdToColumnNames() {
-        Map<Long, Set<String>> tableIdToColumnNames = new HashMap<Long, 
Set<String>>();
-        getTableIdToColumnNames(tableIdToColumnNames);
-        return tableIdToColumnNames;
-    }
-
-    public void getTableIdToColumnNames(Map<Long, Set<String>> 
tableIdToColumnNames) {
-        Preconditions.checkState(tableIdToColumnNames != null);
-        for (Expr child : children) {
-            child.getTableIdToColumnNames(tableIdToColumnNames);
-        }
-    }
-
     /**
      * @return true if this is an instance of LiteralExpr
      */
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/MVColumnItem.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/MVColumnItem.java
index 79b96f2daff..fe3825b2fa2 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/MVColumnItem.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/MVColumnItem.java
@@ -19,7 +19,6 @@ package org.apache.doris.analysis;
 
 import org.apache.doris.catalog.AggregateType;
 import org.apache.doris.catalog.Column;
-import org.apache.doris.catalog.OlapTable;
 import org.apache.doris.catalog.ScalarType;
 import org.apache.doris.catalog.Type;
 import org.apache.doris.common.AnalysisException;
@@ -27,6 +26,7 @@ import org.apache.doris.common.DdlException;
 
 import java.util.HashSet;
 import java.util.Map;
+import java.util.Objects;
 import java.util.Set;
 
 /**
@@ -36,31 +36,22 @@ import java.util.Set;
  * It just a intermediate variable between semantic analysis and final handler.
  */
 public class MVColumnItem {
-    private String name;
+    private final String name;
     // the origin type of slot ref
     private Type type;
     private boolean isKey;
     private AggregateType aggregationType;
     private boolean isAggregationTypeImplicit;
-    private Expr defineExpr;
-    private Set<String> baseColumnNames;
+    private final Expr defineExpr;
+    private final Set<String> baseColumnNames;
 
     public MVColumnItem(String name, Type type, AggregateType aggregateType, 
Expr defineExpr) {
         this.name = name;
         this.type = type;
         this.aggregationType = aggregateType;
         this.isAggregationTypeImplicit = false;
-        this.defineExpr = defineExpr;
-
-        Map<Long, Set<String>> tableIdToColumnNames = 
defineExpr.getTableIdToColumnNames();
-
-        if (tableIdToColumnNames.size() == 1) {
-            for (Map.Entry<Long, Set<String>> entry : 
tableIdToColumnNames.entrySet()) {
-                baseColumnNames = entry.getValue();
-            }
-        } else {
-            baseColumnNames = new HashSet<>();
-        }
+        this.defineExpr = Objects.requireNonNull(defineExpr, "defineExpr is 
null");
+        baseColumnNames = extractBaseColumnNames(defineExpr);
     }
 
     public MVColumnItem(Expr defineExpr) throws AnalysisException {
@@ -70,23 +61,14 @@ public class MVColumnItem {
     public MVColumnItem(String name, Expr defineExpr) {
         this.name = name;
         this.isAggregationTypeImplicit = false;
-        this.defineExpr = defineExpr;
+        this.defineExpr = Objects.requireNonNull(defineExpr, "defineExpr is 
null");
 
         this.type = defineExpr.getType();
         if (this.type instanceof ScalarType && this.type.isStringType()) {
             this.type = new ScalarType(type.getPrimitiveType());
             ((ScalarType) this.type).setMaxLength();
         }
-
-        Map<Long, Set<String>> tableIdToColumnNames = 
defineExpr.getTableIdToColumnNames();
-
-        if (tableIdToColumnNames.size() == 1) {
-            for (Map.Entry<Long, Set<String>> entry : 
tableIdToColumnNames.entrySet()) {
-                baseColumnNames = entry.getValue();
-            }
-        } else {
-            baseColumnNames = new HashSet<>();
-        }
+        baseColumnNames = extractBaseColumnNames(defineExpr);
     }
 
     public String getName() {
@@ -126,32 +108,29 @@ public class MVColumnItem {
         return baseColumnNames;
     }
 
-    public Column toMVColumn(OlapTable olapTable, Map<String, String> 
sessionVars) throws DdlException {
-        Column baseColumn = olapTable.getBaseColumn(name);
+    public Column toMVColumn(Map<String, String> sessionVars) throws 
DdlException {
         Column result;
-        if (baseColumn == null && defineExpr == null) {
-            // Some mtmv column have name diffrent with base column
-            baseColumn = 
olapTable.getBaseColumn(baseColumnNames.iterator().next());
-        }
-        if (baseColumn != null) {
-            result = new Column(baseColumn);
-            if (result.getType() == null) {
-                throw new DdlException("base column's type is null, column=" + 
result.getName());
-            }
-            result.setIsKey(isKey);
-        } else {
-            if (type == null) {
-                throw new DdlException("MVColumnItem type is null");
-            }
-            result = new Column(name, type, isKey, aggregationType, null, "");
-            if (defineExpr != null) {
-                result.setIsAllowNull(defineExpr.isNullable());
-            }
+        if (type == null) {
+            throw new DdlException("MVColumnItem type is null");
         }
+        result = new Column(name, type, isKey, aggregationType, null, "");
+        result.setIsAllowNull(defineExpr.isNullable());
         result.setName(name);
         result.setAggregationType(aggregationType, isAggregationTypeImplicit);
         result.setDefineExpr(defineExpr);
         result.setSessionVariables(sessionVars);
         return result;
     }
+
+    private Set<String> extractBaseColumnNames(Expr defineExpr) {
+        Set<String> result = new HashSet<>();
+        Set<SlotRef> slotRefs = new HashSet<>();
+        defineExpr.collect(SlotRef.class, slotRefs);
+        for (SlotRef slotRef : slotRefs) {
+            if (slotRef.getCol() != null) {
+                result.add(slotRef.getCol());
+            }
+        }
+        return result;
+    }
 }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/SlotRef.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/SlotRef.java
index c1baa8cdf5b..39143fa5c6c 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/SlotRef.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/SlotRef.java
@@ -31,9 +31,6 @@ import com.google.gson.annotations.SerializedName;
 import org.apache.commons.collections4.CollectionUtils;
 
 import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.TreeSet;
 
 public class SlotRef extends Expr {
     @SerializedName("tn")
@@ -236,31 +233,6 @@ public class SlotRef extends Expr {
         return desc.getId().equals(slotId);
     }
 
-    @Override
-    public void getTableIdToColumnNames(Map<Long, Set<String>> 
tableIdToColumnNames) {
-        if (desc == null) {
-            return;
-        }
-
-        if (col == null) {
-            for (Expr expr : desc.getSourceExprs()) {
-                expr.getTableIdToColumnNames(tableIdToColumnNames);
-            }
-        } else {
-            if (desc.getParent().getTable() == null) {
-                // Maybe this column comes from inline view.
-                return;
-            }
-            Long tableId = desc.getParent().getTable().getId();
-            Set<String> columnNames = tableIdToColumnNames.get(tableId);
-            if (columnNames == null) {
-                columnNames = new TreeSet<>(String.CASE_INSENSITIVE_ORDER);
-                tableIdToColumnNames.put(tableId, columnNames);
-            }
-            columnNames.add(desc.getColumn().getName());
-        }
-    }
-
     public void setLabel(String label) {
         this.label = label;
     }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/VirtualSlotRef.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/VirtualSlotRef.java
index e33f42701f2..1b8745766b2 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/VirtualSlotRef.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/VirtualSlotRef.java
@@ -17,9 +17,6 @@
 
 package org.apache.doris.analysis;
 
-import java.util.Map;
-import java.util.Set;
-
 /**
  * It like a SlotRef except that it is not a real column exist in table.
  */
@@ -30,10 +27,6 @@ public class VirtualSlotRef extends SlotRef {
         super(other);
     }
 
-    @Override
-    public void getTableIdToColumnNames(Map<Long, Set<String>> 
tableIdToColumnNames) {
-    }
-
     @Override
     public Expr clone() {
         return new VirtualSlotRef(this);
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/CreateMaterializedViewCommand.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/CreateMaterializedViewCommand.java
index 1dc88f6322c..ddd760a6cbd 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/CreateMaterializedViewCommand.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/CreateMaterializedViewCommand.java
@@ -172,13 +172,13 @@ public class CreateMaterializedViewCommand extends 
Command implements ForwardWit
     }
 
     /**getWhereClauseItemColumn*/
-    public Column getWhereClauseItemColumn(OlapTable olapTable) throws 
DdlException {
+    public Column getWhereClauseItemColumn() throws DdlException {
         if (whereClauseItem == null) {
             return null;
         }
         // sessionVars is null because in BindSink, the where clause guard expr
         // can directly use the session var in materialized view metadata.
-        return whereClauseItem.toMVColumn(olapTable, null);
+        return whereClauseItem.toMVColumn(null);
     }
 
     public MVColumnItem getWhereClauseItem() {
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/alter/MaterializedViewHandlerTest.java
 
b/fe/fe-core/src/test/java/org/apache/doris/alter/MaterializedViewHandlerTest.java
index 1a9c9bb0632..491cf57657b 100644
--- 
a/fe/fe-core/src/test/java/org/apache/doris/alter/MaterializedViewHandlerTest.java
+++ 
b/fe/fe-core/src/test/java/org/apache/doris/alter/MaterializedViewHandlerTest.java
@@ -220,8 +220,6 @@ public class MaterializedViewHandlerTest {
         List<MVColumnItem> list = Lists.newArrayList(mvColumnItem);
         new Expectations() {
             {
-                olapTable.getBaseColumn(columnName1);
-                result = null;
                 olapTable.hasMaterializedIndex(mvName);
                 result = false;
                 createMaterializedViewCommand.getMVName();


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to