Skip to content

Commit 4aa9b5e

Browse files
committed
chore: adding the table getChanges method
refs: #85
1 parent 0763921 commit 4aa9b5e

4 files changed

Lines changed: 151 additions & 0 deletions

File tree

lib/src/main/java/io/cloudquery/schema/Table.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
@Builder(toBuilder = true)
1919
@Getter
2020
public class Table {
21+
2122
public interface Transform {
2223
void transformTable(Table table) throws TransformerException;
2324
}
@@ -203,4 +204,30 @@ public Optional<Column> getColumn(String name) {
203204
}
204205
return Optional.empty();
205206
}
207+
208+
public List<TableColumnChange> getChanges(Table old) {
209+
List<TableColumnChange> changes = new ArrayList<>();
210+
for (Column column : columns) {
211+
Optional<Column> otherColumn = old.getColumn(column.getName());
212+
if (otherColumn.isEmpty()) {
213+
changes.add(
214+
new TableColumnChange(TableColumnChangeType.ADD, column.getName(), column, null));
215+
continue;
216+
}
217+
if (!otherColumn.get().getType().equals(column.getType())) {
218+
changes.add(
219+
new TableColumnChange(
220+
TableColumnChangeType.UPDATE, column.getName(), column, otherColumn.get()));
221+
}
222+
}
223+
for (Column column : old.columns) {
224+
Optional<Column> otherColumn = getColumn(column.getName());
225+
if (otherColumn.isEmpty()) {
226+
changes.add(
227+
new TableColumnChange(TableColumnChangeType.REMOVE, column.getName(), null, column));
228+
continue;
229+
}
230+
}
231+
return changes;
232+
}
206233
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package io.cloudquery.schema;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Getter;
5+
6+
@Getter
7+
@AllArgsConstructor
8+
public class TableColumnChange {
9+
private TableColumnChangeType type;
10+
private String columnName;
11+
private Column current;
12+
private Column previous;
13+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package io.cloudquery.schema;
2+
3+
public enum TableColumnChangeType {
4+
REMOVE,
5+
UPDATE,
6+
ADD
7+
}
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
package io.cloudquery.schema;
2+
3+
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
5+
import io.cloudquery.schema.Table.TableBuilder;
6+
import java.util.List;
7+
import org.apache.arrow.vector.types.pojo.ArrowType;
8+
import org.junit.jupiter.api.BeforeEach;
9+
import org.junit.jupiter.api.Test;
10+
11+
public class TableColumnChangeTest {
12+
13+
private TableBuilder tableBuilder;
14+
15+
@BeforeEach
16+
public void setUp() {
17+
tableBuilder =
18+
Table.builder()
19+
.name("test")
20+
.columns(
21+
List.of(
22+
Column.builder().name("basic_column").type(ArrowType.Bool.INSTANCE).build()));
23+
}
24+
25+
@Test
26+
public void shouldBeNoChangesWithIdenticalTables() {
27+
Table old = tableBuilder.build();
28+
Table current = tableBuilder.build();
29+
30+
List<TableColumnChange> changes = current.getChanges(old);
31+
32+
assertEquals(0, changes.size(), "should be no changes");
33+
}
34+
35+
@Test
36+
public void shouldAddColumnIfNewTableHasAdditionalColumn() {
37+
Table old = tableBuilder.build();
38+
Table current =
39+
tableBuilder
40+
.columns(
41+
List.of(
42+
Column.builder().name("basic_column").type(ArrowType.Bool.INSTANCE).build(),
43+
Column.builder()
44+
.name("additional_column")
45+
.type(ArrowType.Bool.INSTANCE)
46+
.build()))
47+
.build();
48+
49+
List<TableColumnChange> changes = current.getChanges(old);
50+
51+
assertEquals(1, changes.size(), "should be 1 change");
52+
TableColumnChange change = changes.get(0);
53+
assertEquals(TableColumnChangeType.ADD, change.getType());
54+
assertEquals("additional_column", change.getColumnName());
55+
assertEquals("additional_column", change.getCurrent().getName());
56+
}
57+
58+
@Test
59+
public void shouldRemoveColumnIfNewTableHasLessColumns() {
60+
Table old =
61+
Table.builder()
62+
.name("test")
63+
.columns(
64+
List.of(
65+
Column.builder().name("basic_column").type(ArrowType.Bool.INSTANCE).build(),
66+
Column.builder()
67+
.name("additional_column")
68+
.type(ArrowType.Bool.INSTANCE)
69+
.build()))
70+
.build();
71+
72+
Table current = tableBuilder.build();
73+
74+
List<TableColumnChange> changes = current.getChanges(old);
75+
76+
assertEquals(1, changes.size(), "should be 1 change");
77+
TableColumnChange change = changes.get(0);
78+
assertEquals(TableColumnChangeType.REMOVE, change.getType());
79+
assertEquals("additional_column", change.getColumnName());
80+
assertEquals("additional_column", change.getPrevious().getName());
81+
}
82+
83+
@Test
84+
public void shouldUpdateColumnIfNewTableHasUpdateChange() {
85+
Table old = tableBuilder.build();
86+
Table current =
87+
tableBuilder
88+
.columns(
89+
List.of(
90+
Column.builder().name("basic_column").type(ArrowType.Utf8.INSTANCE).build()))
91+
.build();
92+
93+
List<TableColumnChange> changes = current.getChanges(old);
94+
95+
assertEquals(1, changes.size(), "should be 1 change");
96+
TableColumnChange change = changes.get(0);
97+
assertEquals(TableColumnChangeType.UPDATE, change.getType());
98+
assertEquals("basic_column", change.getColumnName());
99+
assertEquals("basic_column", change.getCurrent().getName());
100+
assertEquals("basic_column", change.getPrevious().getName());
101+
assertEquals(ArrowType.Bool.INSTANCE, change.getPrevious().getType());
102+
assertEquals(ArrowType.Utf8.INSTANCE, change.getCurrent().getType());
103+
}
104+
}

0 commit comments

Comments
 (0)