From 431a09670d92c64dde85cef825d435897efc9098 Mon Sep 17 00:00:00 2001 From: Pontus Melke Date: Thu, 18 Jan 2018 22:23:48 +0100 Subject: [PATCH] More efficient cursor-to-iterator --- .../impl/factory/GraphDatabaseFacade.java | 41 ++++--------------- 1 file changed, 9 insertions(+), 32 deletions(-) diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/factory/GraphDatabaseFacade.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/factory/GraphDatabaseFacade.java index 7869794198b7e..770435161c112 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/factory/GraphDatabaseFacade.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/factory/GraphDatabaseFacade.java @@ -61,6 +61,7 @@ import org.neo4j.internal.kernel.api.IndexQuery; import org.neo4j.internal.kernel.api.InternalIndexState; import org.neo4j.internal.kernel.api.NodeCursor; +import org.neo4j.internal.kernel.api.NodeIndexCursor; import org.neo4j.internal.kernel.api.NodeLabelIndexCursor; import org.neo4j.internal.kernel.api.Write; import org.neo4j.internal.kernel.api.NodeValueIndexCursor; @@ -640,34 +641,7 @@ private ResourceIterator nodesByLabelAndProperty( Label myLabel, String ke IndexQuery.ExactPredicate query = IndexQuery.exact( propertyId, value ); read.nodeIndexSeek( index, cursor, IndexOrder.NONE, query ); - return new PrefetchingResourceIterator() - { - private boolean closed; - @Override - protected Node fetchNextOrNull() - { - if ( cursor.next() ) - { - return newNodeProxy( cursor.nodeReference() ); - } - else - { - close(); - return null; - } - } - - @Override - public void close() - { - if ( !closed ) - { - statement.close(); - cursor.close(); - closed = true; - } - } - }; + return new NodeCursorResourceIterator<>( cursor, statement ); } catch ( KernelException e ) { @@ -721,7 +695,7 @@ private ResourceIterator allNodesWithLabel( final Label myLabel ) NodeLabelIndexCursor cursor = ktx.cursors().allocateNodeLabelIndexCursor(); ktx.dataRead().nodeLabelScan( labelId, cursor ); - return new NodeCursorResourceIterator( cursor, statement ); + return new NodeCursorResourceIterator<>( cursor, statement ); } private ResourceIterator map2nodes( PrimitiveLongIterator input, Resource... resources ) @@ -932,16 +906,19 @@ public GraphPropertiesProxy newGraphPropertiesProxy() { return new GraphPropertiesProxy( this ); } + private static final long UNINITIALIZED = -2L; + private static final long NO_ID = -1L; - private final class NodeCursorResourceIterator implements ResourceIterator + private final class NodeCursorResourceIterator implements ResourceIterator { - private final NodeLabelIndexCursor cursor; + + private final CURSOR cursor; private final Statement statement; private long next; private boolean closed; private static final long NOT_INITIALIZED = -2L; - NodeCursorResourceIterator( NodeLabelIndexCursor cursor, Statement statement ) + NodeCursorResourceIterator( CURSOR cursor, Statement statement ) { this.cursor = cursor; this.statement = statement;