private def parsePrimitive()

in tools/src/main/scala/magnolify/tools/ParquetParser.scala [98:183]


  private def parsePrimitive(primitiveType: PrimitiveType): Primitive = {
    val ptn = primitiveType.getPrimitiveTypeName
    val lta = primitiveType.getLogicalTypeAnnotation
    val decimal = lta match {
      case a: DecimalLogicalTypeAnnotation => Some(a)
      case _                               => None
    }

    ptn match {
      case PTN.BOOLEAN =>
        Primitive.Boolean

      // Signed 32-bit integers
      case PTN.INT32 if lta == null =>
        Primitive.Int
      case PTN.INT32 if lta == LTA.intType(8, true) =>
        Primitive.Byte
      case PTN.INT32 if lta == LTA.intType(16, true) =>
        Primitive.Short
      case PTN.INT32 if lta == LTA.intType(32, true) =>
        Primitive.Int

      // Signed 64-bit integers
      case PTN.INT64 if lta == null =>
        Primitive.Long
      case PTN.INT64 if lta == LTA.intType(64, true) =>
        Primitive.Long

      case PTN.FLOAT =>
        Primitive.Float
      case PTN.DOUBLE =>
        Primitive.Double

      case PTN.BINARY if lta == null =>
        Primitive.Bytes
      case PTN.BINARY if lta == LTA.stringType() || lta == LTA.enumType() =>
        Primitive.String

      // BigDecimal
      case PTN.INT32 if decimal.exists(a => 1 <= a.getPrecision && a.getPrecision <= 9) =>
        Primitive.BigDecimal
      case PTN.INT64 if decimal.exists(a => 1 <= a.getPrecision && a.getPrecision <= 18) =>
        Primitive.BigDecimal
      case PTN.FIXED_LEN_BYTE_ARRAY if decimal.nonEmpty =>
        Primitive.BigDecimal
      case PTN.BINARY if decimal.nonEmpty =>
        Primitive.BigDecimal

      // Date
      case PTN.INT32 if lta == LTA.dateType() =>
        Primitive.LocalDate

      // Millis
      case PTN.INT64 if lta == LTA.timestampType(true, TimeUnit.MILLIS) =>
        Primitive.Instant
      case PTN.INT64 if lta == LTA.timestampType(false, TimeUnit.MILLIS) =>
        Primitive.LocalDateTime
      case PTN.INT32 if lta == LTA.timeType(true, TimeUnit.MILLIS) =>
        Primitive.OffsetTime
      case PTN.INT32 if lta == LTA.timeType(false, TimeUnit.MILLIS) =>
        Primitive.LocalTime

      // Micros
      case PTN.INT64 if lta == LTA.timestampType(true, TimeUnit.MICROS) =>
        Primitive.Instant
      case PTN.INT64 if lta == LTA.timestampType(false, TimeUnit.MICROS) =>
        Primitive.LocalDateTime
      case PTN.INT64 if lta == LTA.timeType(true, TimeUnit.MICROS) =>
        Primitive.OffsetTime
      case PTN.INT64 if lta == LTA.timeType(false, TimeUnit.MICROS) =>
        Primitive.LocalTime

      // Nanos
      case PTN.INT64 if lta == LTA.timestampType(true, TimeUnit.NANOS) =>
        Primitive.Instant
      case PTN.INT64 if lta == LTA.timestampType(false, TimeUnit.NANOS) =>
        Primitive.LocalDateTime
      case PTN.INT64 if lta == LTA.timeType(true, TimeUnit.NANOS) =>
        Primitive.OffsetTime
      case PTN.INT64 if lta == LTA.timeType(false, TimeUnit.NANOS) =>
        Primitive.LocalTime

      case _ =>
        throw new IllegalArgumentException(s"Unsupported primitive type $primitiveType")
    }
  }