This is an automated email from the ASF dual-hosted git repository.
bamaer pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/hop.git
The following commit(s) were added to refs/heads/main by this push:
new 217d3a6816 Issue #3123 : Add option to exclude the field to split from
output (#8678)
217d3a6816 is described below
commit 217d3a68167b96a824561ae670d8af51619d14c4
Author: Matt Casters <[email protected]>
AuthorDate: Thu Oct 1 09:10:29 2026 +0200
Issue #3123 : Add option to exclude the field to split from output (#8678)
---
.../pipeline/transforms/splitfieldtorows.adoc | 5 +-
.../splitfieldtorows/SplitFieldToRows.java | 12 ++-
.../splitfieldtorows/SplitFieldToRowsDialog.java | 28 ++++++-
.../splitfieldtorows/SplitFieldToRowsMeta.java | 30 +++++++
.../messages/messages_en_US.properties | 3 +
.../splitfieldtorows/SplitFieldToRowsMetaTest.java | 91 +++++++++++++++++++++-
.../splitfieldtorows/SplitFieldToRowsTest.java | 82 ++++++++++++++++++-
7 files changed, 238 insertions(+), 13 deletions(-)
diff --git
a/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/splitfieldtorows.adoc
b/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/splitfieldtorows.adoc
index 4cff7dd4f1..b5f2bc9625 100644
---
a/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/splitfieldtorows.adoc
+++
b/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/splitfieldtorows.adoc
@@ -29,9 +29,7 @@ The Split Fields To Rows transform splits a row containing a
delimited field int
The original row is not delivered to following transforms.
-The original field is left in each new row to assist in debugging or error
handling.
-
-It can be removed via a xref:pipeline/transforms/selectvalues.adoc[Select
Values] transform if needed.
+By default the original field is left in each new row to assist in debugging
or error handling. Enable *Exclude field to split from output* to drop that
field from the output rows. It can also be removed with a
xref:pipeline/transforms/selectvalues.adoc[Select Values] transform.
The original field must be a string field.
@@ -50,6 +48,7 @@ If the value type/format of the new row is not specified, the
new field will use
|Option|Description
|Transform name|Name of the transform.
|Field to split|The field you want to split.
+|Exclude field to split from output|When enabled, the field to split is
removed from each output row. The split values are still written to the new
field. Disabled by default, so existing pipelines keep the original field.
|Delimiter|The delimiter or separator used.
Special characters (e.g. CHAR ASCII HEX01) can be set with the format
$[value], e.g. $[01] or $[6F,FF,00,1F].
|Enclosure|Optional enclosure string. Delimiters inside a pair of enclosure
characters are not treated as split points, and the enclosure characters are
removed from the output values.
diff --git
a/plugins/transforms/splitfieldtorows/src/main/java/org/apache/hop/pipeline/transforms/splitfieldtorows/SplitFieldToRows.java
b/plugins/transforms/splitfieldtorows/src/main/java/org/apache/hop/pipeline/transforms/splitfieldtorows/SplitFieldToRows.java
index f3346945be..5984cda8f4 100644
---
a/plugins/transforms/splitfieldtorows/src/main/java/org/apache/hop/pipeline/transforms/splitfieldtorows/SplitFieldToRows.java
+++
b/plugins/transforms/splitfieldtorows/src/main/java/org/apache/hop/pipeline/transforms/splitfieldtorows/SplitFieldToRows.java
@@ -101,13 +101,17 @@ public class SplitFieldToRows extends
BaseTransform<SplitFieldToRowsMeta, SplitF
data.rownr = 1L;
}
+ Object[] baseRow = rowData;
+ if (meta.isExcludeSplitField()) {
+ baseRow = RowDataUtil.removeItem(rowData, data.fieldnr);
+ }
+ int newFieldIndex = data.outputRowMeta.size() - (meta.isIncludeRowNumber()
? 2 : 1);
String[] splitStrings = splitSource(originalString);
for (String string : splitStrings) {
- Object[] outputRow = RowDataUtil.createResizedCopy(rowData,
data.outputRowMeta.size());
- outputRow[rowMeta.size()] = string;
- // Include row number in output?
+ Object[] outputRow = RowDataUtil.createResizedCopy(baseRow,
data.outputRowMeta.size());
+ outputRow[newFieldIndex] = string;
if (meta.isIncludeRowNumber()) {
- outputRow[rowMeta.size() + 1] = data.rownr;
+ outputRow[newFieldIndex + 1] = data.rownr;
}
putRow(data.outputRowMeta, outputRow);
data.rownr++;
diff --git
a/plugins/transforms/splitfieldtorows/src/main/java/org/apache/hop/pipeline/transforms/splitfieldtorows/SplitFieldToRowsDialog.java
b/plugins/transforms/splitfieldtorows/src/main/java/org/apache/hop/pipeline/transforms/splitfieldtorows/SplitFieldToRowsDialog.java
index 79d02858bd..5e65515374 100644
---
a/plugins/transforms/splitfieldtorows/src/main/java/org/apache/hop/pipeline/transforms/splitfieldtorows/SplitFieldToRowsDialog.java
+++
b/plugins/transforms/splitfieldtorows/src/main/java/org/apache/hop/pipeline/transforms/splitfieldtorows/SplitFieldToRowsDialog.java
@@ -67,6 +67,8 @@ public class SplitFieldToRowsDialog extends
BaseTransformDialog {
private Button wDelimiterIsRegex;
+ private Button wExcludeSplitField;
+
public SplitFieldToRowsDialog(
Shell parent,
IVariables variables,
@@ -123,6 +125,26 @@ public class SplitFieldToRowsDialog extends
BaseTransformDialog {
}
});
+ Label wlExcludeSplitField = new Label(shell, SWT.RIGHT);
+ wlExcludeSplitField.setText(
+ BaseMessages.getString(PKG,
"SplitFieldToRowsDialog.ExcludeSplitField.Label"));
+ PropsUi.setLook(wlExcludeSplitField);
+ FormData fdlExcludeSplitField = new FormData();
+ fdlExcludeSplitField.left = new FormAttachment(0, 0);
+ fdlExcludeSplitField.top = new FormAttachment(wSplitField, margin);
+ fdlExcludeSplitField.right = new FormAttachment(middle, -margin);
+ wlExcludeSplitField.setLayoutData(fdlExcludeSplitField);
+ wExcludeSplitField = new Button(shell, SWT.CHECK);
+ wExcludeSplitField.setToolTipText(
+ BaseMessages.getString(PKG,
"SplitFieldToRowsDialog.ExcludeSplitField.Tooltip"));
+ PropsUi.setLook(wExcludeSplitField);
+ FormData fdExcludeSplitField = new FormData();
+ fdExcludeSplitField.left = new FormAttachment(middle, 0);
+ fdExcludeSplitField.top = new FormAttachment(wlExcludeSplitField, 0,
SWT.CENTER);
+ fdExcludeSplitField.right = new FormAttachment(100, 0);
+ wExcludeSplitField.setLayoutData(fdExcludeSplitField);
+ wExcludeSplitField.addSelectionListener(new
ComponentSelectionListener(input));
+
// Delimiter line
Label wlDelimiter = new Label(shell, SWT.RIGHT);
wlDelimiter.setText(BaseMessages.getString(PKG,
"SplitFieldToRowsDialog.Delimiter.Label"));
@@ -130,7 +152,7 @@ public class SplitFieldToRowsDialog extends
BaseTransformDialog {
FormData fdlDelimiter = new FormData();
fdlDelimiter.left = new FormAttachment(0, 0);
fdlDelimiter.right = new FormAttachment(middle, -margin);
- fdlDelimiter.top = new FormAttachment(wSplitField, margin);
+ fdlDelimiter.top = new FormAttachment(wExcludeSplitField, margin);
wlDelimiter.setLayoutData(fdlDelimiter);
wDelimiter = new TextVar(variables, shell, SWT.SINGLE | SWT.LEFT |
SWT.BORDER);
wDelimiter.setText("");
@@ -138,7 +160,7 @@ public class SplitFieldToRowsDialog extends
BaseTransformDialog {
wDelimiter.addModifyListener(lsMod);
FormData fdDelimiter = new FormData();
fdDelimiter.left = new FormAttachment(middle, 0);
- fdDelimiter.top = new FormAttachment(wSplitField, margin);
+ fdDelimiter.top = new FormAttachment(wExcludeSplitField, margin);
fdDelimiter.right = new FormAttachment(100, 0);
wDelimiter.setLayoutData(fdDelimiter);
@@ -320,6 +342,7 @@ public class SplitFieldToRowsDialog extends
BaseTransformDialog {
wValName.setText(Const.NVL(input.getNewFieldname(), ""));
wInclRownum.setSelection(input.isIncludeRowNumber());
wDelimiterIsRegex.setSelection(input.isIsDelimiterRegex());
+ wExcludeSplitField.setSelection(input.isExcludeSplitField());
if (input.getRowNumberField() != null) {
wInclRownumField.setText(input.getRowNumberField());
}
@@ -346,6 +369,7 @@ public class SplitFieldToRowsDialog extends
BaseTransformDialog {
input.setRowNumberField(wInclRownumField.getText());
input.setResetRowNumber(wResetRownum.getSelection());
input.setIsDelimiterRegex(wDelimiterIsRegex.getSelection());
+ input.setExcludeSplitField(wExcludeSplitField.getSelection());
dispose();
}
}
diff --git
a/plugins/transforms/splitfieldtorows/src/main/java/org/apache/hop/pipeline/transforms/splitfieldtorows/SplitFieldToRowsMeta.java
b/plugins/transforms/splitfieldtorows/src/main/java/org/apache/hop/pipeline/transforms/splitfieldtorows/SplitFieldToRowsMeta.java
index 232c9c441c..f2af542e69 100644
---
a/plugins/transforms/splitfieldtorows/src/main/java/org/apache/hop/pipeline/transforms/splitfieldtorows/SplitFieldToRowsMeta.java
+++
b/plugins/transforms/splitfieldtorows/src/main/java/org/apache/hop/pipeline/transforms/splitfieldtorows/SplitFieldToRowsMeta.java
@@ -103,6 +103,13 @@ public class SplitFieldToRowsMeta
injectionKeyDescription =
"SplitFieldsToRow.Injection.DelimiterIsRegexp.Description")
private boolean isDelimiterRegex;
+ /** Remove the field to split from each output row */
+ @HopMetadataProperty(
+ key = "exclude_split_field",
+ injectionKey = "EXCLUDE_SPLIT_FIELD",
+ injectionKeyDescription =
"SplitFieldsToRow.Injection.ExcludeSplitField.Description")
+ private boolean excludeSplitField;
+
public boolean isIsDelimiterRegex() {
return isDelimiterRegex;
}
@@ -165,6 +172,7 @@ public class SplitFieldToRowsMeta
newFieldname = "";
includeRowNumber = false;
isDelimiterRegex = false;
+ excludeSplitField = false;
rowNumberField = "";
resetRowNumber = true;
}
@@ -179,6 +187,14 @@ public class SplitFieldToRowsMeta
IHopMetadataProvider metadataProvider)
throws HopTransformException {
+ if (excludeSplitField && !Utils.isEmpty(splitField)) {
+ String realSplitField = variables.resolve(splitField);
+ int splitIndex = row.indexOfValue(realSplitField);
+ if (splitIndex >= 0) {
+ row.removeValueMeta(splitIndex);
+ }
+ }
+
IValueMeta v = new ValueMetaString(newFieldname);
v.setOrigin(name);
row.addValueMeta(v);
@@ -348,4 +364,18 @@ public class SplitFieldToRowsMeta
public boolean isIncludeRowNumber() {
return includeRowNumber;
}
+
+ /**
+ * @return {@code true} when the field to split is removed from the output
+ */
+ public boolean isExcludeSplitField() {
+ return excludeSplitField;
+ }
+
+ /**
+ * @param excludeSplitField {@code true} to remove the field to split from
the output
+ */
+ public void setExcludeSplitField(boolean excludeSplitField) {
+ this.excludeSplitField = excludeSplitField;
+ }
}
diff --git
a/plugins/transforms/splitfieldtorows/src/main/resources/org/apache/hop/pipeline/transforms/splitfieldtorows/messages/messages_en_US.properties
b/plugins/transforms/splitfieldtorows/src/main/resources/org/apache/hop/pipeline/transforms/splitfieldtorows/messages/messages_en_US.properties
index 170f97675f..42b8fcdc69 100644
---
a/plugins/transforms/splitfieldtorows/src/main/resources/org/apache/hop/pipeline/transforms/splitfieldtorows/messages/messages_en_US.properties
+++
b/plugins/transforms/splitfieldtorows/src/main/resources/org/apache/hop/pipeline/transforms/splitfieldtorows/messages/messages_en_US.properties
@@ -18,6 +18,7 @@
SplitFieldsToRow.Injection.Delimiter.Description=Field''s delimiter character
SplitFieldsToRow.Injection.DelimiterIsRegexp.Description=Delimiter is a
Regular Expression
SplitFieldsToRow.Injection.Enclosure.Description=Enclosure string. Delimiters
inside enclosure pairs are not treated as split points.
+SplitFieldsToRow.Injection.ExcludeSplitField.Description=Exclude the field to
split from the output? (Y/N)
SplitFieldsToRow.Injection.FieldToSplit.Description=Field to split
SplitFieldsToRow.Injection.IncludeRowNum.Description=Include rownum field in
output?(Y/N)
SplitFieldsToRow.Injection.NewFieldname.Description=New field name
@@ -36,6 +37,8 @@ SplitFieldToRowsDialog.DelimiterIsRegex.Label=Delimiter is a
Regular Expression
SplitFieldToRowsDialog.DelimiterIsRegex.Tooltip=Check this if the delimiter is
to be interpreted as a regular expression.\nRegex features like lookahead and
lookbehind often prove very useful in string split contexts.
SplitFieldToRowsDialog.Enclosure.Label=Enclosure
SplitFieldToRowsDialog.Enclosure.Tooltip=Ignore delimiters within pairs of
enclosures (leave blank if none).\nEnclosure characters are removed from the
output values.\nThis option is ignored when the delimiter is a regular
expression.
+SplitFieldToRowsDialog.ExcludeSplitField.Label=Exclude field to split from
output
+SplitFieldToRowsDialog.ExcludeSplitField.Tooltip=Remove the field to split
from each output row.\nSplit values are still written to the new field.
SplitFieldToRowsDialog.InclRownum.Label=Include rownum in output
SplitFieldToRowsDialog.InclRownum.Tooltip=Check this to add a field (Integer)
containing the row number.
SplitFieldToRowsDialog.InclRownumField.Label=Rownum fieldname
diff --git
a/plugins/transforms/splitfieldtorows/src/test/java/org/apache/hop/pipeline/transforms/splitfieldtorows/SplitFieldToRowsMetaTest.java
b/plugins/transforms/splitfieldtorows/src/test/java/org/apache/hop/pipeline/transforms/splitfieldtorows/SplitFieldToRowsMetaTest.java
index 4f14449b1e..5713040be4 100644
---
a/plugins/transforms/splitfieldtorows/src/test/java/org/apache/hop/pipeline/transforms/splitfieldtorows/SplitFieldToRowsMetaTest.java
+++
b/plugins/transforms/splitfieldtorows/src/test/java/org/apache/hop/pipeline/transforms/splitfieldtorows/SplitFieldToRowsMetaTest.java
@@ -17,12 +17,19 @@
package org.apache.hop.pipeline.transforms.splitfieldtorows;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.hop.core.HopEnvironment;
import org.apache.hop.core.exception.HopException;
+import org.apache.hop.core.row.IRowMeta;
+import org.apache.hop.core.row.RowMeta;
+import org.apache.hop.core.row.value.ValueMetaString;
+import org.apache.hop.core.variables.Variables;
import org.apache.hop.junit.rules.RestoreHopEngineEnvironmentExtension;
import org.apache.hop.pipeline.transforms.loadsave.LoadSaveTester;
import
org.apache.hop.pipeline.transforms.loadsave.validator.IFieldLoadSaveValidator;
@@ -50,7 +57,8 @@ class SplitFieldToRowsMetaTest {
"includeRowNumber",
"rowNumberField",
"resetRowNumber",
- "delimiterRegex");
+ "delimiterRegex",
+ "excludeSplitField");
Map<String, String> getterMap = new HashMap<>();
getterMap.put("includeRowNumber", "isIncludeRowNumber");
@@ -73,4 +81,85 @@ class SplitFieldToRowsMetaTest {
loadSaveTester.testSerialization();
}
+
+ @Test
+ void getFieldsKeepsSplitFieldByDefault() throws Exception {
+ SplitFieldToRowsMeta meta = meta("licenses_string", "licenses");
+
+ IRowMeta row = inputRow();
+ meta.getFields(row, "split", null, null, new Variables(), null);
+
+ assertEquals(List.of("id", "licenses_string", "name", "licenses"),
names(row));
+ }
+
+ @Test
+ void getFieldsRemovesSplitFieldWhenExcluded() throws Exception {
+ SplitFieldToRowsMeta meta = meta("licenses_string", "licenses");
+ meta.setExcludeSplitField(true);
+
+ IRowMeta row = inputRow();
+ meta.getFields(row, "split", null, null, new Variables(), null);
+
+ assertEquals(List.of("id", "name", "licenses"), names(row));
+ assertTrue(row.searchValueMeta("licenses").isString());
+ }
+
+ @Test
+ void getFieldsRemovesSplitFieldResolvedFromVariable() throws Exception {
+ SplitFieldToRowsMeta meta = meta("${FIELD}", "licenses");
+ meta.setExcludeSplitField(true);
+ Variables variables = new Variables();
+ variables.setVariable("FIELD", "licenses_string");
+
+ IRowMeta row = inputRow();
+ meta.getFields(row, "split", null, null, variables, null);
+
+ assertEquals(List.of("id", "name", "licenses"), names(row));
+ }
+
+ @Test
+ void getFieldsLeavesOtherFieldsWhenSplitFieldIsMissing() throws Exception {
+ SplitFieldToRowsMeta meta = meta("missing", "licenses");
+ meta.setExcludeSplitField(true);
+
+ IRowMeta row = inputRow();
+ meta.getFields(row, "split", null, null, new Variables(), null);
+
+ assertEquals(List.of("id", "licenses_string", "name", "licenses"),
names(row));
+ }
+
+ @Test
+ void getFieldsAppendsRowNumberAfterRemovingSplitField() throws Exception {
+ SplitFieldToRowsMeta meta = meta("licenses_string", "licenses");
+ meta.setExcludeSplitField(true);
+ meta.setIncludeRowNumber(true);
+ meta.setRowNumberField("${NR}");
+ Variables variables = new Variables();
+ variables.setVariable("NR", "nr");
+
+ IRowMeta row = inputRow();
+ meta.getFields(row, "split", null, null, variables, null);
+
+ assertEquals(List.of("id", "name", "licenses", "nr"), names(row));
+ assertTrue(row.searchValueMeta("nr").isInteger());
+ }
+
+ private static SplitFieldToRowsMeta meta(String splitField, String
newFieldname) {
+ SplitFieldToRowsMeta meta = new SplitFieldToRowsMeta();
+ meta.setSplitField(splitField);
+ meta.setNewFieldname(newFieldname);
+ return meta;
+ }
+
+ private static IRowMeta inputRow() {
+ RowMeta row = new RowMeta();
+ row.addValueMeta(new ValueMetaString("id"));
+ row.addValueMeta(new ValueMetaString("licenses_string"));
+ row.addValueMeta(new ValueMetaString("name"));
+ return row;
+ }
+
+ private static List<String> names(IRowMeta row) {
+ return List.of(row.getFieldNames());
+ }
}
diff --git
a/plugins/transforms/splitfieldtorows/src/test/java/org/apache/hop/pipeline/transforms/splitfieldtorows/SplitFieldToRowsTest.java
b/plugins/transforms/splitfieldtorows/src/test/java/org/apache/hop/pipeline/transforms/splitfieldtorows/SplitFieldToRowsTest.java
index bfe70166f6..4dc30e9c87 100644
---
a/plugins/transforms/splitfieldtorows/src/test/java/org/apache/hop/pipeline/transforms/splitfieldtorows/SplitFieldToRowsTest.java
+++
b/plugins/transforms/splitfieldtorows/src/test/java/org/apache/hop/pipeline/transforms/splitfieldtorows/SplitFieldToRowsTest.java
@@ -28,12 +28,14 @@ import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import org.apache.hop.core.BlockingRowSet;
import org.apache.hop.core.HopEnvironment;
import org.apache.hop.core.logging.ILoggingObject;
+import org.apache.hop.core.row.IRowMeta;
import org.apache.hop.core.row.RowMeta;
import org.apache.hop.core.row.value.ValueMetaString;
import org.apache.hop.junit.rules.RestoreHopEngineEnvironmentExtension;
@@ -51,6 +53,8 @@ class SplitFieldToRowsTest {
private TransformMockHelper<SplitFieldToRowsMeta, SplitFieldToRowsData>
transformMockHelper;
+ private IRowMeta lastOutputRowMeta;
+
@BeforeAll
static void initHop() throws Exception {
HopEnvironment.init();
@@ -199,6 +203,57 @@ class SplitFieldToRowsTest {
assertEquals(3L, rows.get(2)[2]);
}
+ @Test
+ void keepsSurroundingFieldsAndAppendsSplitValue() throws Exception {
+ SplitFieldToRowsMeta meta = createMeta(",", null, false);
+ List<Object[]> rows =
+ executeSplit(meta, row("id", "csv", "name"), new Object[] {"1", "a,b",
"n"}, Map.of());
+
+ assertEquals(List.of("1", "a,b", "n", "a"), prefix(rows.get(0), 4));
+ assertEquals(List.of("1", "a,b", "n", "b"), prefix(rows.get(1), 4));
+ assertEquals(List.of("id", "csv", "name", "value"), fieldNames());
+ }
+
+ @Test
+ void excludesSplitFieldFromOutput() throws Exception {
+ SplitFieldToRowsMeta meta = createMeta(",", null, false);
+ meta.setExcludeSplitField(true);
+ List<Object[]> rows =
+ executeSplit(meta, row("id", "csv", "name"), new Object[] {"1", "a,b",
"n"}, Map.of());
+
+ assertEquals(List.of("1", "n", "a"), prefix(rows.get(0), 3));
+ assertEquals(List.of("1", "n", "b"), prefix(rows.get(1), 3));
+ assertEquals(List.of("id", "name", "value"), fieldNames());
+ }
+
+ @Test
+ void excludesSplitFieldAndKeepsRowNumbers() throws Exception {
+ SplitFieldToRowsMeta meta = createMeta(",", null, false);
+ meta.setExcludeSplitField(true);
+ meta.setIncludeRowNumber(true);
+ meta.setRowNumberField("rowNr");
+ meta.setResetRowNumber(true);
+ List<Object[]> rows =
+ executeSplit(meta, row("id", "csv", "name"), new Object[] {"1", "a,b",
"n"}, Map.of());
+
+ assertEquals(List.of("1", "n", "a", 1L), prefix(rows.get(0), 4));
+ assertEquals(List.of("1", "n", "b", 2L), prefix(rows.get(1), 4));
+ assertEquals(List.of("id", "name", "value", "rowNr"), fieldNames());
+ }
+
+ @Test
+ void excludesSplitFieldResolvedFromVariable() throws Exception {
+ SplitFieldToRowsMeta meta = createMeta(",", null, false);
+ meta.setSplitField("${COL}");
+ meta.setExcludeSplitField(true);
+ List<Object[]> rows =
+ executeSplit(meta, row("id", "csv"), new Object[] {"1", "a,b"},
Map.of("COL", "csv"));
+
+ assertEquals(List.of("1", "a"), prefix(rows.get(0), 2));
+ assertEquals(List.of("1", "b"), prefix(rows.get(1), 2));
+ assertEquals(List.of("id", "value"), fieldNames());
+ }
+
private List<Object[]> executeSplit(
String value, String delimiter, String enclosure, boolean
delimiterIsRegex) throws Exception {
return executeSplit(createMeta(delimiter, enclosure, delimiterIsRegex),
value);
@@ -210,6 +265,12 @@ class SplitFieldToRowsTest {
private List<Object[]> executeSplit(
SplitFieldToRowsMeta meta, String value, Map<String, String> variables)
throws Exception {
+ return executeSplit(meta, row("csv"), new Object[] {value}, variables);
+ }
+
+ private List<Object[]> executeSplit(
+ SplitFieldToRowsMeta meta, RowMeta input, Object[] inputRow, Map<String,
String> variables)
+ throws Exception {
SplitFieldToRowsData data = new SplitFieldToRowsData();
when(transformMockHelper.transformMeta.getTransform()).thenReturn(meta);
@@ -224,19 +285,18 @@ class SplitFieldToRowsTest {
variables.forEach(transform::setVariable);
transform.init();
- RowMeta input = new RowMeta();
- input.addValueMeta(new ValueMetaString("csv"));
transform.setInputRowMeta(input);
BlockingRowSet output = new BlockingRowSet(20);
transform.setOutputRowSets(Collections.singletonList(output));
SplitFieldToRows spyTransform = spy(transform);
- doReturn(new Object[] {value}).doReturn(null).when(spyTransform).getRow();
+ doReturn(inputRow).doReturn(null).when(spyTransform).getRow();
assertTrue(spyTransform.processRow());
assertFalse(spyTransform.processRow());
+ lastOutputRowMeta = data.outputRowMeta;
List<Object[]> result = new ArrayList<>();
Object[] row;
while ((row = output.getRowImmediate()) != null) {
@@ -245,6 +305,22 @@ class SplitFieldToRowsTest {
return result;
}
+ private static RowMeta row(String... names) {
+ RowMeta input = new RowMeta();
+ for (String name : names) {
+ input.addValueMeta(new ValueMetaString(name));
+ }
+ return input;
+ }
+
+ private static List<Object> prefix(Object[] row, int size) {
+ return Arrays.asList(row).subList(0, size);
+ }
+
+ private List<String> fieldNames() {
+ return List.of(lastOutputRowMeta.getFieldNames());
+ }
+
private static SplitFieldToRowsMeta createMeta(
String delimiter, String enclosure, boolean delimiterIsRegex) {
SplitFieldToRowsMeta meta = new SplitFieldToRowsMeta();