diff --git a/pom.xml b/pom.xml index 171e334e9..3e425e175 100644 --- a/pom.xml +++ b/pom.xml @@ -293,7 +293,7 @@ io.github.bonigarcia webdrivermanager - 5.4.0 + 5.4.1 diff --git a/webtau-core-groovy/src/test/groovy/org/testingisdocumenting/webtau/data/table/TableDataGroovyTest.groovy b/webtau-core-groovy/src/test/groovy/org/testingisdocumenting/webtau/data/table/TableDataGroovyTest.groovy index 5e19f9bff..52c901b11 100644 --- a/webtau-core-groovy/src/test/groovy/org/testingisdocumenting/webtau/data/table/TableDataGroovyTest.groovy +++ b/webtau-core-groovy/src/test/groovy/org/testingisdocumenting/webtau/data/table/TableDataGroovyTest.groovy @@ -81,6 +81,24 @@ class TableDataGroovyTest { "id31" | "id32" | "description three" } } + @Test + void "should merge in another table using only matching column names"() { + def table = ["hello" | "world"] { + 12 | 46 + 54 | 88 } + + def incoming = ["extra" | "hello"] { + 700 | 24 + 800 | 48 } + + table.addRowsExistingColumnsOnly(incoming) + table.should == ["hello" | "world"] { + 12 | 46 + 54 | 88 + 24 | null + 48 | null } + } + @Test void "should generate multiple rows from multi-values"() { def tableData = createTableDataWithPermute() diff --git a/webtau-core/src/main/java/org/testingisdocumenting/webtau/data/table/Record.java b/webtau-core/src/main/java/org/testingisdocumenting/webtau/data/table/Record.java index 00d7c9338..524a101ea 100644 --- a/webtau-core/src/main/java/org/testingisdocumenting/webtau/data/table/Record.java +++ b/webtau-core/src/main/java/org/testingisdocumenting/webtau/data/table/Record.java @@ -26,28 +26,33 @@ import java.util.*; import java.util.function.Function; +import java.util.stream.Collectors; import java.util.stream.Stream; public class Record implements PrettyPrintable { private final TableDataHeader header; - private final List values; + private final List values; private final CompositeKey key; private final boolean hasMultiValues; private final boolean hasValueGenerators; public Record(TableDataHeader header, Stream values) { + this(header, values.collect(Collectors.toList())); + } + + public Record(TableDataHeader header, List values) { this.header = header; - RecordFromStream recordFromStream = new RecordFromStream(values); + RecordFromList recordFromList = new RecordFromList(values); - if (recordFromStream.values.size() != header.size()) { + if (recordFromList.values.size() != header.size()) { throw new IllegalArgumentException("header size is " + header.size() + - ", but received " + recordFromStream.values.size() + " value(s)"); + ", but received " + recordFromList.values.size() + " value(s)"); } - hasMultiValues = recordFromStream.hasMultiValues; - hasValueGenerators = recordFromStream.hasValueGenerators; - this.values = recordFromStream.values; + hasMultiValues = recordFromList.hasMultiValues; + hasValueGenerators = recordFromList.hasValueGenerators; + this.values = recordFromList.values; this.key = header.hasKeyColumns() ? new CompositeKey(header.getKeyIdxStream().map(this::get)) : null; @@ -87,11 +92,11 @@ public E get(int idx, E defaultValue) { return (E) values.get(idx); } - public Stream valuesStream() { + public Stream valuesStream() { return values.stream(); } - public List getValues() { + public List getValues() { return values; } @@ -182,15 +187,14 @@ void add(Record record) { } } - private static class RecordFromStream { + private static class RecordFromList { private boolean hasMultiValues; private boolean hasValueGenerators; - private final List values; - - public RecordFromStream(Stream valuesStream) { - values = new ArrayList<>(); + private final List values; - valuesStream.forEach(v -> { + public RecordFromList(List valuesList) { + values = valuesList; + for (Object v : valuesList) { if (v instanceof MultiValue) { hasMultiValues = true; } @@ -198,9 +202,7 @@ public RecordFromStream(Stream valuesStream) { if (v instanceof TableDataCellValueGenerator) { hasValueGenerators = true; } - - values.add(v); - }); + } } } } diff --git a/webtau-core/src/main/java/org/testingisdocumenting/webtau/data/table/TableData.java b/webtau-core/src/main/java/org/testingisdocumenting/webtau/data/table/TableData.java index d1df351f2..aff5c5fcb 100644 --- a/webtau-core/src/main/java/org/testingisdocumenting/webtau/data/table/TableData.java +++ b/webtau-core/src/main/java/org/testingisdocumenting/webtau/data/table/TableData.java @@ -191,6 +191,22 @@ public Record findByKey(Object... keyParts) { return find(key); } + public void addRowsExistingColumnsOnly(TableData tableData) { + List existingNames = getColumnNames(); + + for (Record targetRow : tableData.rows) { + List newRowData = new ArrayList<>(); + + for (String existingColumnName : existingNames) { + int idx = tableData.header.findColumnIdxByName(existingColumnName); + + newRowData.add(idx == -1 ? null : targetRow.get(idx)); + } + + addRow(new Record(header, newRowData)); + } + } + public void addRow(List values) { addRow(values.stream()); } diff --git a/webtau-core/src/main/java/org/testingisdocumenting/webtau/data/table/header/TableDataHeader.java b/webtau-core/src/main/java/org/testingisdocumenting/webtau/data/table/header/TableDataHeader.java index 4afc1b0bc..4f6b0724d 100644 --- a/webtau-core/src/main/java/org/testingisdocumenting/webtau/data/table/header/TableDataHeader.java +++ b/webtau-core/src/main/java/org/testingisdocumenting/webtau/data/table/header/TableDataHeader.java @@ -42,7 +42,7 @@ public TableDataHeader(Stream names, Stream keyNames) { names.forEach(name -> add(name, keyNamesAsSet.contains(name))); } - public Record createRecord(Stream values) { + public Record createRecord(Stream values) { return new Record(this, values); } diff --git a/webtau-db/src/main/java/org/testingisdocumenting/webtau/db/DatabaseTable.java b/webtau-db/src/main/java/org/testingisdocumenting/webtau/db/DatabaseTable.java index e44cb6141..eb647ac23 100644 --- a/webtau-db/src/main/java/org/testingisdocumenting/webtau/db/DatabaseTable.java +++ b/webtau-db/src/main/java/org/testingisdocumenting/webtau/db/DatabaseTable.java @@ -123,7 +123,7 @@ private void insertTableStep(List> rows) { private void insertMultipleRowsStep(Supplier isEmpty, Supplier size, Supplier> header, - Function> valuesByRowIdx) { + Function> valuesByRowIdx) { if (isEmpty.get()) { return; } diff --git a/webtau-db/src/main/java/org/testingisdocumenting/webtau/db/gen/SqlQueriesGenerator.java b/webtau-db/src/main/java/org/testingisdocumenting/webtau/db/gen/SqlQueriesGenerator.java index 0c1292e12..d6d7dfa89 100644 --- a/webtau-db/src/main/java/org/testingisdocumenting/webtau/db/gen/SqlQueriesGenerator.java +++ b/webtau-db/src/main/java/org/testingisdocumenting/webtau/db/gen/SqlQueriesGenerator.java @@ -34,7 +34,7 @@ public static String insert(String tableName, Map row) { return insert(tableName, row.keySet().stream(), row.values().stream()); } - public static String insert(String tableName, Stream columnNamesStream, Stream valuesStream) { + public static String insert(String tableName, Stream columnNamesStream, Stream valuesStream) { String enumeratedColumnNames = columnNamesStream.collect(Collectors.joining(", ")); String questionMarks = valuesStream.map(v -> "?").collect(Collectors.joining(", ")); diff --git a/webtau-docs/znai/release-notes/2.1/add-2023-07-14-table-data-merge-into.md b/webtau-docs/znai/release-notes/2.1/add-2023-07-14-table-data-merge-into.md new file mode 100644 index 000000000..e4cb023b3 --- /dev/null +++ b/webtau-docs/znai/release-notes/2.1/add-2023-07-14-table-data-merge-into.md @@ -0,0 +1 @@ +* Add: [TableData](reference/table-data) `.addRowsExistingColumnsOnly(otherTable)` to merge other tables into