public static GeoParquetSchema createGeoParquetSchema()

in baremaps-geoparquet/src/main/java/org/apache/baremaps/geoparquet/GeoParquetGroupFactory.java [57:118]


  public static GeoParquetSchema createGeoParquetSchema(
      GroupType schema,
      GeoParquetMetadata metadata) {

    // Map the fields
    List<Field> fields = schema.getFields().stream().map(field -> {

      // Map the column cardinality
      Cardinality cardinality = switch (field.getRepetition()) {
        case REQUIRED -> GeoParquetSchema.Cardinality.REQUIRED;
        case OPTIONAL -> GeoParquetSchema.Cardinality.OPTIONAL;
        case REPEATED -> GeoParquetSchema.Cardinality.REPEATED;
      };

      // Handle geometry columns
      if (field.isPrimitive() && metadata.columns().containsKey(field.getName())) {
        return new GeometryField(field.getName(), cardinality);
      }

      // Handle envelope columns
      else if (!field.isPrimitive() && field.getName().equals("bbox")) {
        GroupType groupType = field.asGroupType();
        GeoParquetSchema geoParquetSchema = createGeoParquetSchema(groupType, metadata);
        return new EnvelopeField(field.getName(), cardinality, geoParquetSchema);
      }

      // Handle group columns
      else if (!field.isPrimitive()) {
        GroupType groupType = field.asGroupType();
        GeoParquetSchema geoParquetSchema = createGeoParquetSchema(groupType, metadata);
        return (Field) new GroupField(
            groupType.getName(),
            cardinality,
            geoParquetSchema);
      }

      // Handle logical types
      else if (field.getLogicalTypeAnnotation() != null
          && field.getLogicalTypeAnnotation().equals(LogicalTypeAnnotation.stringType())) {
        return new StringField(field.getName(), cardinality);
      }

      // Handle primitive columns
      else {
        PrimitiveType primitiveType = field.asPrimitiveType();
        PrimitiveTypeName primitiveTypeName = primitiveType.getPrimitiveTypeName();
        String columnName = primitiveType.getName();
        return switch (primitiveTypeName) {
          case INT32 -> new IntegerField(columnName, cardinality);
          case INT64 -> new LongField(columnName, cardinality);
          case INT96 -> new Int96Field(columnName, cardinality);
          case FLOAT -> new FloatField(columnName, cardinality);
          case DOUBLE -> new DoubleField(columnName, cardinality);
          case BOOLEAN -> new BooleanField(columnName, cardinality);
          case BINARY -> new BinaryField(columnName, cardinality);
          case FIXED_LEN_BYTE_ARRAY -> new BinaryField(columnName, cardinality);
        };
      }
    }).toList();

    return new GeoParquetSchema(schema.getName(), fields);
  }