Skip to content

Commit 23af52f

Browse files
committed
add allowWraparound
1 parent 5ec6546 commit 23af52f

2 files changed

Lines changed: 29 additions & 21 deletions

File tree

parquet-column/src/main/java/org/apache/parquet/column/statistics/geometry/BoundingBox.java

Lines changed: 29 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525

2626
public class BoundingBox {
2727

28+
boolean allowWraparound = Boolean.parseBoolean(System.getenv().getOrDefault("ALLOW_BBOX_WRAPAROUND", "true"));
29+
2830
private double xMin = Double.POSITIVE_INFINITY;
2931
private double xMax = Double.NEGATIVE_INFINITY;
3032
private double yMin = Double.POSITIVE_INFINITY;
@@ -110,7 +112,7 @@ void update(Geometry geometry, String crs) {
110112
}
111113
}
112114

113-
updateXBounds(minX, maxX);
115+
updateXBounds(minX, maxX, allowWraparound);
114116

115117
yMin = Math.min(yMin, minY);
116118
yMax = Math.max(yMax, maxY);
@@ -125,7 +127,7 @@ void merge(BoundingBox other) {
125127
double minX = other.xMin;
126128
double maxX = other.xMax;
127129

128-
updateXBounds(minX, maxX);
130+
updateXBounds(minX, maxX, allowWraparound);
129131

130132
yMin = Math.min(yMin, other.yMin);
131133
yMax = Math.max(yMax, other.yMax);
@@ -161,26 +163,31 @@ private boolean isCrossingAntiMeridian(double x1, double x2) {
161163
return Math.abs(x1 - x2) > 180;
162164
}
163165

164-
private void updateXBounds(double minX, double maxX) {
165-
if (xMin == Double.POSITIVE_INFINITY || xMax == Double.NEGATIVE_INFINITY) {
166-
xMin = minX;
167-
xMax = maxX;
166+
private void updateXBounds(double minX, double maxX, boolean allowWraparound) {
167+
if (!allowWraparound) {
168+
xMin = Math.min(xMin, minX);
169+
xMax = Math.max(xMax, maxX);
168170
} else {
169-
if (!isCrossingAntiMeridian(xMax, xMin)) {
170-
if (!isCrossingAntiMeridian(maxX, minX)) {
171-
xMin = Math.min(xMin, minX);
172-
xMax = Math.max(xMax, maxX);
173-
} else {
174-
xMin = Math.max(xMin, maxX);
175-
xMax = Math.min(xMax, minX);
176-
}
171+
if (xMin == Double.POSITIVE_INFINITY || xMax == Double.NEGATIVE_INFINITY) {
172+
xMin = minX;
173+
xMax = maxX;
177174
} else {
178-
if (!isCrossingAntiMeridian(maxX, minX)) {
179-
xMin = Math.max(xMin, minX);
180-
xMax = Math.min(xMax, maxX);
175+
if (!isCrossingAntiMeridian(xMax, xMin)) {
176+
if (!isCrossingAntiMeridian(maxX, minX)) {
177+
xMin = Math.min(xMin, minX);
178+
xMax = Math.max(xMax, maxX);
179+
} else {
180+
xMin = Math.max(xMin, maxX);
181+
xMax = Math.min(xMax, minX);
182+
}
181183
} else {
182-
xMin = Math.max(xMin, maxX);
183-
xMax = Math.min(xMax, minX);
184+
if (!isCrossingAntiMeridian(maxX, minX)) {
185+
xMin = Math.max(xMin, minX);
186+
xMax = Math.min(xMax, maxX);
187+
} else {
188+
xMin = Math.max(xMin, maxX);
189+
xMax = Math.min(xMax, minX);
190+
}
184191
}
185192
}
186193
}
@@ -198,7 +205,9 @@ private boolean shouldNormalizeLongitude(String crs) {
198205
return false;
199206
}
200207
String normalizedCrs = crs.trim().toUpperCase();
201-
return "OGC:CRS84".equals(normalizedCrs) || "EPSG:4326".equals(normalizedCrs) || "SRID:4326".equals(normalizedCrs);
208+
return "OGC:CRS84".equals(normalizedCrs)
209+
|| "EPSG:4326".equals(normalizedCrs)
210+
|| "SRID:4326".equals(normalizedCrs);
202211
}
203212

204213
public BoundingBox copy() {

parquet-column/src/main/java/org/apache/parquet/column/statistics/geometry/GeospatialStatistics.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ public class GeospatialStatistics {
3939
private final BoundingBox boundingBox;
4040
private final EdgeInterpolationAlgorithm edgeAlgorithm;
4141
private final GeospatialTypes geospatialTypes;
42-
// private final WKBReader reader = new WKBReader();
4342

4443
/**
4544
* Whether the statistics has valid value.

0 commit comments

Comments
 (0)