Skip to content

Commit fa05aeb

Browse files
committed
Could remove sedona alltogether by removing an unused CIRCLE type from the serializers.
1 parent ae4ba13 commit fa05aeb

File tree

10 files changed

+458
-264
lines changed

10 files changed

+458
-264
lines changed

jena-geosparql/pom.xml

Lines changed: 0 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@
3535
</properties>
3636

3737
<dependencies>
38-
3938
<dependency>
4039
<groupId>io.github.galbiston</groupId>
4140
<artifactId>expiring-map</artifactId>
@@ -82,89 +81,10 @@
8281
<artifactId>commons-collections4</artifactId>
8382
</dependency>
8483

85-
<!-- Kryo serialization via Apache Sedona -->
86-
87-
<!--
88-
<dependency>
89-
<groupId>org.apache.sedona</groupId>
90-
<artifactId>sedona-spark-common-3.5_2.13</artifactId>
91-
<version>1.6.0</version>
92-
<exclusions>
93-
<exclusion>
94-
<groupId>org.apache.spark</groupId>
95-
<artifactId>spark-core_2.12</artifactId>
96-
</exclusion>
97-
<exclusion>
98-
<groupId>org.apache.hadoop</groupId>
99-
<artifactId>hadoop-minicluster</artifactId>
100-
</exclusion>
101-
<exclusion>
102-
<groupId>org.apache.hadoop</groupId>
103-
<artifactId>hadoop-client</artifactId>
104-
</exclusion>
105-
<exclusion>
106-
<groupId>org.geotools</groupId>
107-
<artifactId>gt-geotiff</artifactId>
108-
</exclusion>
109-
<exclusion>
110-
<groupId>org.geotools</groupId>
111-
<artifactId>gt-coverage</artifactId>
112-
</exclusion>
113-
</exclusions>
114-
</dependency>
115-
-->
116-
117-
<dependency>
118-
<groupId>org.apache.sedona</groupId>
119-
<artifactId>sedona-common</artifactId>
120-
<version>1.7.0</version>
121-
<exclusions>
122-
<exclusion>
123-
<groupId>org.apache.commons</groupId>
124-
<artifactId>commons-math3</artifactId>
125-
</exclusion>
126-
<exclusion>
127-
<groupId>org.wololo</groupId>
128-
<artifactId>jts2geojson</artifactId>
129-
</exclusion>
130-
<exclusion>
131-
<groupId>com.google.geometry</groupId>
132-
<artifactId>s2-geometry</artifactId>
133-
</exclusion>
134-
<exclusion>
135-
<groupId>com.uber</groupId>
136-
<artifactId>h3</artifactId>
137-
</exclusion>
138-
<exclusion>
139-
<groupId>net.sf.geographiclib</groupId>
140-
<artifactId>GeographicLib-Java</artifactId>
141-
</exclusion>
142-
</exclusions>
143-
</dependency>
144-
145-
<!-- H3Utils only exists in newer sedona-common versions -->
146-
<!--
147-
<dependency>
148-
<groupId>org.apache.sedona</groupId>
149-
<artifactId>sedona-common</artifactId>
150-
<version>1.6.0</version>
151-
</dependency>
152-
-->
153-
15484
<dependency>
15585
<groupId>com.esotericsoftware</groupId>
15686
<artifactId>kryo</artifactId>
157-
<version>4.0.2</version>
158-
</dependency>
159-
160-
<!-- Resolve conflicts between jenax/tika/nashorn/hadoop/kryo-->
161-
<!--
162-
<dependency>
163-
<groupId>org.ow2.asm</groupId>
164-
<artifactId>asm</artifactId>
165-
<version>8.0.1</version>
16687
</dependency>
167-
-->
16888

16989
<!-- Non-free; testing only -->
17090
<dependency>
@@ -185,8 +105,6 @@
185105
<artifactId>log4j-slf4j2-impl</artifactId>
186106
<scope>test</scope>
187107
</dependency>
188-
189-
190108
</dependencies>
191109

