Hello, I started working with neo4j-spatial a while ago. i found it very useful and the first thing i would like to say is Thanks for your wonderful work. While working on a project that require large amount of insert/delete operation I think i found two bugs. The first one is in EditableLayerImpl.java. When adding an object and immediately delete it, and then insert another object, you will get an error because the previousGeomNode field will refer to a node that have been deleted.
The second bug is in the Rtree implementation (RTreeIndex.java). When removing an object from a leaf and the tree is need to be reorganize a null exception is raise at line 124. This happens because deleteRecursivelyEmptySubtree (at line 121) method delete the relationship from the lastParentNodeToDelete to it's parent (at line 740) and than the getIndexNodeParent method ant line 124 returns null. I think that this can be solved easily by applying the following changes to lines 120-126: Node lastParentNodeToDelParent = getIndexNodeParent(lastParentNodeToDelete); deleteRecursivelyEmptySubtree(lastParentNodeToDelete); // adjust tree adjustParentBoundingBox(lastParentNodeToDelParent, SpatialRelationshipTypes.RTREE_CHILD); adjustPathBoundingBox(lastParentNodeToDelParent); the line number are the same as in the github repository. I will be happy to your opinion about these issues. here is a short code that generate the second bug: import org.neo4j.gis.spatial.EditableLayer; import org.neo4j.gis.spatial.EditableLayerImpl; import org.neo4j.gis.spatial.RTreeIndex; import org.neo4j.gis.spatial.SpatialDatabaseService; import org.neo4j.gis.spatial.WKTGeometryEncoder; import org.neo4j.graphdb.GraphDatabaseService; import org.neo4j.kernel.EmbeddedGraphDatabase; import com.vividsolutions.jts.geom.Coordinate; public class RteeTest { /** * @param args */ public static void main(String[] args) { final String dbFolder = "c:\\RtreeTest"; GraphDatabaseService graphDB = new EmbeddedGraphDatabase(dbFolder); SpatialDatabaseService sgDB = new SpatialDatabaseService(graphDB); EditableLayer testLayer = (EditableLayer)sgDB.createLayer("RtreeTest", WKTGeometryEncoder.class, EditableLayerImpl.class); for (int i = 0; i < 15; i++){ for (int j = 0; j < 10; j++){ testLayer.add(testLayer.getGeometryFactory().createPoint(new Coordinate(i, j))); } } ((RTreeIndex)testLayer.getIndex()).debugIndexTree(); testLayer.delete(60); // raise an java.lang.NullPointerException exception ((RTreeIndex)testLayer.getIndex()).debugIndexTree(); graphDB.shutdown(); } } Thanks again Ben _______________________________________________ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user