Skip to content

Commit 7529438

Browse files
authored
feat: Duration scalar (#42)
Closes #39
1 parent c70bcf6 commit 7529438

File tree

6 files changed

+240
-8
lines changed

6 files changed

+240
-8
lines changed

Diff for: lib/src/main/java/io/cloudquery/scalar/Binary.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -59,9 +59,9 @@ public void set(Object value) throws ValidationException {
5959
return;
6060
}
6161

62-
if (value instanceof String string) {
62+
if (value instanceof CharSequence sequence) {
6363
this.valid = true;
64-
this.value = Base64.decodeBase64(string);
64+
this.value = Base64.decodeBase64(sequence.toString());
6565
return;
6666
}
6767

Diff for: lib/src/main/java/io/cloudquery/scalar/Bool.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,9 @@ public void set(Object value) throws ValidationException {
5656
return;
5757
}
5858

59-
if (value instanceof String string) {
59+
if (value instanceof CharSequence sequence) {
6060
this.valid = true;
61-
this.value = Boolean.parseBoolean(string);
61+
this.value = Boolean.parseBoolean(sequence.toString());
6262
return;
6363
}
6464

Diff for: lib/src/main/java/io/cloudquery/scalar/DateDay.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -63,9 +63,9 @@ public void set(Object value) throws ValidationException {
6363
return;
6464
}
6565

66-
if (value instanceof String string) {
66+
if (value instanceof CharSequence sequence) {
6767
this.valid = true;
68-
this.value = Integer.parseInt(string);
68+
this.value = Integer.parseInt(sequence.toString());
6969
return;
7070
}
7171

Diff for: lib/src/main/java/io/cloudquery/scalar/DateMilli.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -69,9 +69,9 @@ public void set(Object value) throws ValidationException {
6969
return;
7070
}
7171

72-
if (value instanceof String string) {
72+
if (value instanceof CharSequence sequence) {
7373
this.valid = true;
74-
this.value = Long.parseLong(string);
74+
this.value = Long.parseLong(sequence.toString());
7575
return;
7676
}
7777

Diff for: lib/src/main/java/io/cloudquery/scalar/Duration.java

+99
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
package io.cloudquery.scalar;
2+
3+
import org.apache.arrow.vector.types.TimeUnit;
4+
import org.apache.arrow.vector.types.pojo.ArrowType;
5+
6+
public class Duration implements Scalar {
7+
protected java.time.Duration value;
8+
9+
// TODO: add more units support later
10+
private static final ArrowType dt = new ArrowType.Duration(TimeUnit.MILLISECOND);
11+
12+
public Duration() {
13+
}
14+
15+
public Duration(Object value) throws ValidationException {
16+
this.set(value);
17+
}
18+
19+
@Override
20+
public String toString() {
21+
if (this.value != null) {
22+
return this.value.toString();
23+
}
24+
return NULL_VALUE_STRING;
25+
}
26+
27+
@Override
28+
public boolean isValid() {
29+
return this.value != null;
30+
}
31+
32+
@Override
33+
public ArrowType dataType() {
34+
return dt;
35+
}
36+
37+
@Override
38+
public void set(Object value) throws ValidationException {
39+
if (value == null) {
40+
this.value = null;
41+
return;
42+
}
43+
44+
if (value instanceof Scalar scalar) {
45+
if (!scalar.isValid()) {
46+
this.value = null;
47+
return;
48+
}
49+
50+
if (scalar instanceof Duration duration) {
51+
this.value = duration.value;
52+
return;
53+
}
54+
55+
this.set(scalar.get());
56+
return;
57+
}
58+
59+
if (value instanceof java.time.Duration duration) {
60+
this.value = duration;
61+
return;
62+
}
63+
64+
if (value instanceof Integer integer) {
65+
this.value = java.time.Duration.ofMillis(integer);
66+
return;
67+
}
68+
69+
if (value instanceof Long longValue) {
70+
this.value = java.time.Duration.ofMillis(longValue);
71+
return;
72+
}
73+
74+
if (value instanceof CharSequence sequence) {
75+
this.value = java.time.Duration.parse(sequence);
76+
return;
77+
}
78+
79+
throw new ValidationException(ValidationException.NO_CONVERSION_AVAILABLE, this.dataType(), value);
80+
}
81+
82+
@Override
83+
public Object get() {
84+
return this.value; // null or proper value
85+
}
86+
87+
@Override
88+
public boolean equals(Object other) {
89+
if (other == null) {
90+
return false;
91+
}
92+
93+
if (!(other instanceof Duration o)) {
94+
return false;
95+
}
96+
97+
return this.value == o.value || this.value.equals(o.value);
98+
}
99+
}
+133
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
package io.cloudquery.scalar;
2+
3+
import org.apache.arrow.vector.types.TimeUnit;
4+
import org.apache.arrow.vector.types.pojo.ArrowType;
5+
import org.junit.jupiter.api.Test;
6+
7+
import static org.junit.jupiter.api.Assertions.*;
8+
9+
10+
public class DurationTest {
11+
@Test
12+
public void testNew() {
13+
assertDoesNotThrow(() -> {
14+
new Duration();
15+
});
16+
}
17+
18+
@Test
19+
public void testNewWithValidParam() {
20+
assertDoesNotThrow(() -> {
21+
new Duration(1);
22+
new Duration("PT8H6M12.345S");
23+
new Duration(java.time.Duration.ZERO);
24+
new Duration(java.time.Duration.ofNanos(1));
25+
26+
Scalar s = new Duration(java.time.Duration.ZERO);
27+
new Duration(s);
28+
});
29+
}
30+
31+
@Test
32+
public void testNewWithInvalidParam() {
33+
assertThrows(ValidationException.class, () -> {
34+
new Duration(false);
35+
});
36+
}
37+
38+
@Test
39+
public void testToString() {
40+
Duration duration = new Duration();
41+
assertEquals(Scalar.NULL_VALUE_STRING, duration.toString());
42+
43+
assertDoesNotThrow(() -> {
44+
duration.set(1);
45+
});
46+
assertEquals("PT0.001S", duration.toString());
47+
48+
assertDoesNotThrow(() -> {
49+
duration.set(java.time.Duration.ofDays(1L));
50+
});
51+
assertEquals("PT24H", duration.toString());
52+
}
53+
54+
@Test
55+
public void testDataType() {
56+
Duration duration = new Duration();
57+
assertEquals(new ArrowType.Duration(TimeUnit.MILLISECOND), duration.dataType());
58+
}
59+
60+
@Test
61+
public void testIsValid() {
62+
Duration duration = new Duration();
63+
assertFalse(duration.isValid());
64+
65+
assertDoesNotThrow(() -> {
66+
duration.set(1L);
67+
});
68+
assertTrue(duration.isValid());
69+
}
70+
71+
@Test
72+
public void testSet() {
73+
Duration duration = new Duration();
74+
assertDoesNotThrow(() -> {
75+
duration.set(1);
76+
duration.set(1L);
77+
duration.set("PT8H6M12.345S");
78+
duration.set(java.time.Duration.ZERO);
79+
80+
Scalar s = new Duration(java.time.Duration.ZERO);
81+
duration.set(s);
82+
});
83+
}
84+
85+
@Test
86+
public void testSetWithInvalidParam() {
87+
Duration duration = new Duration();
88+
assertThrows(ValidationException.class, () -> {
89+
duration.set(false);
90+
});
91+
}
92+
93+
@Test
94+
public void testGet() {
95+
Duration duration = new Duration();
96+
assertFalse(duration.isValid());
97+
assertNull(duration.get());
98+
99+
assertDoesNotThrow(() -> {
100+
duration.set(-1L);
101+
});
102+
assertTrue(duration.isValid());
103+
assertEquals(java.time.Duration.ofMillis(-1L), duration.get());
104+
105+
assertDoesNotThrow(() -> {
106+
duration.set(java.time.Duration.ZERO);
107+
});
108+
assertTrue(duration.isValid());
109+
assertEquals(java.time.Duration.ZERO, duration.get());
110+
}
111+
112+
@Test
113+
public void testEquals() {
114+
Duration a = new Duration();
115+
Duration b = new Duration();
116+
assertEquals(a, b);
117+
assertNotEquals(a, null);
118+
assertNotEquals(a, new Bool()); // we can't cast Bool to Duration
119+
assertNotEquals(null, a);
120+
121+
assertDoesNotThrow(() -> {
122+
a.set(-1L);
123+
});
124+
assertNotEquals(a, b);
125+
126+
assertDoesNotThrow(() -> {
127+
for (Object obj : new Object[]{null, 0, 0L, -1, -1L, 1, 1L, "PT8H6M12.345S", java.time.Duration.ZERO}) {
128+
a.set(obj);
129+
assertEquals(a, new Duration(obj));
130+
}
131+
});
132+
}
133+
}

0 commit comments

Comments
 (0)