18
18
package org .apache .baremaps .storage .geoparquet ;
19
19
20
20
import java .util .ArrayList ;
21
+ import java .util .HashMap ;
21
22
import java .util .List ;
22
- import org .apache .baremaps .data .storage .DataColumn ;
23
+ import java .util .Map ;
24
+ import org .apache .baremaps .data .storage .*;
25
+ import org .apache .baremaps .data .storage .DataColumn .Cardinality ;
23
26
import org .apache .baremaps .data .storage .DataColumn .Type ;
24
- import org .apache .baremaps .data .storage .DataColumnImpl ;
25
- import org .apache .baremaps .data .storage .DataSchema ;
26
- import org .apache .baremaps .data .storage .DataSchemaImpl ;
27
27
import org .apache .baremaps .geoparquet .data .GeoParquetGroup ;
28
28
import org .apache .baremaps .geoparquet .data .GeoParquetGroup .Field ;
29
+ import org .apache .baremaps .geoparquet .data .GeoParquetGroup .GroupField ;
29
30
import org .apache .baremaps .geoparquet .data .GeoParquetGroup .Schema ;
30
31
31
32
public class GeoParquetTypeConversion {
32
33
33
34
private GeoParquetTypeConversion () {}
34
35
35
36
public static DataSchema asSchema (String table , Schema schema ) {
36
- List <DataColumn > columns = schema .fields ().stream ()
37
- .map (field -> (DataColumn ) new DataColumnImpl (field .name (), asSchema (field .type ())))
38
- .toList ();
37
+ List <DataColumn > columns = asDataColumns (schema );
39
38
return new DataSchemaImpl (table , columns );
40
39
}
41
40
42
- public static Type asSchema (GeoParquetGroup .Type type ) {
43
- return switch (type ) {
44
- case BINARY -> Type .BYTE_ARRAY ;
45
- case BOOLEAN -> Type .BOOLEAN ;
46
- case INTEGER -> Type .INTEGER ;
47
- case INT96 , LONG -> Type .LONG ;
48
- case FLOAT -> Type .FLOAT ;
49
- case DOUBLE -> Type .DOUBLE ;
50
- case STRING -> Type .STRING ;
51
- case GEOMETRY -> Type .GEOMETRY ;
52
- case GROUP -> null ;
41
+ private static List <DataColumn > asDataColumns (Schema field ) {
42
+ return field .fields ().stream ()
43
+ .map (GeoParquetTypeConversion ::asDataColumn )
44
+ .toList ();
45
+ }
46
+
47
+ private static DataColumn asDataColumn (Field field ) {
48
+ Cardinality cardinality = switch (field .cardinality ()) {
49
+ case REQUIRED -> Cardinality .REQUIRED ;
50
+ case OPTIONAL -> Cardinality .OPTIONAL ;
51
+ case REPEATED -> Cardinality .REPEATED ;
52
+ };
53
+ return switch (field .type ()) {
54
+ case BINARY -> new DataColumnFixed (field .name (), cardinality , Type .BINARY );
55
+ case BOOLEAN -> new DataColumnFixed (field .name (), cardinality , Type .BOOLEAN );
56
+ case INTEGER -> new DataColumnFixed (field .name (), cardinality , Type .INTEGER );
57
+ case INT96 , LONG -> new DataColumnFixed (field .name (), cardinality , Type .LONG );
58
+ case FLOAT -> new DataColumnFixed (field .name (), cardinality , Type .FLOAT );
59
+ case DOUBLE -> new DataColumnFixed (field .name (), cardinality , Type .DOUBLE );
60
+ case STRING -> new DataColumnFixed (field .name (), cardinality , Type .STRING );
61
+ case GEOMETRY -> new DataColumnFixed (field .name (), cardinality , Type .GEOMETRY );
62
+ case ENVELOPE -> new DataColumnFixed (field .name (), cardinality , Type .ENVELOPE );
63
+ case GROUP -> new DataColumnNested (field .name (), cardinality ,
64
+ asDataColumns (((GroupField ) field ).schema ()));
53
65
};
54
66
}
55
67
@@ -59,7 +71,6 @@ public static List<Object> asRowValues(GeoParquetGroup group) {
59
71
List <Field > fields = schema .fields ();
60
72
for (int i = 0 ; i < fields .size (); i ++) {
61
73
Field field = fields .get (i );
62
- field .type ();
63
74
switch (field .type ()) {
64
75
case BINARY -> values .add (group .getBinaryValue (i ).getBytes ());
65
76
case BOOLEAN -> values .add (group .getBooleanValue (i ));
@@ -69,9 +80,33 @@ public static List<Object> asRowValues(GeoParquetGroup group) {
69
80
case DOUBLE -> values .add (group .getDoubleValue (i ));
70
81
case STRING -> values .add (group .getStringValue (i ));
71
82
case GEOMETRY -> values .add (group .getGeometryValue (i ));
72
- case GROUP -> values .add (null ); // TODO: values.add(asDataRow(group.getGroupValue(i)));
83
+ case ENVELOPE -> values .add (group .getEnvelopeValue (i ));
84
+ case GROUP -> values .add (asNested (group .getGroupValue (i )));
73
85
}
74
86
}
75
87
return values ;
76
88
}
89
+
90
+ public static Map <String , Object > asNested (GeoParquetGroup group ) {
91
+ Map <String , Object > nested = new HashMap <>();
92
+ Schema schema = group .getSchema ();
93
+ List <Field > fields = schema .fields ();
94
+ for (int i = 0 ; i < fields .size (); i ++) {
95
+ Field field = fields .get (i );
96
+ nested .put (field .name (), switch (field .type ()) {
97
+ case BINARY -> group .getBinaryValue (i ).getBytes ();
98
+ case BOOLEAN -> group .getBooleanValue (i );
99
+ case INTEGER -> group .getIntegerValue (i );
100
+ case INT96 , LONG -> group .getLongValue (i );
101
+ case FLOAT -> group .getFloatValue (i );
102
+ case DOUBLE -> group .getDoubleValue (i );
103
+ case STRING -> group .getStringValue (i );
104
+ case GEOMETRY -> group .getGeometryValue (i );
105
+ case ENVELOPE -> group .getEnvelopeValue (i );
106
+ case GROUP -> asNested (group .getGroupValue (i ));
107
+ });
108
+ }
109
+ return nested ;
110
+ }
111
+
77
112
}
0 commit comments