diff --git a/community/kernel-api/src/main/java/org/neo4j/internal/kernel/api/TokenRead.java b/community/kernel-api/src/main/java/org/neo4j/internal/kernel/api/TokenRead.java index d74d7103e68d7..46760d2559090 100644 --- a/community/kernel-api/src/main/java/org/neo4j/internal/kernel/api/TokenRead.java +++ b/community/kernel-api/src/main/java/org/neo4j/internal/kernel/api/TokenRead.java @@ -41,9 +41,8 @@ public interface TokenRead * Returns the token corresponding to the provided name * @param name The name associated with the token * @return The token corresponding withe - * @throws LabelNotFoundKernelException */ - int labelGetForName( String name ) throws LabelNotFoundKernelException; + int labelGetForName( String name ); /** * Return the id of the provided label, or NO_TOKEN if the label isn't known to the graph. diff --git a/community/kernel-api/src/test/java/org/neo4j/internal/kernel/api/TransactionStateTestBase.java b/community/kernel-api/src/test/java/org/neo4j/internal/kernel/api/TransactionStateTestBase.java index 95f976b1a368d..cbf63d6a37af4 100644 --- a/community/kernel-api/src/test/java/org/neo4j/internal/kernel/api/TransactionStateTestBase.java +++ b/community/kernel-api/src/test/java/org/neo4j/internal/kernel/api/TransactionStateTestBase.java @@ -550,7 +550,6 @@ public void shouldNotFindNodeWithRemovedLabelInLabelScan() throws Exception } } - @Test public void shouldFindUpdatedNodeInInLabelScan() throws Exception { @@ -627,7 +626,6 @@ public void shouldNotFindNodeWithRemovedLabelInDisjunctionLabelScan() throws Exc } } - @Test public void shouldFindUpdatedNodeInInDisjunctionLabelScan() throws Exception { @@ -648,7 +646,6 @@ public void shouldFindUpdatedNodeInInDisjunctionLabelScan() throws Exception } } - @Test public void shouldNotFindDeletedNodeInConjunctionLabelScan() throws Exception { diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/core/NodeProxy.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/core/NodeProxy.java index 3e4d39a90f781..eba7fd71439a0 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/core/NodeProxy.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/core/NodeProxy.java @@ -67,6 +67,7 @@ import static org.neo4j.collection.primitive.PrimitiveIntCollections.map; import static org.neo4j.graphdb.Label.label; import static org.neo4j.helpers.collection.Iterators.asList; +import static org.neo4j.kernel.api.StatementConstants.NO_SUCH_LABEL; import static org.neo4j.kernel.api.StatementConstants.NO_SUCH_RELATIONSHIP_TYPE; import static org.neo4j.kernel.impl.core.TokenHolder.NO_ID; @@ -682,13 +683,13 @@ public boolean hasLabel( Label label ) NodeCursor nodes = transaction.cursors().allocateNodeCursor() ) { int labelId = transaction.tokenRead().labelGetForName( label.name() ); + if ( labelId == NO_SUCH_LABEL ) + { + return false; + } transaction.dataRead().singleNode( nodeId, nodes ); return nodes.next() && nodes.labels().contains( labelId ); } - catch ( LabelNotFoundKernelException e ) - { - return false; - } } @Override 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 b81d2212c56e5..11545731e7c93 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 @@ -56,10 +56,10 @@ import org.neo4j.graphdb.traversal.BidirectionalTraversalDescription; import org.neo4j.graphdb.traversal.TraversalDescription; import org.neo4j.helpers.collection.PrefetchingResourceIterator; -import org.neo4j.helpers.collection.ResourceClosingIterator; 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.NodeLabelIndexCursor; import org.neo4j.internal.kernel.api.exceptions.InvalidTransactionTypeKernelException; import org.neo4j.internal.kernel.api.exceptions.KernelException; import org.neo4j.internal.kernel.api.exceptions.schema.ConstraintValidationException; @@ -79,7 +79,6 @@ import org.neo4j.kernel.configuration.Config; import org.neo4j.kernel.guard.Guard; import org.neo4j.kernel.impl.api.TokenAccess; -import org.neo4j.kernel.impl.api.operations.KeyReadOperations; import org.neo4j.kernel.impl.core.NodeProxy; import org.neo4j.kernel.impl.core.RelationshipProxy; import org.neo4j.kernel.impl.core.ThreadToStatementContextBridge; @@ -111,7 +110,6 @@ import org.neo4j.values.virtual.MapValue; import static java.lang.String.format; -import static org.neo4j.collection.primitive.PrimitiveLongCollections.map; import static org.neo4j.graphdb.factory.GraphDatabaseSettings.transaction_timeout; import static org.neo4j.helpers.collection.Iterators.emptyResourceIterator; import static org.neo4j.internal.kernel.api.security.SecurityContext.AUTH_DISABLED; @@ -710,18 +708,39 @@ private ResourceIterator getNodesByLabelAndPropertyWithoutIndex( int prope private ResourceIterator allNodesWithLabel( final Label myLabel ) { - Statement statement = spi.currentStatement(); + KernelTransaction ktx = spi.currentTransaction(); + assertTransactionOpen( ktx ); - int labelId = statement.readOperations().labelGetForName( myLabel.name() ); - if ( labelId == KeyReadOperations.NO_SUCH_LABEL ) + int labelId = ktx.tokenRead().labelGetForName( myLabel.name() ); + if ( labelId == NO_SUCH_LABEL ) { - statement.close(); - return emptyResourceIterator(); + return ResourceIterator.empty(); } - final PrimitiveLongResourceIterator nodeIds = statement.readOperations().nodesGetForLabel( labelId ); - return ResourceClosingIterator - .newResourceIterator( map( nodeId -> new NodeProxy( nodeActions, nodeId ), nodeIds ), statement, nodeIds ); + NodeLabelIndexCursor cursor = ktx.cursors().allocateNodeLabelIndexCursor(); + ktx.dataRead().nodeLabelScan( labelId, cursor ); + return new PrefetchingResourceIterator() + { + @Override + protected Node fetchNextOrNull() + { + if ( cursor.next() ) + { + return new NodeProxy( nodeActions, cursor.nodeReference() ); + } + else + { + close(); + return null; + } + } + + @Override + public void close() + { + cursor.close(); + } + }; } private ResourceIterator map2nodes( PrimitiveLongIterator input, Resource... resources ) diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/AllStoreHolder.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/AllStoreHolder.java index 003e0cebfb91a..1de8b45e77e41 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/AllStoreHolder.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/AllStoreHolder.java @@ -20,7 +20,6 @@ package org.neo4j.kernel.impl.newapi; import java.nio.ByteBuffer; -import java.util.Arrays; import java.util.Iterator; import java.util.Map; @@ -29,7 +28,6 @@ import org.neo4j.helpers.collection.Iterators; import org.neo4j.internal.kernel.api.CapableIndexReference; import org.neo4j.internal.kernel.api.IndexCapability; -import org.neo4j.internal.kernel.api.IndexQuery; import org.neo4j.internal.kernel.api.InternalIndexState; import org.neo4j.internal.kernel.api.Token; import org.neo4j.internal.kernel.api.exceptions.KernelException; @@ -310,7 +308,7 @@ public String labelGetName( int token ) throws LabelNotFoundKernelException } @Override - public int labelGetForName( String name ) throws LabelNotFoundKernelException + public int labelGetForName( String name ) { return storeReadLayer.labelGetForName( name ); } diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/KernelToken.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/KernelToken.java index 464c5a8416370..649251b634747 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/KernelToken.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/KernelToken.java @@ -66,7 +66,7 @@ public String labelGetName( int token ) throws LabelNotFoundKernelException } @Override - public int labelGetForName( String name ) throws LabelNotFoundKernelException + public int labelGetForName( String name ) { return store.labelGetForName( name ); } diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/state/TxStateTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/state/TxStateTest.java index 21e1b9d49bd33..52491a9d6f5f9 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/state/TxStateTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/state/TxStateTest.java @@ -156,7 +156,6 @@ public void shouldHandleMultipleLabels() throws Exception state.nodeDoAddLabel( 2, 4 ); state.nodeDoAddLabel( 3, 5 ); - // WHEN Set removed = state.nodesWithLabelChanged( 1, 2, 3 ).getRemoved(); Set added = state.nodesWithLabelChanged( 1, 2, 3 ).getAdded();