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())));
+ }
+}