From df5c57568cd3df2f5cd9084718929d8cb54d47b1 Mon Sep 17 00:00:00 2001 From: Bengbengbalabalabeng Date: Sat, 15 Aug 2026 22:49:15 +0800 Subject: [PATCH 1/4] refactor: replace includeColumnIndexes list lookup with ColumnIndexResolver --- .../analysis/csv/CsvExcelReadExecutor.java | 14 +-- .../v03/handlers/BlankRecordHandler.java | 15 +-- .../v03/handlers/BoolErrRecordHandler.java | 14 +-- .../v03/handlers/DummyRecordHandler.java | 14 +-- .../v03/handlers/FormulaRecordHandler.java | 14 +-- .../v03/handlers/LabelRecordHandler.java | 14 +-- .../v03/handlers/LabelSstRecordHandler.java | 14 +-- .../v03/handlers/NumberRecordHandler.java | 14 +-- .../v03/handlers/RkRecordHandler.java | 15 +-- .../analysis/v07/handlers/CellTagHandler.java | 18 +--- .../read/metadata/ColumnIndexResolver.java | 72 ++++++++++++++ .../fesod/sheet/read/metadata/ReadSheet.java | 18 ++-- .../read/metadata/holder/ReadSheetHolder.java | 4 + .../apache/fesod/sheet/FesodSheetTest.java | 1 - .../metadata/ColumnIndexResolverTest.java | 96 +++++++++++++++++++ 15 files changed, 219 insertions(+), 118 deletions(-) create mode 100644 fesod-sheet/src/main/java/org/apache/fesod/sheet/read/metadata/ColumnIndexResolver.java create mode 100644 fesod-sheet/src/test/java/org/apache/fesod/sheet/read/metadata/ColumnIndexResolverTest.java 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 833aba53b..6e0bb967a 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,15 @@ private void dealRecord(CSVRecord record, int rowIndex) { csvReadContext.csvReadWorkbookHolder().globalConfiguration().getAutoTrim(); Boolean autoStrip = csvReadContext.csvReadWorkbookHolder().globalConfiguration().getAutoStrip(); - List 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().determineIncludedColumnIndex(currentColumnIndex); + if (targetColumnIndex == null) { + continue; } ReadCellData 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 2cf1782e7..9f964271a 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 includeColumnIndexes = - xlsReadContext.readSheetHolder().getReadSheet().getColumnIndexes(); - - int targetColumnIndex = originalColumnIndex; - if (includeColumnIndexes != null) { - targetColumnIndex = includeColumnIndexes.indexOf(originalColumnIndex); - if (targetColumnIndex < 0) { - return; - } + Integer targetColumnIndex = xlsReadContext.readSheetHolder().determineIncludedColumnIndex(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 4fe379cab..c2cc28820 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.RowTypeEnum; @@ -41,17 +40,12 @@ public class BoolErrRecordHandler extends AbstractXlsRecordHandler implements Ig @Override public void processRecord(XlsReadContext xlsReadContext, Record record) { BoolErrRecord ber = (BoolErrRecord) record; - int originalColumnIndex = ber.getColumn(); - List includeColumnIndexes = - xlsReadContext.readSheetHolder().getReadSheet().getColumnIndexes(); - int targetColumnIndex = originalColumnIndex; - if (includeColumnIndexes != null) { - targetColumnIndex = includeColumnIndexes.indexOf(originalColumnIndex); - if (targetColumnIndex < 0) { - return; - } + Integer targetColumnIndex = xlsReadContext.readSheetHolder().determineIncludedColumnIndex(ber.getColumn()); + if (targetColumnIndex == null) { + return; } + xlsReadContext .xlsReadSheetHolder() .getCellMap() 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 18cc1c02f..2d33e2f6a 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 void processRecord(XlsReadContext xlsReadContext, Record record) { xlsReadSheetHolder.setTempRowType(RowTypeEnum.EMPTY); } else if (record instanceof MissingCellDummyRecord) { MissingCellDummyRecord mcdr = (MissingCellDummyRecord) record; - int originalColumnIndex = mcdr.getColumn(); - List includeColumnIndexes = - xlsReadContext.readSheetHolder().getReadSheet().getColumnIndexes(); - int targetColumnIndex = originalColumnIndex; - if (includeColumnIndexes != null) { - targetColumnIndex = includeColumnIndexes.indexOf(originalColumnIndex); - if (targetColumnIndex < 0) { - return; - } + Integer targetColumnIndex = xlsReadContext.readSheetHolder().determineIncludedColumnIndex(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 229a188a8..545c86129 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 includeColumnIndexes = - xlsReadContext.readSheetHolder().getReadSheet().getColumnIndexes(); - - int targetColumnIndex = originalColumnIndex; - if (includeColumnIndexes != null) { - targetColumnIndex = includeColumnIndexes.indexOf(originalColumnIndex); - if (targetColumnIndex < 0) { - return; - } + Integer targetColumnIndex = xlsReadContext.readSheetHolder().determineIncludedColumnIndex(frec.getColumn()); + if (targetColumnIndex == null) { + return; } Map 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 0df77a3b5..d8fe77bfd 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 includeColumnIndexes = - xlsReadContext.readSheetHolder().getReadSheet().getColumnIndexes(); - - int targetColumnIndex = originalColumnIndex; - if (includeColumnIndexes != null) { - targetColumnIndex = includeColumnIndexes.indexOf(originalColumnIndex); - if (targetColumnIndex < 0) { - return; - } + Integer targetColumnIndex = xlsReadContext.readSheetHolder().determineIncludedColumnIndex(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 c718b85cc..c6f2bb905 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 includeColumnIndexes = - xlsReadContext.readSheetHolder().getReadSheet().getColumnIndexes(); - - int targetColumnIndex = originalColumnIndex; - if (includeColumnIndexes != null) { - targetColumnIndex = includeColumnIndexes.indexOf(originalColumnIndex); - if (targetColumnIndex < 0) { - return; - } + Integer targetColumnIndex = xlsReadContext.readSheetHolder().determineIncludedColumnIndex(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 ec0ea97bf..1102175ce 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 includeColumnIndexes = - xlsReadContext.readSheetHolder().getReadSheet().getColumnIndexes(); - - int targetColumnIndex = originalColumnIndex; - if (includeColumnIndexes != null) { - targetColumnIndex = includeColumnIndexes.indexOf(originalColumnIndex); - if (targetColumnIndex < 0) { - return; - } + Integer targetColumnIndex = xlsReadContext.readSheetHolder().determineIncludedColumnIndex(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 502c9f348..051a9aee9 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 includeColumnIndexes = - xlsReadContext.readSheetHolder().getReadSheet().getColumnIndexes(); - - int targetColumnIndex = originalColumnIndex; - if (includeColumnIndexes != null) { - targetColumnIndex = includeColumnIndexes.indexOf(originalColumnIndex); - if (targetColumnIndex < 0) { - return; - } + Integer targetColumnIndex = xlsReadContext.readSheetHolder().determineIncludedColumnIndex(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 21eb39c6a..528caf0b9 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 void startElement(XlsxReadContext xlsxReadContext, String name, Attribute public void endElement(XlsxReadContext xlsxReadContext, String name) { XlsxReadSheetHolder xlsxReadSheetHolder = xlsxReadContext.xlsxReadSheetHolder(); ReadCellData tempCellData = xlsxReadSheetHolder.getTempCellData(); - int targetColumnIndex = 0; - List 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().determineIncludedColumnIndex(xlsxReadSheetHolder.getColumnIndex()); + if (targetColumnIndex == null) { + return; } StringBuilder tempData = xlsxReadSheetHolder.getTempData(); 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 000000000..f53f402fa --- /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.collections4.CollectionUtils; +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 from(List includeColumnIndexes) { + if (CollectionUtils.isEmpty(includeColumnIndexes)) { + return PASS_THROUGH; + } + return new DefaultColumnIndexResolver(includeColumnIndexes); + } + + class DefaultColumnIndexResolver implements ColumnIndexResolver { + + private final Map indexMap; + + DefaultColumnIndexResolver(List includeColumnIndexes) { + List columnIndexes = new ArrayList<>(includeColumnIndexes); + this.indexMap = MapUtils.newHashMapWithExpectedSize(columnIndexes.size()); + + for (int targetIndex = 0; targetIndex < columnIndexes.size(); targetIndex++) { + this.indexMap.put(columnIndexes.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 411c648d3..9477f272d 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 reading included columns. */ - private List columnIndexes; + private ColumnIndexResolver includeColumnIndexResolver = ColumnIndexResolver.PASS_THROUGH; public ReadSheet() {} @@ -81,7 +81,7 @@ public ReadSheet(Integer sheetNo, String sheetName, Integer numRows, List getColumnIndexes() { - return this.columnIndexes; + public ColumnIndexResolver getIncludedColumnIndexResolver() { + return this.includeColumnIndexResolver; } public void setColumnIndexes(List columnIndexes) { - this.columnIndexes = columnIndexes; + this.includeColumnIndexResolver = ColumnIndexResolver.from(columnIndexes); + } + + public void setIncludedColumnIndexResolver(ColumnIndexResolver includeColumnIndexResolver) { + this.includeColumnIndexResolver = includeColumnIndexResolver; } public void copyBasicParameter(ReadSheet other) { @@ -147,7 +151,7 @@ public void copyBasicParameter(ReadSheet other) { this.setNumRows(other.getNumRows()); this.setHidden(other.isHidden()); this.setVeryHidden(other.isVeryHidden()); - this.setColumnIndexes(other.getColumnIndexes()); + this.setIncludedColumnIndexResolver(other.getIncludedColumnIndexResolver()); } @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 530c425ce..ddb0a87a5 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 Integer getTotal() { public HolderEnum holderType() { return HolderEnum.SHEET; } + + public Integer determineIncludedColumnIndex(int columnIndex) { + return readSheet.getIncludedColumnIndexResolver().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 bcc6ad3e9..97771b9f5 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 @@ void testReadSheet_withColumnIndexes_shouldConfigureAll() { 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 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 000000000..57912542b --- /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 shouldReturnPassThroughWhenListIsEmptyOrNull() { + ColumnIndexResolver resolverForNull = ColumnIndexResolver.from(null); + Assertions.assertSame(ColumnIndexResolver.PASS_THROUGH, resolverForNull); + + ColumnIndexResolver resolverForEmpty = ColumnIndexResolver.from(Collections.emptyList()); + Assertions.assertSame(ColumnIndexResolver.PASS_THROUGH, resolverForEmpty); + } + + @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 includeColumns = Arrays.asList(0, 2, 5); + ColumnIndexResolver resolver = ColumnIndexResolver.from(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 customOrderColumns = Arrays.asList(5, 2, 0); + ColumnIndexResolver resolver = ColumnIndexResolver.from(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)); + } +} From 4c6d1247df54c0f1de4e6bb059dc265132a25b5d Mon Sep 17 00:00:00 2001 From: Bengbengbalabalabeng Date: Sun, 16 Aug 2026 09:55:12 +0800 Subject: [PATCH 2/4] style: some renaming --- .../analysis/csv/CsvExcelReadExecutor.java | 3 +-- .../v03/handlers/BlankRecordHandler.java | 2 +- .../v03/handlers/BoolErrRecordHandler.java | 2 +- .../v03/handlers/DummyRecordHandler.java | 2 +- .../v03/handlers/FormulaRecordHandler.java | 2 +- .../v03/handlers/LabelRecordHandler.java | 2 +- .../v03/handlers/LabelSstRecordHandler.java | 2 +- .../v03/handlers/NumberRecordHandler.java | 2 +- .../v03/handlers/RkRecordHandler.java | 2 +- .../analysis/v07/handlers/CellTagHandler.java | 2 +- .../sheet/read/builder/CsvReaderBuilder.java | 2 +- .../read/builder/ExcelReaderSheetBuilder.java | 4 ++-- .../read/metadata/ColumnIndexResolver.java | 23 +++++++++---------- .../fesod/sheet/read/metadata/ReadSheet.java | 20 ++++++++-------- .../read/metadata/holder/ReadSheetHolder.java | 4 ++-- .../metadata/ColumnIndexResolverTest.java | 14 +++++------ 16 files changed, 42 insertions(+), 46 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 6e0bb967a..8754b9763 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 @@ -228,8 +228,7 @@ private void dealRecord(CSVRecord record, int rowIndex) { String cellString = cellIterator.next(); int currentColumnIndex = columnIndex++; - Integer targetColumnIndex = - csvReadContext.readSheetHolder().determineIncludedColumnIndex(currentColumnIndex); + Integer targetColumnIndex = csvReadContext.readSheetHolder().determineTargetColumnIndex(currentColumnIndex); if (targetColumnIndex == null) { continue; } 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 9f964271a..3adefb6d4 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 @@ -40,7 +40,7 @@ public class BlankRecordHandler extends AbstractXlsRecordHandler implements Igno public void processRecord(XlsReadContext xlsReadContext, Record record) { BlankRecord br = (BlankRecord) record; - Integer targetColumnIndex = xlsReadContext.readSheetHolder().determineIncludedColumnIndex(br.getColumn()); + Integer targetColumnIndex = xlsReadContext.readSheetHolder().determineTargetColumnIndex(br.getColumn()); if (targetColumnIndex == null) { return; } 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 c2cc28820..a2d84e169 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 @@ -41,7 +41,7 @@ public class BoolErrRecordHandler extends AbstractXlsRecordHandler implements Ig public void processRecord(XlsReadContext xlsReadContext, Record record) { BoolErrRecord ber = (BoolErrRecord) record; - Integer targetColumnIndex = xlsReadContext.readSheetHolder().determineIncludedColumnIndex(ber.getColumn()); + Integer targetColumnIndex = xlsReadContext.readSheetHolder().determineTargetColumnIndex(ber.getColumn()); if (targetColumnIndex == null) { return; } 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 2d33e2f6a..28f09292f 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 @@ -59,7 +59,7 @@ public void processRecord(XlsReadContext xlsReadContext, Record record) { } else if (record instanceof MissingCellDummyRecord) { MissingCellDummyRecord mcdr = (MissingCellDummyRecord) record; - Integer targetColumnIndex = xlsReadContext.readSheetHolder().determineIncludedColumnIndex(mcdr.getColumn()); + Integer targetColumnIndex = xlsReadContext.readSheetHolder().determineTargetColumnIndex(mcdr.getColumn()); if (targetColumnIndex == null) { return; } 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 545c86129..1dbf3d32b 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 @@ -54,7 +54,7 @@ public class FormulaRecordHandler extends AbstractXlsRecordHandler implements Ig public void processRecord(XlsReadContext xlsReadContext, Record record) { FormulaRecord frec = (FormulaRecord) record; - Integer targetColumnIndex = xlsReadContext.readSheetHolder().determineIncludedColumnIndex(frec.getColumn()); + Integer targetColumnIndex = xlsReadContext.readSheetHolder().determineTargetColumnIndex(frec.getColumn()); if (targetColumnIndex == null) { return; } 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 d8fe77bfd..615f53bec 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 @@ -42,7 +42,7 @@ public class LabelRecordHandler extends AbstractXlsRecordHandler implements Igno public void processRecord(XlsReadContext xlsReadContext, Record record) { LabelRecord lrec = (LabelRecord) record; - Integer targetColumnIndex = xlsReadContext.readSheetHolder().determineIncludedColumnIndex(lrec.getColumn()); + Integer targetColumnIndex = xlsReadContext.readSheetHolder().determineTargetColumnIndex(lrec.getColumn()); if (targetColumnIndex == null) { return; } 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 c6f2bb905..248a8fc22 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 @@ -46,7 +46,7 @@ public class LabelSstRecordHandler extends AbstractXlsRecordHandler implements I public void processRecord(XlsReadContext xlsReadContext, Record record) { LabelSSTRecord lsrec = (LabelSSTRecord) record; - Integer targetColumnIndex = xlsReadContext.readSheetHolder().determineIncludedColumnIndex(lsrec.getColumn()); + Integer targetColumnIndex = xlsReadContext.readSheetHolder().determineTargetColumnIndex(lsrec.getColumn()); if (targetColumnIndex == null) { return; } 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 1102175ce..55261e2cc 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 @@ -44,7 +44,7 @@ public class NumberRecordHandler extends AbstractXlsRecordHandler implements Ign public void processRecord(XlsReadContext xlsReadContext, Record record) { NumberRecord nr = (NumberRecord) record; - Integer targetColumnIndex = xlsReadContext.readSheetHolder().determineIncludedColumnIndex(nr.getColumn()); + Integer targetColumnIndex = xlsReadContext.readSheetHolder().determineTargetColumnIndex(nr.getColumn()); if (targetColumnIndex == null) { return; } 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 051a9aee9..1d117e64e 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 @@ -40,7 +40,7 @@ public class RkRecordHandler extends AbstractXlsRecordHandler implements Ignorab public void processRecord(XlsReadContext xlsReadContext, Record record) { RKRecord re = (RKRecord) record; - Integer targetColumnIndex = xlsReadContext.readSheetHolder().determineIncludedColumnIndex(re.getColumn()); + Integer targetColumnIndex = xlsReadContext.readSheetHolder().determineTargetColumnIndex(re.getColumn()); if (targetColumnIndex == null) { return; } 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 528caf0b9..df9720bb9 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 @@ -87,7 +87,7 @@ public void endElement(XlsxReadContext xlsxReadContext, String name) { ReadCellData tempCellData = xlsxReadSheetHolder.getTempCellData(); Integer targetColumnIndex = - xlsxReadContext.readSheetHolder().determineIncludedColumnIndex(xlsxReadSheetHolder.getColumnIndex()); + xlsxReadContext.readSheetHolder().determineTargetColumnIndex(xlsxReadSheetHolder.getColumnIndex()); if (targetColumnIndex == null) { return; } 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 84b8cb8e9..5be1fe1de 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 CsvReaderBuilder nullString(String nullString) { * @return */ public CsvReaderBuilder includeColumnIndexes(List 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 38040ce09..4f00e9ba6 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 ReadSheet build() { * @return */ public ExcelReaderSheetBuilder includeColumnIndexes(List columnIndexes) { - readSheet.setColumnIndexes(columnIndexes); + readSheet.setIncludeColumnIndexes(columnIndexes); return this; } public ExcelReaderSheetBuilder includeColumnIndexesIfNotNull(List 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 index f53f402fa..a19aba047 100644 --- 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 @@ -22,7 +22,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; -import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.Validate; import org.apache.fesod.common.util.MapUtils; /** @@ -44,23 +44,22 @@ public interface ColumnIndexResolver { */ Integer resolve(int columnIndex); - static ColumnIndexResolver from(List includeColumnIndexes) { - if (CollectionUtils.isEmpty(includeColumnIndexes)) { - return PASS_THROUGH; - } - return new DefaultColumnIndexResolver(includeColumnIndexes); + static ColumnIndexResolver fromInclude(List columnIndexes) { + return new DefaultIncludedColumnIndexResolver(columnIndexes); } - class DefaultColumnIndexResolver implements ColumnIndexResolver { + class DefaultIncludedColumnIndexResolver implements ColumnIndexResolver { private final Map indexMap; - DefaultColumnIndexResolver(List includeColumnIndexes) { - List columnIndexes = new ArrayList<>(includeColumnIndexes); - this.indexMap = MapUtils.newHashMapWithExpectedSize(columnIndexes.size()); + DefaultIncludedColumnIndexResolver(List columnIndexes) { + Validate.notEmpty(columnIndexes, "The includeColumnIndexes must not be empty"); + + List tmpColumnIndexes = new ArrayList<>(columnIndexes); + this.indexMap = MapUtils.newHashMapWithExpectedSize(tmpColumnIndexes.size()); - for (int targetIndex = 0; targetIndex < columnIndexes.size(); targetIndex++) { - this.indexMap.put(columnIndexes.get(targetIndex), targetIndex); + for (int targetIndex = 0; targetIndex < tmpColumnIndexes.size(); targetIndex++) { + this.indexMap.put(tmpColumnIndexes.get(targetIndex), targetIndex); } } 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 9477f272d..e302dfb79 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; /** - * Resolver for reading included columns. + * Resolver for column filtering and index remapping. */ - private ColumnIndexResolver includeColumnIndexResolver = ColumnIndexResolver.PASS_THROUGH; + private ColumnIndexResolver columnIndexResolver = ColumnIndexResolver.PASS_THROUGH; public ReadSheet() {} @@ -81,7 +81,7 @@ public ReadSheet(Integer sheetNo, String sheetName, Integer numRows, List columnIndexes) { - this.includeColumnIndexResolver = ColumnIndexResolver.from(columnIndexes); + public void setIncludeColumnIndexes(List columnIndexes) { + this.columnIndexResolver = ColumnIndexResolver.fromInclude(columnIndexes); } - public void setIncludedColumnIndexResolver(ColumnIndexResolver includeColumnIndexResolver) { - this.includeColumnIndexResolver = includeColumnIndexResolver; + public void setColumnIndexResolver(ColumnIndexResolver columnIndexResolver) { + this.columnIndexResolver = columnIndexResolver; } public void copyBasicParameter(ReadSheet other) { @@ -151,7 +151,7 @@ public void copyBasicParameter(ReadSheet other) { this.setNumRows(other.getNumRows()); this.setHidden(other.isHidden()); this.setVeryHidden(other.isVeryHidden()); - this.setIncludedColumnIndexResolver(other.getIncludedColumnIndexResolver()); + 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 ddb0a87a5..def35c622 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 @@ -120,7 +120,7 @@ public HolderEnum holderType() { return HolderEnum.SHEET; } - public Integer determineIncludedColumnIndex(int columnIndex) { - return readSheet.getIncludedColumnIndexResolver().resolve(columnIndex); + public Integer determineTargetColumnIndex(int columnIndex) { + return readSheet.getColumnIndexResolver().resolve(columnIndex); } } 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 index 57912542b..30faff861 100644 --- 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 @@ -34,12 +34,10 @@ class ColumnIndexResolverTest { @Test - void shouldReturnPassThroughWhenListIsEmptyOrNull() { - ColumnIndexResolver resolverForNull = ColumnIndexResolver.from(null); - Assertions.assertSame(ColumnIndexResolver.PASS_THROUGH, resolverForNull); - - ColumnIndexResolver resolverForEmpty = ColumnIndexResolver.from(Collections.emptyList()); - Assertions.assertSame(ColumnIndexResolver.PASS_THROUGH, resolverForEmpty); + void shouldThrowWhenListIsEmptyOrNull() { + Assertions.assertThrows(NullPointerException.class, () -> ColumnIndexResolver.fromInclude(null)); + Assertions.assertThrows( + IllegalArgumentException.class, () -> ColumnIndexResolver.fromInclude(Collections.emptyList())); } @Test @@ -54,7 +52,7 @@ void passThroughShouldReturnOriginalIndex() { @Test void defaultResolverShouldMapAndFilterColumns() { List includeColumns = Arrays.asList(0, 2, 5); - ColumnIndexResolver resolver = ColumnIndexResolver.from(includeColumns); + ColumnIndexResolver resolver = ColumnIndexResolver.fromInclude(includeColumns); Assertions.assertNotSame(ColumnIndexResolver.PASS_THROUGH, resolver); @@ -72,7 +70,7 @@ void defaultResolverShouldMapAndFilterColumns() { @Test void defaultResolverShouldPreserveCustomColumnOrder() { List customOrderColumns = Arrays.asList(5, 2, 0); - ColumnIndexResolver resolver = ColumnIndexResolver.from(customOrderColumns); + ColumnIndexResolver resolver = ColumnIndexResolver.fromInclude(customOrderColumns); Assertions.assertEquals(0, resolver.resolve(5)); Assertions.assertEquals(1, resolver.resolve(2)); From 686c94705dc201730b33bc001238e34eb25e57e3 Mon Sep 17 00:00:00 2001 From: Bengbengbalabalabeng Date: Sun, 16 Aug 2026 19:54:41 +0800 Subject: [PATCH 3/4] fix: covers null element checks --- .../apache/fesod/sheet/read/metadata/ColumnIndexResolver.java | 1 + .../fesod/sheet/read/metadata/ColumnIndexResolverTest.java | 2 ++ 2 files changed, 3 insertions(+) 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 index a19aba047..8470abb76 100644 --- 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 @@ -54,6 +54,7 @@ class DefaultIncludedColumnIndexResolver implements ColumnIndexResolver { DefaultIncludedColumnIndexResolver(List columnIndexes) { Validate.notEmpty(columnIndexes, "The includeColumnIndexes must not be empty"); + Validate.noNullElements(columnIndexes, "The includeColumnIndexes must not contain null elements"); List tmpColumnIndexes = new ArrayList<>(columnIndexes); this.indexMap = MapUtils.newHashMapWithExpectedSize(tmpColumnIndexes.size()); 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 index 30faff861..f8adec1da 100644 --- 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 @@ -38,6 +38,8 @@ 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 From 35757d7b31fc47b95375ab96b30707fe9c6846c1 Mon Sep 17 00:00:00 2001 From: Bengbengbalabalabeng Date: Tue, 18 Aug 2026 17:30:27 +0800 Subject: [PATCH 4/4] refactor: replace columns list with ColumnIndexResolver in constructor --- .../java/org/apache/fesod/sheet/read/metadata/ReadSheet.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 e302dfb79..29e187eb8 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 @@ -77,11 +77,11 @@ public ReadSheet(Integer sheetNo, String sheetName, Integer numRows) { this.numRows = numRows; } - public ReadSheet(Integer sheetNo, String sheetName, Integer numRows, List numCols) { + public ReadSheet(Integer sheetNo, String sheetName, Integer numRows, ColumnIndexResolver columnIndexResolver) { this.sheetNo = sheetNo; this.sheetName = sheetName; this.numRows = numRows; - this.columnIndexResolver = ColumnIndexResolver.fromInclude(numCols); + this.columnIndexResolver = columnIndexResolver; } public Integer getSheetNo() {