in hudi-client/hudi-flink-client/src/main/java/org/apache/hudi/util/TypeConverters.java [79:265]
public static TypeConverter getInstance(LogicalType fromType, LogicalType toType) {
LogicalTypeRoot from = fromType.getTypeRoot();
LogicalTypeRoot to = toType.getTypeRoot();
switch (to) {
case BIGINT: {
if (from == INTEGER) {
return new TypeConverter() {
private static final long serialVersionUID = 1L;
@Override
public Object convert(Object val) {
return ((Number) val).longValue();
}
};
}
break;
}
case FLOAT: {
if (from == INTEGER || from == BIGINT) {
return new TypeConverter() {
private static final long serialVersionUID = 1L;
@Override
public Object convert(Object val) {
return ((Number) val).floatValue();
}
};
}
break;
}
case DOUBLE: {
if (from == INTEGER || from == BIGINT) {
return new TypeConverter() {
private static final long serialVersionUID = 1L;
@Override
public Object convert(Object val) {
return ((Number) val).doubleValue();
}
};
}
if (from == FLOAT) {
return new TypeConverter() {
private static final long serialVersionUID = 1L;
@Override
public Object convert(Object val) {
return Double.parseDouble(val.toString());
}
};
}
break;
}
case DECIMAL: {
if (from == INTEGER || from == BIGINT || from == DOUBLE) {
return new TypeConverter() {
private static final long serialVersionUID = 1L;
@Override
public Object convert(Object val) {
return toDecimalData((Number) val, toType);
}
};
}
if (from == FLOAT) {
return new TypeConverter() {
private static final long serialVersionUID = 1L;
@Override
public Object convert(Object val) {
return toDecimalData(Double.parseDouble(val.toString()), toType);
}
};
}
if (from == VARCHAR) {
return new TypeConverter() {
private static final long serialVersionUID = 1L;
@Override
public Object convert(Object val) {
return toDecimalData(Double.parseDouble(val.toString()), toType);
}
};
}
if (from == DECIMAL) {
return new TypeConverter() {
private static final long serialVersionUID = 1L;
@Override
public Object convert(Object val) {
return toDecimalData(((DecimalData) val).toBigDecimal(), toType);
}
};
}
break;
}
case VARCHAR: {
if (from == INTEGER
|| from == BIGINT
|| from == FLOAT
|| from == DOUBLE
|| from == DECIMAL) {
return new TypeConverter() {
private static final long serialVersionUID = 1L;
@Override
public Object convert(Object val) {
return new BinaryStringData(String.valueOf(val));
}
};
}
if (from == DATE) {
return new TypeConverter() {
private static final long serialVersionUID = 1L;
@Override
public Object convert(Object val) {
return new BinaryStringData(LocalDate.ofEpochDay(((Integer) val).longValue()).toString());
}
};
}
break;
}
case DATE: {
if (from == VARCHAR) {
return new TypeConverter() {
private static final long serialVersionUID = 1L;
@Override
public Object convert(Object val) {
return (int) LocalDate.parse(val.toString()).toEpochDay();
}
};
}
break;
}
case ARRAY: {
if (from == ARRAY) {
try {
LogicalType fromElementType = fromType.getChildren().get(0);
LogicalType toElementType = toType.getChildren().get(0);
return createArrayConverter(fromElementType, toElementType);
} catch (IllegalStateException ise) {
return null;
}
}
break;
}
case MAP: {
if (from == MAP) {
try {
return createMapConverter(fromType, toType);
} catch (IllegalStateException ise) {
return null;
}
}
break;
}
case ROW: {
if (from == ROW) {
// Assumption: InternalSchemaManager should produce a cast that is of the same size
try {
// note: InternalSchema.merge guarantees that the schema to be read fromType is orientated in the same order as toType
// hence, we can match types by position as it is guaranteed that it is referencing the same field
// ignoring error messages here as the calling function's checked exception will ignore it
ValidationUtils.checkArgument(fromType.getChildren().size() == toType.getChildren().size());
return createRowConverter(fromType, toType);
} catch (IllegalStateException ise) {
return null;
}
}
break;
}
default:
}
return null;
}