private TypeMapping fromParquetPrimitive()

in parquet-arrow/src/main/java/org/apache/parquet/arrow/schema/SchemaConverter.java [507:702]


  private TypeMapping fromParquetPrimitive(final PrimitiveType type, final String name) {
    return type.getPrimitiveTypeName()
        .convert(new PrimitiveType.PrimitiveTypeNameConverter<TypeMapping, RuntimeException>() {

          private TypeMapping field(ArrowType arrowType) {
            final Field field;
            if (type.isRepetition(OPTIONAL)) {
              field = Field.nullable(name, arrowType);
            } else {
              field = Field.notNullable(name, arrowType);
            }
            return new PrimitiveTypeMapping(field, type);
          }

          @Override
          public TypeMapping convertFLOAT(PrimitiveTypeName primitiveTypeName) throws RuntimeException {
            return field(new ArrowType.FloatingPoint(FloatingPointPrecision.SINGLE));
          }

          @Override
          public TypeMapping convertDOUBLE(PrimitiveTypeName primitiveTypeName) throws RuntimeException {
            return field(new ArrowType.FloatingPoint(FloatingPointPrecision.DOUBLE));
          }

          @Override
          public TypeMapping convertINT32(PrimitiveTypeName primitiveTypeName) throws RuntimeException {
            LogicalTypeAnnotation logicalTypeAnnotation = type.getLogicalTypeAnnotation();
            if (logicalTypeAnnotation == null) {
              return integer(32, true);
            }
            return logicalTypeAnnotation
                .accept(new LogicalTypeAnnotation.LogicalTypeAnnotationVisitor<TypeMapping>() {
                  @Override
                  public Optional<TypeMapping> visit(
                      LogicalTypeAnnotation.DecimalLogicalTypeAnnotation decimalLogicalType) {
                    return of(decimal(
                        decimalLogicalType.getPrecision(), decimalLogicalType.getScale()));
                  }

                  @Override
                  public Optional<TypeMapping> visit(
                      LogicalTypeAnnotation.DateLogicalTypeAnnotation dateLogicalType) {
                    return of(field(new ArrowType.Date(DateUnit.DAY)));
                  }

                  @Override
                  public Optional<TypeMapping> visit(
                      LogicalTypeAnnotation.TimeLogicalTypeAnnotation timeLogicalType) {
                    return timeLogicalType.getUnit() == MILLIS
                        ? of(field(new ArrowType.Time(TimeUnit.MILLISECOND, 32)))
                        : empty();
                  }

                  @Override
                  public Optional<TypeMapping> visit(
                      LogicalTypeAnnotation.IntLogicalTypeAnnotation intLogicalType) {
                    if (intLogicalType.getBitWidth() == 64) {
                      return empty();
                    }
                    return of(integer(intLogicalType.getBitWidth(), intLogicalType.isSigned()));
                  }
                })
                .orElseThrow(() -> new IllegalArgumentException("illegal type " + type));
          }

          @Override
          public TypeMapping convertINT64(PrimitiveTypeName primitiveTypeName) throws RuntimeException {
            LogicalTypeAnnotation logicalTypeAnnotation = type.getLogicalTypeAnnotation();
            if (logicalTypeAnnotation == null) {
              return integer(64, true);
            }

            return logicalTypeAnnotation
                .accept(new LogicalTypeAnnotation.LogicalTypeAnnotationVisitor<TypeMapping>() {
                  @Override
                  public Optional<TypeMapping> visit(
                      LogicalTypeAnnotation.DateLogicalTypeAnnotation dateLogicalType) {
                    return of(field(new ArrowType.Date(DateUnit.DAY)));
                  }

                  @Override
                  public Optional<TypeMapping> visit(
                      LogicalTypeAnnotation.DecimalLogicalTypeAnnotation decimalLogicalType) {
                    return of(decimal(
                        decimalLogicalType.getPrecision(), decimalLogicalType.getScale()));
                  }

                  @Override
                  public Optional<TypeMapping> visit(
                      LogicalTypeAnnotation.IntLogicalTypeAnnotation intLogicalType) {
                    return of(integer(intLogicalType.getBitWidth(), intLogicalType.isSigned()));
                  }

                  @Override
                  public Optional<TypeMapping> visit(
                      LogicalTypeAnnotation.TimeLogicalTypeAnnotation timeLogicalType) {
                    if (timeLogicalType.getUnit() == MICROS) {
                      return of(field(new ArrowType.Time(TimeUnit.MICROSECOND, 64)));
                    } else if (timeLogicalType.getUnit() == NANOS) {
                      return of(field(new ArrowType.Time(TimeUnit.NANOSECOND, 64)));
                    }
                    return empty();
                  }

                  @Override
                  public Optional<TypeMapping> visit(
                      LogicalTypeAnnotation.TimestampLogicalTypeAnnotation timestampLogicalType) {
                    switch (timestampLogicalType.getUnit()) {
                      case MICROS:
                        return of(field(new ArrowType.Timestamp(
                            TimeUnit.MICROSECOND, getTimeZone(timestampLogicalType))));
                      case MILLIS:
                        return of(field(new ArrowType.Timestamp(
                            TimeUnit.MILLISECOND, getTimeZone(timestampLogicalType))));
                      case NANOS:
                        return of(field(new ArrowType.Timestamp(
                            TimeUnit.NANOSECOND, getTimeZone(timestampLogicalType))));
                    }
                    return empty();
                  }

                  private String getTimeZone(
                      LogicalTypeAnnotation.TimestampLogicalTypeAnnotation timestampLogicalType) {
                    return timestampLogicalType.isAdjustedToUTC() ? "UTC" : null;
                  }
                })
                .orElseThrow(() -> new IllegalArgumentException("illegal type " + type));
          }

          @Override
          public TypeMapping convertINT96(PrimitiveTypeName primitiveTypeName) throws RuntimeException {
            if (convertInt96ToArrowTimestamp) {
              return field(new ArrowType.Timestamp(TimeUnit.NANOSECOND, null));
            } else {
              return field(new ArrowType.Binary());
            }
          }

          @Override
          public TypeMapping convertFIXED_LEN_BYTE_ARRAY(PrimitiveTypeName primitiveTypeName)
              throws RuntimeException {
            LogicalTypeAnnotation logicalTypeAnnotation = type.getLogicalTypeAnnotation();
            if (logicalTypeAnnotation == null) {
              return field(new ArrowType.Binary());
            }

            return logicalTypeAnnotation
                .accept(new LogicalTypeAnnotation.LogicalTypeAnnotationVisitor<TypeMapping>() {
                  @Override
                  public Optional<TypeMapping> visit(
                      LogicalTypeAnnotation.DecimalLogicalTypeAnnotation decimalLogicalType) {
                    return of(decimal(
                        decimalLogicalType.getPrecision(), decimalLogicalType.getScale()));
                  }
                })
                .orElseThrow(() -> new IllegalArgumentException("illegal type " + type));
          }

          @Override
          public TypeMapping convertBOOLEAN(PrimitiveTypeName primitiveTypeName) throws RuntimeException {
            return field(new ArrowType.Bool());
          }

          @Override
          public TypeMapping convertBINARY(PrimitiveTypeName primitiveTypeName) throws RuntimeException {
            LogicalTypeAnnotation logicalTypeAnnotation = type.getLogicalTypeAnnotation();
            if (logicalTypeAnnotation == null) {
              return field(new ArrowType.Binary());
            }
            return logicalTypeAnnotation
                .accept(new LogicalTypeAnnotation.LogicalTypeAnnotationVisitor<TypeMapping>() {
                  @Override
                  public Optional<TypeMapping> visit(
                      LogicalTypeAnnotation.StringLogicalTypeAnnotation stringLogicalType) {
                    return of(field(new ArrowType.Utf8()));
                  }

                  @Override
                  public Optional<TypeMapping> visit(
                      LogicalTypeAnnotation.DecimalLogicalTypeAnnotation decimalLogicalType) {
                    return of(decimal(
                        decimalLogicalType.getPrecision(), decimalLogicalType.getScale()));
                  }
                })
                .orElseThrow(() -> new IllegalArgumentException("illegal type " + type));
          }

          private TypeMapping decimal(int precision, int scale) {
            return field(new ArrowType.Decimal(precision, scale));
          }

          private TypeMapping integer(int width, boolean signed) {
            return field(new ArrowType.Int(width, signed));
          }
        });
  }