Skip to content

Commit edc87a1

Browse files
committed
fixed Period serialization
1 parent 17b8770 commit edc87a1

File tree

5 files changed

+47
-17
lines changed

5 files changed

+47
-17
lines changed

clickhouse-data/src/main/java/com/clickhouse/data/ClickHouseDataType.java

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@
44
import java.math.BigInteger;
55
import java.net.Inet4Address;
66
import java.net.Inet6Address;
7+
import java.time.Duration;
78
import java.time.LocalDate;
89
import java.time.LocalDateTime;
10+
import java.time.Period;
911
import java.time.ZonedDateTime;
1012
import java.time.temporal.ChronoUnit;
1113
import java.time.temporal.TemporalUnit;
@@ -212,17 +214,19 @@ static Map<ClickHouseDataType, Set<Class<?>>> dataTypeClassMap() {
212214
map.put(Enum16, setOf(java.lang.String.class,byte.class, Byte.class, short.class, Short.class, int.class, Integer.class, long.class, Long.class));
213215
map.put(Array, setOf(List.class, Object[].class, byte[].class, short[].class, int[].class, long[].class, boolean[].class));
214216

215-
map.put(IntervalYear, setOfAllNumberClasses);
216-
map.put(IntervalQuarter, setOfAllNumberClasses);
217-
map.put(IntervalMonth, setOfAllNumberClasses);
218-
map.put(IntervalWeek, setOfAllNumberClasses);
219-
map.put(IntervalDay, setOfAllNumberClasses);
220-
map.put(IntervalHour, setOfAllNumberClasses);
221-
map.put(IntervalMinute, setOfAllNumberClasses);
222-
map.put(IntervalSecond, setOfAllNumberClasses);
223-
map.put(IntervalMillisecond, setOfAllNumberClasses);
224-
map.put(IntervalMicrosecond, setOfAllNumberClasses);
225-
map.put(IntervalNanosecond, setOfAllNumberClasses);
217+
Set<Class<?>> dateIntervalClasses = Collections.unmodifiableSet(new HashSet<>(Arrays.asList(Period.class, Duration.class, byte.class, Byte.class, short.class, Short.class, int.class, Integer.class, long.class, Long.class, BigInteger.class)));
218+
Set<Class<?>> timeIntervalClasses = Collections.unmodifiableSet(new HashSet<>(Arrays.asList(Duration.class, byte.class, Byte.class, short.class, Short.class, int.class, Integer.class, long.class, Long.class, BigInteger.class)));
219+
map.put(IntervalYear, dateIntervalClasses);
220+
map.put(IntervalQuarter, dateIntervalClasses);
221+
map.put(IntervalMonth, dateIntervalClasses);
222+
map.put(IntervalWeek, dateIntervalClasses);
223+
map.put(IntervalDay, dateIntervalClasses);
224+
map.put(IntervalHour, timeIntervalClasses);
225+
map.put(IntervalMinute, timeIntervalClasses);
226+
map.put(IntervalSecond, timeIntervalClasses);
227+
map.put(IntervalMillisecond, timeIntervalClasses);
228+
map.put(IntervalMicrosecond, timeIntervalClasses);
229+
map.put(IntervalNanosecond, timeIntervalClasses);
226230

227231
return map;
228232
}

