results = RTreeTestUtils.get_height_map(tx, rtree.getIndexRoot(tx));
assertEquals(1, results.size());
@@ -1218,7 +1237,8 @@ public void shouldBuildTreeFromScratch() throws Exception {
}
@Disabled
- public void shouldPerformRTreeBulkInsertion() throws Exception {
+ @Test
+ public void shouldPerformRTreeBulkInsertion() {
// Use this line if you want to examine the output.
//GraphDatabaseService db = databases.database("BulkTest");
@@ -1252,7 +1272,6 @@ public void shouldPerformRTreeBulkInsertion() throws Exception {
- time) + "ms");
RTreeIndex rtree = (RTreeIndex) layer.getIndex();
- RTreeTestUtils utils = new RTreeTestUtils(rtree);
assertTrue(RTreeTestUtils.check_balance(tx, rtree.getIndexRoot(tx)));
tx.commit();
@@ -1281,12 +1300,11 @@ public void shouldPerformRTreeBulkInsertion() throws Exception {
for (Relationship r : root.getRelationships(Direction.OUTGOING, RTreeRelationshipTypes.RTREE_CHILD)) {
children.add(r.getEndNode());
}
- RTreeTestUtils utils = new RTreeTestUtils(rtree);
- double root_overlap = utils.calculate_overlap(root);
+ double root_overlap = RTreeTestUtils.calculate_overlap(root);
assertTrue(root_overlap < 0.01); //less than one percent
System.out.println("********* Bulk Overlap Percentage" + root_overlap);
- double average_child_overlap = children.stream().mapToDouble(utils::calculate_overlap).average()
+ double average_child_overlap = children.stream().mapToDouble(RTreeTestUtils::calculate_overlap).average()
.getAsDouble();
assertTrue(average_child_overlap < 0.02);
System.out.println("*********** Bulk Average Child Overlap Percentage" + average_child_overlap);
@@ -1717,7 +1735,7 @@ private void restart() throws IOException {
db = databases.database(DEFAULT_DATABASE_NAME);
}
- private void doCleanShutdown() throws IOException {
+ private void doCleanShutdown() {
try {
System.out.println("Shutting down database");
if (databases != null) {
diff --git a/src/test/java/org/neo4j/gis/spatial/RTreeTestUtils.java b/src/test/java/org/neo4j/gis/spatial/RTreeTestUtils.java
index 261f2049..c3d75401 100644
--- a/src/test/java/org/neo4j/gis/spatial/RTreeTestUtils.java
+++ b/src/test/java/org/neo4j/gis/spatial/RTreeTestUtils.java
@@ -37,20 +37,12 @@
import org.neo4j.graphdb.Transaction;
/**
+ * This class contain functions which can be used to test the integrity of the Rtree.
+ *
* Created by Philip Stephens on 12/11/2016.
*/
public class RTreeTestUtils {
- /**
- * This class contain functions which can be used to test the integrity of the Rtree.
- */
-
- private final RTreeIndex rtree;
-
- public RTreeTestUtils(RTreeIndex rtree) {
- this.rtree = rtree;
- }
-
public static double one_d_overlap(double a1, double a2, double b1, double b2) {
return Double.max(
Double.min(a2, b2) - Double.max(a1, b1),
@@ -63,7 +55,7 @@ public static double compute_overlap(Envelope a, Envelope b) {
one_d_overlap(a.getMinY(), a.getMaxY(), b.getMinY(), b.getMaxY());
}
- public double calculate_overlap(Node child) {
+ public static double calculate_overlap(Node child) {
Envelope parent = RTreeIndex.getIndexNodeEnvelope(child);
List children = new ArrayList();
diff --git a/src/test/java/org/neo4j/gis/spatial/TestDynamicLayers.java b/src/test/java/org/neo4j/gis/spatial/TestDynamicLayers.java
index 8b04b196..bf71633c 100644
--- a/src/test/java/org/neo4j/gis/spatial/TestDynamicLayers.java
+++ b/src/test/java/org/neo4j/gis/spatial/TestDynamicLayers.java
@@ -246,7 +246,7 @@ private static String toCoordinateText(Coordinate[] coordinates) {
}
private static String toCoordinateText(Envelope bbox) {
- return "" + bbox.getMinX() + ", " + bbox.getMinY() + ", " + bbox.getMaxX() + ", " + bbox.getMaxY();
+ return bbox.getMinX() + ", " + bbox.getMinY() + ", " + bbox.getMaxX() + ", " + bbox.getMaxY();
}
private void checkIndexAndFeatureCount(Layer layer) throws IOException {
diff --git a/src/test/java/org/neo4j/gis/spatial/TestIntersectsPathQueries.java b/src/test/java/org/neo4j/gis/spatial/TestIntersectsPathQueries.java
index e50bc3b6..0f04e045 100644
--- a/src/test/java/org/neo4j/gis/spatial/TestIntersectsPathQueries.java
+++ b/src/test/java/org/neo4j/gis/spatial/TestIntersectsPathQueries.java
@@ -210,8 +210,8 @@ public String toString() {
}
@SuppressWarnings("SameParameterValue")
- private void runTestPointSetGeoptimaIntersection(String tracePath, String dbRoot, String dbName, String layerName,
- boolean testMultiPoint) {
+ private static void runTestPointSetGeoptimaIntersection(String tracePath, String dbRoot, String dbName,
+ String layerName, boolean testMultiPoint) {
withDatabase(dbRoot, dbName, Neo4jTestCase.NORMAL_CONFIG, graphDb -> {
SpatialDatabaseService spatial = new SpatialDatabaseService(
new IndexManager((GraphDatabaseAPI) graphDb, SecurityContext.AUTH_DISABLED));
diff --git a/src/test/java/org/neo4j/gis/spatial/functions/SpatialFunctionsTest.java b/src/test/java/org/neo4j/gis/spatial/functions/SpatialFunctionsTest.java
new file mode 100644
index 00000000..2cdb08f3
--- /dev/null
+++ b/src/test/java/org/neo4j/gis/spatial/functions/SpatialFunctionsTest.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright (c) "Neo4j"
+ * Neo4j Sweden AB [http://neo4j.com]
+ *
+ * This file is part of Neo4j Spatial.
+ *
+ * Neo4j is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package org.neo4j.gis.spatial.functions;
+
+import static org.hamcrest.Matchers.closeTo;
+import static org.junit.jupiter.api.Assertions.assertInstanceOf;
+
+import java.util.Map;
+import org.hamcrest.MatcherAssert;
+import org.junit.jupiter.api.Test;
+import org.neo4j.exceptions.KernelException;
+import org.neo4j.gis.spatial.AbstractApiTest;
+import org.neo4j.graphdb.spatial.Geometry;
+
+public class SpatialFunctionsTest extends AbstractApiTest {
+
+ @Override
+ protected void registerApiProceduresAndFunctions() throws KernelException {
+ registerProceduresAndFunctions(SpatialFunctions.class);
+ }
+
+ @Test
+ public void create_point_and_pass_as_param() {
+ Geometry geom = (Geometry) executeObject("RETURN point({latitude: 5.0, longitude: 4.0}) as geometry",
+ "geometry");
+ double distance = (Double) executeObject(
+ "WITH spatial.asGeometry($geom) AS geometry RETURN point.distance(geometry, point({latitude: 5.1, longitude: 4.0})) as distance",
+ Map.of("geom", geom), "distance");
+ MatcherAssert.assertThat("Expected the geographic distance of 11132km", distance, closeTo(11132.0, 1.0));
+ }
+
+ @Test
+ public void create_point_geometry_return() {
+ Object geometry = executeObject(
+ "WITH point({latitude: 5.0, longitude: 4.0}) as geom RETURN spatial.asGeometry(geom) AS geometry",
+ "geometry");
+ assertInstanceOf(Geometry.class, geometry, "Should be Geometry type");
+ }
+
+ @Test
+ public void create_point_geometry_and_distance() {
+ double distance = (double) executeObject(
+ "WITH point({latitude: 5.0, longitude: 4.0}) as geom WITH spatial.asGeometry(geom) AS geometry RETURN point.distance(geometry, point({latitude: 5.0, longitude: 4.0})) as distance",
+ "distance");
+ System.out.println(distance);
+ }
+
+ @Test
+ public void literal_geometry_return() {
+ Object geometry = executeObject(
+ "WITH spatial.asGeometry({latitude: 5.0, longitude: 4.0}) AS geometry RETURN geometry", "geometry");
+ assertInstanceOf(Geometry.class, geometry, "Should be Geometry type");
+ }
+}
diff --git a/src/test/java/org/neo4j/gis/spatial/pipes/GeoPipesPerformanceTest.java b/src/test/java/org/neo4j/gis/spatial/pipes/GeoPipesPerformanceTest.java
index 1d98fe2b..f60d0bb3 100644
--- a/src/test/java/org/neo4j/gis/spatial/pipes/GeoPipesPerformanceTest.java
+++ b/src/test/java/org/neo4j/gis/spatial/pipes/GeoPipesPerformanceTest.java
@@ -37,8 +37,8 @@
public class GeoPipesPerformanceTest extends Neo4jTestCase {
- private int records = 10000;
- private int chunkSize = records / 10;
+ private final int records = 10000;
+ private final int chunkSize = records / 10;
@BeforeEach
public void setUp() throws Exception {
@@ -90,9 +90,9 @@ public float average() {
@Override
public String toString() {
if (count > 0) {
- return "" + chunk + ": " + average() + "ms per record (" + count + " records over " + time + "ms)";
+ return chunk + ": " + average() + "ms per record (" + count + " records over " + time + "ms)";
}
- return "" + chunk + ": INVALID (" + count + " records over " + time + "ms)";
+ return chunk + ": INVALID (" + count + " records over " + time + "ms)";
}
}
diff --git a/src/test/java/org/neo4j/gis/spatial/procedures/SpatialProceduresTest.java b/src/test/java/org/neo4j/gis/spatial/procedures/SpatialProceduresTest.java
index dab6800a..a8562200 100644
--- a/src/test/java/org/neo4j/gis/spatial/procedures/SpatialProceduresTest.java
+++ b/src/test/java/org/neo4j/gis/spatial/procedures/SpatialProceduresTest.java
@@ -31,70 +31,44 @@
import static org.junit.jupiter.api.Assertions.assertInstanceOf;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.fail;
-import static org.neo4j.configuration.GraphDatabaseSettings.DEFAULT_DATABASE_NAME;
import static org.neo4j.gis.spatial.Constants.LABEL_LAYER;
import static org.neo4j.gis.spatial.Constants.PROP_GEOMENCODER;
import static org.neo4j.gis.spatial.Constants.PROP_GEOMENCODER_CONFIG;
import static org.neo4j.gis.spatial.Constants.PROP_LAYER;
import static org.neo4j.gis.spatial.Constants.PROP_LAYER_CLASS;
-import java.io.File;
-import java.io.IOException;
-import java.nio.file.Path;
import java.util.ArrayList;
import java.util.LinkedHashMap;
-import java.util.List;
import java.util.Map;
import java.util.function.Consumer;
import org.hamcrest.MatcherAssert;
-import org.junit.jupiter.api.AfterEach;
-import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
-import org.neo4j.configuration.GraphDatabaseInternalSettings;
-import org.neo4j.configuration.GraphDatabaseSettings;
-import org.neo4j.dbms.api.DatabaseManagementService;
import org.neo4j.exceptions.KernelException;
+import org.neo4j.gis.spatial.AbstractApiTest;
import org.neo4j.gis.spatial.Layer;
import org.neo4j.gis.spatial.SpatialDatabaseService;
import org.neo4j.gis.spatial.SpatialRelationshipTypes;
+import org.neo4j.gis.spatial.functions.SpatialFunctions;
import org.neo4j.gis.spatial.index.IndexManager;
import org.neo4j.gis.spatial.utilities.ReferenceNodes;
import org.neo4j.graphdb.GraphDatabaseService;
import org.neo4j.graphdb.Node;
-import org.neo4j.graphdb.ResourceIterator;
import org.neo4j.graphdb.Result;
import org.neo4j.graphdb.Transaction;
import org.neo4j.graphdb.spatial.Geometry;
import org.neo4j.graphdb.spatial.Point;
-import org.neo4j.internal.helpers.collection.Iterators;
-import org.neo4j.io.fs.FileUtils;
import org.neo4j.kernel.api.KernelTransaction;
import org.neo4j.kernel.api.procedure.GlobalProcedures;
import org.neo4j.kernel.impl.coreapi.InternalTransaction;
import org.neo4j.kernel.internal.GraphDatabaseAPI;
-import org.neo4j.test.TestDatabaseManagementServiceBuilder;
-public class SpatialProceduresTest {
+public class SpatialProceduresTest extends AbstractApiTest {
- private DatabaseManagementService databases;
- private GraphDatabaseService db;
-
- @BeforeEach
- public void setUp() throws KernelException, IOException {
- Path dbRoot = new File("target/procedures").toPath();
- FileUtils.deleteDirectory(dbRoot);
- databases = new TestDatabaseManagementServiceBuilder(dbRoot)
- .setConfig(GraphDatabaseSettings.procedure_unrestricted, List.of("spatial.*"))
- .setConfig(GraphDatabaseInternalSettings.trace_cursors, true)
- .impermanent().build();
- db = databases.database(DEFAULT_DATABASE_NAME);
- registerProceduresAndFunctions(db, SpatialProcedures.class);
- }
-
- @AfterEach
- public void tearDown() {
- databases.shutdown();
+ @Override
+ protected void registerApiProceduresAndFunctions() throws KernelException {
+ registerProceduresAndFunctions(SpatialProcedures.class);
+ registerProceduresAndFunctions(SpatialFunctions.class);
}
public static void testCall(GraphDatabaseService db, String call, Consumer