Skip to content

Commit 89211fa

Browse files
authored
Merge pull request #190 from planetlabs/no-geometry
Allow empty and null geometries in validation
2 parents 36edb48 + aea265d commit 89211fa

File tree

9 files changed

+404
-43
lines changed

9 files changed

+404
-43
lines changed

internal/geo/geo.go

+3
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,9 @@ func DecodeGeometry(value any, encoding string) (*orbjson.Geometry, error) {
117117
if !ok {
118118
return nil, fmt.Errorf("expected bytes for wkb geometry, got %T", value)
119119
}
120+
if len(data) == 0 {
121+
return nil, nil
122+
}
120123
g, err := wkb.Unmarshal(data)
121124
if err != nil {
122125
return nil, err

internal/validator/testdata/bad-bbox-type/expected.json

+21-21
Original file line numberDiff line numberDiff line change
@@ -47,59 +47,59 @@
4747
},
4848
{
4949
"title": "optional \"orientation\" must be a valid string",
50-
"passed": true,
51-
"run": true
50+
"run": true,
51+
"passed": true
5252
},
5353
{
5454
"title": "optional \"edges\" must be a valid string",
55-
"passed": true,
56-
"run": true
55+
"run": true,
56+
"passed": true
5757
},
5858
{
5959
"title": "optional \"bbox\" must be an array of 4 or 6 numbers",
60-
"passed": false,
6160
"run": true,
61+
"passed": false,
6262
"message": "expected \"bbox\" for column \"geometry\" to be a list, got a string: \"bogus\""
6363
},
6464
{
6565
"title": "optional \"epoch\" must be a number",
66-
"passed": false,
67-
"run": false
66+
"run": false,
67+
"passed": false
6868
},
6969
{
7070
"title": "geometry columns must not be grouped",
71-
"passed": false,
72-
"run": false
71+
"run": false,
72+
"passed": false
7373
},
7474
{
7575
"title": "geometry columns must be stored using the BYTE_ARRAY parquet type",
76-
"passed": false,
77-
"run": false
76+
"run": false,
77+
"passed": false
7878
},
7979
{
8080
"title": "geometry columns must be required or optional, not repeated",
81-
"passed": false,
82-
"run": false
81+
"run": false,
82+
"passed": false
8383
},
8484
{
8585
"title": "all geometry values match the \"encoding\" metadata",
86-
"passed": false,
87-
"run": false
86+
"run": false,
87+
"passed": false
8888
},
8989
{
9090
"title": "all geometry types must be included in the \"geometry_types\" metadata (if not empty)",
91-
"passed": false,
92-
"run": false
91+
"run": false,
92+
"passed": false
9393
},
9494
{
9595
"title": "all polygon geometries must follow the \"orientation\" metadata (if present)",
96-
"passed": false,
97-
"run": false
96+
"run": false,
97+
"passed": false
9898
},
9999
{
100100
"title": "all geometries must fall within the \"bbox\" metadata (if present)",
101-
"passed": false,
102-
"run": false
101+
"run": false,
102+
"passed": false
103103
}
104104
],
105105
"metadataOnly": false

internal/validator/testdata/bad-crs-type/expected.json

