Skip to content

Commit 68149b6

Browse files
authored
Geo: replace intermediate geo objects with libs/geo (#37721)
Replaces intermediate geo objects built by ShapeBuilders with objects from the libs/geo hierarchy. This should allow us to build all geo functionality around a single hierarchy. Follow up for #35320
1 parent e88ae99 commit 68149b6

29 files changed

+465
-365
lines changed

build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,7 @@ allprojects {
212212
"org.elasticsearch:elasticsearch-core:${version}": ':libs:core',
213213
"org.elasticsearch:elasticsearch-nio:${version}": ':libs:nio',
214214
"org.elasticsearch:elasticsearch-x-content:${version}": ':libs:x-content',
215+
"org.elasticsearch:elasticsearch-geo:${version}": ':libs:elasticsearch-geo',
215216
"org.elasticsearch:elasticsearch-secure-sm:${version}": ':libs:secure-sm',
216217
"org.elasticsearch.client:elasticsearch-rest-client:${version}": ':client:rest',
217218
"org.elasticsearch.client:elasticsearch-rest-client-sniffer:${version}": ':client:sniffer',

libs/geo/src/main/java/org/elasticsearch/geo/geometry/Line.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,14 @@ public double getLon(int i) {
6767
return lons[i];
6868
}
6969

70+
public double[] getLats() {
71+
return lats.clone();
72+
}
73+
74+
public double[] getLons() {
75+
return lons.clone();
76+
}
77+
7078
@Override
7179
public ShapeType type() {
7280
return ShapeType.LINESTRING;

libs/geo/src/main/java/org/elasticsearch/geo/geometry/Point.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,11 +48,11 @@ public ShapeType type() {
4848
return ShapeType.POINT;
4949
}
5050

51-
public double lat() {
51+
public double getLat() {
5252
return lat;
5353
}
5454

55-
public double lon() {
55+
public double getLon() {
5656
return lon;
5757
}
5858

libs/geo/src/main/java/org/elasticsearch/geo/utils/WellKnownText.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -123,12 +123,12 @@ public Void visit(MultiLine multiLine) {
123123
public Void visit(MultiPoint multiPoint) {
124124
// walk through coordinates:
125125
sb.append(LPAREN);
126-
visitPoint(multiPoint.get(0).lon(), multiPoint.get(0).lat());
126+
visitPoint(multiPoint.get(0).getLon(), multiPoint.get(0).getLat());
127127
for (int i = 1; i < multiPoint.size(); ++i) {
128128
sb.append(COMMA);
129129
sb.append(SPACE);
130130
Point point = multiPoint.get(i);
131-
visitPoint(point.lon(), point.lat());
131+
visitPoint(point.getLon(), point.getLat());
132132
}
133133
sb.append(RPAREN);
134134
return null;
@@ -146,7 +146,7 @@ public Void visit(Point point) {
146146
sb.append(EMPTY);
147147
} else {
148148
sb.append(LPAREN);
149-
visitPoint(point.lon(), point.lat());
149+
visitPoint(point.getLon(), point.getLat());
150150
sb.append(RPAREN);
151151
}
152152
return null;

server/build.gradle

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,8 @@ dependencies {
7777
compile "org.elasticsearch:elasticsearch-core:${version}"
7878
compile "org.elasticsearch:elasticsearch-secure-sm:${version}"
7979
compile "org.elasticsearch:elasticsearch-x-content:${version}"
80-
80+
compile "org.elasticsearch:elasticsearch-geo:${version}"
81+
8182
compileOnly project(':libs:plugin-classloader')
8283
testRuntime project(':libs:plugin-classloader')
8384

server/src/main/java/org/elasticsearch/common/geo/GeoShapeType.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -258,7 +258,7 @@ CoordinateNode validate(CoordinateNode coordinates, boolean coerce) {
258258
},
259259
GEOMETRYCOLLECTION("geometrycollection") {
260260
@Override
261-
public ShapeBuilder<?, ?> getBuilder(CoordinateNode coordinates, DistanceUnit.Distance radius,
261+
public ShapeBuilder<?, ?, ?> getBuilder(CoordinateNode coordinates, DistanceUnit.Distance radius,
262262
Orientation orientation, boolean coerce) {
263263
// noop, handled in parser
264264
return null;
@@ -298,7 +298,7 @@ public static GeoShapeType forName(String geoshapename) {
298298
throw new IllegalArgumentException("unknown geo_shape ["+geoshapename+"]");
299299
}
300300

301-
public abstract ShapeBuilder<?, ?> getBuilder(CoordinateNode coordinates, DistanceUnit.Distance radius,
301+
public abstract ShapeBuilder<?, ?, ?> getBuilder(CoordinateNode coordinates, DistanceUnit.Distance radius,
302302
ShapeBuilder.Orientation orientation, boolean coerce);
303303
abstract CoordinateNode validate(CoordinateNode coordinates, boolean coerce);
304304

server/src/main/java/org/elasticsearch/common/geo/builders/CircleBuilder.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
import java.io.IOException;
3535
import java.util.Objects;
3636

37-
public class CircleBuilder extends ShapeBuilder<Circle, CircleBuilder> {
37+
public class CircleBuilder extends ShapeBuilder<Circle, org.elasticsearch.geo.geometry.Circle, CircleBuilder> {
3838

3939
public static final ParseField FIELD_RADIUS = new ParseField("radius");
4040
public static final GeoShapeType TYPE = GeoShapeType.CIRCLE;
@@ -164,7 +164,7 @@ public Circle buildS4J() {
164164
}
165165

166166
@Override
167-
public Object buildLucene() {
167+
public org.elasticsearch.geo.geometry.Circle buildGeometry() {
168168
throw new UnsupportedOperationException("CIRCLE geometry is not supported");
169169
}
170170

server/src/main/java/org/elasticsearch/common/geo/builders/EnvelopeBuilder.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
import java.io.IOException;
3333
import java.util.Objects;
3434

35-
public class EnvelopeBuilder extends ShapeBuilder<Rectangle, EnvelopeBuilder> {
35+
public class EnvelopeBuilder extends ShapeBuilder<Rectangle, org.elasticsearch.geo.geometry.Rectangle, EnvelopeBuilder> {
3636

3737
public static final GeoShapeType TYPE = GeoShapeType.ENVELOPE;
3838

@@ -113,8 +113,8 @@ public Rectangle buildS4J() {
113113
}
114114

115115
@Override
116-
public org.apache.lucene.geo.Rectangle buildLucene() {
117-
return new org.apache.lucene.geo.Rectangle(bottomRight.y, topLeft.y, topLeft.x, bottomRight.x);
116+
public org.elasticsearch.geo.geometry.Rectangle buildGeometry() {
117+
return new org.elasticsearch.geo.geometry.Rectangle(bottomRight.y, topLeft.y, topLeft.x, bottomRight.x);
118118
}
119119

120120
@Override

server/src/main/java/org/elasticsearch/common/geo/builders/GeometryCollectionBuilder.java

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,11 @@
3131

3232
import java.io.IOException;
3333
import java.util.ArrayList;
34-
import java.util.Arrays;
3534
import java.util.List;
3635
import java.util.Objects;
3736

38-
public class GeometryCollectionBuilder extends ShapeBuilder<Shape, GeometryCollectionBuilder> {
37+
public class GeometryCollectionBuilder extends ShapeBuilder<Shape,
38+
org.elasticsearch.geo.geometry.GeometryCollection<org.elasticsearch.geo.geometry.Geometry>, GeometryCollectionBuilder> {
3939

4040
public static final GeoShapeType TYPE = GeoShapeType.GEOMETRYCOLLECTION;
4141

@@ -185,19 +185,14 @@ public Shape buildS4J() {
185185
}
186186

187187
@Override
188-
public Object buildLucene() {
189-
List<Object> shapes = new ArrayList<>(this.shapes.size());
188+
public org.elasticsearch.geo.geometry.GeometryCollection<org.elasticsearch.geo.geometry.Geometry> buildGeometry() {
189+
List<org.elasticsearch.geo.geometry.Geometry> shapes = new ArrayList<>(this.shapes.size());
190190

191191
for (ShapeBuilder shape : this.shapes) {
192-
Object o = shape.buildLucene();
193-
if (o.getClass().isArray()) {
194-
shapes.addAll(Arrays.asList((Object[])o));
195-
} else {
196-
shapes.add(o);
197-
}
192+
shapes.add(shape.buildGeometry());
198193
}
199194

200-
return shapes.toArray(new Object[shapes.size()]);
195+
return new org.elasticsearch.geo.geometry.GeometryCollection<>(shapes);
201196
}
202197

203198
@Override

server/src/main/java/org/elasticsearch/common/geo/builders/LineStringBuilder.java

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,16 @@
1919

2020
package org.elasticsearch.common.geo.builders;
2121

22-
import org.apache.lucene.geo.Line;
23-
import org.locationtech.jts.geom.Coordinate;
24-
import org.locationtech.jts.geom.Geometry;
25-
import org.locationtech.jts.geom.GeometryFactory;
26-
import org.locationtech.jts.geom.LineString;
27-
2822
import org.elasticsearch.common.geo.GeoShapeType;
2923
import org.elasticsearch.common.geo.parsers.ShapeParser;
3024
import org.elasticsearch.common.io.stream.StreamInput;
3125
import org.elasticsearch.common.xcontent.XContentBuilder;
26+
import org.elasticsearch.geo.geometry.Line;
27+
import org.elasticsearch.geo.geometry.MultiLine;
28+
import org.locationtech.jts.geom.Coordinate;
29+
import org.locationtech.jts.geom.Geometry;
30+
import org.locationtech.jts.geom.GeometryFactory;
31+
import org.locationtech.jts.geom.LineString;
3232
import org.locationtech.spatial4j.shape.jts.JtsGeometry;
3333

3434
import java.io.IOException;
@@ -39,7 +39,7 @@
3939
import static org.elasticsearch.common.geo.GeoUtils.normalizeLat;
4040
import static org.elasticsearch.common.geo.GeoUtils.normalizeLon;
4141

42-
public class LineStringBuilder extends ShapeBuilder<JtsGeometry, LineStringBuilder> {
42+
public class LineStringBuilder extends ShapeBuilder<JtsGeometry, org.elasticsearch.geo.geometry.Geometry, LineStringBuilder> {
4343
public static final GeoShapeType TYPE = GeoShapeType.LINESTRING;
4444

4545
/**
@@ -125,15 +125,15 @@ public JtsGeometry buildS4J() {
125125
}
126126

127127
@Override
128-
public Object buildLucene() {
128+
public org.elasticsearch.geo.geometry.Geometry buildGeometry() {
129129
// decompose linestrings crossing dateline into array of Lines
130130
Coordinate[] coordinates = this.coordinates.toArray(new Coordinate[this.coordinates.size()]);
131131
if (wrapdateline) {
132-
ArrayList<Line> linestrings = decomposeLucene(coordinates, new ArrayList<>());
132+
List<Line> linestrings = decomposeGeometry(coordinates, new ArrayList<>());
133133
if (linestrings.size() == 1) {
134134
return linestrings.get(0);
135135
} else {
136-
return linestrings.toArray(new Line[linestrings.size()]);
136+
return new MultiLine(linestrings);
137137
}
138138
}
139139
return new Line(Arrays.stream(coordinates).mapToDouble(i->normalizeLat(i.y)).toArray(),
@@ -149,7 +149,7 @@ static ArrayList<LineString> decomposeS4J(GeometryFactory factory, Coordinate[]
149149
return strings;
150150
}
151151

152-
static ArrayList<Line> decomposeLucene(Coordinate[] coordinates, ArrayList<Line> lines) {
152+
static List<Line> decomposeGeometry(Coordinate[] coordinates, List<Line> lines) {
153153
for (Coordinate[] part : decompose(+DATELINE, coordinates)) {
154154
for (Coordinate[] line : decompose(-DATELINE, part)) {
155155
lines.add(new Line(Arrays.stream(line).mapToDouble(i->normalizeLat(i.y)).toArray(),

0 commit comments

Comments
 (0)