summaryrefslogtreecommitdiff
path: root/core/src/main/java/org/elasticsearch/common/geo/builders
diff options
context:
space:
mode:
Diffstat (limited to 'core/src/main/java/org/elasticsearch/common/geo/builders')
-rw-r--r--core/src/main/java/org/elasticsearch/common/geo/builders/CircleBuilder.java31
-rw-r--r--core/src/main/java/org/elasticsearch/common/geo/builders/CoordinateCollection.java22
-rw-r--r--core/src/main/java/org/elasticsearch/common/geo/builders/EnvelopeBuilder.java34
-rw-r--r--core/src/main/java/org/elasticsearch/common/geo/builders/GeometryCollectionBuilder.java48
-rw-r--r--core/src/main/java/org/elasticsearch/common/geo/builders/LineStringBuilder.java32
-rw-r--r--core/src/main/java/org/elasticsearch/common/geo/builders/MultiLineStringBuilder.java41
-rw-r--r--core/src/main/java/org/elasticsearch/common/geo/builders/MultiPointBuilder.java34
-rw-r--r--core/src/main/java/org/elasticsearch/common/geo/builders/MultiPolygonBuilder.java52
-rw-r--r--core/src/main/java/org/elasticsearch/common/geo/builders/PointBuilder.java24
-rw-r--r--core/src/main/java/org/elasticsearch/common/geo/builders/PolygonBuilder.java64
-rw-r--r--core/src/main/java/org/elasticsearch/common/geo/builders/ShapeBuilder.java27
-rw-r--r--core/src/main/java/org/elasticsearch/common/geo/builders/ShapeBuilders.java14
12 files changed, 223 insertions, 200 deletions
diff --git a/core/src/main/java/org/elasticsearch/common/geo/builders/CircleBuilder.java b/core/src/main/java/org/elasticsearch/common/geo/builders/CircleBuilder.java
index 97ef6561c9..658d8ed84c 100644
--- a/core/src/main/java/org/elasticsearch/common/geo/builders/CircleBuilder.java
+++ b/core/src/main/java/org/elasticsearch/common/geo/builders/CircleBuilder.java
@@ -36,8 +36,6 @@ public class CircleBuilder extends ShapeBuilder {
public static final String FIELD_RADIUS = "radius";
public static final GeoShapeType TYPE = GeoShapeType.CIRCLE;
- public static final CircleBuilder PROTOTYPE = new CircleBuilder();
-
private DistanceUnit unit = DistanceUnit.DEFAULT;
private double radius;
private Coordinate center;
@@ -51,6 +49,21 @@ public class CircleBuilder extends ShapeBuilder {
}
/**
+ * Read from a stream.
+ */
+ public CircleBuilder(StreamInput in) throws IOException {
+ center(readFromStream(in));
+ radius(in.readDouble(), DistanceUnit.readFromStream(in));;
+ }
+
+ @Override
+ public void writeTo(StreamOutput out) throws IOException {
+ writeCoordinateTo(center, out);
+ out.writeDouble(radius);
+ unit.writeTo(out);
+ }
+
+ /**
* Set the center of the circle
*
* @param center coordinate of the circles center
@@ -170,18 +183,4 @@ public class CircleBuilder extends ShapeBuilder {
Objects.equals(radius, other.radius) &&
Objects.equals(unit.ordinal(), other.unit.ordinal());
}
-
- @Override
- public void writeTo(StreamOutput out) throws IOException {
- writeCoordinateTo(center, out);
- out.writeDouble(radius);
- DistanceUnit.writeDistanceUnit(out, unit);
- }
-
- @Override
- public CircleBuilder readFrom(StreamInput in) throws IOException {
- return new CircleBuilder()
- .center(readCoordinateFrom(in))
- .radius(in.readDouble(), DistanceUnit.readDistanceUnit(in));
- }
}
diff --git a/core/src/main/java/org/elasticsearch/common/geo/builders/CoordinateCollection.java b/core/src/main/java/org/elasticsearch/common/geo/builders/CoordinateCollection.java
index 72ac7be811..b6b9df45d0 100644
--- a/core/src/main/java/org/elasticsearch/common/geo/builders/CoordinateCollection.java
+++ b/core/src/main/java/org/elasticsearch/common/geo/builders/CoordinateCollection.java
@@ -21,9 +21,12 @@ package org.elasticsearch.common.geo.builders;
import com.vividsolutions.jts.geom.Coordinate;
+import org.elasticsearch.common.io.stream.StreamInput;
+import org.elasticsearch.common.io.stream.StreamOutput;
import org.elasticsearch.common.xcontent.XContentBuilder;
import java.io.IOException;
+import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
@@ -48,6 +51,25 @@ public abstract class CoordinateCollection<E extends CoordinateCollection<E>> ex
this.coordinates = coordinates;
}
+ /**
+ * Read from a stream.
+ */
+ protected CoordinateCollection(StreamInput in) throws IOException {
+ int size = in.readVInt();
+ coordinates = new ArrayList<>(size);
+ for (int i=0; i < size; i++) {
+ coordinates.add(readFromStream(in));
+ }
+ }
+
+ @Override
+ public void writeTo(StreamOutput out) throws IOException {
+ out.writeVInt(coordinates.size());
+ for (Coordinate point : coordinates) {
+ writeCoordinateTo(point, out);
+ }
+ }
+
@SuppressWarnings("unchecked")
private E thisRef() {
return (E)this;
diff --git a/core/src/main/java/org/elasticsearch/common/geo/builders/EnvelopeBuilder.java b/core/src/main/java/org/elasticsearch/common/geo/builders/EnvelopeBuilder.java
index ab997387ea..5b80ceeeee 100644
--- a/core/src/main/java/org/elasticsearch/common/geo/builders/EnvelopeBuilder.java
+++ b/core/src/main/java/org/elasticsearch/common/geo/builders/EnvelopeBuilder.java
@@ -33,11 +33,12 @@ public class EnvelopeBuilder extends ShapeBuilder {
public static final GeoShapeType TYPE = GeoShapeType.ENVELOPE;
- public static final EnvelopeBuilder PROTOTYPE = new EnvelopeBuilder(new Coordinate(-1.0, 1.0), new Coordinate(1.0, -1.0));
-
- private Coordinate topLeft;
- private Coordinate bottomRight;
+ private final Coordinate topLeft;
+ private final Coordinate bottomRight;
+ /**
+ * Build an envelope from the top left and bottom right coordinates.
+ */
public EnvelopeBuilder(Coordinate topLeft, Coordinate bottomRight) {
Objects.requireNonNull(topLeft, "topLeft of envelope cannot be null");
Objects.requireNonNull(bottomRight, "bottomRight of envelope cannot be null");
@@ -45,6 +46,20 @@ public class EnvelopeBuilder extends ShapeBuilder {
this.bottomRight = bottomRight;
}
+ /**
+ * Read from a stream.
+ */
+ public EnvelopeBuilder(StreamInput in) throws IOException {
+ topLeft = readFromStream(in);
+ bottomRight = readFromStream(in);
+ }
+
+ @Override
+ public void writeTo(StreamOutput out) throws IOException {
+ writeCoordinateTo(topLeft, out);
+ writeCoordinateTo(bottomRight, out);
+ }
+
public Coordinate topLeft() {
return this.topLeft;
}
@@ -91,15 +106,4 @@ public class EnvelopeBuilder extends ShapeBuilder {
return Objects.equals(topLeft, other.topLeft) &&
Objects.equals(bottomRight, other.bottomRight);
}
-
- @Override
- public void writeTo(StreamOutput out) throws IOException {
- writeCoordinateTo(topLeft, out);
- writeCoordinateTo(bottomRight, out);
- }
-
- @Override
- public EnvelopeBuilder readFrom(StreamInput in) throws IOException {
- return new EnvelopeBuilder(readCoordinateFrom(in), readCoordinateFrom(in));
- }
}
diff --git a/core/src/main/java/org/elasticsearch/common/geo/builders/GeometryCollectionBuilder.java b/core/src/main/java/org/elasticsearch/common/geo/builders/GeometryCollectionBuilder.java
index d21f47cf05..b8559fcb48 100644
--- a/core/src/main/java/org/elasticsearch/common/geo/builders/GeometryCollectionBuilder.java
+++ b/core/src/main/java/org/elasticsearch/common/geo/builders/GeometryCollectionBuilder.java
@@ -36,9 +36,34 @@ public class GeometryCollectionBuilder extends ShapeBuilder {
public static final GeoShapeType TYPE = GeoShapeType.GEOMETRYCOLLECTION;
- public static final GeometryCollectionBuilder PROTOTYPE = new GeometryCollectionBuilder();
+ /**
+ * List of shapes. Package scope for testing.
+ */
+ final List<ShapeBuilder> shapes = new ArrayList<>();
- protected final ArrayList<ShapeBuilder> shapes = new ArrayList<>();
+ /**
+ * Build and empty GeometryCollectionBuilder.
+ */
+ public GeometryCollectionBuilder() {
+ }
+
+ /**
+ * Read from a stream.
+ */
+ public GeometryCollectionBuilder(StreamInput in) throws IOException {
+ int shapes = in.readVInt();
+ for (int i = 0; i < shapes; i++) {
+ shape(in.readShape());
+ }
+ }
+
+ @Override
+ public void writeTo(StreamOutput out) throws IOException {
+ out.writeVInt(shapes.size());
+ for (ShapeBuilder shape : shapes) {
+ out.writeShape(shape);
+ }
+ }
public GeometryCollectionBuilder shape(ShapeBuilder shape) {
this.shapes.add(shape);
@@ -146,23 +171,4 @@ public class GeometryCollectionBuilder extends ShapeBuilder {
GeometryCollectionBuilder other = (GeometryCollectionBuilder) obj;
return Objects.equals(shapes, other.shapes);
}
-
- @Override
- public void writeTo(StreamOutput out) throws IOException {
- out.writeVInt(shapes.size());
- for (ShapeBuilder shape : shapes) {
- out.writeShape(shape);
- }
- }
-
- @Override
- public GeometryCollectionBuilder readFrom(StreamInput in) throws IOException {
- GeometryCollectionBuilder geometryCollectionBuilder = new GeometryCollectionBuilder();
- int shapes = in.readVInt();
- for (int i = 0; i < shapes; i++) {
- geometryCollectionBuilder.shape(in.readShape());
- }
- return geometryCollectionBuilder;
- }
-
}
diff --git a/core/src/main/java/org/elasticsearch/common/geo/builders/LineStringBuilder.java b/core/src/main/java/org/elasticsearch/common/geo/builders/LineStringBuilder.java
index cbc9002c78..e79578d9ab 100644
--- a/core/src/main/java/org/elasticsearch/common/geo/builders/LineStringBuilder.java
+++ b/core/src/main/java/org/elasticsearch/common/geo/builders/LineStringBuilder.java
@@ -19,15 +19,14 @@
package org.elasticsearch.common.geo.builders;
-import org.locationtech.spatial4j.shape.Shape;
import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.geom.GeometryFactory;
import com.vividsolutions.jts.geom.LineString;
import org.elasticsearch.common.io.stream.StreamInput;
-import org.elasticsearch.common.io.stream.StreamOutput;
import org.elasticsearch.common.xcontent.XContentBuilder;
+import org.locationtech.spatial4j.shape.Shape;
import java.io.IOException;
import java.util.ArrayList;
@@ -36,6 +35,7 @@ import java.util.List;
import java.util.Objects;
public class LineStringBuilder extends CoordinateCollection<LineStringBuilder> {
+ public static final GeoShapeType TYPE = GeoShapeType.LINESTRING;
/**
* Construct a new LineString.
@@ -55,9 +55,12 @@ public class LineStringBuilder extends CoordinateCollection<LineStringBuilder> {
this(coordinates.build());
}
- public static final GeoShapeType TYPE = GeoShapeType.LINESTRING;
-
- public static final LineStringBuilder PROTOTYPE = new LineStringBuilder(new CoordinatesBuilder().coordinate(0.0, 0.0).coordinate(1.0, 1.0));
+ /**
+ * Read from a stream.
+ */
+ public LineStringBuilder(StreamInput in) throws IOException {
+ super(in);
+ }
@Override
public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException {
@@ -182,23 +185,4 @@ public class LineStringBuilder extends CoordinateCollection<LineStringBuilder> {
LineStringBuilder other = (LineStringBuilder) obj;
return Objects.equals(coordinates, other.coordinates);
}
-
- @Override
- public void writeTo(StreamOutput out) throws IOException {
- out.writeVInt(coordinates.size());
- for (Coordinate point : coordinates) {
- writeCoordinateTo(point, out);
- }
- }
-
- @Override
- public LineStringBuilder readFrom(StreamInput in) throws IOException {
- CoordinatesBuilder coordinates = new CoordinatesBuilder();
- int size = in.readVInt();
- for (int i=0; i < size; i++) {
- coordinates.coordinate(readCoordinateFrom(in));
- }
- LineStringBuilder lineStringBuilder = new LineStringBuilder(coordinates);
- return lineStringBuilder;
- }
}
diff --git a/core/src/main/java/org/elasticsearch/common/geo/builders/MultiLineStringBuilder.java b/core/src/main/java/org/elasticsearch/common/geo/builders/MultiLineStringBuilder.java
index 51f4fd232c..04e25862c8 100644
--- a/core/src/main/java/org/elasticsearch/common/geo/builders/MultiLineStringBuilder.java
+++ b/core/src/main/java/org/elasticsearch/common/geo/builders/MultiLineStringBuilder.java
@@ -37,10 +37,29 @@ public class MultiLineStringBuilder extends ShapeBuilder {
public static final GeoShapeType TYPE = GeoShapeType.MULTILINESTRING;
- public static final MultiLineStringBuilder PROTOTYPE = new MultiLineStringBuilder();
-
private final ArrayList<LineStringBuilder> lines = new ArrayList<>();
+ public MultiLineStringBuilder() {
+ }
+
+ /**
+ * Read from a stream.
+ */
+ public MultiLineStringBuilder(StreamInput in) throws IOException {
+ int size = in.readVInt();
+ for (int i = 0; i < size; i++) {
+ linestring(new LineStringBuilder(in));
+ }
+ }
+
+ @Override
+ public void writeTo(StreamOutput out) throws IOException {
+ out.writeVInt(lines.size());
+ for (LineStringBuilder line : lines) {
+ line.writeTo(out);
+ }
+ }
+
public MultiLineStringBuilder linestring(LineStringBuilder line) {
this.lines.add(line);
return this;
@@ -114,22 +133,4 @@ public class MultiLineStringBuilder extends ShapeBuilder {
MultiLineStringBuilder other = (MultiLineStringBuilder) obj;
return Objects.equals(lines, other.lines);
}
-
- @Override
- public void writeTo(StreamOutput out) throws IOException {
- out.writeVInt(lines.size());
- for (LineStringBuilder line : lines) {
- line.writeTo(out);
- }
- }
-
- @Override
- public MultiLineStringBuilder readFrom(StreamInput in) throws IOException {
- MultiLineStringBuilder multiLineStringBuilder = new MultiLineStringBuilder();
- int size = in.readVInt();
- for (int i = 0; i < size; i++) {
- multiLineStringBuilder.linestring(LineStringBuilder.PROTOTYPE.readFrom(in));
- }
- return multiLineStringBuilder;
- }
}
diff --git a/core/src/main/java/org/elasticsearch/common/geo/builders/MultiPointBuilder.java b/core/src/main/java/org/elasticsearch/common/geo/builders/MultiPointBuilder.java
index b8f2c8137e..f8a0624436 100644
--- a/core/src/main/java/org/elasticsearch/common/geo/builders/MultiPointBuilder.java
+++ b/core/src/main/java/org/elasticsearch/common/geo/builders/MultiPointBuilder.java
@@ -19,14 +19,13 @@
package org.elasticsearch.common.geo.builders;
-import org.locationtech.spatial4j.shape.Point;
-import org.locationtech.spatial4j.shape.Shape;
import com.vividsolutions.jts.geom.Coordinate;
import org.elasticsearch.common.geo.XShapeCollection;
import org.elasticsearch.common.io.stream.StreamInput;
-import org.elasticsearch.common.io.stream.StreamOutput;
import org.elasticsearch.common.xcontent.XContentBuilder;
+import org.locationtech.spatial4j.shape.Point;
+import org.locationtech.spatial4j.shape.Shape;
import java.io.IOException;
import java.util.ArrayList;
@@ -37,8 +36,6 @@ public class MultiPointBuilder extends CoordinateCollection<MultiPointBuilder> {
public static final GeoShapeType TYPE = GeoShapeType.MULTIPOINT;
- public static final MultiPointBuilder PROTOTYPE = new MultiPointBuilder(new CoordinatesBuilder().coordinate(0.0, 0.0).build());
-
/**
* Create a new {@link MultiPointBuilder}.
* @param coordinates needs at least two coordinates to be valid, otherwise will throw an exception
@@ -47,6 +44,13 @@ public class MultiPointBuilder extends CoordinateCollection<MultiPointBuilder> {
super(coordinates);
}
+ /**
+ * Read from a stream.
+ */
+ public MultiPointBuilder(StreamInput in) throws IOException {
+ super(in);
+ }
+
@Override
public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException {
builder.startObject();
@@ -91,24 +95,4 @@ public class MultiPointBuilder extends CoordinateCollection<MultiPointBuilder> {
MultiPointBuilder other = (MultiPointBuilder) obj;
return Objects.equals(coordinates, other.coordinates);
}
-
- @Override
- public void writeTo(StreamOutput out) throws IOException {
- out.writeVInt(coordinates.size());
- for (Coordinate point : coordinates) {
- writeCoordinateTo(point, out);
- }
- }
-
- @Override
- public MultiPointBuilder readFrom(StreamInput in) throws IOException {
- int size = in.readVInt();
- List<Coordinate> points = new ArrayList<Coordinate>(size);
- for (int i=0; i < size; i++) {
- points.add(readCoordinateFrom(in));
- }
- MultiPointBuilder multiPointBuilder = new MultiPointBuilder(points);
-
- return multiPointBuilder;
- }
}
diff --git a/core/src/main/java/org/elasticsearch/common/geo/builders/MultiPolygonBuilder.java b/core/src/main/java/org/elasticsearch/common/geo/builders/MultiPolygonBuilder.java
index 6ee679b730..f5e5bca505 100644
--- a/core/src/main/java/org/elasticsearch/common/geo/builders/MultiPolygonBuilder.java
+++ b/core/src/main/java/org/elasticsearch/common/geo/builders/MultiPolygonBuilder.java
@@ -36,20 +36,45 @@ import java.util.Objects;
public class MultiPolygonBuilder extends ShapeBuilder {
public static final GeoShapeType TYPE = GeoShapeType.MULTIPOLYGON;
- public static final MultiPolygonBuilder PROTOTYPE = new MultiPolygonBuilder();
- private final ArrayList<PolygonBuilder> polygons = new ArrayList<>();
+ private final List<PolygonBuilder> polygons = new ArrayList<>();
- private Orientation orientation = Orientation.RIGHT;
+ private final Orientation orientation;
+ /**
+ * Build a MultiPolygonBuilder with RIGHT orientation.
+ */
public MultiPolygonBuilder() {
this(Orientation.RIGHT);
}
+ /**
+ * Build a MultiPolygonBuilder with an arbitrary orientation.
+ */
public MultiPolygonBuilder(Orientation orientation) {
this.orientation = orientation;
}
+ /**
+ * Read from a stream.
+ */
+ public MultiPolygonBuilder(StreamInput in) throws IOException {
+ orientation = Orientation.readFrom(in);
+ int holes = in.readVInt();
+ for (int i = 0; i < holes; i++) {
+ polygon(new PolygonBuilder(in));
+ }
+ }
+
+ @Override
+ public void writeTo(StreamOutput out) throws IOException {
+ orientation.writeTo(out);
+ out.writeVInt(polygons.size());
+ for (PolygonBuilder polygon : polygons) {
+ polygon.writeTo(out);
+ }
+ }
+
public Orientation orientation() {
return this.orientation;
}
@@ -70,7 +95,7 @@ public class MultiPolygonBuilder extends ShapeBuilder {
/**
* get the list of polygons
*/
- public ArrayList<PolygonBuilder> polygons() {
+ public List<PolygonBuilder> polygons() {
return polygons;
}
@@ -134,23 +159,4 @@ public class MultiPolygonBuilder extends ShapeBuilder {
return Objects.equals(polygons, other.polygons) &&
Objects.equals(orientation, other.orientation);
}
-
- @Override
- public void writeTo(StreamOutput out) throws IOException {
- orientation.writeTo(out);
- out.writeVInt(polygons.size());
- for (PolygonBuilder polygon : polygons) {
- polygon.writeTo(out);
- }
- }
-
- @Override
- public MultiPolygonBuilder readFrom(StreamInput in) throws IOException {
- MultiPolygonBuilder polyBuilder = new MultiPolygonBuilder(Orientation.readFrom(in));
- int holes = in.readVInt();
- for (int i = 0; i < holes; i++) {
- polyBuilder.polygon(PolygonBuilder.PROTOTYPE.readFrom(in));
- }
- return polyBuilder;
- }
}
diff --git a/core/src/main/java/org/elasticsearch/common/geo/builders/PointBuilder.java b/core/src/main/java/org/elasticsearch/common/geo/builders/PointBuilder.java
index 30b7e370f2..fdd9826410 100644
--- a/core/src/main/java/org/elasticsearch/common/geo/builders/PointBuilder.java
+++ b/core/src/main/java/org/elasticsearch/common/geo/builders/PointBuilder.java
@@ -30,9 +30,7 @@ import java.io.IOException;
import java.util.Objects;
public class PointBuilder extends ShapeBuilder {
-
public static final GeoShapeType TYPE = GeoShapeType.POINT;
- public static final PointBuilder PROTOTYPE = new PointBuilder();
private Coordinate coordinate;
@@ -43,6 +41,18 @@ public class PointBuilder extends ShapeBuilder {
this.coordinate = ZERO_ZERO;
}
+ /**
+ * Read from a stream.
+ */
+ public PointBuilder(StreamInput in) throws IOException {
+ coordinate = readFromStream(in);
+ }
+
+ @Override
+ public void writeTo(StreamOutput out) throws IOException {
+ writeCoordinateTo(coordinate, out);
+ }
+
public PointBuilder coordinate(Coordinate coordinate) {
this.coordinate = coordinate;
return this;
@@ -91,14 +101,4 @@ public class PointBuilder extends ShapeBuilder {
PointBuilder other = (PointBuilder) obj;
return Objects.equals(coordinate, other.coordinate);
}
-
- @Override
- public void writeTo(StreamOutput out) throws IOException {
- writeCoordinateTo(coordinate, out);
- }
-
- @Override
- public PointBuilder readFrom(StreamInput in) throws IOException {
- return new PointBuilder().coordinate(readCoordinateFrom(in));
- }
}
diff --git a/core/src/main/java/org/elasticsearch/common/geo/builders/PolygonBuilder.java b/core/src/main/java/org/elasticsearch/common/geo/builders/PolygonBuilder.java
index 52314c98ef..9fad4fb8ef 100644
--- a/core/src/main/java/org/elasticsearch/common/geo/builders/PolygonBuilder.java
+++ b/core/src/main/java/org/elasticsearch/common/geo/builders/PolygonBuilder.java
@@ -53,8 +53,6 @@ import java.util.concurrent.atomic.AtomicBoolean;
public class PolygonBuilder extends ShapeBuilder {
public static final GeoShapeType TYPE = GeoShapeType.POLYGON;
- public static final PolygonBuilder PROTOTYPE = new PolygonBuilder(new CoordinatesBuilder().coordinate(0.0, 0.0).coordinate(0.0, 1.0)
- .coordinate(1.0, 0.0).coordinate(0.0, 0.0));
private static final Coordinate[][] EMPTY = new Coordinate[0][];
@@ -64,7 +62,7 @@ public class PolygonBuilder extends ShapeBuilder {
private LineStringBuilder shell;
// List of line strings defining the holes of the polygon
- private final ArrayList<LineStringBuilder> holes = new ArrayList<>();
+ private final List<LineStringBuilder> holes = new ArrayList<>();
public PolygonBuilder(LineStringBuilder lineString, Orientation orientation, boolean coerce) {
this.orientation = orientation;
@@ -87,6 +85,28 @@ public class PolygonBuilder extends ShapeBuilder {
this(coordinates, Orientation.RIGHT);
}
+ /**
+ * Read from a stream.
+ */
+ public PolygonBuilder(StreamInput in) throws IOException {
+ shell = new LineStringBuilder(in);
+ orientation = Orientation.readFrom(in);
+ int holes = in.readVInt();
+ for (int i = 0; i < holes; i++) {
+ hole(new LineStringBuilder(in));
+ }
+ }
+
+ @Override
+ public void writeTo(StreamOutput out) throws IOException {
+ shell.writeTo(out);
+ orientation.writeTo(out);
+ out.writeVInt(holes.size());
+ for (LineStringBuilder hole : holes) {
+ hole.writeTo(out);
+ }
+ }
+
public Orientation orientation() {
return this.orientation;
}
@@ -383,10 +403,10 @@ public class PolygonBuilder extends ShapeBuilder {
return coordinates;
}
- private static Coordinate[][][] buildCoordinates(ArrayList<ArrayList<Coordinate[]>> components) {
+ private static Coordinate[][][] buildCoordinates(List<List<Coordinate[]>> components) {
Coordinate[][][] result = new Coordinate[components.size()][][];
for (int i = 0; i < result.length; i++) {
- ArrayList<Coordinate[]> component = components.get(i);
+ List<Coordinate[]> component = components.get(i);
result[i] = component.toArray(new Coordinate[component.size()][]);
}
@@ -416,13 +436,13 @@ public class PolygonBuilder extends ShapeBuilder {
return points;
}
- private static Edge[] edges(Edge[] edges, int numHoles, ArrayList<ArrayList<Coordinate[]>> components) {
+ private static Edge[] edges(Edge[] edges, int numHoles, List<List<Coordinate[]>> components) {
ArrayList<Edge> mainEdges = new ArrayList<>(edges.length);
for (int i = 0; i < edges.length; i++) {
if (edges[i].component >= 0) {
int length = component(edges[i], -(components.size()+numHoles+1), mainEdges);
- ArrayList<Coordinate[]> component = new ArrayList<>();
+ List<Coordinate[]> component = new ArrayList<>();
component.add(coordinates(edges[i], new Coordinate[length+1]));
components.add(component);
}
@@ -432,12 +452,12 @@ public class PolygonBuilder extends ShapeBuilder {
}
private static Coordinate[][][] compose(Edge[] edges, Edge[] holes, int numHoles) {
- final ArrayList<ArrayList<Coordinate[]>> components = new ArrayList<>();
+ final List<List<Coordinate[]>> components = new ArrayList<>();
assign(holes, holes(holes, numHoles), numHoles, edges(edges, numHoles, components), components);
return buildCoordinates(components);
}
- private static void assign(Edge[] holes, Coordinate[][] points, int numHoles, Edge[] edges, ArrayList<ArrayList<Coordinate[]>> components) {
+ private static void assign(Edge[] holes, Coordinate[][] points, int numHoles, Edge[] edges, List<List<Coordinate[]>> components) {
// Assign Hole to related components
// To find the new component the hole belongs to all intersections of the
// polygon edges with a vertical line are calculated. This vertical line
@@ -668,8 +688,8 @@ public class PolygonBuilder extends ShapeBuilder {
* number of points to use
* @return the edges creates
*/
- private static Edge[] concat(int component, boolean direction, Coordinate[] points, final int pointOffset, Edge[] edges, final int edgeOffset,
- int length) {
+ private static Edge[] concat(int component, boolean direction, Coordinate[] points, final int pointOffset, Edge[] edges,
+ final int edgeOffset, int length) {
assert edges.length >= length+edgeOffset;
assert points.length >= length+pointOffset;
edges[edgeOffset] = new Edge(points[pointOffset], null);
@@ -725,26 +745,4 @@ public class PolygonBuilder extends ShapeBuilder {
Objects.equals(holes, other.holes) &&
Objects.equals(orientation, other.orientation);
}
-
- @Override
- public void writeTo(StreamOutput out) throws IOException {
- shell.writeTo(out);
- orientation.writeTo(out);
- out.writeVInt(holes.size());
- for (LineStringBuilder hole : holes) {
- hole.writeTo(out);
- }
- }
-
- @Override
- public PolygonBuilder readFrom(StreamInput in) throws IOException {
- LineStringBuilder shell = LineStringBuilder.PROTOTYPE.readFrom(in);
- Orientation orientation = Orientation.readFrom(in);
- PolygonBuilder polyBuilder = new PolygonBuilder(shell, orientation);
- int holes = in.readVInt();
- for (int i = 0; i < holes; i++) {
- polyBuilder.hole(LineStringBuilder.PROTOTYPE.readFrom(in));
- }
- return polyBuilder;
- }
}
diff --git a/core/src/main/java/org/elasticsearch/common/geo/builders/ShapeBuilder.java b/core/src/main/java/org/elasticsearch/common/geo/builders/ShapeBuilder.java
index d0c7396457..a0d77d004d 100644
--- a/core/src/main/java/org/elasticsearch/common/geo/builders/ShapeBuilder.java
+++ b/core/src/main/java/org/elasticsearch/common/geo/builders/ShapeBuilder.java
@@ -180,7 +180,7 @@ public abstract class ShapeBuilder extends ToXContentToBytes implements NamedWri
out.writeDouble(coordinate.y);
}
- protected Coordinate readCoordinateFrom(StreamInput in) throws IOException {
+ protected static Coordinate readFromStream(StreamInput in) throws IOException {
return new Coordinate(in.readDouble(), in.readDouble());
}
@@ -519,7 +519,8 @@ public abstract class ShapeBuilder extends ToXContentToBytes implements NamedWri
} else if (geometryCollections == null && GeoShapeType.GEOMETRYCOLLECTION == shapeType) {
throw new ElasticsearchParseException("geometries not included");
} else if (radius != null && GeoShapeType.CIRCLE != shapeType) {
- throw new ElasticsearchParseException("field [{}] is supported for [{}] only", CircleBuilder.FIELD_RADIUS, CircleBuilder.TYPE);
+ throw new ElasticsearchParseException("field [{}] is supported for [{}] only", CircleBuilder.FIELD_RADIUS,
+ CircleBuilder.TYPE);
}
switch (shapeType) {
@@ -539,7 +540,8 @@ public abstract class ShapeBuilder extends ToXContentToBytes implements NamedWri
protected static void validatePointNode(CoordinateNode node) {
if (node.isEmpty()) {
- throw new ElasticsearchParseException("invalid number of points (0) provided when expecting a single coordinate ([lat, lng])");
+ throw new ElasticsearchParseException(
+ "invalid number of points (0) provided when expecting a single coordinate ([lat, lng])");
} else if (node.coordinate == null) {
if (node.children.isEmpty() == false) {
throw new ElasticsearchParseException("multipoint data provided when single point data expected.");
@@ -559,8 +561,9 @@ public abstract class ShapeBuilder extends ToXContentToBytes implements NamedWri
protected static EnvelopeBuilder parseEnvelope(CoordinateNode coordinates) {
// validate the coordinate array for envelope type
if (coordinates.children.size() != 2) {
- throw new ElasticsearchParseException("invalid number of points [{}] provided for " +
- "geo_shape [{}] when expecting an array of 2 coordinates", coordinates.children.size(), GeoShapeType.ENVELOPE.shapename);
+ throw new ElasticsearchParseException(
+ "invalid number of points [{}] provided for geo_shape [{}] when expecting an array of 2 coordinates",
+ coordinates.children.size(), GeoShapeType.ENVELOPE.shapename);
}
// verify coordinate bounds, correct if necessary
Coordinate uL = coordinates.children.get(0).coordinate;
@@ -604,7 +607,8 @@ public abstract class ShapeBuilder extends ToXContentToBytes implements NamedWri
* LineStringBuilder should throw a graceful exception if < 2 coordinates/points are provided
*/
if (coordinates.children.size() < 2) {
- throw new ElasticsearchParseException("invalid number of points in LineString (found [{}] - must be >= 2)", coordinates.children.size());
+ throw new ElasticsearchParseException("invalid number of points in LineString (found [{}] - must be >= 2)",
+ coordinates.children.size());
}
CoordinatesBuilder line = new CoordinatesBuilder();
@@ -636,10 +640,10 @@ public abstract class ShapeBuilder extends ToXContentToBytes implements NamedWri
throw new ElasticsearchParseException(error);
}
- int numValidPts;
- if (coordinates.children.size() < (numValidPts = (coerce) ? 3 : 4)) {
- throw new ElasticsearchParseException("invalid number of points in LinearRing (found [{}] - must be >= " + numValidPts + ")(",
- coordinates.children.size());
+ int numValidPts = coerce ? 3 : 4;
+ if (coordinates.children.size() < numValidPts) {
+ throw new ElasticsearchParseException("invalid number of points in LinearRing (found [{}] - must be >= [{}])",
+ coordinates.children.size(), numValidPts);
}
if (!coordinates.children.get(0).coordinate.equals(
@@ -655,7 +659,8 @@ public abstract class ShapeBuilder extends ToXContentToBytes implements NamedWri
protected static PolygonBuilder parsePolygon(CoordinateNode coordinates, final Orientation orientation, final boolean coerce) {
if (coordinates.children == null || coordinates.children.isEmpty()) {
- throw new ElasticsearchParseException("invalid LinearRing provided for type polygon. Linear ring must be an array of coordinates");
+ throw new ElasticsearchParseException(
+ "invalid LinearRing provided for type polygon. Linear ring must be an array of coordinates");
}
LineStringBuilder shell = parseLinearRing(coordinates.children.get(0), coerce);
diff --git a/core/src/main/java/org/elasticsearch/common/geo/builders/ShapeBuilders.java b/core/src/main/java/org/elasticsearch/common/geo/builders/ShapeBuilders.java
index 1c82881443..5194510bcf 100644
--- a/core/src/main/java/org/elasticsearch/common/geo/builders/ShapeBuilders.java
+++ b/core/src/main/java/org/elasticsearch/common/geo/builders/ShapeBuilders.java
@@ -21,6 +21,8 @@ package org.elasticsearch.common.geo.builders;
import com.vividsolutions.jts.geom.Coordinate;
+import org.elasticsearch.common.io.stream.NamedWriteableRegistry;
+
import java.util.List;
/**
@@ -137,4 +139,16 @@ public class ShapeBuilders {
public static EnvelopeBuilder newEnvelope(Coordinate topLeft, Coordinate bottomRight) {
return new EnvelopeBuilder(topLeft, bottomRight);
}
+
+ public static void register(NamedWriteableRegistry namedWriteableRegistry) {
+ namedWriteableRegistry.register(ShapeBuilder.class, PointBuilder.TYPE.shapeName(), PointBuilder::new);
+ namedWriteableRegistry.register(ShapeBuilder.class, CircleBuilder.TYPE.shapeName(), CircleBuilder::new);
+ namedWriteableRegistry.register(ShapeBuilder.class, EnvelopeBuilder.TYPE.shapeName(), EnvelopeBuilder::new);
+ namedWriteableRegistry.register(ShapeBuilder.class, MultiPointBuilder.TYPE.shapeName(), MultiPointBuilder::new);
+ namedWriteableRegistry.register(ShapeBuilder.class, LineStringBuilder.TYPE.shapeName(), LineStringBuilder::new);
+ namedWriteableRegistry.register(ShapeBuilder.class, MultiLineStringBuilder.TYPE.shapeName(), MultiLineStringBuilder::new);
+ namedWriteableRegistry.register(ShapeBuilder.class, PolygonBuilder.TYPE.shapeName(), PolygonBuilder::new);
+ namedWriteableRegistry.register(ShapeBuilder.class, MultiPolygonBuilder.TYPE.shapeName(), MultiPolygonBuilder::new);
+ namedWriteableRegistry.register(ShapeBuilder.class, GeometryCollectionBuilder.TYPE.shapeName(), GeometryCollectionBuilder::new);
+ }
}