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]