Skip to content

Commit 400c406

Browse files
authored
chore: add default CQ columns (#66)
refs: #49
1 parent 39ec6e6 commit 400c406

File tree

3 files changed

+135
-3
lines changed

3 files changed

+135
-3
lines changed
Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,55 @@
11
package io.cloudquery.schema;
22

3+
import io.cloudquery.types.UUIDType;
34
import lombok.Builder;
45
import lombok.Getter;
56
import org.apache.arrow.vector.types.pojo.ArrowType;
67

7-
@Builder
8+
@Builder(toBuilder = true)
89
@Getter
910
public class Column {
1011
private String name;
12+
private String description;
1113
private ArrowType type;
1214
private ColumnResolver resolver;
1315
private boolean primaryKey;
16+
private boolean notNull;
17+
private boolean unique;
18+
private boolean incrementalKey;
1419
private boolean ignoreInTests;
20+
21+
public static final Column CQ_ID_COLUMN = Column.builder().
22+
name("_cq_id").
23+
type(new UUIDType()).
24+
description("Internal CQ ID of the row").
25+
notNull(true).
26+
unique(true).
27+
build();
28+
public static final Column CQ_PARENT_ID_COLUMN = Column.builder().
29+
name("_cq_parent_id").
30+
type(new UUIDType()).
31+
description("Internal CQ ID of the parent row").
32+
ignoreInTests(true).
33+
build();
34+
35+
@Override
36+
public String toString() {
37+
StringBuilder sb = new StringBuilder();
38+
sb.append(name);
39+
sb.append(":");
40+
sb.append(type.toString());
41+
if (primaryKey) {
42+
sb.append(":PK");
43+
}
44+
if (notNull) {
45+
sb.append(":NotNull");
46+
}
47+
if (unique) {
48+
sb.append(":Unique");
49+
}
50+
if (incrementalKey) {
51+
sb.append(":IncrementalKey");
52+
}
53+
return sb.toString();
54+
}
1555
}

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

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package io.cloudquery.schema;
22

33
import io.cloudquery.glob.Glob;
4+
import io.cloudquery.schema.Column.ColumnBuilder;
45
import io.cloudquery.transformers.TransformerException;
56
import lombok.Builder;
67
import lombok.Getter;
@@ -17,7 +18,6 @@
1718
@Builder(toBuilder = true)
1819
@Getter
1920
public class Table {
20-
2121
public interface Transform {
2222
void transformTable(Table table) throws TransformerException;
2323
}
@@ -113,7 +113,7 @@ public static int maxDepth(List<Table> tables) {
113113
private List<Column> columns = new ArrayList<>();
114114

115115
@Builder.Default
116-
private List<Table> relations = Collections.emptyList();
116+
private List<Table> relations = new ArrayList<>();
117117

118118
private Transform transform;
119119

@@ -123,6 +123,30 @@ public void transform() throws TransformerException {
123123
}
124124
}
125125

126+
public void addCQIDs() {
127+
boolean havePrimaryKeys = !primaryKeys().isEmpty();
128+
ColumnBuilder cqIdColumnBuilder = Column.CQ_ID_COLUMN.toBuilder();
129+
if (!havePrimaryKeys) {
130+
cqIdColumnBuilder.primaryKey(true);
131+
}
132+
133+
List<Column> newColumns = List.of(cqIdColumnBuilder.build(), Column.CQ_PARENT_ID_COLUMN);
134+
for (int i = 0; i < newColumns.size(); i++) {
135+
columns.add(i, newColumns.get(i));
136+
}
137+
138+
for (Table relation : relations) {
139+
relation.addCQIDs();
140+
}
141+
}
142+
143+
public List<String> primaryKeys() {
144+
return columns.stream().
145+
filter(Column::isPrimaryKey).
146+
map(Column::getName).
147+
toList();
148+
}
149+
126150
private Optional<Table> filterDfs(boolean parentMatched, Predicate<Table> include, Predicate<Table> exclude, boolean skipDependentTables) {
127151
if (exclude.test(this)) {
128152
return Optional.empty();
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package io.cloudquery.schema;
2+
3+
import org.junit.jupiter.api.Test;
4+
5+
import java.util.ArrayList;
6+
import java.util.List;
7+
import java.util.Optional;
8+
9+
import static org.junit.jupiter.api.Assertions.assertEquals;
10+
import static org.junit.jupiter.api.Assertions.assertFalse;
11+
import static org.junit.jupiter.api.Assertions.assertTrue;
12+
13+
class TableTest {
14+
@Test
15+
public void shouldAddDefaultCQColumns() {
16+
Table table = Table.builder().name("test").build();
17+
18+
assertEquals(0, table.getColumns().size());
19+
table.addCQIDs();
20+
21+
List<Column> expectedColumns = List.of(Column.CQ_ID_COLUMN, Column.CQ_PARENT_ID_COLUMN);
22+
assertEquals(expectedColumns.size(), table.getColumns().size());
23+
for (int i = 0; i < expectedColumns.size(); i++) {
24+
assertEquals(expectedColumns.get(i).getName(), table.getColumns().get(i).getName());
25+
}
26+
}
27+
28+
@Test
29+
public void shouldAddDefaultCQColumnsToRelations() {
30+
Table table = Table.builder().name("test").build();
31+
Table relation = Table.builder().name("relation").build();
32+
table.getRelations().add(relation);
33+
34+
assertEquals(0, relation.getColumns().size());
35+
table.addCQIDs();
36+
37+
List<Column> expectedColumns = List.of(Column.CQ_ID_COLUMN, Column.CQ_PARENT_ID_COLUMN);
38+
assertEquals(expectedColumns.size(), relation.getColumns().size());
39+
for (int i = 0; i < expectedColumns.size(); i++) {
40+
assertEquals(expectedColumns.get(i).getName(), relation.getColumns().get(i).getName());
41+
}
42+
}
43+
44+
@Test
45+
public void shouldSetDefaultColumnAsPrimaryKeyIfNoOtherPrimaryKey() {
46+
Table table = Table.builder().name("test").build();
47+
48+
table.addCQIDs();
49+
50+
Optional<Column> column = table.getColumn(Column.CQ_ID_COLUMN.getName());
51+
assertTrue(column.isPresent());
52+
assertTrue(column.get().isPrimaryKey(), "CQ_ID_COLUMN should be primary key");
53+
}
54+
55+
@Test
56+
public void shouldUseExistingPrimaryKeyWhenPossible() {
57+
Column pkColumn = Column.builder().name("mypk").primaryKey(true).build();
58+
Table table = Table.builder().name("test").
59+
columns(new ArrayList<>(List.of(pkColumn))).
60+
build();
61+
62+
table.addCQIDs();
63+
64+
Optional<Column> column = table.getColumn(Column.CQ_ID_COLUMN.getName());
65+
assertTrue(column.isPresent());
66+
assertFalse(column.get().isPrimaryKey(), "CQ_ID_COLUMN should not be primary key");
67+
}
68+
}

0 commit comments

Comments
 (0)