Skip to content

Commit cf9e4f6

Browse files
committed
chore: adding UUID scalar
NOTE: added an equals verify test which suggests overriding `hashcode` also refs: #4
1 parent e7ce5b1 commit cf9e4f6

File tree

3 files changed

+242
-0
lines changed

3 files changed

+242
-0
lines changed

lib/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ dependencies {
4040
testImplementation('org.junit.jupiter:junit-jupiter-api:5.10.0')
4141
testImplementation('org.mockito:mockito-core:5.4.0')
4242
testImplementation('org.mockito:mockito-junit-jupiter:5.4.0')
43+
testImplementation('nl.jqno.equalsverifier:equalsverifier:3.15')
4344
testRuntimeOnly('org.junit.jupiter:junit-jupiter-engine:5.10.0')
4445

4546
testImplementation 'org.assertj:assertj-core:3.24.2'
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
package io.cloudquery.scalar;
2+
3+
import org.apache.arrow.vector.types.pojo.ArrowType;
4+
import org.apache.arrow.vector.types.pojo.ArrowType.FixedSizeBinary;
5+
6+
import java.util.Objects;
7+
8+
public class UUID implements Scalar {
9+
public static final FixedSizeBinary dt = new FixedSizeBinary(16);
10+
11+
private java.util.UUID value;
12+
13+
public UUID() {
14+
}
15+
16+
public UUID(Object value) throws ValidationException {
17+
this.set(value);
18+
}
19+
20+
@Override
21+
public boolean isValid() {
22+
return this.value != null;
23+
}
24+
25+
@Override
26+
public ArrowType dataType() {
27+
return dt;
28+
}
29+
30+
@Override
31+
public void set(Object value) throws ValidationException {
32+
if (value == null) {
33+
this.value = null;
34+
return;
35+
}
36+
37+
if (value instanceof Scalar scalar) {
38+
if (!scalar.isValid()) {
39+
this.value = null;
40+
return;
41+
}
42+
43+
if (scalar instanceof UUID uuid) {
44+
this.value = uuid.value;
45+
return;
46+
}
47+
48+
this.set(scalar.get());
49+
return;
50+
}
51+
52+
if (value instanceof java.util.UUID uuid) {
53+
this.value = uuid;
54+
return;
55+
}
56+
57+
if (value instanceof String s) {
58+
this.value = java.util.UUID.fromString(s);
59+
return;
60+
}
61+
62+
if (value instanceof byte[] b) {
63+
this.value = java.util.UUID.nameUUIDFromBytes(b);
64+
return;
65+
}
66+
67+
throw new ValidationException(ValidationException.NO_CONVERSION_AVAILABLE, this.dataType(), value);
68+
}
69+
70+
@Override
71+
public Object get() {
72+
return this.value;
73+
}
74+
75+
@Override
76+
public final boolean equals(Object other) {
77+
if (other == null) {
78+
return false;
79+
}
80+
81+
if (!(other instanceof UUID o)) {
82+
return false;
83+
}
84+
85+
return this.value == o.value || Objects.equals(this.value, o.value);
86+
}
87+
88+
@Override
89+
public final int hashCode() {
90+
return Objects.hash(value);
91+
}
92+
93+
@Override
94+
public String toString() {
95+
if (this.value != null) {
96+
return this.value.toString();
97+
}
98+
return NULL_VALUE_STRING;
99+
}
100+
}
Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
package io.cloudquery.scalar;
2+
3+
import nl.jqno.equalsverifier.EqualsVerifier;
4+
import nl.jqno.equalsverifier.Warning;
5+
import org.apache.arrow.vector.types.pojo.ArrowType;
6+
import org.junit.jupiter.api.Test;
7+
8+
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
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.assertNotEquals;
12+
import static org.junit.jupiter.api.Assertions.assertNull;
13+
import static org.junit.jupiter.api.Assertions.assertThrows;
14+
import static org.junit.jupiter.api.Assertions.assertTrue;
15+
16+
public class UUIDTest {
17+
@Test
18+
public void testNew() {
19+
assertDoesNotThrow(() -> {
20+
new UUID();
21+
});
22+
}
23+
24+
@Test
25+
public void testNewWithValidParam() {
26+
assertDoesNotThrow(() -> {
27+
new UUID("123e4567-e89b-12d3-a456-426614174000");
28+
new UUID(java.util.UUID.randomUUID());
29+
new UUID(new byte[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15});
30+
31+
Scalar s = new UUID(java.util.UUID.randomUUID());
32+
new UUID(s);
33+
}
34+
);
35+
}
36+
37+
@Test
38+
public void testNewWithInvalidParam() {
39+
assertThrows(ValidationException.class, () -> {
40+
new UUID(false);
41+
});
42+
}
43+
44+
@Test
45+
public void testToString() {
46+
UUID uuid = new UUID();
47+
assertEquals(Scalar.NULL_VALUE_STRING, uuid.toString());
48+
49+
java.util.UUID u = java.util.UUID.randomUUID();
50+
assertDoesNotThrow(() -> {
51+
uuid.set(u);
52+
});
53+
assertEquals(u.toString(), uuid.toString());
54+
55+
assertDoesNotThrow(() -> {
56+
uuid.set(u.toString());
57+
});
58+
assertEquals(u.toString(), uuid.toString());
59+
}
60+
61+
@Test
62+
public void testDataType() {
63+
UUID uuid = new UUID();
64+
assertEquals(new ArrowType.FixedSizeBinary(16), uuid.dataType());
65+
}
66+
67+
@Test
68+
public void testIsValid() {
69+
UUID uuid = new UUID();
70+
assertFalse(uuid.isValid());
71+
72+
assertDoesNotThrow(() -> {
73+
uuid.set(java.util.UUID.randomUUID());
74+
});
75+
assertTrue(uuid.isValid());
76+
}
77+
78+
@Test
79+
public void testSet() {
80+
UUID uuid = new UUID();
81+
assertDoesNotThrow(() -> {
82+
uuid.set("123e4567-e89b-12d3-a456-426614174000");
83+
uuid.set(java.util.UUID.randomUUID());
84+
uuid.set(new byte[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15});
85+
86+
Scalar s = new UUID(java.util.UUID.randomUUID());
87+
uuid.set(s);
88+
});
89+
}
90+
91+
@Test
92+
public void testSetWithInvalidParam() {
93+
UUID uuid = new UUID();
94+
assertThrows(ValidationException.class, () -> {
95+
uuid.set(false);
96+
});
97+
}
98+
99+
@Test
100+
public void testGet() {
101+
UUID uuid = new UUID();
102+
assertFalse(uuid.isValid());
103+
assertNull(uuid.get());
104+
105+
java.util.UUID u = java.util.UUID.randomUUID();
106+
assertDoesNotThrow(() -> {
107+
uuid.set(u);
108+
});
109+
assertTrue(uuid.isValid());
110+
assertEquals(u, uuid.get());
111+
}
112+
113+
@Test
114+
public void testEquals() {
115+
UUID uuid1 = new UUID();
116+
UUID uuid2 = new UUID();
117+
118+
assertEquals(uuid1, uuid2);
119+
assertNotEquals(uuid1, null);
120+
assertNotEquals(uuid1, new Bool());
121+
assertNotEquals(null, uuid1);
122+
123+
assertDoesNotThrow(() -> {
124+
uuid1.set(java.util.UUID.randomUUID());
125+
});
126+
assertNotEquals(uuid1, uuid2);
127+
128+
java.util.UUID u = java.util.UUID.randomUUID();
129+
assertDoesNotThrow(() -> {
130+
uuid1.set(u);
131+
assertEquals(uuid1, new UUID(u));
132+
});
133+
}
134+
135+
@Test
136+
public void equalsContractVerification() {
137+
EqualsVerifier.forClass(UUID.class).
138+
suppress(Warning.NONFINAL_FIELDS). // Scalar classes are intentionally mutable
139+
verify();
140+
}
141+
}

0 commit comments

Comments
 (0)