From aa9c793d34f0c0acbd820377ca581cc901f8c11b Mon Sep 17 00:00:00 2001 From: Martin Norbury Date: Tue, 8 Aug 2023 13:55:35 +0100 Subject: [PATCH] feat: adding basic support for tables Start by adding support for table flattening and max depth, based on [table_tests.go](https://github.com/cloudquery/plugin-sdk/blob/main/schema/table_test.go) --- .../main/java/io/cloudquery/schema/Table.java | 44 ++++++++++++++++ .../java/io/cloudquery/schema/TableTest.java | 52 +++++++++++++++++++ 2 files changed, 96 insertions(+) create mode 100644 lib/src/main/java/io/cloudquery/schema/Table.java create mode 100644 lib/src/test/java/io/cloudquery/schema/TableTest.java diff --git a/lib/src/main/java/io/cloudquery/schema/Table.java b/lib/src/main/java/io/cloudquery/schema/Table.java new file mode 100644 index 0000000..78bbe18 --- /dev/null +++ b/lib/src/main/java/io/cloudquery/schema/Table.java @@ -0,0 +1,44 @@ +package io.cloudquery.schema; + +import lombok.Builder; +import lombok.Getter; + +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Builder(toBuilder = true) +@Getter +public class Table { + public static List flattenTables(List
tables) { + Map flattenMap = new HashMap<>(); + for (Table table : tables) { + Table newTable = table.toBuilder().relations(Collections.emptyList()).build(); + flattenMap.put(newTable.name, newTable); + for (Table child : flattenTables(table.getRelations())) { + flattenMap.put(child.name, child); + } + } + return flattenMap.values().stream().toList(); + } + + public static int maxDepth(List
tables) { + int depth = 0; + if (tables.isEmpty()) { + return 0; + } + for (Table table : tables) { + int newDepth = 1 + maxDepth(table.getRelations()); + if (newDepth > depth) { + depth = newDepth; + } + } + return depth; + } + + private String name; + + @Builder.Default + private List
relations = Collections.emptyList(); +} diff --git a/lib/src/test/java/io/cloudquery/schema/TableTest.java b/lib/src/test/java/io/cloudquery/schema/TableTest.java new file mode 100644 index 0000000..1ffb420 --- /dev/null +++ b/lib/src/test/java/io/cloudquery/schema/TableTest.java @@ -0,0 +1,52 @@ +package io.cloudquery.schema; + +import org.junit.Before; +import org.junit.Test; + +import java.util.Collections; +import java.util.List; + +import static org.junit.Assert.assertEquals; + +public class TableTest { + + public Table testTable; + + @Before + public void setUp() { + testTable = Table.builder(). + name("test"). + relations(List.of( + Table.builder().name("test2").build(), + Table.builder().name("test3").build(), + Table.builder().name("test4").build() + )).build(); + } + + @Test + public void shouldFlattenTables() { + List
srcTables = List.of(testTable); + List
flattenedTables = Table.flattenTables(srcTables); + + assertEquals(1, srcTables.size()); + assertEquals(3, testTable.getRelations().size()); + assertEquals(4, flattenedTables.size()); + } + + @Test + public void shouldFlattenTablesWithDuplicates() { + List
srcTables = List.of(testTable, testTable, testTable); + List
flattenedTables = Table.flattenTables(srcTables); + + assertEquals(3, srcTables.size()); + assertEquals(3, testTable.getRelations().size()); + assertEquals(4, flattenedTables.size()); + } + + @Test + public void shouldReturnMaxDepth() { + assertEquals(0, Table.maxDepth(Collections.emptyList())); + assertEquals(2, Table.maxDepth(List.of(testTable))); + assertEquals(3, Table.maxDepth(List.of(testTable.toBuilder().relations(List.of(testTable)).build()))); + } +}