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

yiguolei pushed a commit to branch vector-index-dev
in repository https://gitbox.apache.org/repos/asf/doris.git

commit 340a67aecd7f019a87dd765c0510a71d364d3979
Author: morrySnow <zhangwen...@selectdb.com>
AuthorDate: Mon May 19 12:16:02 2025 +0800

    [opt](vector) refactor some scan code
---
 .../trees/copier/LogicalPlanDeepCopier.java        | 29 ++++++++-
 .../plans/logical/LogicalCatalogRelation.java      | 68 ++++++++++++++++++++--
 .../nereids/trees/plans/logical/LogicalEsScan.java | 22 +++++--
 .../trees/plans/logical/LogicalFileScan.java       | 41 ++++++++-----
 .../trees/plans/logical/LogicalHudiScan.java       | 52 ++++++++++-------
 .../trees/plans/logical/LogicalJdbcScan.java       | 22 ++++---
 .../trees/plans/logical/LogicalOdbcScan.java       | 18 +++---
 .../trees/plans/logical/LogicalOlapScan.java       | 18 +-----
 .../trees/plans/logical/LogicalSchemaScan.java     | 59 +++++++++++--------
 9 files changed, 225 insertions(+), 104 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/copier/LogicalPlanDeepCopier.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/copier/LogicalPlanDeepCopier.java
index a6e724f8454..d74851dec3c 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/copier/LogicalPlanDeepCopier.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/copier/LogicalPlanDeepCopier.java
@@ -19,6 +19,7 @@ package org.apache.doris.nereids.trees.copier;
 
 import org.apache.doris.nereids.exceptions.AnalysisException;
 import org.apache.doris.nereids.properties.OrderKey;
+import org.apache.doris.nereids.trees.expressions.Alias;
 import org.apache.doris.nereids.trees.expressions.ExprId;
 import org.apache.doris.nereids.trees.expressions.Expression;
 import org.apache.doris.nereids.trees.expressions.MarkJoinSlotReference;
@@ -98,7 +99,33 @@ public class LogicalPlanDeepCopier extends 
DefaultPlanRewriter<DeepCopierContext
         return newRelation;
     }
 
