[Neo4j] Neo4j-Spatial: problems when delete spatial entities

2011-07-29 Thread Ben Galon
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


Re: [Neo4j] Neo4j-Spatial: problems when delete spatial entities

2011-07-29 Thread Ben Galon
Hi Peter
I don't have git installed on my computer. so I opened a fork and
commit my solution from the web UI. I could not find a way to upload
the Test file, sorry for that.

Best regards
Ben


On Fri, Jul 29, 2011 at 5:37 PM, Peter Neubauer
neubauer.pe...@gmail.com wrote:
 Ben,
 The first bug is fixed in Andreas Wilhelms fork, thanks for pointing it out!
 Can't comment on the second from my mobile :) could you fork, add the test
 and see if you can fix it?

 /peter

 Sent from my phone.
 On Jul 29, 2011 7:29 AM, Ben Galon bga...@gmail.com wrote:
 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
 ___
 Neo4j mailing list
 User@lists.neo4j.org
 https://lists.neo4j.org/mailman/listinfo/user

___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user