Skip to content

Commit 73cd3bc

Browse files
authored
chore: add parent primary key resolver (#69)
Adding parent primary key resolver, which led to fleshing out methods in the `Table` and `Resource` classes fixes: #49
1 parent 20ebb42 commit 73cd3bc

File tree

9 files changed

+205
-4
lines changed

9 files changed

+205
-4
lines changed
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
package io.cloudquery.schema;
22

3+
import lombok.Builder;
4+
5+
@Builder
36
public class ClientMeta {
47
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ public class Column {
2929
name("_cq_parent_id").
3030
type(new UUIDType()).
3131
description("Internal CQ ID of the parent row").
32+
resolver(new ParentCQUUIDResolver()).
3233
ignoreInTests(true).
3334
build();
3435

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package io.cloudquery.schema;
2+
3+
import io.cloudquery.scalar.Scalar;
4+
import io.cloudquery.scalar.UUID;
5+
import io.cloudquery.scalar.ValidationException;
6+
import io.cloudquery.transformers.TransformerException;
7+
8+
import static io.cloudquery.schema.Column.CQ_ID_COLUMN;
9+
10+
public class ParentCQUUIDResolver implements ColumnResolver {
11+
@Override
12+
public void resolve(ClientMeta meta, Resource resource, Column column) throws TransformerException {
13+
Resource parent = resource.getParent();
14+
if (parent == null) {
15+
setOrThrow(resource, column, null);
16+
return;
17+
}
18+
19+
Scalar<?> parentCqID = parent.get(CQ_ID_COLUMN.getName());
20+
if (parentCqID == null) {
21+
setOrThrow(resource, column, null);
22+
return;
23+
}
24+
25+
if (!(parentCqID instanceof UUID)) {
26+
setOrThrow(resource, column, null);
27+
return;
28+
}
29+
30+
setOrThrow(resource, column, parentCqID);
31+
}
32+
33+
private static void setOrThrow(Resource resource, Column column, Scalar<?> parentCqID) throws TransformerException {
34+
try {
35+
resource.set(column.getName(), parentCqID);
36+
} catch (ValidationException ex) {
37+
throw new TransformerException("Failed to set parent CQ ID", ex);
38+
}
39+
}
40+
}
Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,40 @@
11
package io.cloudquery.schema;
22

3+
import io.cloudquery.scalar.Scalar;
4+
import io.cloudquery.scalar.ValidationException;
35
import lombok.Builder;
46
import lombok.Getter;
57

6-
@Builder
8+
import java.util.ArrayList;
9+
import java.util.List;
10+
711
@Getter
812
public class Resource {
913
private Object item;
14+
private Resource parent;
15+
private Table table;
16+
17+
private final List<Scalar<?>> data;
18+
19+
@Builder(toBuilder = true)
20+
public Resource(Table table, Resource parent, Object item) {
21+
this.item = item;
22+
this.parent = parent;
23+
this.table = table != null ? table : Table.builder().build();
24+
this.data = new ArrayList<>();
1025

26+
for (Column column : this.table.getColumns()) {
27+
this.data.add(Scalar.fromArrowType(column.getType()));
28+
}
29+
}
30+
31+
public void set(String columnName, Object value) throws ValidationException {
32+
int index = table.indexOfColumn(columnName);
33+
this.data.get(index).set(value);
34+
}
1135

12-
public void set(String columnName, Object value) {
36+
public Scalar<?> get(String columnName) {
37+
int index = table.indexOfColumn(columnName);
38+
return this.data.get(index);
1339
}
1440
}

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,15 @@ public void addCQIDs() {
140140
}
141141
}
142142

143+
public int indexOfColumn(String columnName) {
144+
for (int index = 0; index < columns.size(); index++) {
145+
if (columns.get(index).getName().equals(columnName)) {
146+
return index;
147+
}
148+
}
149+
return -1;
150+
}
151+
143152
public List<String> primaryKeys() {
144153
return columns.stream().
145154
filter(Column::isPrimaryKey).

lib/src/main/java/io/cloudquery/transformers/ResolverTransformer.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import io.cloudquery.helper.ReflectionPathResolver;
44
import io.cloudquery.helper.ReflectionPathResolver.PathResolverException;
5+
import io.cloudquery.scalar.ValidationException;
56
import io.cloudquery.schema.ColumnResolver;
67

78
import java.lang.reflect.Field;
@@ -16,7 +17,7 @@ public ColumnResolver transform(Field field, String path) throws TransformerExce
1617
return (meta, resource, column) -> {
1718
try {
1819
resource.set(column.getName(), ReflectionPathResolver.resolve(resource.getItem(), path));
19-
} catch (PathResolverException ex) {
20+
} catch (PathResolverException | ValidationException ex) {
2021
throw new TransformerException("Failed to resolve path: " + path, ex);
2122
}
2223
};
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package io.cloudquery.schema;
2+
3+
import io.cloudquery.scalar.ValidationException;
4+
import io.cloudquery.transformers.TransformerException;
5+
import io.cloudquery.types.UUIDType;
6+
import org.junit.jupiter.api.BeforeEach;
7+
import org.junit.jupiter.api.Test;
8+
9+
import java.util.List;
10+
11+
import static org.junit.jupiter.api.Assertions.assertEquals;
12+
13+
class ParentCQUUIDResolverTest {
14+
private static final java.util.UUID PARENT_UUID = java.util.UUID.randomUUID();
15+
private static final java.util.UUID CHILD_UID = java.util.UUID.randomUUID();
16+
private static final String CHILD_COLUMN = "child_column";
17+
private static final Column COLUMN = Column.builder().name(CHILD_COLUMN).type(new UUIDType()).build();
18+
private static final Table parentTable = Table.builder().name("parent").columns(List.of(Column.CQ_ID_COLUMN)).build();
19+
private static final Table childTable = Table.builder().name("child").columns(List.of(COLUMN)).build();
20+
21+
private ColumnResolver resolver;
22+
23+
@BeforeEach
24+
void setUp() {
25+
resolver = new ParentCQUUIDResolver();
26+
}
27+
28+
@Test
29+
public void shouldSetColumnToNullIfWeDoNotHaveAParent() throws TransformerException, ValidationException {
30+
Resource resourceWithNoParent = Resource.builder().table(childTable).build();
31+
resourceWithNoParent.set(CHILD_COLUMN, CHILD_UID);
32+
33+
assertEquals(CHILD_UID, resourceWithNoParent.get(CHILD_COLUMN).get());
34+
resolver.resolve(null, resourceWithNoParent, COLUMN);
35+
36+
assertEquals(null, resourceWithNoParent.get(CHILD_COLUMN).get());
37+
}
38+
39+
@Test
40+
public void shouldSetColumnToNullIfParentDoesNotHaveCQID() throws TransformerException, ValidationException {
41+
Resource resource = Resource.builder().
42+
table(childTable).
43+
parent(Resource.builder().table(parentTable).build()).
44+
build();
45+
resource.set(CHILD_COLUMN, CHILD_UID);
46+
47+
assertEquals(CHILD_UID, resource.get(CHILD_COLUMN).get());
48+
resolver.resolve(null, resource, COLUMN);
49+
50+
assertEquals(null, resource.get(CHILD_COLUMN).get());
51+
}
52+
53+
@Test
54+
public void shouldSetColumnToUUIDIfParentHasACQID() throws TransformerException, ValidationException {
55+
Resource parentResource = Resource.builder().table(parentTable).build();
56+
parentResource.set(Column.CQ_ID_COLUMN.getName(), PARENT_UUID);
57+
58+
Resource resource = Resource.builder().table(childTable).parent(parentResource).build();
59+
resource.set(CHILD_COLUMN, CHILD_UID);
60+
61+
assertEquals(CHILD_UID, resource.get(CHILD_COLUMN).get());
62+
resolver.resolve(null, resource, COLUMN);
63+
64+
assertEquals(PARENT_UUID, resource.get(CHILD_COLUMN).get());
65+
}
66+
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package io.cloudquery.schema;
2+
3+
import io.cloudquery.scalar.ValidationException;
4+
import io.cloudquery.types.UUIDType;
5+
import org.apache.arrow.vector.types.pojo.ArrowType;
6+
import org.junit.jupiter.api.Test;
7+
8+
import java.util.List;
9+
import java.util.UUID;
10+
11+
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
12+
import static org.junit.jupiter.api.Assertions.assertEquals;
13+
import static org.junit.jupiter.api.Assertions.assertInstanceOf;
14+
15+
public class ResourceTest {
16+
private static final UUID UUID = java.util.UUID.randomUUID();
17+
18+
@Test
19+
public void shouldBuildWithNoErrors() {
20+
assertDoesNotThrow(() -> Resource.builder().build());
21+
}
22+
23+
@Test
24+
public void shouldCreateScalarData() {
25+
Column column1 = Column.builder().
26+
name("test_column1").
27+
type(new UUIDType()).
28+
build();
29+
Column column2 = Column.builder().
30+
name("test_column2").
31+
type(ArrowType.Utf8.INSTANCE).
32+
build();
33+
Table table = Table.builder().name("test").columns(List.of(column1, column2)).build();
34+
35+
Resource resource = Resource.builder().table(table).build();
36+
37+
assertInstanceOf(io.cloudquery.scalar.UUID.class, resource.get(column1.getName()));
38+
assertInstanceOf(io.cloudquery.scalar.String.class, resource.get(column2.getName()));
39+
}
40+
41+
@Test
42+
public void shouldSetAndGetDataTypes() throws ValidationException {
43+
Column column1 = Column.builder().
44+
name("test_column1").
45+
type(new UUIDType()).
46+
build();
47+
Table table = Table.builder().name("test").columns(List.of(column1)).build();
48+
49+
Resource resource = Resource.builder().table(table).build();
50+
51+
resource.set(column1.getName(), UUID);
52+
assertEquals(UUID, resource.get(column1.getName()).get());
53+
}
54+
}

lib/src/test/java/io/cloudquery/transformers/DefaultResolverTransformerTest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package io.cloudquery.transformers;
22

3+
import io.cloudquery.scalar.ValidationException;
34
import io.cloudquery.schema.Column;
45
import io.cloudquery.schema.Resource;
56
import io.cloudquery.transformers.ResolverTransformer.DefaulResolverTransformer;
@@ -36,7 +37,7 @@ void setUp() {
3637
}
3738

3839
@Test
39-
public void shouldTransformCustomFieldNamesFromResource() throws TransformerException {
40+
public void shouldTransformCustomFieldNamesFromResource() throws TransformerException, ValidationException {
4041
Column targetColumn = Column.builder().name("id").build();
4142

4243
transformer.transform(null, "myCustomID").resolve(null, resource, targetColumn);

0 commit comments

Comments
 (0)