192110
<build>

jena-geosparql/src/main/java/org/apache/jena/geosparql/spatial/SpatialIndexFindUtils.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,8 @@ public static IteratorCloseable<SpatialIndexItem> findGeometryIndexItems(Graph g
108108
Node geometry = stmt.getObject();
109109

110110
Iterator<Node> nodeIter = G.iterSP(graph, geometry, Geo.HAS_SERIALIZATION_NODE);
111+
112+
// XXX If there is a super-property then the concrete serializations are not tried.
111113
try {
112114
if (!nodeIter.hasNext()) {
113115
Iter.close(nodeIter);

jena-geosparql/src/main/java/org/apache/jena/geosparql/spatial/index/v2/serde/GeometrySerdeAdapterSedona.java

Lines changed: 21 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -17,34 +17,25 @@
1717
*/
1818
package org.apache.jena.geosparql.spatial.index.v2.serde;
1919

20-
import java.io.Serializable;
21-
22-
import org.apache.sedona.common.geometrySerde.GeometrySerializer;
23-
import org.locationtech.jts.geom.Geometry;
24-
25-
import com.esotericsoftware.kryo.Kryo;
26-
import com.esotericsoftware.kryo.io.Input;
27-
import com.esotericsoftware.kryo.io.Output;
28-
2920
/** Geometry de-/serialization via the facilities of Apache sedona-common. */
30-
public class GeometrySerdeAdapterSedona
31-
implements GeometrySerdeAdapter, Serializable
32-
{
33-
private static final long serialVersionUID = 1L;
34-
35-
@Override
36-
public void write(Kryo kryo, Output output, Geometry geometry) {
37-
byte[] data = GeometrySerializer.serialize(geometry);
38-
output.writeInt(data.length);
39-
output.write(data, 0, data.length);
40-
}
41-
42-
@Override
43-
public Geometry read(Kryo kryo, Input input) throws Exception {
44-
int length = input.readInt();
45-
byte[] bytes = new byte[length];
46-
input.readBytes(bytes);
47-
Geometry geometry = GeometrySerializer.deserialize(bytes);
48-
return geometry;
49-
}
50-
}
21+
//public class GeometrySerdeAdapterSedona
22+
// implements GeometrySerdeAdapter, Serializable
23+
//{
24+
// private static final long serialVersionUID = 1L;
25+
//
26+
// @Override
27+
// public void write(Kryo kryo, Output output, Geometry geometry) {
28+
// byte[] data = GeometrySerializer.serialize(geometry);
29+
// output.writeInt(data.length);
30+
// output.write(data, 0, data.length);
31+
// }
32+
//
33+
// @Override
34+
// public Geometry read(Kryo kryo, Input input) throws Exception {
35+
// int length = input.readInt();
36+
// byte[] bytes = new byte[length];
37+
// input.readBytes(bytes);
38+
// Geometry geometry = GeometrySerializer.deserialize(bytes);
39+
// return geometry;
40+
// }
41+
//}

jena-geosparql/src/main/java/org/apache/jena/geosparql/spatial/index/v2/serde/sedona/CustomGeometrySerde.java

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
import java.io.Serializable;
2121

2222
import org.apache.jena.geosparql.spatial.index.v2.serde.GeometrySerdeAdapter;
23-
import org.apache.sedona.common.geometryObjects.Circle;
2423
import org.locationtech.jts.geom.Envelope;
2524
import org.locationtech.jts.geom.Geometry;
2625
import org.locationtech.jts.geom.GeometryCollection;
@@ -79,13 +78,14 @@ private Geometry readGeometry(Kryo kryo, Input input)
7978

8079
@Override
8180
public void write(Kryo kryo, Output out, Object object) {
82-
if (object instanceof Circle) {
83-
Circle circle = (Circle) object;
84-
writeType(out, Type.CIRCLE);
85-
out.writeDouble(circle.getRadius());
86-
writeGeometry(kryo, out, circle.getCenterGeometry());
87-
writeUserData(kryo, out, circle);
88-
} else if (object instanceof Point
81+
// if (object instanceof Circle) {
82+
// Circle circle = (Circle) object;
83+
// writeType(out, Type.CIRCLE);
84+
// out.writeDouble(circle.getRadius());
85+
// writeGeometry(kryo, out, circle.getCenterGeometry());
86+
// writeUserData(kryo, out, circle);
87+
// } else
88+
if (object instanceof Point
8989
|| object instanceof LineString
9090
|| object instanceof Polygon
9191
|| object instanceof GeometryCollection) {
@@ -131,16 +131,16 @@ public Object read(Kryo kryo, Input input, Class aClass) {
131131
switch (geometryType) {
132132
case SHAPE:
133133
return readGeometry(kryo, input);
134-
case CIRCLE:
135-
{
136-
double radius = input.readDouble();
137-
Geometry centerGeometry = readGeometry(kryo, input);
138-
Object userData = readUserData(kryo, input);
139-
140-
Circle circle = new Circle(centerGeometry, radius);
141-
circle.setUserData(userData);
142-
return circle;
143-
}
134+
// case CIRCLE:
135+
// {
136+
// double radius = input.readDouble();
137+
// Geometry centerGeometry = readGeometry(kryo, input);
138+
// Object userData = readUserData(kryo, input);
139+
//
140+
// Circle circle = new Circle(centerGeometry, radius);
141+
// circle.setUserData(userData);
142+
// return circle;
143+
// }
144144
case ENVELOPE:
145145
{
146146
double xMin = input.readDouble();

jena-geosparql/src/main/java/org/apache/jena/geosparql/spatial/index/v2/serde/sedona/CustomSpatialIndexSerde.java

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

2020
import java.io.Serializable;
2121

22-
import org.locationtech.jts.index.quadtree.IndexSerde;
22+
import org.locationtech.jts.index.quadtree.CustomIndexSerdeV2;
2323
import org.locationtech.jts.index.quadtree.Quadtree;
2424
import org.locationtech.jts.index.strtree.STRtree;
2525

@@ -53,7 +53,7 @@ public void write(Kryo kryo, Output output, Object o) {
5353
// serialize quadtree index
5454
writeType(output, Type.QUADTREE);
5555
Quadtree tree = (Quadtree) o;
56-
IndexSerde indexSerde = new IndexSerde();
56+
CustomIndexSerdeV2 indexSerde = new CustomIndexSerdeV2(geometrySerde);
5757
indexSerde.write(kryo, output, tree);
5858
} else if (o instanceof STRtree) {
5959
// serialize rtree index
@@ -74,7 +74,7 @@ public Object read(Kryo kryo, Input input, Class aClass) {
7474
switch (indexType) {
7575
case QUADTREE:
7676
{
77-
IndexSerde indexSerde = new IndexSerde();
77+
CustomIndexSerdeV2 indexSerde = new CustomIndexSerdeV2(geometrySerde);
7878
return indexSerde.read(kryo, input);
7979
}
8080
case RTREE:
Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
/*
2+
* Licensed to the Apache Software Foundation (ASF) under one
3+
* or more contributor license agreements. See the NOTICE file
4+
* distributed with this work for additional information
5+
* regarding copyright ownership. The ASF licenses this file
6+
* to you under the Apache License, Version 2.0 (the
7+
* "License"); you may not use this file except in compliance
8+
* with the License. You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing,
13+
* software distributed under the License is distributed on an
14+
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15+
* KIND, either express or implied. See the License for the
16+
* specific language governing permissions and limitations
17+
* under the License.
18+
*/
19+
package org.locationtech.jts.index.quadtree;
20+
21+
import java.util.ArrayList;
22+
import java.util.List;
23+
24+
import org.apache.jena.geosparql.spatial.index.v2.serde.sedona.CustomGeometrySerde;
25+
import org.locationtech.jts.geom.Envelope;
26+
import org.locationtech.jts.geom.Geometry;
27+
28+
import com.esotericsoftware.kryo.Kryo;
29+
import com.esotericsoftware.kryo.io.Input;
30+
import com.esotericsoftware.kryo.io.Output;
31+
32+
/**
33+
* Provides methods to efficiently serialize and deserialize the index. trees are serialized
34+
* recursively.
35+
*/
36+
public class CustomIndexSerdeV2 {
37+
CustomGeometrySerde geometrySerde;
38+
39+
public CustomIndexSerdeV2(CustomGeometrySerde geometrySerde) {
40+
this.geometrySerde = geometrySerde;
41+
}
42+
43+
public Object read(Kryo kryo, Input input) {
44+
Quadtree index = new Quadtree();
45+
boolean notEmpty = (input.readByte() & 0x01) == 1;
46+
if (!notEmpty) {
47+
return index;
48+
}
49+
int itemSize = input.readInt();
50+
List items = new ArrayList();
51+
for (int i = 0; i < itemSize; ++i) {
52+
items.add(geometrySerde.read(kryo, input, Geometry.class));
53+
}
54+
index.getRoot().items = items;
55+
for (int i = 0; i < 4; ++i) {
56+
index.getRoot().subnode[i] = readQuadTreeNode(kryo, input);
57+
}
58+
return index;
59+
}
60+
61+
public void write(Kryo kryo, Output output, Quadtree tree) {
62+
// serialize quadtree index
63+
if (tree.isEmpty()) {
64+
output.writeByte(0);
65+
} else {
66+
output.writeByte(1);
67+
// write root
68+
List items = tree.getRoot().getItems();
69+
output.writeInt(items.size());
70+
for (Object item : items) {
71+
geometrySerde.write(kryo, output, item);
72+
}
73+
Node[] subNodes = tree.getRoot().subnode;
74+
for (int i = 0; i < 4; ++i) {
75+
writeQuadTreeNode(kryo, output, subNodes[i]);
76+
}
77+
}
78+
}
79+
80+
private void writeQuadTreeNode(Kryo kryo, Output output, Node node) {
81+
// write head first
82+
if (node == null || node.isEmpty()) {
83+
output.writeByte(0);
84+
} else { // not empty
85+
output.writeByte(1);
86+
// write node information, envelope and level
87+
geometrySerde.write(kryo, output, node.getEnvelope());
88+
output.writeInt(node.getLevel());
89+
List items = node.getItems();
90+
output.writeInt(items.size());
91+
for (Object obj : items) {
92+
geometrySerde.write(kryo, output, obj);
93+
}
94+
Node[] subNodes = node.subnode;
95+
for (int i = 0; i < 4; ++i) {
96+
writeQuadTreeNode(kryo, output, subNodes[i]);
97+
}
98+
}
99+
}
100+
101+
private Node readQuadTreeNode(Kryo kryo, Input input) {
102+
boolean notEmpty = (input.readByte() & 0x01) == 1;
103+
if (!notEmpty) {
104+
return null;
105+
}
106+
Envelope envelope = (Envelope) geometrySerde.read(kryo, input, Envelope.class);
107+
int level = input.readInt();
108+
Node node = new Node(envelope, level);
109+
int itemSize = input.readInt();
110+
List items = new ArrayList();
111+
for (int i = 0; i < itemSize; ++i) {
112+
items.add(geometrySerde.read(kryo, input, Geometry.class));
113+
}
114+
node.items = items;
115+
// read children
116+
for (int i = 0; i < 4; ++i) {
117+
node.subnode[i] = readQuadTreeNode(kryo, input);
118+
}
119+
return node;
120+
}
121+
}

0 commit comments

Comments
 (0)