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..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 @@ -223,21 +223,14 @@ 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().determineTargetColumnIndex(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..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 @@ -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().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 8a5d5895e..fc50e17a4 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 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 18cc1c02f..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 @@ -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().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 229a188a8..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 @@ -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().determineTargetColumnIndex(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..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 @@ -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().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 c718b85cc..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 @@ -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().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 ec0ea97bf..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 @@ -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().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 502c9f348..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 @@ -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().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 21eb39c6a..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 @@ -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().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 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 new file mode 100644 index 000000000..8470abb76 --- /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 columnIndexes) { + return new DefaultIncludedColumnIndexResolver(columnIndexes); + } + + class DefaultIncludedColumnIndexResolver implements ColumnIndexResolver { + + private final Map indexMap; + + 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()); + + 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 411c648d3..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 @@ -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 columnIndexes; + private ColumnIndexResolver columnIndexResolver = ColumnIndexResolver.PASS_THROUGH; public ReadSheet() {} @@ -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.columnIndexes = numCols; + this.columnIndexResolver = columnIndexResolver; } public Integer getSheetNo() { @@ -124,12 +124,16 @@ public void setVeryHidden(boolean sheetVeryHidden) { this.sheetVeryHidden = sheetVeryHidden; } - public List getColumnIndexes() { - return this.columnIndexes; + public ColumnIndexResolver getColumnIndexResolver() { + return this.columnIndexResolver; } - public void setColumnIndexes(List columnIndexes) { - this.columnIndexes = columnIndexes; + public void setIncludeColumnIndexes(List columnIndexes) { + this.columnIndexResolver = ColumnIndexResolver.fromInclude(columnIndexes); + } + + public void setColumnIndexResolver(ColumnIndexResolver columnIndexResolver) { + this.columnIndexResolver = columnIndexResolver; } 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.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 530c425ce..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 @@ -119,4 +119,8 @@ public Integer getTotal() { 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 c885d4912..38f04df7d 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..f8adec1da --- /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 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 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)); + } +}