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

delei pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/fesod.git


The following commit(s) were added to refs/heads/main by this push:
     new cf602d61 refactor: replace includeColumnIndexes list lookup with 
ColumnIndexResolver (#1015)
cf602d61 is described below

commit cf602d61a947df47bddfdf666991f30ca872a8ed
Author: Bengbengbalabalabeng 
<[email protected]>
AuthorDate: Mon Aug 24 11:32:29 2026 +0800

    refactor: replace includeColumnIndexes list lookup with ColumnIndexResolver 
(#1015)
    
    * refactor: replace includeColumnIndexes list lookup with 
ColumnIndexResolver
    
    * style: some renaming
    
    * fix: covers null element checks
    
    * refactor: replace columns list with ColumnIndexResolver in constructor
    
    ---------
    
    Co-authored-by: ian zhang <[email protected]>
    Co-authored-by: DeleiGuo <[email protected]>
---
 .../sheet/analysis/csv/CsvExcelReadExecutor.java   | 13 +--
 .../analysis/v03/handlers/BlankRecordHandler.java  | 15 +---
 .../v03/handlers/BoolErrRecordHandler.java         | 13 +--
 .../analysis/v03/handlers/DummyRecordHandler.java  | 14 +---
 .../v03/handlers/FormulaRecordHandler.java         | 14 +---
 .../analysis/v03/handlers/LabelRecordHandler.java  | 14 +---
 .../v03/handlers/LabelSstRecordHandler.java        | 14 +---
 .../analysis/v03/handlers/NumberRecordHandler.java | 14 +---
 .../analysis/v03/handlers/RkRecordHandler.java     | 15 +---
 .../analysis/v07/handlers/CellTagHandler.java      | 18 +---
 .../fesod/sheet/read/builder/CsvReaderBuilder.java |  2 +-
 .../read/builder/ExcelReaderSheetBuilder.java      |  4 +-
 .../sheet/read/metadata/ColumnIndexResolver.java   | 72 ++++++++++++++++
 .../fesod/sheet/read/metadata/ReadSheet.java       | 22 +++--
 .../read/metadata/holder/ReadSheetHolder.java      |  4 +
 .../org/apache/fesod/sheet/FesodSheetTest.java     |  1 -
 .../read/metadata/ColumnIndexResolverTest.java     | 96 ++++++++++++++++++++++
 17 files changed, 222 insertions(+), 123 deletions(-)

diff --git 
a/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/csv/CsvExcelReadExecutor.java
 
b/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/csv/CsvExcelReadExecutor.java
index 833aba53..8754b976 100644
--- 
a/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/csv/CsvExcelReadExecutor.java
+++ 
b/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/csv/CsvExcelReadExecutor.java
@@ -223,21 +223,14 @@ public class CsvExcelReadExecutor implements 
ExcelReadExecutor {
                 
csvReadContext.csvReadWorkbookHolder().globalConfiguration().getAutoTrim();
         Boolean autoStrip =
                 
csvReadContext.csvReadWorkbookHolder().globalConfiguration().getAutoStrip();
-        List<Integer> includeColumnIndexes =
-                
csvReadContext.readSheetHolder().getReadSheet().getColumnIndexes();
 
         while (cellIterator.hasNext()) {
             String cellString = cellIterator.next();
             int currentColumnIndex = columnIndex++;
-            int targetColumnIndex;
 
-            if (includeColumnIndexes == null) {
-                targetColumnIndex = currentColumnIndex;
-            } else {
-                targetColumnIndex = 
includeColumnIndexes.indexOf(currentColumnIndex);
-                if (targetColumnIndex < 0) {
-                    continue;
-                }
+            Integer targetColumnIndex = 
csvReadContext.readSheetHolder().determineTargetColumnIndex(currentColumnIndex);
+            if (targetColumnIndex == null) {
+                continue;
             }
 
             ReadCellData<String> readCellData = new ReadCellData<>();
diff --git 
a/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v03/handlers/BlankRecordHandler.java
 
b/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v03/handlers/BlankRecordHandler.java
index 2cf1782e..3adefb6d 100644
--- 
a/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v03/handlers/BlankRecordHandler.java
+++ 
b/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v03/handlers/BlankRecordHandler.java
@@ -25,7 +25,6 @@
 
 package org.apache.fesod.sheet.analysis.v03.handlers;
 
-import java.util.List;
 import org.apache.fesod.sheet.analysis.v03.IgnorableXlsRecordHandler;
 import org.apache.fesod.sheet.context.xls.XlsReadContext;
 import org.apache.fesod.sheet.metadata.data.ReadCellData;
@@ -40,18 +39,12 @@ public class BlankRecordHandler extends 
AbstractXlsRecordHandler implements Igno
     @Override
     public void processRecord(XlsReadContext xlsReadContext, Record record) {
         BlankRecord br = (BlankRecord) record;
-        int originalColumnIndex = br.getColumn();
 
-        List<Integer> includeColumnIndexes =
-                
xlsReadContext.readSheetHolder().getReadSheet().getColumnIndexes();
-
-        int targetColumnIndex = originalColumnIndex;
-        if (includeColumnIndexes != null) {
-            targetColumnIndex = 
includeColumnIndexes.indexOf(originalColumnIndex);
-            if (targetColumnIndex < 0) {
-                return;
-            }
+        Integer targetColumnIndex = 
xlsReadContext.readSheetHolder().determineTargetColumnIndex(br.getColumn());
+        if (targetColumnIndex == null) {
+            return;
         }
+
         xlsReadContext
                 .xlsReadSheetHolder()
                 .getCellMap()
diff --git 
a/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v03/handlers/BoolErrRecordHandler.java
 
b/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v03/handlers/BoolErrRecordHandler.java
index 8a5d5895..fc50e17a 100644
--- 
a/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v03/handlers/BoolErrRecordHandler.java
+++ 
b/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v03/handlers/BoolErrRecordHandler.java
@@ -25,7 +25,6 @@
 
 package org.apache.fesod.sheet.analysis.v03.handlers;
 
-import java.util.List;
 import org.apache.fesod.sheet.analysis.v03.IgnorableXlsRecordHandler;
 import org.apache.fesod.sheet.context.xls.XlsReadContext;
 import org.apache.fesod.sheet.enums.CellDataTypeEnum;
@@ -43,16 +42,10 @@ public class BoolErrRecordHandler extends 
AbstractXlsRecordHandler implements Ig
     @Override
     public void processRecord(XlsReadContext xlsReadContext, Record record) {
         BoolErrRecord ber = (BoolErrRecord) record;
-        int originalColumnIndex = ber.getColumn();
-        List<Integer> includeColumnIndexes =
-                
xlsReadContext.readSheetHolder().getReadSheet().getColumnIndexes();
 
-        int targetColumnIndex = originalColumnIndex;
-        if (includeColumnIndexes != null) {
-            targetColumnIndex = 
includeColumnIndexes.indexOf(originalColumnIndex);
-            if (targetColumnIndex < 0) {
-                return;
-            }
+        Integer targetColumnIndex = 
xlsReadContext.readSheetHolder().determineTargetColumnIndex(ber.getColumn());
+        if (targetColumnIndex == null) {
+            return;
         }
         ReadCellData<?> cellData;
         if (ber.isError()) {
diff --git 
a/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v03/handlers/DummyRecordHandler.java
 
b/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v03/handlers/DummyRecordHandler.java
index 18cc1c02..28f09292 100644
--- 
a/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v03/handlers/DummyRecordHandler.java
+++ 
b/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v03/handlers/DummyRecordHandler.java
@@ -26,7 +26,6 @@
 package org.apache.fesod.sheet.analysis.v03.handlers;
 
 import java.util.LinkedHashMap;
-import java.util.List;
 import org.apache.fesod.sheet.analysis.v03.IgnorableXlsRecordHandler;
 import org.apache.fesod.sheet.context.xls.XlsReadContext;
 import org.apache.fesod.sheet.enums.RowTypeEnum;
@@ -59,17 +58,12 @@ public class DummyRecordHandler extends 
AbstractXlsRecordHandler implements Igno
             xlsReadSheetHolder.setTempRowType(RowTypeEnum.EMPTY);
         } else if (record instanceof MissingCellDummyRecord) {
             MissingCellDummyRecord mcdr = (MissingCellDummyRecord) record;
-            int originalColumnIndex = mcdr.getColumn();
-            List<Integer> includeColumnIndexes =
-                    
xlsReadContext.readSheetHolder().getReadSheet().getColumnIndexes();
 
-            int targetColumnIndex = originalColumnIndex;
-            if (includeColumnIndexes != null) {
-                targetColumnIndex = 
includeColumnIndexes.indexOf(originalColumnIndex);
-                if (targetColumnIndex < 0) {
-                    return;
-                }
+            Integer targetColumnIndex = 
xlsReadContext.readSheetHolder().determineTargetColumnIndex(mcdr.getColumn());
+            if (targetColumnIndex == null) {
+                return;
             }
+
             // Some abnormal XLS, in the case of data already exist, or there 
will be a "MissingCellDummyRecord"
             // records, so if the existing data, empty data is ignored
             xlsReadSheetHolder
diff --git 
a/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v03/handlers/FormulaRecordHandler.java
 
b/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v03/handlers/FormulaRecordHandler.java
index 229a188a..1dbf3d32 100644
--- 
a/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v03/handlers/FormulaRecordHandler.java
+++ 
b/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v03/handlers/FormulaRecordHandler.java
@@ -26,7 +26,6 @@
 package org.apache.fesod.sheet.analysis.v03.handlers;
 
 import java.math.BigDecimal;
-import java.util.List;
 import java.util.Map;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.fesod.sheet.analysis.v03.IgnorableXlsRecordHandler;
@@ -54,17 +53,10 @@ public class FormulaRecordHandler extends 
AbstractXlsRecordHandler implements Ig
     @Override
     public void processRecord(XlsReadContext xlsReadContext, Record record) {
         FormulaRecord frec = (FormulaRecord) record;
-        int originalColumnIndex = frec.getColumn();
 
-        List<Integer> includeColumnIndexes =
-                
xlsReadContext.readSheetHolder().getReadSheet().getColumnIndexes();
-
-        int targetColumnIndex = originalColumnIndex;
-        if (includeColumnIndexes != null) {
-            targetColumnIndex = 
includeColumnIndexes.indexOf(originalColumnIndex);
-            if (targetColumnIndex < 0) {
-                return;
-            }
+        Integer targetColumnIndex = 
xlsReadContext.readSheetHolder().determineTargetColumnIndex(frec.getColumn());
+        if (targetColumnIndex == null) {
+            return;
         }
 
         Map<Integer, Cell> cellMap = 
xlsReadContext.xlsReadSheetHolder().getCellMap();
diff --git 
a/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v03/handlers/LabelRecordHandler.java
 
b/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v03/handlers/LabelRecordHandler.java
index 0df77a3b..615f53be 100644
--- 
a/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v03/handlers/LabelRecordHandler.java
+++ 
b/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v03/handlers/LabelRecordHandler.java
@@ -25,7 +25,6 @@
 
 package org.apache.fesod.sheet.analysis.v03.handlers;
 
-import java.util.List;
 import org.apache.fesod.common.util.StringUtils;
 import org.apache.fesod.sheet.analysis.v03.IgnorableXlsRecordHandler;
 import org.apache.fesod.sheet.context.xls.XlsReadContext;
@@ -42,17 +41,10 @@ public class LabelRecordHandler extends 
AbstractXlsRecordHandler implements Igno
     @Override
     public void processRecord(XlsReadContext xlsReadContext, Record record) {
         LabelRecord lrec = (LabelRecord) record;
-        int originalColumnIndex = lrec.getColumn();
 
-        List<Integer> includeColumnIndexes =
-                
xlsReadContext.readSheetHolder().getReadSheet().getColumnIndexes();
-
-        int targetColumnIndex = originalColumnIndex;
-        if (includeColumnIndexes != null) {
-            targetColumnIndex = 
includeColumnIndexes.indexOf(originalColumnIndex);
-            if (targetColumnIndex < 0) {
-                return;
-            }
+        Integer targetColumnIndex = 
xlsReadContext.readSheetHolder().determineTargetColumnIndex(lrec.getColumn());
+        if (targetColumnIndex == null) {
+            return;
         }
 
         String data = lrec.getValue();
diff --git 
a/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v03/handlers/LabelSstRecordHandler.java
 
b/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v03/handlers/LabelSstRecordHandler.java
index c718b85c..248a8fc2 100644
--- 
a/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v03/handlers/LabelSstRecordHandler.java
+++ 
b/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v03/handlers/LabelSstRecordHandler.java
@@ -25,7 +25,6 @@
 
 package org.apache.fesod.sheet.analysis.v03.handlers;
 
-import java.util.List;
 import java.util.Map;
 import org.apache.fesod.common.util.StringUtils;
 import org.apache.fesod.sheet.analysis.v03.IgnorableXlsRecordHandler;
@@ -46,17 +45,10 @@ public class LabelSstRecordHandler extends 
AbstractXlsRecordHandler implements I
     @Override
     public void processRecord(XlsReadContext xlsReadContext, Record record) {
         LabelSSTRecord lsrec = (LabelSSTRecord) record;
-        int originalColumnIndex = lsrec.getColumn();
 
-        List<Integer> includeColumnIndexes =
-                
xlsReadContext.readSheetHolder().getReadSheet().getColumnIndexes();
-
-        int targetColumnIndex = originalColumnIndex;
-        if (includeColumnIndexes != null) {
-            targetColumnIndex = 
includeColumnIndexes.indexOf(originalColumnIndex);
-            if (targetColumnIndex < 0) {
-                return;
-            }
+        Integer targetColumnIndex = 
xlsReadContext.readSheetHolder().determineTargetColumnIndex(lsrec.getColumn());
+        if (targetColumnIndex == null) {
+            return;
         }
 
         ReadCache readCache = 
xlsReadContext.readWorkbookHolder().getReadCache();
diff --git 
a/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v03/handlers/NumberRecordHandler.java
 
b/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v03/handlers/NumberRecordHandler.java
index ec0ea97b..55261e2c 100644
--- 
a/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v03/handlers/NumberRecordHandler.java
+++ 
b/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v03/handlers/NumberRecordHandler.java
@@ -26,7 +26,6 @@
 package org.apache.fesod.sheet.analysis.v03.handlers;
 
 import java.math.BigDecimal;
-import java.util.List;
 import org.apache.fesod.sheet.analysis.v03.IgnorableXlsRecordHandler;
 import org.apache.fesod.sheet.constant.BuiltinFormats;
 import org.apache.fesod.sheet.context.xls.XlsReadContext;
@@ -44,17 +43,10 @@ public class NumberRecordHandler extends 
AbstractXlsRecordHandler implements Ign
     @Override
     public void processRecord(XlsReadContext xlsReadContext, Record record) {
         NumberRecord nr = (NumberRecord) record;
-        int originalColumnIndex = nr.getColumn();
 
-        List<Integer> includeColumnIndexes =
-                
xlsReadContext.readSheetHolder().getReadSheet().getColumnIndexes();
-
-        int targetColumnIndex = originalColumnIndex;
-        if (includeColumnIndexes != null) {
-            targetColumnIndex = 
includeColumnIndexes.indexOf(originalColumnIndex);
-            if (targetColumnIndex < 0) {
-                return;
-            }
+        Integer targetColumnIndex = 
xlsReadContext.readSheetHolder().determineTargetColumnIndex(nr.getColumn());
+        if (targetColumnIndex == null) {
+            return;
         }
 
         ReadCellData<?> cellData =
diff --git 
a/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v03/handlers/RkRecordHandler.java
 
b/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v03/handlers/RkRecordHandler.java
index 502c9f34..1d117e64 100644
--- 
a/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v03/handlers/RkRecordHandler.java
+++ 
b/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v03/handlers/RkRecordHandler.java
@@ -25,7 +25,6 @@
 
 package org.apache.fesod.sheet.analysis.v03.handlers;
 
-import java.util.List;
 import org.apache.fesod.sheet.analysis.v03.IgnorableXlsRecordHandler;
 import org.apache.fesod.sheet.context.xls.XlsReadContext;
 import org.apache.fesod.sheet.metadata.data.ReadCellData;
@@ -40,18 +39,12 @@ public class RkRecordHandler extends 
AbstractXlsRecordHandler implements Ignorab
     @Override
     public void processRecord(XlsReadContext xlsReadContext, Record record) {
         RKRecord re = (RKRecord) record;
-        int originalColumnIndex = re.getColumn();
 
-        List<Integer> includeColumnIndexes =
-                
xlsReadContext.readSheetHolder().getReadSheet().getColumnIndexes();
-
-        int targetColumnIndex = originalColumnIndex;
-        if (includeColumnIndexes != null) {
-            targetColumnIndex = 
includeColumnIndexes.indexOf(originalColumnIndex);
-            if (targetColumnIndex < 0) {
-                return;
-            }
+        Integer targetColumnIndex = 
xlsReadContext.readSheetHolder().determineTargetColumnIndex(re.getColumn());
+        if (targetColumnIndex == null) {
+            return;
         }
+
         xlsReadContext
                 .xlsReadSheetHolder()
                 .getCellMap()
diff --git 
a/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v07/handlers/CellTagHandler.java
 
b/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v07/handlers/CellTagHandler.java
index 21eb39c6..df9720bb 100644
--- 
a/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v07/handlers/CellTagHandler.java
+++ 
b/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v07/handlers/CellTagHandler.java
@@ -26,7 +26,6 @@
 package org.apache.fesod.sheet.analysis.v07.handlers;
 
 import java.math.BigDecimal;
-import java.util.List;
 import org.apache.fesod.common.util.PositionUtils;
 import org.apache.fesod.common.util.StringUtils;
 import org.apache.fesod.sheet.constant.ExcelXmlConstants;
@@ -86,20 +85,11 @@ public class CellTagHandler extends AbstractXlsxTagHandler {
     public void endElement(XlsxReadContext xlsxReadContext, String name) {
         XlsxReadSheetHolder xlsxReadSheetHolder = 
xlsxReadContext.xlsxReadSheetHolder();
         ReadCellData<?> tempCellData = xlsxReadSheetHolder.getTempCellData();
-        int targetColumnIndex = 0;
 
-        List<Integer> includeColumnIndexes =
-                
xlsxReadContext.readSheetHolder().getReadSheet().getColumnIndexes();
-
-        if (includeColumnIndexes == null) {
-            targetColumnIndex = xlsxReadSheetHolder.getColumnIndex();
-        } else {
-            // if it's a target column, rewrite the cell's internal index
-            targetColumnIndex = 
includeColumnIndexes.indexOf(xlsxReadSheetHolder.getColumnIndex());
-            if (targetColumnIndex < 0) {
-
-                return;
-            }
+        Integer targetColumnIndex =
+                
xlsxReadContext.readSheetHolder().determineTargetColumnIndex(xlsxReadSheetHolder.getColumnIndex());
+        if (targetColumnIndex == null) {
+            return;
         }
 
         StringBuilder tempData = xlsxReadSheetHolder.getTempData();
diff --git 
a/fesod-sheet/src/main/java/org/apache/fesod/sheet/read/builder/CsvReaderBuilder.java
 
b/fesod-sheet/src/main/java/org/apache/fesod/sheet/read/builder/CsvReaderBuilder.java
index 84b8cb8e..5be1fe1d 100644
--- 
a/fesod-sheet/src/main/java/org/apache/fesod/sheet/read/builder/CsvReaderBuilder.java
+++ 
b/fesod-sheet/src/main/java/org/apache/fesod/sheet/read/builder/CsvReaderBuilder.java
@@ -124,7 +124,7 @@ public class CsvReaderBuilder extends 
AbstractExcelReaderParameterBuilder<CsvRea
      * @return
      */
     public CsvReaderBuilder includeColumnIndexes(List<Integer> columnIndexes) {
-        readSheet.setColumnIndexes(columnIndexes);
+        readSheet.setIncludeColumnIndexes(columnIndexes);
         return this;
     }
 
diff --git 
a/fesod-sheet/src/main/java/org/apache/fesod/sheet/read/builder/ExcelReaderSheetBuilder.java
 
b/fesod-sheet/src/main/java/org/apache/fesod/sheet/read/builder/ExcelReaderSheetBuilder.java
index 38040ce0..4f00e9ba 100644
--- 
a/fesod-sheet/src/main/java/org/apache/fesod/sheet/read/builder/ExcelReaderSheetBuilder.java
+++ 
b/fesod-sheet/src/main/java/org/apache/fesod/sheet/read/builder/ExcelReaderSheetBuilder.java
@@ -119,13 +119,13 @@ public class ExcelReaderSheetBuilder extends 
AbstractExcelReaderParameterBuilder
      * @return
      */
     public ExcelReaderSheetBuilder includeColumnIndexes(List<Integer> 
columnIndexes) {
-        readSheet.setColumnIndexes(columnIndexes);
+        readSheet.setIncludeColumnIndexes(columnIndexes);
         return this;
     }
 
     public ExcelReaderSheetBuilder includeColumnIndexesIfNotNull(List<Integer> 
columnIndexes) {
         if (Objects.nonNull(columnIndexes)) {
-            readSheet.setColumnIndexes(columnIndexes);
+            readSheet.setIncludeColumnIndexes(columnIndexes);
         }
         return this;
     }
diff --git 
a/fesod-sheet/src/main/java/org/apache/fesod/sheet/read/metadata/ColumnIndexResolver.java
 
b/fesod-sheet/src/main/java/org/apache/fesod/sheet/read/metadata/ColumnIndexResolver.java
new file mode 100644
index 00000000..8470abb7
--- /dev/null
+++ 
b/fesod-sheet/src/main/java/org/apache/fesod/sheet/read/metadata/ColumnIndexResolver.java
@@ -0,0 +1,72 @@
+/*
+ * 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.fesod.sheet.read.metadata;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import org.apache.commons.lang3.Validate;
+import org.apache.fesod.common.util.MapUtils;
+
+/**
+ * Strategy interface for column index resolution and filtering during sheet 
parsing.
+ */
+@FunctionalInterface
+public interface ColumnIndexResolver {
+
+    /**
+     * Default pass-through resolver that performs no column filtering.
+     */
+    ColumnIndexResolver PASS_THROUGH = columnIndex -> columnIndex;
+
+    /**
+     * Resolves the raw column index to a target column index.
+     *
+     * @param columnIndex raw 0-based column index
+     * @return mapped target column index, or {@code null} if the column is 
not included
+     */
+    Integer resolve(int columnIndex);
+
+    static ColumnIndexResolver fromInclude(List<Integer> columnIndexes) {
+        return new DefaultIncludedColumnIndexResolver(columnIndexes);
+    }
+
+    class DefaultIncludedColumnIndexResolver implements ColumnIndexResolver {
+
+        private final Map<Integer, Integer> indexMap;
+
+        DefaultIncludedColumnIndexResolver(List<Integer> columnIndexes) {
+            Validate.notEmpty(columnIndexes, "The includeColumnIndexes must 
not be empty");
+            Validate.noNullElements(columnIndexes, "The includeColumnIndexes 
must not contain null elements");
+
+            List<Integer> tmpColumnIndexes = new ArrayList<>(columnIndexes);
+            this.indexMap = 
MapUtils.newHashMapWithExpectedSize(tmpColumnIndexes.size());
+
+            for (int targetIndex = 0; targetIndex < tmpColumnIndexes.size(); 
targetIndex++) {
+                this.indexMap.put(tmpColumnIndexes.get(targetIndex), 
targetIndex);
+            }
+        }
+
+        @Override
+        public Integer resolve(int columnIndex) {
+            return indexMap.get(columnIndex);
+        }
+    }
+}
diff --git 
a/fesod-sheet/src/main/java/org/apache/fesod/sheet/read/metadata/ReadSheet.java 
b/fesod-sheet/src/main/java/org/apache/fesod/sheet/read/metadata/ReadSheet.java
index 411c648d..29e187eb 100644
--- 
a/fesod-sheet/src/main/java/org/apache/fesod/sheet/read/metadata/ReadSheet.java
+++ 
b/fesod-sheet/src/main/java/org/apache/fesod/sheet/read/metadata/ReadSheet.java
@@ -56,9 +56,9 @@ public class ReadSheet extends ReadBasicParameter {
     public Integer numRows;
 
     /**
-     * Specific columns to read (0-based indexes)
+     * Resolver for column filtering and index remapping.
      */
-    private List<Integer> columnIndexes;
+    private ColumnIndexResolver columnIndexResolver = 
ColumnIndexResolver.PASS_THROUGH;
 
     public ReadSheet() {}
 
@@ -77,11 +77,11 @@ public class ReadSheet extends ReadBasicParameter {
         this.numRows = numRows;
     }
 
-    public ReadSheet(Integer sheetNo, String sheetName, Integer numRows, 
List<Integer> numCols) {
+    public ReadSheet(Integer sheetNo, String sheetName, Integer numRows, 
ColumnIndexResolver columnIndexResolver) {
         this.sheetNo = sheetNo;
         this.sheetName = sheetName;
         this.numRows = numRows;
-        this.columnIndexes = numCols;
+        this.columnIndexResolver = columnIndexResolver;
     }
 
     public Integer getSheetNo() {
@@ -124,12 +124,16 @@ public class ReadSheet extends ReadBasicParameter {
         this.sheetVeryHidden = sheetVeryHidden;
     }
 
-    public List<Integer> getColumnIndexes() {
-        return this.columnIndexes;
+    public ColumnIndexResolver getColumnIndexResolver() {
+        return this.columnIndexResolver;
     }
 
-    public void setColumnIndexes(List<Integer> columnIndexes) {
-        this.columnIndexes = columnIndexes;
+    public void setIncludeColumnIndexes(List<Integer> columnIndexes) {
+        this.columnIndexResolver = 
ColumnIndexResolver.fromInclude(columnIndexes);
+    }
+
+    public void setColumnIndexResolver(ColumnIndexResolver 
columnIndexResolver) {
+        this.columnIndexResolver = columnIndexResolver;
     }
 
     public void copyBasicParameter(ReadSheet other) {
@@ -147,7 +151,7 @@ public class ReadSheet extends ReadBasicParameter {
         this.setNumRows(other.getNumRows());
         this.setHidden(other.isHidden());
         this.setVeryHidden(other.isVeryHidden());
-        this.setColumnIndexes(other.getColumnIndexes());
+        this.setColumnIndexResolver(other.getColumnIndexResolver());
     }
 
     @Override
diff --git 
a/fesod-sheet/src/main/java/org/apache/fesod/sheet/read/metadata/holder/ReadSheetHolder.java
 
b/fesod-sheet/src/main/java/org/apache/fesod/sheet/read/metadata/holder/ReadSheetHolder.java
index 530c425c..def35c62 100644
--- 
a/fesod-sheet/src/main/java/org/apache/fesod/sheet/read/metadata/holder/ReadSheetHolder.java
+++ 
b/fesod-sheet/src/main/java/org/apache/fesod/sheet/read/metadata/holder/ReadSheetHolder.java
@@ -119,4 +119,8 @@ public class ReadSheetHolder extends AbstractReadHolder {
     public HolderEnum holderType() {
         return HolderEnum.SHEET;
     }
+
+    public Integer determineTargetColumnIndex(int columnIndex) {
+        return readSheet.getColumnIndexResolver().resolve(columnIndex);
+    }
 }
diff --git 
a/fesod-sheet/src/test/java/org/apache/fesod/sheet/FesodSheetTest.java 
b/fesod-sheet/src/test/java/org/apache/fesod/sheet/FesodSheetTest.java
index c885d491..38f04df7 100644
--- a/fesod-sheet/src/test/java/org/apache/fesod/sheet/FesodSheetTest.java
+++ b/fesod-sheet/src/test/java/org/apache/fesod/sheet/FesodSheetTest.java
@@ -310,7 +310,6 @@ class FesodSheetTest {
         Assertions.assertEquals(0, configuredSheet.getSheetNo());
         Assertions.assertEquals("Sheet1", configuredSheet.getSheetName());
         Assertions.assertEquals(100, configuredSheet.getNumRows());
-        Assertions.assertEquals(targetColumns, 
configuredSheet.getColumnIndexes());
         // data related tests
         Assertions.assertNotNull(readResults);
         Map<Integer, String> parsedRow = readResults.get(0);
diff --git 
a/fesod-sheet/src/test/java/org/apache/fesod/sheet/read/metadata/ColumnIndexResolverTest.java
 
b/fesod-sheet/src/test/java/org/apache/fesod/sheet/read/metadata/ColumnIndexResolverTest.java
new file mode 100644
index 00000000..f8adec1d
--- /dev/null
+++ 
b/fesod-sheet/src/test/java/org/apache/fesod/sheet/read/metadata/ColumnIndexResolverTest.java
@@ -0,0 +1,96 @@
+/*
+ * 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.fesod.sheet.read.metadata;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import org.apache.fesod.sheet.testkit.Tags;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
+
+/**
+ * Tests {@link ColumnIndexResolver}.
+ */
+@Tag(Tags.UNIT)
+class ColumnIndexResolverTest {
+
+    @Test
+    void shouldThrowWhenListIsEmptyOrNull() {
+        Assertions.assertThrows(NullPointerException.class, () -> 
ColumnIndexResolver.fromInclude(null));
+        Assertions.assertThrows(
+                IllegalArgumentException.class, () -> 
ColumnIndexResolver.fromInclude(Collections.emptyList()));
+        Assertions.assertThrows(
+                IllegalArgumentException.class, () -> 
ColumnIndexResolver.fromInclude(Arrays.asList(1, null)));
+    }
+
+    @Test
+    void passThroughShouldReturnOriginalIndex() {
+        ColumnIndexResolver resolver = ColumnIndexResolver.PASS_THROUGH;
+
+        Assertions.assertEquals(0, resolver.resolve(0));
+        Assertions.assertEquals(5, resolver.resolve(5));
+        Assertions.assertEquals(100, resolver.resolve(100));
+    }
+
+    @Test
+    void defaultResolverShouldMapAndFilterColumns() {
+        List<Integer> includeColumns = Arrays.asList(0, 2, 5);
+        ColumnIndexResolver resolver = 
ColumnIndexResolver.fromInclude(includeColumns);
+
+        Assertions.assertNotSame(ColumnIndexResolver.PASS_THROUGH, resolver);
+
+        Assertions.assertEquals(0, resolver.resolve(0));
+        Assertions.assertEquals(1, resolver.resolve(2));
+        Assertions.assertEquals(2, resolver.resolve(5));
+
+        Assertions.assertNull(resolver.resolve(1));
+        Assertions.assertNull(resolver.resolve(3));
+        Assertions.assertNull(resolver.resolve(4));
+        Assertions.assertNull(resolver.resolve(6));
+        Assertions.assertNull(resolver.resolve(99));
+    }
+
+    @Test
+    void defaultResolverShouldPreserveCustomColumnOrder() {
+        List<Integer> customOrderColumns = Arrays.asList(5, 2, 0);
+        ColumnIndexResolver resolver = 
ColumnIndexResolver.fromInclude(customOrderColumns);
+
+        Assertions.assertEquals(0, resolver.resolve(5));
+        Assertions.assertEquals(1, resolver.resolve(2));
+        Assertions.assertEquals(2, resolver.resolve(0));
+
+        Assertions.assertNull(resolver.resolve(1));
+        Assertions.assertNull(resolver.resolve(3));
+    }
+
+    @Test
+    void shouldSupportCustomLambdaResolver() {
+        ColumnIndexResolver evenColumnResolver = rawIndex -> (rawIndex % 2 == 
0) ? rawIndex / 2 : null;
+
+        Assertions.assertEquals(0, evenColumnResolver.resolve(0));
+        Assertions.assertEquals(1, evenColumnResolver.resolve(2));
+        Assertions.assertEquals(2, evenColumnResolver.resolve(4));
+
+        Assertions.assertNull(evenColumnResolver.resolve(1));
+        Assertions.assertNull(evenColumnResolver.resolve(3));
+    }
+}


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

Reply via email to