public static TypeConverter getInstance()

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;
  }