client-v2/src/main/java/com/clickhouse/client/api/data_formats/internal/BinaryStreamReader.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,7 @@ private TemporalAmount readIntervalValue(ClickHouseDataType dataType, InputStrea
251251
case IntervalYear:
252252
return Period.ofYears(v.intValue());
253253
case IntervalQuarter:
254-
return Period.ofMonths(4 * v.intValue());
254+
return Period.ofMonths(3 * v.intValue());
255255
case IntervalMonth:
256256
return Period.ofMonths(v.intValue());
257257
case IntervalWeek:
@@ -265,7 +265,7 @@ private TemporalAmount readIntervalValue(ClickHouseDataType dataType, InputStrea
265265
case IntervalSecond:
266266
return Duration.ofSeconds(v.longValue());
267267
case IntervalMicrosecond:
268-
return Duration.ofNanos(1000 * v.longValue());
268+
return Duration.ofNanos(v.longValue() * 1000);
269269
case IntervalMillisecond:
270270
return Duration.ofMillis(v.longValue());
271271
case IntervalNanosecond:

client-v2/src/main/java/com/clickhouse/client/api/data_formats/internal/SerializerUtils.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -611,11 +611,17 @@ private static void serializeInterval(OutputStream stream, ClickHouseColumn colu
611611
case IntervalDay:
612612
v = p.toTotalMonths() * 30 + p.getDays();
613613
break;
614+
case IntervalWeek:
615+
v = (p.toTotalMonths() * 30 + p.getDays()) / 7;
616+
break;
614617
case IntervalMonth:
615-
v = p.toTotalMonths();
618+
v = p.toTotalMonths() + p.getDays() / 30;
619+
break;
620+
case IntervalQuarter:
621+
v = (p.toTotalMonths() + (p.getDays() / 30)) / 3;
616622
break;
617623
case IntervalYear:
618-
v = p.toTotalMonths() / 12;
624+
v = (p.toTotalMonths() + (p.getDays() / 30)) / 12;
619625
break;
620626
default:
621627
throw new UnsupportedOperationException("Cannot convert Period to " + column.getDataType());

client-v2/src/test/java/com/clickhouse/client/datatypes/DataTypeTests.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,26 @@ public void testVariantWithSimpleDataTypes() throws Exception {
227227
case MultiPolygon:
228228
strValue = row.getGeoMultiPolygon("field").toString();
229229
break;
230+
case IntervalMicrosecond:
231+
case IntervalMillisecond:
232+
case IntervalSecond:
233+
case IntervalMinute:
234+
case IntervalHour:
235+
strValue = String.valueOf(row.getTemporalAmount("field"));
236+
break;
237+
case IntervalDay:
238+
case IntervalWeek:
239+
case IntervalMonth:
240+
case IntervalQuarter:
241+
case IntervalYear:
242+
Period period = (Period) value;
243+
long days = (period).getDays() + Math.round((period.toTotalMonths() * 30));
244+
value = Period.ofDays((int) days);
245+
period = (Period) row.getTemporalAmount("field");
246+
days = (period).getDays() + Math.round((period.toTotalMonths() * 30));
247+
strValue = Period.ofDays((int) days).toString();
248+
break;
249+
230250
}
231251
if (value.getClass().isPrimitive()) {
232252
Assert.assertEquals(strValue, String.valueOf(value));

client-v2/src/test/java/com/clickhouse/client/datatypes/DataTypesTestingPOJO.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -248,15 +248,15 @@ public DataTypesTestingPOJO() {
248248
groupBitmapUint64 = ClickHouseBitmap.wrap(random.longs(5, Long.MAX_VALUE - 100, Long.MAX_VALUE).toArray());
249249

250250
intervalYear = Period.ofYears(random.nextInt(4000));
251-
intervalQuarter = Period.ofDays(random.nextInt(1000));
251+
intervalQuarter = Period.ofMonths(random.nextInt(10) *3);
252252
intervalMonth = Period.ofMonths(random.nextInt(12));
253253
intervalWeek = Period.ofWeeks(random.nextInt(52));
254254
intervalDay = Period.ofDays(random.nextInt(30));
255255
intervalHour = Duration.ofHours(random.nextInt(24));
256256
intervalMinute = Duration.ofMinutes(random.nextInt(60));
257257
intervalSecond = Duration.ofSeconds(random.nextInt(60));
258258
intervalMillisecond = Duration.ofMillis(random.nextInt());
259-
intervalMicrosecond = Duration.ofNanos(random.nextInt());
259+
intervalMicrosecond = Duration.ofNanos(random.nextInt() * 1000L);
260260

261261
intervalNanosecond = Duration.ofNanos((random.nextInt()));
262262

0 commit comments

Comments
 (0)