+22-22
Original file line numberDiff line numberDiff line change
@@ -48,58 +48,58 @@
4848
},
4949
{
5050
"title": "optional \"orientation\" must be a valid string",
51-
"passed": false,
52-
"run": false
51+
"run": false,
52+
"passed": false
5353
},
5454
{
5555
"title": "optional \"edges\" must be a valid string",
56-
"passed": false,
57-
"run": false
56+
"run": false,
57+
"passed": false
5858
},
5959
{
6060
"title": "optional \"bbox\" must be an array of 4 or 6 numbers",
61-
"passed": false,
62-
"run": false
61+
"run": false,
62+
"passed": false
6363
},
6464
{
6565
"title": "optional \"epoch\" must be a number",
66-
"passed": false,
67-
"run": false
66+
"run": false,
67+
"passed": false
6868
},
6969
{
7070
"title": "geometry columns must not be grouped",
71-
"passed": false,
72-
"run": false
71+
"run": false,
72+
"passed": false
7373
},
7474
{
7575
"title": "geometry columns must be stored using the BYTE_ARRAY parquet type",
76-
"passed": false,
77-
"run": false
76+
"run": false,
77+
"passed": false
7878
},
7979
{
8080
"title": "geometry columns must be required or optional, not repeated",
81-
"passed": false,
82-
"run": false
81+
"run": false,
82+
"passed": false
8383
},
8484
{
8585
"title": "all geometry values match the \"encoding\" metadata",
86-
"passed": false,
87-
"run": false
86+
"run": false,
87+
"passed": false
8888
},
8989
{
9090
"title": "all geometry types must be included in the \"geometry_types\" metadata (if not empty)",
91-
"passed": false,
92-
"run": false
91+
"run": false,
92+
"passed": false
9393
},
9494
{
9595
"title": "all polygon geometries must follow the \"orientation\" metadata (if present)",
96-
"passed": false,
97-
"run": false
96+
"run": false,
97+
"passed": false
9898
},
9999
{
100100
"title": "all geometries must fall within the \"bbox\" metadata (if present)",
101-
"passed": false,
102-
"run": false
101+
"run": false,
102+
"passed": false
103103
}
104104
],
105105
"metadataOnly": false
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
{
2+
"checks": [
3+
{
4+
"title": "file must include a \"geo\" metadata key",
5+
"run": true,
6+
"passed": true
7+
},
8+
{
9+
"title": "metadata must be a JSON object",
10+
"run": true,
11+
"passed": true
12+
},
13+
{
14+
"title": "metadata must include a \"version\" string",
15+
"run": true,
16+
"passed": true
17+
},
18+
{
19+
"title": "metadata must include a \"primary_column\" string",
20+
"run": true,
21+
"passed": true
22+
},
23+
{
24+
"title": "metadata must include a \"columns\" object",
25+
"run": true,
26+
"passed": true
27+
},
28+
{
29+
"title": "column metadata must include the \"primary_column\" name",
30+
"run": true,
31+
"passed": true
32+
},
33+
{
34+
"title": "column metadata must include a valid \"encoding\" string",
35+
"run": true,
36+
"passed": true
37+
},
38+
{
39+
"title": "column metadata must include a \"geometry_types\" list",
40+
"run": true,
41+
"passed": true
42+
},
43+
{
44+
"title": "optional \"crs\" must be null or a PROJJSON object",
45+
"run": true,
46+
"passed": true
47+
},
48+
{
49+
"title": "optional \"orientation\" must be a valid string",
50+
"run": true,
51+
"passed": true
52+
},
53+
{
54+
"title": "optional \"edges\" must be a valid string",
55+
"run": true,
56+
"passed": true
57+
},
58+
{
59+
"title": "optional \"bbox\" must be an array of 4 or 6 numbers",
60+
"run": true,
61+
"passed": true
62+
},
63+
{
64+
"title": "optional \"epoch\" must be a number",
65+
"run": true,
66+
"passed": true
67+
},
68+
{
69+
"title": "geometry columns must not be grouped",
70+
"run": true,
71+
"passed": true
72+
},
73+
{
74+
"title": "geometry columns must be stored using the BYTE_ARRAY parquet type",
75+
"run": true,
76+
"passed": true
77+
},
78+
{
79+
"title": "geometry columns must be required or optional, not repeated",
80+
"run": true,
81+
"passed": true
82+
},
83+
{
84+
"title": "all geometry values match the \"encoding\" metadata",
85+
"run": true,
86+
"passed": true
87+
},
88+
{
89+
"title": "all geometry types must be included in the \"geometry_types\" metadata (if not empty)",
90+
"run": true,
91+
"passed": true
92+
},
93+
{
94+
"title": "all polygon geometries must follow the \"orientation\" metadata (if present)",
95+
"run": true,
96+
"passed": true
97+
},
98+
{
99+
"title": "all geometries must fall within the \"bbox\" metadata (if present)",
100+
"run": true,
101+
"passed": true
102+
}
103+
],
104+
"metadataOnly": false
105+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
{
2+
"metadata": {
3+
"version": "1.0.0",
4+
"primary_column": "geometry",
5+
"columns": {
6+
"geometry": {
7+
"encoding": "WKB",
8+
"geometry_types": ["Point"]
9+
}
10+
}
11+
},
12+
"data": {
13+
"type": "FeatureCollection",
14+
"features": [
15+
{
16+
"type": "Feature",
17+
"properties": {
18+
"name": "with geometry"
19+
},
20+
"geometry": {
21+
"type": "Point",
22+
"coordinates": [0, 0]
23+
}
24+
},
25+
{
26+
"type": "Feature",
27+
"properties": {
28+
"name": "empty geometry"
29+
},
30+
"geometry": {
31+
"type": "Point",
32+
"coordinates": []
33+
}
34+
}
35+
]
36+
}
37+
}

0 commit comments

Comments
 (0)