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

Reply via email to