-    // TODO update scan
+    @Override
+    public Plan visitLogicalCatalogRelation(LogicalCatalogRelation 
catalogRelation, DeepCopierContext context) {
+        if 
(context.getRelationReplaceMap().containsKey(catalogRelation.getRelationId())) {
+            return 
context.getRelationReplaceMap().get(catalogRelation.getRelationId());
+        }
+        LogicalCatalogRelation newRelation =
+                
catalogRelation.withRelationId(StatementScopeIdGenerator.newRelationId());
+        updateReplaceMapWithOutput(catalogRelation, newRelation, 
context.exprIdReplaceMap);
+        List<NamedExpression> virtualColumns = 
catalogRelation.getVirtualColumns().stream()
+                .map(e -> {
+                    if (e instanceof Alias) {
+                        return new Alias(((Alias) e).child(), e.getName());
+                    }
+                    return e;
+                })
+                .collect(ImmutableList.toImmutableList());
+        for (int i = 0; i < virtualColumns.size(); i++) {
+            
context.exprIdReplaceMap.put(catalogRelation.getVirtualColumns().get(i).getExprId(),
+                    virtualColumns.get(i).getExprId());
+        }
+        virtualColumns = virtualColumns.stream()
+                .map(o -> (NamedExpression) 
ExpressionDeepCopier.INSTANCE.deepCopy(o, context))
+                .collect(ImmutableList.toImmutableList());
+        newRelation = newRelation.withVirtualColumns(virtualColumns);
+        context.putRelation(catalogRelation.getRelationId(), newRelation);
+        return newRelation;
+    }
 
     @Override
     public Plan visitLogicalCatalogRelation(LogicalCatalogRelation relation, 
DeepCopierContext context) {
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalCatalogRelation.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalCatalogRelation.java
index 3d1ddf9a26a..684142962d3 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalCatalogRelation.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalCatalogRelation.java
@@ -31,6 +31,7 @@ import org.apache.doris.nereids.properties.FdFactory;
 import org.apache.doris.nereids.properties.FdItem;
 import org.apache.doris.nereids.properties.LogicalProperties;
 import org.apache.doris.nereids.properties.TableFdItem;
+import org.apache.doris.nereids.trees.expressions.NamedExpression;
 import org.apache.doris.nereids.trees.expressions.Slot;
 import org.apache.doris.nereids.trees.expressions.SlotReference;
 import org.apache.doris.nereids.trees.plans.PlanType;
@@ -41,6 +42,7 @@ import org.apache.doris.qe.ConnectContext;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableList.Builder;
 import com.google.common.collect.ImmutableSet;
 
 import java.util.Collection;
@@ -60,22 +62,40 @@ public abstract class LogicalCatalogRelation extends 
LogicalRelation implements
 
     protected final ImmutableList<Slot> operativeSlots;
 
+    // use for virtual slot
+    protected final List<NamedExpression> virtualColumns;
+
     public LogicalCatalogRelation(RelationId relationId, PlanType type, 
TableIf table, List<String> qualifier) {
         this(relationId, type, table, qualifier, Optional.empty(), 
Optional.empty());
     }
 
     public LogicalCatalogRelation(RelationId relationId, PlanType type, 
TableIf table, List<String> qualifier,
             Optional<GroupExpression> groupExpression, 
Optional<LogicalProperties> logicalProperties) {
-        this(relationId, type, table, qualifier, groupExpression, 
logicalProperties, ImmutableList.of());
+        this(relationId, type, table, qualifier, ImmutableList.of(), 
ImmutableList.of(),
+                groupExpression, logicalProperties);
     }
 
+    /**
+     * Constructs a LogicalCatalogRelation with specified parameters.
+     *
+     * @param relationId Unique identifier for this relation
+     * @param type Plan type
+     * @param table Table object associated with this relation
+     * @param qualifier List of qualifiers, typically [catalogName, 
databaseName]
+     * @param operativeSlots Collection of operative slots
+     * @param virtualColumns List of virtual columns
+     * @param groupExpression Optional group expression
+     * @param logicalProperties Optional logical properties
+     */
     public LogicalCatalogRelation(RelationId relationId, PlanType type, 
TableIf table, List<String> qualifier,
-            Optional<GroupExpression> groupExpression, 
Optional<LogicalProperties> logicalProperties,
-            Collection<Slot> operativeSlots) {
+            Collection<Slot> operativeSlots, List<NamedExpression> 
virtualColumns,
+            Optional<GroupExpression> groupExpression, 
Optional<LogicalProperties> logicalProperties) {
         super(relationId, type, groupExpression, logicalProperties);
         this.table = Objects.requireNonNull(table, "table can not be null");
         this.qualifier = 
ImmutableList.copyOf(Objects.requireNonNull(qualifier, "qualifier can not be 
null"));
         this.operativeSlots = ImmutableList.copyOf(operativeSlots);
+        this.virtualColumns = 
Utils.fastToImmutableList(Objects.requireNonNull(virtualColumns,
+                "virtualColumns can not be null"));
     }
 
     @Override
@@ -108,10 +128,16 @@ public abstract class LogicalCatalogRelation extends 
LogicalRelation implements
 
     @Override
     public List<Slot> computeOutput() {
-        return table.getBaseSchema()
+        Builder<Slot> slots = ImmutableList.builder();
+        table.getBaseSchema()
                 .stream()
                 .map(col -> SlotReference.fromColumn(table, col, qualified()))
-                .collect(ImmutableList.toImmutableList());
+                .forEach(slots::add);
+        // add virtual slots
+        for (NamedExpression virtualColumn : virtualColumns) {
+            slots.add(virtualColumn.toSlot());
+        }
+        return slots.build();
     }
 
     @Override
@@ -133,6 +159,15 @@ public abstract class LogicalCatalogRelation extends 
LogicalRelation implements
         return Utils.qualifiedName(qualifier, table.getName());
     }
 
+    @Override
+    public List<Slot> getOperativeSlots() {
+        return operativeSlots;
+    }
+
+    public List<NamedExpression> getVirtualColumns() {
+        return virtualColumns;
+    }
+
     @Override
     public void computeUnique(DataTrait.Builder builder) {
         Set<Slot> outputSet = Utils.fastToImmutableSet(getOutputSet());
@@ -206,4 +241,27 @@ public abstract class LogicalCatalogRelation extends 
LogicalRelation implements
         // don't generate any equal pair
     }
 
+    public LogicalCatalogRelation withVirtualColumns(List<NamedExpression> 
virtualColumns) {
+        return this;
+    }
+
+    public abstract LogicalCatalogRelation withRelationId(RelationId 
relationId);
+
+    @Override
+    public boolean equals(Object o) {
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+        if (!super.equals(o)) {
+            return false;
+        }
+        LogicalCatalogRelation that = (LogicalCatalogRelation) o;
+        return Objects.equals(operativeSlots, that.operativeSlots)
+                && Objects.equals(virtualColumns, that.virtualColumns);
+    }
+
+    @Override
+    public int hashCode() {
+        return super.hashCode();
+    }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalEsScan.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalEsScan.java
index 8fb916b8a5e..2835c8e69cf 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalEsScan.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalEsScan.java
@@ -20,12 +20,15 @@ package org.apache.doris.nereids.trees.plans.logical;
 import org.apache.doris.catalog.TableIf;
 import org.apache.doris.nereids.memo.GroupExpression;
 import org.apache.doris.nereids.properties.LogicalProperties;
+import org.apache.doris.nereids.trees.expressions.NamedExpression;
 import org.apache.doris.nereids.trees.plans.Plan;
 import org.apache.doris.nereids.trees.plans.PlanType;
 import org.apache.doris.nereids.trees.plans.RelationId;
 import org.apache.doris.nereids.trees.plans.visitor.PlanVisitor;
 import org.apache.doris.nereids.util.Utils;
 
+import com.google.common.collect.ImmutableList;
+
 import java.util.List;
 import java.util.Optional;
 
@@ -38,13 +41,15 @@ public class LogicalEsScan extends LogicalCatalogRelation {
      * Constructor for LogicalEsScan.
      */
     public LogicalEsScan(RelationId id, TableIf table, List<String> qualifier,
+                           List<NamedExpression> virtualColumns,
                            Optional<GroupExpression> groupExpression,
                            Optional<LogicalProperties> logicalProperties) {
-        super(id, PlanType.LOGICAL_ES_SCAN, table, qualifier, groupExpression, 
logicalProperties);
+        super(id, PlanType.LOGICAL_ES_SCAN, table, qualifier,
+                ImmutableList.of(), virtualColumns, groupExpression, 
logicalProperties);
     }
 
     public LogicalEsScan(RelationId id, TableIf table, List<String> qualifier) 
{
-        this(id, table, qualifier, Optional.empty(), Optional.empty());
+        this(id, table, qualifier, ImmutableList.of(), Optional.empty(), 
Optional.empty());
     }
 
     @Override
@@ -57,19 +62,24 @@ public class LogicalEsScan extends LogicalCatalogRelation {
 
     @Override
     public LogicalEsScan withGroupExpression(Optional<GroupExpression> 
groupExpression) {
-        return new LogicalEsScan(relationId, table, qualifier, groupExpression,
-            Optional.of(getLogicalProperties()));
+        return new LogicalEsScan(relationId, table, qualifier, virtualColumns,
+                groupExpression, Optional.of(getLogicalProperties()));
     }
 
     @Override
     public Plan withGroupExprLogicalPropChildren(Optional<GroupExpression> 
groupExpression,
             Optional<LogicalProperties> logicalProperties, List<Plan> 
children) {
-        return new LogicalEsScan(relationId, table, qualifier, 
groupExpression, logicalProperties);
+        return new LogicalEsScan(relationId, table, qualifier, virtualColumns, 
groupExpression, logicalProperties);
     }
 
     @Override
     public LogicalEsScan withRelationId(RelationId relationId) {
-        return new LogicalEsScan(relationId, table, qualifier, 
Optional.empty(), Optional.empty());
+        return new LogicalEsScan(relationId, table, qualifier, virtualColumns, 
Optional.empty(), Optional.empty());
+    }
+
+    @Override
+    public LogicalEsScan withVirtualColumns(List<NamedExpression> 
virtualColumns) {
+        return new LogicalEsScan(relationId, table, qualifier, virtualColumns, 
Optional.empty(), Optional.empty());
     }
 
     @Override
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalFileScan.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalFileScan.java
index ecdcc07db12..d44b1e4f9d7 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalFileScan.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalFileScan.java
@@ -26,6 +26,7 @@ import org.apache.doris.nereids.memo.GroupExpression;
 import org.apache.doris.nereids.properties.LogicalProperties;
 import org.apache.doris.nereids.trees.TableSample;
 import org.apache.doris.nereids.trees.expressions.Slot;
+import org.apache.doris.nereids.trees.expressions.NamedExpression;
 import org.apache.doris.nereids.trees.plans.Plan;
 import org.apache.doris.nereids.trees.plans.PlanType;
 import org.apache.doris.nereids.trees.plans.RelationId;
@@ -33,6 +34,7 @@ import 
org.apache.doris.nereids.trees.plans.visitor.PlanVisitor;
 import org.apache.doris.nereids.util.Utils;
 
 import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 
 import java.util.Collection;
@@ -50,16 +52,24 @@ public class LogicalFileScan extends LogicalCatalogRelation 
{
     protected final Optional<TableSnapshot> tableSnapshot;
     protected final Optional<TableScanParams> scanParams;
 
+    public LogicalFileScan(RelationId id, ExternalTable table, List<String> 
qualifier,
+            Optional<TableSample> tableSample, Optional<TableSnapshot> 
tableSnapshot) {
+        this(id, table, qualifier, 
table.initSelectedPartitions(MvccUtil.getSnapshotFromContext(table)),
+                tableSample, tableSnapshot, ImmutableList.of(), 
Optional.empty(), Optional.empty());
+    }
+
     /**
      * Constructor for LogicalFileScan.
      */
     protected LogicalFileScan(RelationId id, ExternalTable table, List<String> 
qualifier,
-            Optional<GroupExpression> groupExpression, 
Optional<LogicalProperties> logicalProperties,
             SelectedPartitions selectedPartitions, Optional<TableSample> 
tableSample,
             Optional<TableSnapshot> tableSnapshot,
             Collection<Slot> operativeSlots,
-            Optional<TableScanParams> scanParams) {
-        super(id, PlanType.LOGICAL_FILE_SCAN, table, qualifier, 
groupExpression, logicalProperties, operativeSlots);
+            Optional<TableScanParams> scanParams,
+            List<NamedExpression> virtualColumns,
+            Optional<GroupExpression> groupExpression, 
Optional<LogicalProperties> logicalProperties) {
+        super(id, PlanType.LOGICAL_FILE_SCAN, table, qualifier, 
operativeSlots, virtualColumns,
+                groupExpression, logicalProperties);
         this.selectedPartitions = selectedPartitions;
         this.tableSample = tableSample;
         this.tableSnapshot = tableSnapshot;
@@ -72,7 +82,8 @@ public class LogicalFileScan extends LogicalCatalogRelation {
                            Optional<TableScanParams> scanParams) {
         this(id, table, qualifier, Optional.empty(), Optional.empty(),
                 
table.initSelectedPartitions(MvccUtil.getSnapshotFromContext(table)),
-                tableSample, tableSnapshot, operativeSlots, scanParams);
+                tableSample, tableSnapshot, operativeSlots, scanParams,
+                Optional.empty(), Optional.empty(),Optional.empty());
     }
 
     public SelectedPartitions getSelectedPartitions() {
@@ -109,30 +120,30 @@ public class LogicalFileScan extends 
LogicalCatalogRelation {
 
     @Override
     public LogicalFileScan withGroupExpression(Optional<GroupExpression> 
groupExpression) {
-        return new LogicalFileScan(relationId, (ExternalTable) table, 
qualifier, groupExpression,
-                Optional.of(getLogicalProperties()), selectedPartitions, 
tableSample, tableSnapshot,
-                operativeSlots, scanParams);
+        return new LogicalFileScan(relationId, (ExternalTable) table, 
qualifier,
+                selectedPartitions, tableSample, tableSnapshot, 
virtualColumns, groupExpression,
+                Optional.of(getLogicalProperties()));
     }
 
     @Override
     public Plan withGroupExprLogicalPropChildren(Optional<GroupExpression> 
groupExpression,
             Optional<LogicalProperties> logicalProperties, List<Plan> 
children) {
         return new LogicalFileScan(relationId, (ExternalTable) table, 
qualifier,
-                groupExpression, logicalProperties, selectedPartitions, 
tableSample, tableSnapshot,
-                operativeSlots, scanParams);
+                selectedPartitions, tableSample, tableSnapshot, virtualColumns,
+                groupExpression, logicalProperties);
     }
 
     public LogicalFileScan withSelectedPartitions(SelectedPartitions 
selectedPartitions) {
-        return new LogicalFileScan(relationId, (ExternalTable) table, 
qualifier, Optional.empty(),
-                Optional.of(getLogicalProperties()), selectedPartitions, 
tableSample, tableSnapshot,
-                operativeSlots, scanParams);
+        return new LogicalFileScan(relationId, (ExternalTable) table, 
qualifier,
+                selectedPartitions, tableSample, tableSnapshot, virtualColumns,
+                Optional.empty(), Optional.of(getLogicalProperties()));
     }
 
     @Override
     public LogicalFileScan withRelationId(RelationId relationId) {
-        return new LogicalFileScan(relationId, (ExternalTable) table, 
qualifier, Optional.empty(),
-                Optional.empty(), selectedPartitions, tableSample, 
tableSnapshot,
-                operativeSlots, scanParams);
+        return new LogicalFileScan(relationId, (ExternalTable) table, 
qualifier,
+                selectedPartitions, tableSample, tableSnapshot, virtualColumns,
+                Optional.empty(), Optional.empty());
     }
 
     @Override
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalHudiScan.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalHudiScan.java
index 6d5fa3e050b..86a36290eed 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalHudiScan.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalHudiScan.java
@@ -35,6 +35,7 @@ import org.apache.doris.nereids.trees.expressions.Expression;
 import org.apache.doris.nereids.trees.expressions.GreaterThan;
 import org.apache.doris.nereids.trees.expressions.GreaterThanEqual;
 import org.apache.doris.nereids.trees.expressions.LessThanEqual;
+import org.apache.doris.nereids.trees.expressions.NamedExpression;
 import org.apache.doris.nereids.trees.expressions.Slot;
 import org.apache.doris.nereids.trees.expressions.SlotReference;
 import org.apache.doris.nereids.trees.expressions.literal.StringLiteral;
@@ -43,6 +44,7 @@ import org.apache.doris.nereids.trees.plans.RelationId;
 import org.apache.doris.nereids.trees.plans.visitor.PlanVisitor;
 import org.apache.doris.nereids.util.Utils;
 
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 import org.apache.hudi.common.table.HoodieTableMetaClient;
 import org.apache.logging.log4j.LogManager;
@@ -69,25 +71,32 @@ public class LogicalHudiScan extends LogicalFileScan {
      * Constructor for LogicalHudiScan.
      */
     protected LogicalHudiScan(RelationId id, ExternalTable table, List<String> 
qualifier,
-            Optional<GroupExpression> groupExpression, 
Optional<LogicalProperties> logicalProperties,
             SelectedPartitions selectedPartitions, Optional<TableSample> 
tableSample,
             Optional<TableSnapshot> tableSnapshot,
             Optional<TableScanParams> scanParams, 
Optional<IncrementalRelation> incrementalRelation,
-            Collection<Slot> operativeSlots) {
-        super(id, table, qualifier, groupExpression, logicalProperties,
-                selectedPartitions, tableSample, tableSnapshot, 
operativeSlots, scanParams);
+            Collection<Slot> operativeSlots,
+            List<NamedExpression> virtualColumns,
+            Optional<GroupExpression> groupExpression,
+            Optional<LogicalProperties> logicalProperties) {
+        super(id, table, qualifier, selectedPartitions, tableSample, 
tableSnapshot, operativeSlots,
+              virtualColumns, groupExpression, logicalProperties);
         Objects.requireNonNull(scanParams, "scanParams should not null");
         Objects.requireNonNull(incrementalRelation, "incrementalRelation 
should not null");
         this.incrementalRelation = incrementalRelation;
     }
 
     public LogicalHudiScan(RelationId id, ExternalTable table, List<String> 
qualifier,
-            Optional<TableSample> tableSample, Optional<TableSnapshot> 
tableSnapshot,
             Collection<Slot> operativeSlots,
-            Optional<TableScanParams> scanParams) {
+            Optional<TableScanParams> scanParams,
+            Optional<TableSample> tableSample, Optional<TableSnapshot> 
tableSnapshot) {
         this(id, table, qualifier, Optional.empty(), Optional.empty(),
                 ((HMSExternalTable) 
table).initHudiSelectedPartitions(tableSnapshot), tableSample, tableSnapshot,
-                scanParams, Optional.empty(), operativeSlots);
+                Optional.empty(), Optional.empty(),
+                ImmutableList.of(), Optional.empty(), Optional.empty());
+    }
+
+    public Optional<TableScanParams> getScanParams() {
+        return scanParams;
     }
 
     public Optional<IncrementalRelation> getIncrementalRelation() {
@@ -132,30 +141,30 @@ public class LogicalHudiScan extends LogicalFileScan {
 
     @Override
     public LogicalHudiScan withGroupExpression(Optional<GroupExpression> 
groupExpression) {
-        return new LogicalHudiScan(relationId, (ExternalTable) table, 
qualifier, groupExpression,
-                Optional.of(getLogicalProperties()), selectedPartitions, 
tableSample, tableSnapshot,
-                scanParams, incrementalRelation, operativeSlots);
+        return new LogicalHudiScan(relationId, (ExternalTable) table, 
qualifier,
+                selectedPartitions, tableSample, tableSnapshot, scanParams, 
incrementalRelation, virtualColumns,
+                groupExpression, Optional.of(getLogicalProperties()));
     }
 
     @Override
     public Plan withGroupExprLogicalPropChildren(Optional<GroupExpression> 
groupExpression,
             Optional<LogicalProperties> logicalProperties, List<Plan> 
children) {
         return new LogicalHudiScan(relationId, (ExternalTable) table, 
qualifier,
-                groupExpression, logicalProperties, selectedPartitions, 
tableSample, tableSnapshot,
-                scanParams, incrementalRelation, operativeSlots);
+                selectedPartitions, tableSample, tableSnapshot, scanParams, 
incrementalRelation, virtualColumns,
+                groupExpression, logicalProperties);
     }
 
     public LogicalHudiScan withSelectedPartitions(SelectedPartitions 
selectedPartitions) {
-        return new LogicalHudiScan(relationId, (ExternalTable) table, 
qualifier, Optional.empty(),
-                Optional.of(getLogicalProperties()), selectedPartitions, 
tableSample, tableSnapshot,
-                scanParams, incrementalRelation, operativeSlots);
+        return new LogicalHudiScan(relationId, (ExternalTable) table, 
qualifier,
+                selectedPartitions, tableSample, tableSnapshot, scanParams, 
incrementalRelation, virtualColumns,
+                Optional.empty(), Optional.of(getLogicalProperties()));
     }
 
     @Override
     public LogicalHudiScan withRelationId(RelationId relationId) {
-        return new LogicalHudiScan(relationId, (ExternalTable) table, 
qualifier, Optional.empty(),
-                Optional.empty(), selectedPartitions, tableSample, 
tableSnapshot,
-                scanParams, incrementalRelation, operativeSlots);
+        return new LogicalHudiScan(relationId, (ExternalTable) table, 
qualifier,
+                selectedPartitions, tableSample, tableSnapshot, scanParams, 
incrementalRelation, virtualColumns,
+                Optional.empty(), Optional.empty());
     }
 
     @Override
@@ -218,8 +227,9 @@ public class LogicalHudiScan extends LogicalFileScan {
                     "Failed to create incremental relation for table: " + 
table.getFullQualifiers(), e);
             }
         }
-        return new LogicalHudiScan(relationId, table, qualifier, 
Optional.empty(),
-            Optional.empty(), selectedPartitions, tableSample, tableSnapshot,
-            optScanParams, newIncrementalRelation, operativeSlots);
+        newScanParams = Optional.ofNullable(scanParams);
+        return new LogicalHudiScan(relationId, table, qualifier,
+                selectedPartitions, tableSample, tableSnapshot, newScanParams, 
newIncrementalRelation, virtualColumns,
+                Optional.empty(), Optional.empty());
     }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalJdbcScan.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalJdbcScan.java
index 53176f72c53..13491ea76f9 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalJdbcScan.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalJdbcScan.java
@@ -22,6 +22,7 @@ import org.apache.doris.catalog.TableIf;
 import org.apache.doris.datasource.ExternalTable;
 import org.apache.doris.nereids.memo.GroupExpression;
 import org.apache.doris.nereids.properties.LogicalProperties;
+import org.apache.doris.nereids.trees.expressions.NamedExpression;
 import org.apache.doris.nereids.trees.plans.Plan;
 import org.apache.doris.nereids.trees.plans.PlanType;
 import org.apache.doris.nereids.trees.plans.RelationId;
@@ -29,6 +30,7 @@ import 
org.apache.doris.nereids.trees.plans.visitor.PlanVisitor;
 import org.apache.doris.nereids.util.Utils;
 
 import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableList;
 
 import java.util.List;
 import java.util.Optional;
@@ -41,14 +43,14 @@ public class LogicalJdbcScan extends LogicalCatalogRelation 
{
     /**
      * Constructor for LogicalJdbcScan.
      */
-    public LogicalJdbcScan(RelationId id, TableIf table, List<String> 
qualifier,
-                           Optional<GroupExpression> groupExpression,
-                           Optional<LogicalProperties> logicalProperties) {
-        super(id, PlanType.LOGICAL_JDBC_SCAN, table, qualifier, 
groupExpression, logicalProperties);
+    public LogicalJdbcScan(RelationId id, TableIf table, List<String> 
qualifier, List<NamedExpression> virtualColumns,
+            Optional<GroupExpression> groupExpression, 
Optional<LogicalProperties> logicalProperties) {
+        super(id, PlanType.LOGICAL_JDBC_SCAN, table, qualifier, 
ImmutableList.of(), virtualColumns,
+                groupExpression, logicalProperties);
     }
 
     public LogicalJdbcScan(RelationId id, TableIf table, List<String> 
qualifier) {
-        this(id, table, qualifier, Optional.empty(), Optional.empty());
+        this(id, table, qualifier, ImmutableList.of(), Optional.empty(), 
Optional.empty());
     }
 
     @Override
@@ -68,19 +70,21 @@ public class LogicalJdbcScan extends LogicalCatalogRelation 
{
 
     @Override
     public LogicalJdbcScan withGroupExpression(Optional<GroupExpression> 
groupExpression) {
-        return new LogicalJdbcScan(relationId, table, qualifier, 
groupExpression,
-            Optional.of(getLogicalProperties()));
+        return new LogicalJdbcScan(relationId, table, qualifier, 
virtualColumns,
+                groupExpression, Optional.of(getLogicalProperties()));
     }
 
     @Override
     public Plan withGroupExprLogicalPropChildren(Optional<GroupExpression> 
groupExpression,
             Optional<LogicalProperties> logicalProperties, List<Plan> 
children) {
-        return new LogicalJdbcScan(relationId, table, qualifier, 
groupExpression, logicalProperties);
+        return new LogicalJdbcScan(relationId, table, qualifier, 
virtualColumns,
+                groupExpression, logicalProperties);
     }
 
     @Override
     public LogicalJdbcScan withRelationId(RelationId relationId) {
-        return new LogicalJdbcScan(relationId, table, qualifier, 
Optional.empty(), Optional.empty());
+        return new LogicalJdbcScan(relationId, table, qualifier, 
virtualColumns,
+                Optional.empty(), Optional.empty());
     }
 
     @Override
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalOdbcScan.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalOdbcScan.java
index 3ce9b8d7403..f63585d099f 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalOdbcScan.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalOdbcScan.java
@@ -21,6 +21,7 @@ import org.apache.doris.catalog.OdbcTable;
 import org.apache.doris.catalog.TableIf;
 import org.apache.doris.nereids.memo.GroupExpression;
 import org.apache.doris.nereids.properties.LogicalProperties;
+import org.apache.doris.nereids.trees.expressions.NamedExpression;
 import org.apache.doris.nereids.trees.plans.Plan;
 import org.apache.doris.nereids.trees.plans.PlanType;
 import org.apache.doris.nereids.trees.plans.RelationId;
@@ -28,6 +29,7 @@ import 
org.apache.doris.nereids.trees.plans.visitor.PlanVisitor;
 import org.apache.doris.nereids.util.Utils;
 
 import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableList;
 
 import java.util.List;
 import java.util.Optional;
@@ -37,14 +39,14 @@ import java.util.Optional;
  */
 public class LogicalOdbcScan extends LogicalCatalogRelation {
 
-    public LogicalOdbcScan(RelationId id, TableIf table, List<String> 
qualifier,
-            Optional<GroupExpression> groupExpression,
-            Optional<LogicalProperties> logicalProperties) {
-        super(id, PlanType.LOGICAL_ODBC_SCAN, table, qualifier, 
groupExpression, logicalProperties);
+    public LogicalOdbcScan(RelationId id, TableIf table, List<String> 
qualifier, List<NamedExpression> virtualColumns,
+            Optional<GroupExpression> groupExpression, 
Optional<LogicalProperties> logicalProperties) {
+        super(id, PlanType.LOGICAL_ODBC_SCAN, table, qualifier,
+                ImmutableList.of(), virtualColumns, groupExpression, 
logicalProperties);
     }
 
     public LogicalOdbcScan(RelationId id, TableIf table, List<String> 
qualifier) {
-        this(id, table, qualifier, Optional.empty(), Optional.empty());
+        this(id, table, qualifier, ImmutableList.of(), Optional.empty(), 
Optional.empty());
     }
 
     @Override
@@ -64,19 +66,19 @@ public class LogicalOdbcScan extends LogicalCatalogRelation 
{
 
     @Override
     public LogicalOdbcScan withGroupExpression(Optional<GroupExpression> 
groupExpression) {
-        return new LogicalOdbcScan(relationId, table, qualifier, 
groupExpression,
+        return new LogicalOdbcScan(relationId, table, qualifier, 
virtualColumns, groupExpression,
                 Optional.of(getLogicalProperties()));
     }
 
     @Override
     public Plan withGroupExprLogicalPropChildren(Optional<GroupExpression> 
groupExpression,
             Optional<LogicalProperties> logicalProperties, List<Plan> 
children) {
-        return new LogicalOdbcScan(relationId, table, qualifier, 
groupExpression, logicalProperties);
+        return new LogicalOdbcScan(relationId, table, qualifier, 
virtualColumns, groupExpression, logicalProperties);
     }
 
     @Override
     public LogicalOdbcScan withRelationId(RelationId relationId) {
-        return new LogicalOdbcScan(relationId, table, qualifier, 
Optional.empty(), Optional.empty());
+        return new LogicalOdbcScan(relationId, table, qualifier, 
virtualColumns, Optional.empty(), Optional.empty());
     }
 
     @Override
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalOlapScan.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalOlapScan.java
index b1f57386aab..f51791e4653 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalOlapScan.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalOlapScan.java
@@ -140,9 +140,6 @@ public class LogicalOlapScan extends LogicalCatalogRelation 
implements OlapScan
     private final Map<String, Set<List<String>>> colToSubPathsMap;
     private final Map<Slot, Map<List<String>, SlotReference>> subPathToSlotMap;
 
-    // use for virtual slot
-    private final List<NamedExpression> virtualColumns;
-
     // use for ann push down
     private final List<OrderKey> annOrderKeys;
     private final Optional<Long> annLimit;
@@ -210,7 +207,7 @@ public class LogicalOlapScan extends LogicalCatalogRelation 
implements OlapScan
             Collection<Slot> operativeSlots, List<NamedExpression> 
virtualColumns,
             List<OrderKey> annOrderKeys, Optional<Long> annLimit) {
         super(id, PlanType.LOGICAL_OLAP_SCAN, table, qualifier,
-                groupExpression, logicalProperties, operativeSlots);
+                operativeSlots, virtualColumns, groupExpression, 
logicalProperties);
         Preconditions.checkArgument(selectedPartitionIds != null,
                 "selectedPartitionIds can not be null");
         this.selectedTabletIds = Utils.fastToImmutableList(selectedTabletIds);
@@ -240,7 +237,6 @@ public class LogicalOlapScan extends LogicalCatalogRelation 
implements OlapScan
         this.directMvScan = directMvScan;
         this.colToSubPathsMap = colToSubPathsMap;
         this.subPathToSlotMap = Maps.newHashMap();
-        this.virtualColumns = Utils.fastToImmutableList(virtualColumns);
         this.annOrderKeys = Utils.fastToImmutableList(annOrderKeys);
         this.annLimit = annLimit;
     }
@@ -393,6 +389,7 @@ public class LogicalOlapScan extends LogicalCatalogRelation 
implements OlapScan
      * @param virtualColumns generated virtual columns
      * @return scan with virtual columns
      */
+    @Override
     public LogicalOlapScan withVirtualColumns(List<NamedExpression> 
virtualColumns) {
         LogicalProperties logicalProperties = getLogicalProperties();
         List<Slot> output = Lists.newArrayList(logicalProperties.getOutput());
@@ -573,10 +570,6 @@ public class LogicalOlapScan extends 
LogicalCatalogRelation implements OlapScan
         return preAggStatus.isUnset();
     }
 
-    public List<NamedExpression> getVirtualColumns() {
-        return virtualColumns;
-    }
-
     public List<OrderKey> getAnnOrderKeys() {
         return annOrderKeys;
     }
@@ -747,7 +740,7 @@ public class LogicalOlapScan extends LogicalCatalogRelation 
implements OlapScan
                 manuallySpecifiedTabletIds, operativeSlots, virtualColumns, 
annOrderKeys, annLimit);
     }
 
-    Map<Slot, Slot> constructReplaceMap(MTMV mtmv) {
+    private Map<Slot, Slot> constructReplaceMap(MTMV mtmv) {
         Map<Slot, Slot> replaceMap = new HashMap<>();
         // Need remove invisible column, and then mapping them
         List<Slot> originOutputs = new ArrayList<>();
@@ -777,10 +770,6 @@ public class LogicalOlapScan extends 
LogicalCatalogRelation implements OlapScan
         return replaceMap;
     }
 
-    public List<Slot> getOperativeSlots() {
-        return operativeSlots;
-    }
-
     @Override
     public boolean equals(Object o) {
         if (this == o) {
@@ -801,7 +790,6 @@ public class LogicalOlapScan extends LogicalCatalogRelation 
implements OlapScan
                 && Objects.equals(selectedPartitionIds, 
that.selectedPartitionIds)
                 && Objects.equals(hints, that.hints)
                 && Objects.equals(tableSample, that.tableSample)
-                && Objects.equals(virtualColumns, that.virtualColumns)
                 && Objects.equals(annOrderKeys, that.annOrderKeys)
                 && Objects.equals(annLimit, that.annLimit);
     }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalSchemaScan.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalSchemaScan.java
index d969f505a4c..6e5e62da092 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalSchemaScan.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalSchemaScan.java
@@ -20,12 +20,15 @@ package org.apache.doris.nereids.trees.plans.logical;
 import org.apache.doris.catalog.TableIf;
 import org.apache.doris.nereids.memo.GroupExpression;
 import org.apache.doris.nereids.properties.LogicalProperties;
+import org.apache.doris.nereids.trees.expressions.NamedExpression;
 import org.apache.doris.nereids.trees.plans.Plan;
 import org.apache.doris.nereids.trees.plans.PlanType;
 import org.apache.doris.nereids.trees.plans.RelationId;
 import org.apache.doris.nereids.trees.plans.visitor.PlanVisitor;
 import org.apache.doris.nereids.util.Utils;
 
+import com.google.common.collect.ImmutableList;
+
 import java.util.List;
 import java.util.Objects;
 import java.util.Optional;
@@ -41,18 +44,31 @@ public class LogicalSchemaScan extends 
LogicalCatalogRelation {
     private final Optional<String> schemaTable;
 
     public LogicalSchemaScan(RelationId id, TableIf table, List<String> 
qualifier) {
-        super(id, PlanType.LOGICAL_SCHEMA_SCAN, table, qualifier);
-        this.filterPushed = false;
-        this.schemaCatalog = Optional.empty();
-        this.schemaDatabase = Optional.empty();
-        this.schemaTable = Optional.empty();
+        this(id, table, qualifier, false,
+                Optional.empty(), Optional.empty(), Optional.empty(), 
ImmutableList.of(),
+                Optional.empty(), Optional.empty());
     }
 
-    public LogicalSchemaScan(RelationId id, TableIf table, List<String> 
qualifier,
-            Optional<GroupExpression> groupExpression, 
Optional<LogicalProperties> logicalProperties,
-            boolean filterPushed, Optional<String> schemaCatalog, 
Optional<String> schemaDatabase,
-            Optional<String> schemaTable) {
-        super(id, PlanType.LOGICAL_SCHEMA_SCAN, table, qualifier, 
groupExpression, logicalProperties);
+    /**
+     * Constructs a LogicalSchemaScan with the specified parameters.
+     *
+     * @param id Unique identifier for this relation
+     * @param table The table interface representing the underlying data source
+     * @param qualifier The qualifier list representing the path to this table
+     * @param filterPushed Whether filter has been pushed down to this scan 
operation
+     * @param schemaCatalog Optional catalog name in the schema
+     * @param schemaDatabase Optional database name in the schema
+     * @param schemaTable Optional table name in the schema
+     * @param virtualColumns List of virtual columns to be included in the scan
+     * @param groupExpression Optional group expression for memo representation
+     * @param logicalProperties Optional logical properties for this plan node
+     */
+    public LogicalSchemaScan(RelationId id, TableIf table, List<String> 
qualifier, boolean filterPushed,
+            Optional<String> schemaCatalog, Optional<String> schemaDatabase, 
Optional<String> schemaTable,
+            List<NamedExpression> virtualColumns,
+            Optional<GroupExpression> groupExpression, 
Optional<LogicalProperties> logicalProperties) {
+        super(id, PlanType.LOGICAL_SCHEMA_SCAN, table, qualifier, 
ImmutableList.of(), virtualColumns,
+                groupExpression, logicalProperties);
         this.filterPushed = filterPushed;
         this.schemaCatalog = schemaCatalog;
         this.schemaDatabase = schemaDatabase;
@@ -75,11 +91,6 @@ public class LogicalSchemaScan extends 
LogicalCatalogRelation {
         return schemaTable;
     }
 
-    @Override
-    public TableIf getTable() {
-        return table;
-    }
-
     @Override
     public <R, C> R accept(PlanVisitor<R, C> visitor, C context) {
         return visitor.visitLogicalSchemaScan(this, context);
@@ -87,28 +98,28 @@ public class LogicalSchemaScan extends 
LogicalCatalogRelation {
 
     @Override
     public Plan withGroupExpression(Optional<GroupExpression> groupExpression) 
{
-        return new LogicalSchemaScan(relationId, table, qualifier,
-                groupExpression, Optional.of(getLogicalProperties()), 
filterPushed,
-                schemaCatalog, schemaDatabase, schemaTable);
+        return new LogicalSchemaScan(relationId, table, qualifier, 
filterPushed,
+                schemaCatalog, schemaDatabase, schemaTable, virtualColumns,
+                groupExpression, Optional.of(getLogicalProperties()));
     }
 
     @Override
     public Plan withGroupExprLogicalPropChildren(Optional<GroupExpression> 
groupExpression,
             Optional<LogicalProperties> logicalProperties, List<Plan> 
children) {
-        return new LogicalSchemaScan(relationId, table, qualifier, 
groupExpression, logicalProperties, filterPushed,
-            schemaCatalog, schemaDatabase, schemaTable);
+        return new LogicalSchemaScan(relationId, table, qualifier, 
filterPushed,
+                schemaCatalog, schemaDatabase, schemaTable, virtualColumns, 
groupExpression, logicalProperties);
     }
 
     @Override
     public LogicalSchemaScan withRelationId(RelationId relationId) {
-        return new LogicalSchemaScan(relationId, table, qualifier, 
Optional.empty(), Optional.empty(), filterPushed,
-            schemaCatalog, schemaDatabase, schemaTable);
+        return new LogicalSchemaScan(relationId, table, qualifier, 
filterPushed,
+                schemaCatalog, schemaDatabase, schemaTable, virtualColumns, 
Optional.empty(), Optional.empty());
     }
 
     public LogicalSchemaScan withSchemaIdentifier(Optional<String> 
schemaCatalog, Optional<String> schemaDatabase,
             Optional<String> schemaTable) {
-        return new LogicalSchemaScan(relationId, table, qualifier, 
Optional.empty(),
-            Optional.of(getLogicalProperties()), true, schemaCatalog, 
schemaDatabase, schemaTable);
+        return new LogicalSchemaScan(relationId, table, qualifier, true, 
schemaCatalog, schemaDatabase, schemaTable,
+                virtualColumns, Optional.empty(), 
Optional.of(getLogicalProperties()));
     }
 
     @Override


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org


Reply via email to