Skip to content

Commit 970cc42

Browse files
update for logical type handling
1 parent 5e429bd commit 970cc42

File tree

3 files changed

+44
-47
lines changed

3 files changed

+44
-47
lines changed

hudi-common/src/main/java/org/apache/hudi/common/schema/HoodieSchema.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1092,6 +1092,10 @@ public String getName() {
10921092
return String.format("decimal(%d,%d)", precision, scale);
10931093
}
10941094

1095+
public boolean isFixed() {
1096+
return fixedSize.isPresent();
1097+
}
1098+
10951099
@Override
10961100
public int getFixedSize() {
10971101
if (fixedSize.isPresent()) {

hudi-common/src/main/java/org/apache/hudi/internal/schema/convert/InternalSchemaConverter.java

Lines changed: 32 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@
3131
import org.apache.hudi.internal.schema.Types;
3232
import org.apache.hudi.internal.schema.utils.InternalSchemaUtils;
3333

34-
import org.apache.avro.LogicalType;
3534
import org.apache.avro.LogicalTypes;
3635
import org.apache.avro.Schema;
3736

@@ -301,42 +300,8 @@ private static Type visitSchemaToBuildType(HoodieSchema schema, Deque<String> vi
301300
}
302301
}
303302

304-
private static Type visitPrimitiveToBuildInternalType(HoodieSchema hoodieSchema) {
305-
Schema primitive = hoodieSchema.toAvroSchema();
306-
LogicalType logical = primitive.getLogicalType();
307-
if (logical != null) {
308-
String name = logical.getName();
309-
if (logical instanceof LogicalTypes.Decimal) {
310-
if (primitive.getType() == Schema.Type.FIXED) {
311-
return Types.DecimalTypeFixed.get(((LogicalTypes.Decimal) logical).getPrecision(),
312-
((LogicalTypes.Decimal) logical).getScale(), primitive.getFixedSize());
313-
} else if (primitive.getType() == Schema.Type.BYTES) {
314-
return Types.DecimalTypeBytes.get(
315-
((LogicalTypes.Decimal) logical).getPrecision(),
316-
((LogicalTypes.Decimal) logical).getScale());
317-
} else {
318-
throw new IllegalArgumentException("Unsupported primitive type for Decimal: " + primitive.getType().getName());
319-
}
320-
} else if (logical instanceof LogicalTypes.Date) {
321-
return Types.DateType.get();
322-
} else if (logical instanceof LogicalTypes.TimeMillis) {
323-
return Types.TimeMillisType.get();
324-
} else if (logical instanceof LogicalTypes.TimeMicros) {
325-
return Types.TimeType.get();
326-
} else if (logical instanceof LogicalTypes.TimestampMillis) {
327-
return Types.TimestampMillisType.get();
328-
} else if (logical instanceof LogicalTypes.TimestampMicros) {
329-
return Types.TimestampType.get();
330-
} else if (logical instanceof LogicalTypes.LocalTimestampMillis) {
331-
return Types.LocalTimestampMillisType.get();
332-
} else if (logical instanceof LogicalTypes.LocalTimestampMicros) {
333-
return Types.LocalTimestampMicrosType.get();
334-
} else if (LogicalTypes.uuid().getName().equals(name)) {
335-
return Types.UUIDType.get();
336-
}
337-
}
338-
339-
switch (primitive.getType()) {
303+
private static Type visitPrimitiveToBuildInternalType(HoodieSchema schema) {
304+
switch (schema.getType()) {
340305
case BOOLEAN:
341306
return Types.BooleanType.get();
342307
case INT:
@@ -351,13 +316,41 @@ private static Type visitPrimitiveToBuildInternalType(HoodieSchema hoodieSchema)
351316
case ENUM:
352317
return Types.StringType.get();
353318
case FIXED:
354-
return Types.FixedType.getFixed(primitive.getFixedSize());
319+
return Types.FixedType.getFixed(schema.getFixedSize());
355320
case BYTES:
356321
return Types.BinaryType.get();
322+
case UUID:
323+
return Types.UUIDType.get();
324+
case DECIMAL:
325+
HoodieSchema.Decimal decimalSchema = (HoodieSchema.Decimal) schema;
326+
if (decimalSchema.isFixed()) {
327+
return Types.DecimalTypeFixed.get(decimalSchema.getPrecision(), decimalSchema.getScale(), decimalSchema.getFixedSize());
328+
}
329+
return Types.DecimalType.get(decimalSchema.getPrecision(), decimalSchema.getScale());
330+
case TIME:
331+
HoodieSchema.Time timeSchema = (HoodieSchema.Time) schema;
332+
if (timeSchema.getPrecision() == HoodieSchema.TimePrecision.MICROS) {
333+
return Types.TimeType.get();
334+
} else if (timeSchema.getPrecision() == HoodieSchema.TimePrecision.MILLIS) {
335+
return Types.TimeMillisType.get();
336+
} else {
337+
throw new UnsupportedOperationException("Unsupported time precision: " + timeSchema.getPrecision());
338+
}
339+
case TIMESTAMP:
340+
HoodieSchema.Timestamp timestampSchema = (HoodieSchema.Timestamp) schema;
341+
if (timestampSchema.getPrecision() == HoodieSchema.TimePrecision.MICROS) {
342+
return timestampSchema.isUtcAdjusted() ? Types.TimestampType.get() : Types.LocalTimestampMicrosType.get();
343+
} else if (timestampSchema.getPrecision() == HoodieSchema.TimePrecision.MILLIS) {
344+
return timestampSchema.isUtcAdjusted() ? Types.TimestampMillisType.get() : Types.LocalTimestampMillisType.get();
345+
} else {
346+
throw new UnsupportedOperationException("Unsupported timestamp precision: " + timestampSchema.getPrecision());
347+
}
348+
case DATE:
349+
return Types.DateType.get();
357350
case NULL:
358351
return null;
359352
default:
360-
throw new UnsupportedOperationException("Unsupported primitive type: " + primitive);
353+
throw new UnsupportedOperationException("Unsupported primitive type: " + schema.getType());
361354
}
362355
}
363356

hudi-common/src/test/java/org/apache/hudi/common/schema/TestHoodieSchema.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -829,7 +829,7 @@ void testCreateTimestampMillis() {
829829
HoodieSchema timestampSchema = HoodieSchema.createTimestampMillis();
830830

831831
assertEquals(HoodieSchemaType.TIMESTAMP, timestampSchema.getType());
832-
assertEquals("timestamp-millis", timestampSchema.getName().get());
832+
assertEquals("timestamp-millis", timestampSchema.getName());
833833
assertTrue(((HoodieSchema.Timestamp) timestampSchema).isUtcAdjusted());
834834
assertEquals(HoodieSchema.TimePrecision.MILLIS, ((HoodieSchema.Timestamp) timestampSchema).getPrecision());
835835
assertInstanceOf(LogicalTypes.TimestampMillis.class, timestampSchema.toAvroSchema().getLogicalType());
@@ -840,7 +840,7 @@ void testCreateTimestampMicros() {
840840
HoodieSchema timestampSchema = HoodieSchema.createTimestampMicros();
841841

842842
assertEquals(HoodieSchemaType.TIMESTAMP, timestampSchema.getType());
843-
assertEquals("timestamp-micros", timestampSchema.getName().get());
843+
assertEquals("timestamp-micros", timestampSchema.getName());
844844
assertTrue(((HoodieSchema.Timestamp) timestampSchema).isUtcAdjusted());
845845
assertEquals(HoodieSchema.TimePrecision.MICROS, ((HoodieSchema.Timestamp) timestampSchema).getPrecision());
846846
assertInstanceOf(LogicalTypes.TimestampMicros.class, timestampSchema.toAvroSchema().getLogicalType());
@@ -851,7 +851,7 @@ void testCreateLocalTimestampMillis() {
851851
HoodieSchema timestampSchema = HoodieSchema.createLocalTimestampMillis();
852852

853853
assertEquals(HoodieSchemaType.TIMESTAMP, timestampSchema.getType());
854-
assertEquals("local-timestamp-millis", timestampSchema.getName().get());
854+
assertEquals("local-timestamp-millis", timestampSchema.getName());
855855
assertFalse(((HoodieSchema.Timestamp) timestampSchema).isUtcAdjusted());
856856
assertEquals(HoodieSchema.TimePrecision.MILLIS, ((HoodieSchema.Timestamp) timestampSchema).getPrecision());
857857
assertInstanceOf(LogicalTypes.LocalTimestampMillis.class, timestampSchema.toAvroSchema().getLogicalType());
@@ -862,7 +862,7 @@ void testCreateLocalTimestampMicros() {
862862
HoodieSchema timestampSchema = HoodieSchema.createLocalTimestampMicros();
863863

864864
assertEquals(HoodieSchemaType.TIMESTAMP, timestampSchema.getType());
865-
assertEquals("local-timestamp-micros", timestampSchema.getName().get());
865+
assertEquals("local-timestamp-micros", timestampSchema.getName());
866866
assertFalse(((HoodieSchema.Timestamp) timestampSchema).isUtcAdjusted());
867867
assertEquals(HoodieSchema.TimePrecision.MICROS, ((HoodieSchema.Timestamp) timestampSchema).getPrecision());
868868
assertInstanceOf(LogicalTypes.LocalTimestampMicros.class, timestampSchema.toAvroSchema().getLogicalType());
@@ -873,7 +873,7 @@ void testCreateTimeMillisSchema() {
873873
HoodieSchema timeSchema = HoodieSchema.createTimeMillis();
874874

875875
assertEquals(HoodieSchemaType.TIME, timeSchema.getType());
876-
assertEquals("time-millis", timeSchema.getName().get());
876+
assertEquals("time-millis", timeSchema.getName());
877877
assertInstanceOf(LogicalTypes.TimeMillis.class, timeSchema.toAvroSchema().getLogicalType());
878878
}
879879

@@ -882,7 +882,7 @@ void testCreateTimeMicrosSchema() {
882882
HoodieSchema timeSchema = HoodieSchema.createTimeMicros();
883883

884884
assertEquals(HoodieSchemaType.TIME, timeSchema.getType());
885-
assertEquals("time-micros", timeSchema.getName().get());
885+
assertEquals("time-micros", timeSchema.getName());
886886
assertInstanceOf(LogicalTypes.TimeMicros.class, timeSchema.toAvroSchema().getLogicalType());
887887
}
888888

@@ -891,7 +891,7 @@ void testCreateDateSchema() {
891891
HoodieSchema dateSchema = HoodieSchema.createDate();
892892

893893
assertEquals(HoodieSchemaType.DATE, dateSchema.getType());
894-
assertEquals("date", dateSchema.getName().get());
894+
assertEquals("date", dateSchema.getName());
895895
assertInstanceOf(LogicalTypes.Date.class, dateSchema.toAvroSchema().getLogicalType());
896896
}
897897

@@ -900,7 +900,7 @@ void testCreateUuidSchema() {
900900
HoodieSchema uuidSchema = HoodieSchema.createUUID();
901901

902902
assertEquals(HoodieSchemaType.UUID, uuidSchema.getType());
903-
assertEquals("uuid", uuidSchema.getName().get());
903+
assertEquals("uuid", uuidSchema.getName());
904904
assertEquals("uuid", uuidSchema.toAvroSchema().getLogicalType().getName());
905905
}
906906
}

0 commit comments

Comments
 (0)