20
20
package org .neo4j .gis .spatial .procedures ;
21
21
22
22
import static org .neo4j .gis .spatial .SpatialDatabaseService .RTREE_INDEX_NAME ;
23
+ import static org .neo4j .procedure .Mode .READ ;
23
24
import static org .neo4j .procedure .Mode .WRITE ;
24
25
25
26
import java .io .File ;
@@ -182,7 +183,7 @@ public Stream<NameResult> upgradeSpatial() {
182
183
return builder .build ();
183
184
}
184
185
185
- @ Procedure (value = "spatial.layers" , mode = WRITE )
186
+ @ Procedure (value = "spatial.layers" , mode = READ )
186
187
@ Description ("Returns name, and details for all layers" )
187
188
public Stream <NameResult > getAllLayers () {
188
189
SpatialDatabaseService sdb = spatial ();
@@ -553,21 +554,27 @@ public void removeLayer(@Name("name") String name) {
553
554
@ Description ("Adds the given node to the layer, returns the geometry-node" )
554
555
public Stream <NodeResult > addNodeToLayer (@ Name ("layerName" ) String name , @ Name ("node" ) Node node ) {
555
556
EditableLayer layer = getEditableLayerOrThrow (tx , spatial (), name );
556
- return streamNode (layer .add (tx , node ).getGeomNode ());
557
+ Node geomNode = layer .add (tx , node ).getGeomNode ();
558
+ layer .finalizeTransaction (tx );
559
+ return streamNode (geomNode );
557
560
}
558
561
559
562
@ Procedure (value = "spatial.addNodes" , mode = WRITE )
560
563
@ Description ("Adds the given nodes list to the layer, returns the count" )
561
564
public Stream <CountResult > addNodesToLayer (@ Name ("layerName" ) String name , @ Name ("nodes" ) List <Node > nodes ) {
562
565
EditableLayer layer = getEditableLayerOrThrow (tx , spatial (), name );
563
- return Stream .of (new CountResult (layer .addAll (tx , nodes )));
566
+ int count = layer .addAll (tx , nodes );
567
+ layer .finalizeTransaction (tx );
568
+ return Stream .of (new CountResult (count ));
564
569
}
565
570
566
571
@ Procedure (value = "spatial.addNode.byId" , mode = WRITE )
567
572
@ Description ("Adds the given node to the layer, returns the geometry-node" )
568
573
public Stream <NodeResult > addNodeIdToLayer (@ Name ("layerName" ) String name , @ Name ("nodeId" ) String nodeId ) {
569
574
EditableLayer layer = getEditableLayerOrThrow (tx , spatial (), name );
570
- return streamNode (layer .add (tx , tx .getNodeByElementId (nodeId )).getGeomNode ());
575
+ Node geomNode = layer .add (tx , tx .getNodeByElementId (nodeId )).getGeomNode ();
576
+ layer .finalizeTransaction (tx );
577
+ return streamNode (geomNode );
571
578
}
572
579
573
580
@ Procedure (value = "spatial.addNodes.byId" , mode = WRITE )
@@ -576,14 +583,17 @@ public Stream<CountResult> addNodeIdsToLayer(@Name("layerName") String name,
576
583
@ Name ("nodeIds" ) List <String > nodeIds ) {
577
584
EditableLayer layer = getEditableLayerOrThrow (tx , spatial (), name );
578
585
List <Node > nodes = nodeIds .stream ().map (id -> tx .getNodeByElementId (id )).collect (Collectors .toList ());
579
- return Stream .of (new CountResult (layer .addAll (tx , nodes )));
586
+ int count = layer .addAll (tx , nodes );
587
+ layer .finalizeTransaction (tx );
588
+ return Stream .of (new CountResult (count ));
580
589
}
581
590
582
591
@ Procedure (value = "spatial.removeNode" , mode = WRITE )
583
592
@ Description ("Removes the given node from the layer, returns the geometry-node" )
584
593
public Stream <NodeIdResult > removeNodeFromLayer (@ Name ("layerName" ) String name , @ Name ("node" ) Node node ) {
585
594
EditableLayer layer = getEditableLayerOrThrow (tx , spatial (), name );
586
595
layer .removeFromIndex (tx , node .getElementId ());
596
+ layer .finalizeTransaction (tx );
587
597
return streamNode (node .getElementId ());
588
598
}
589
599
@@ -597,6 +607,7 @@ public Stream<CountResult> removeNodesFromLayer(@Name("layerName") String name,
597
607
layer .removeFromIndex (tx , node .getElementId ());
598
608
}
599
609
int after = layer .getIndex ().count (tx );
610
+ layer .finalizeTransaction (tx );
600
611
return Stream .of (new CountResult (before - after ));
601
612
}
602
613
@@ -605,6 +616,7 @@ public Stream<CountResult> removeNodesFromLayer(@Name("layerName") String name,
605
616
public Stream <NodeIdResult > removeNodeFromLayer (@ Name ("layerName" ) String name , @ Name ("nodeId" ) String nodeId ) {
606
617
EditableLayer layer = getEditableLayerOrThrow (tx , spatial (), name );
607
618
layer .removeFromIndex (tx , nodeId );
619
+ layer .finalizeTransaction (tx );
608
620
return streamNode (nodeId );
609
621
}
610
622
@@ -619,6 +631,7 @@ public Stream<CountResult> removeNodeIdsFromLayer(@Name("layerName") String name
619
631
layer .removeFromIndex (tx , nodeId );
620
632
}
621
633
int after = layer .getIndex ().count (tx );
634
+ layer .finalizeTransaction (tx );
622
635
return Stream .of (new CountResult (before - after ));
623
636
}
624
637
@@ -628,7 +641,9 @@ public Stream<NodeResult> addGeometryWKTToLayer(@Name("layerName") String name,
628
641
@ Name ("geometry" ) String geometryWKT ) {
629
642
EditableLayer layer = getEditableLayerOrThrow (tx , spatial (), name );
630
643
WKTReader reader = new WKTReader (layer .getGeometryFactory ());
631
- return streamNode (addGeometryWkt (layer , reader , geometryWKT ));
644
+ Node node = addGeometryWkt (layer , reader , geometryWKT );
645
+ layer .finalizeTransaction (tx );
646
+ return streamNode (node );
632
647
}
633
648
634
649
@ Procedure (value = "spatial.addWKTs" , mode = WRITE )
@@ -638,7 +653,8 @@ public Stream<NodeResult> addGeometryWKTsToLayer(@Name("layerName") String name,
638
653
EditableLayer layer = getEditableLayerOrThrow (tx , spatial (), name );
639
654
WKTReader reader = new WKTReader (layer .getGeometryFactory ());
640
655
return geometryWKTs .stream ().map (geometryWKT -> addGeometryWkt (layer , reader , geometryWKT ))
641
- .map (NodeResult ::new );
656
+ .map (NodeResult ::new )
657
+ .onClose (() -> layer .finalizeTransaction (tx ));
642
658
}
643
659
644
660
private Node addGeometryWkt (EditableLayer layer , WKTReader reader , String geometryWKT ) {
@@ -656,7 +672,9 @@ public Stream<CountResult> importShapefile(
656
672
@ Name ("layerName" ) String name ,
657
673
@ Name ("uri" ) String uri ) throws IOException {
658
674
EditableLayerImpl layer = getEditableLayerOrThrow (tx , spatial (), name );
659
- return Stream .of (new CountResult (importShapefileToLayer (uri , layer , 1000 ).size ()));
675
+ List <Node > nodes = importShapefileToLayer (uri , layer , 1000 );
676
+ layer .finalizeTransaction (tx );
677
+ return Stream .of (new CountResult (nodes .size ()));
660
678
}
661
679
662
680
@ Procedure (value = "spatial.importShapefile" , mode = WRITE )
@@ -776,7 +794,7 @@ public void run() {
776
794
}
777
795
}
778
796
779
- @ Procedure (value = "spatial.bbox" , mode = WRITE )
797
+ @ Procedure (value = "spatial.bbox" , mode = READ )
780
798
@ Description ("Finds all geometry nodes in the given layer within the lower left and upper right coordinates of a box" )
781
799
public Stream <NodeResult > findGeometriesInBBox (
782
800
@ Name ("layerName" ) String name ,
@@ -790,7 +808,7 @@ public Stream<NodeResult> findGeometriesInBBox(
790
808
.stream ().map (GeoPipeFlow ::getGeomNode ).map (NodeResult ::new );
791
809
}
792
810
793
- @ Procedure (value = "spatial.closest" , mode = WRITE )
811
+ @ Procedure (value = "spatial.closest" , mode = READ )
794
812
@ Description ("Finds all geometry nodes in the layer within the distance to the given coordinate" )
795
813
public Stream <NodeResult > findClosestGeometries (
796
814
@ Name ("layerName" ) String name ,
@@ -804,7 +822,7 @@ public Stream<NodeResult> findClosestGeometries(
804
822
return edgeResults .stream ().map (e -> e .getValue ().getGeomNode ()).map (NodeResult ::new );
805
823
}
806
824
807
- @ Procedure (value = "spatial.withinDistance" , mode = WRITE )
825
+ @ Procedure (value = "spatial.withinDistance" , mode = READ )
808
826
@ Description ("Returns all geometry nodes and their ordered distance in the layer within the distance to the given coordinate" )
809
827
public Stream <NodeDistanceResult > findGeometriesWithinDistance (
810
828
@ Name ("layerName" ) String name ,
@@ -841,7 +859,7 @@ public Stream<GeometryResult> asExternalGeometry(
841
859
return Stream .of (geometry ).map (geom -> new GeometryResult (toNeo4jGeometry (null , geom )));
842
860
}
843
861
844
- @ Procedure (value = "spatial.intersects" , mode = WRITE )
862
+ @ Procedure (value = "spatial.intersects" , mode = READ )
845
863
@ Description ("Returns all geometry nodes that intersect the given geometry (shape, polygon) in the layer" )
846
864
public Stream <NodeResult > findGeometriesIntersecting (
847
865
@ Name ("layerName" ) String name ,
0 commit comments