Skip to content

Commit 024661a

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

File tree

4 files changed

+164
-0
lines changed

4 files changed

+164
-0
lines changed

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

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
package io.cloudquery.schema;
22

3+
import static io.cloudquery.schema.TableColumnChangeType.ADD;
4+
import static io.cloudquery.schema.TableColumnChangeType.REMOVE;
5+
import static io.cloudquery.schema.TableColumnChangeType.UPDATE;
6+
37
import io.cloudquery.glob.Glob;
48
import io.cloudquery.schema.Column.ColumnBuilder;
59
import io.cloudquery.transformers.TransformerException;
@@ -18,6 +22,7 @@
1822
@Builder(toBuilder = true)
1923
@Getter
2024
public class Table {
25+
2126
public interface Transform {
2227
void transformTable(Table table) throws TransformerException;
2328
}
@@ -203,4 +208,39 @@ public Optional<Column> getColumn(String name) {
203208
}
204209
return Optional.empty();
205210
}
211+
212+
public List<TableColumnChange> getChanges(Table old) {
213+
List<TableColumnChange> changes = new ArrayList<>();
214+
for (Column currentColumn : columns) {
215+
Optional<Column> oldColumn = old.getColumn(currentColumn.getName());
216+
if (oldColumn.isEmpty()) {
217+
changes.add(new TableColumnChange(ADD, currentColumn.getName(), currentColumn, null));
218+
continue;
219+
}
220+
if (shouldUpdate(currentColumn, oldColumn.get())) {
221+
changes.add(
222+
new TableColumnChange(UPDATE, currentColumn.getName(), currentColumn, oldColumn.get()));
223+
}
224+
}
225+
for (Column column : old.columns) {
226+
Optional<Column> otherColumn = getColumn(column.getName());
227+
if (otherColumn.isEmpty()) {
228+
changes.add(new TableColumnChange(REMOVE, column.getName(), null, column));
229+
}
230+
}
231+
return changes;
232+
}
233+
234+
private static boolean shouldUpdate(Column currentColumn, Column oldColumn) {
235+
if (!oldColumn.getType().equals(currentColumn.getType())) {
236+
return true;
237+
}
238+
if (oldColumn.isPrimaryKey() != currentColumn.isPrimaryKey()) {
239+
return true;
240+
}
241+
if (oldColumn.isNotNull() != currentColumn.isNotNull()) {
242+
return true;
243+
}
244+
return oldColumn.isUnique() != currentColumn.isUnique();
245+
}
206246
}
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)