From a7154e0864aba2e68a0af45d41afb03ae4cc0cc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20Finn=C3=A9?= Date: Fri, 25 May 2018 21:12:30 +0200 Subject: [PATCH] Removed next(filter) from storage cursors So that the storage cursors can be simplified even further. The check for removed in tx-state moved into the kernel API cursors, where they belong. Also javadoced the storage cursors and created a simple hierarchy of StorageCursor. --- .../TransactionCountingStateVisitor.java | 7 ++- .../TxStateTransactionDataSnapshot.java | 17 +++---- .../kernel/impl/newapi/DefaultNodeCursor.java | 9 +++- .../impl/newapi/DefaultPropertyCursor.java | 10 +++- .../newapi/DefaultRelationshipScanCursor.java | 9 +++- .../DefaultRelationshipTraversalCursor.java | 14 ++++-- .../impl/recordstorage/RecordNodeCursor.java | 11 +---- .../recordstorage/RecordPropertyCursor.java | 14 +++--- .../RecordRelationshipCursor.java | 2 - .../RecordRelationshipScanCursor.java | 13 ++--- .../RecordRelationshipTraversalCursor.java | 39 ++++++--------- .../participant/StoreMigrator.java | 12 +++++ .../participant/StoreScanChunk.java | 12 ++--- .../storageengine/api/StorageCursor.java | 31 ++++++++++++ .../api/StorageEntityCursor.java | 20 ++++---- .../storageengine/api/StorageNodeCursor.java | 48 +++++++++++++++++-- .../api/StoragePropertyCursor.java | 28 +++++++---- .../api/StorageRelationshipCursor.java | 23 +++++++-- .../api/StorageRelationshipScanCursor.java | 13 +++++ .../StorageRelationshipTraversalCursor.java | 4 -- .../internal/BatchRelationshipIterable.java | 5 +- .../RecordPropertyCursorTest.java | 3 +- .../RecordRelationshipScanCursorTest.java | 7 ++- ...RecordRelationshipTraversalCursorTest.java | 13 +++-- .../RecordStorageReaderLabelTest.java | 3 +- .../RecordStorageReaderNodeAndRelTest.java | 5 +- .../RecordStorageReaderPropertyTest.java | 6 +-- ...ordStorageReaderRelTypesAndDegreeTest.java | 3 +- .../kernel/impl/store/NeoStoresTest.java | 28 +++++------ .../participant/StoreScanChunkIT.java | 6 +++ .../storageengine/api/StubStorageCursors.java | 14 ++++-- 31 files changed, 270 insertions(+), 159 deletions(-) create mode 100644 community/kernel/src/main/java/org/neo4j/storageengine/api/StorageCursor.java diff --git a/community/kernel/src/main/java/org/neo4j/kernel/api/txstate/TransactionCountingStateVisitor.java b/community/kernel/src/main/java/org/neo4j/kernel/api/txstate/TransactionCountingStateVisitor.java index f3de756cffda3..430cda989fe0a 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/api/txstate/TransactionCountingStateVisitor.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/api/txstate/TransactionCountingStateVisitor.java @@ -35,7 +35,6 @@ import org.neo4j.storageengine.api.txstate.ReadableTransactionState; import org.neo4j.storageengine.api.txstate.TxStateVisitor; -import static org.eclipse.collections.impl.block.factory.primitive.LongPredicates.alwaysFalse; import static org.neo4j.kernel.api.StatementConstants.ANY_LABEL; import static org.neo4j.kernel.api.StatementConstants.ANY_RELATIONSHIP_TYPE; @@ -71,7 +70,7 @@ public void visitDeletedNode( long id ) { counts.incrementNodeCount( ANY_LABEL, -1 ); nodeCursor.single( id ); - if ( nodeCursor.next( alwaysFalse() ) ) + if ( nodeCursor.next() ) { decrementCountForLabelsAndRelationships( nodeCursor ); } @@ -137,7 +136,7 @@ public void visitNodeLabelChanges( long id, final LongSet added, final LongSet r // the relationship changes will compensate for what happens during the transaction nodeCursor.single( id ); - if ( nodeCursor.next( alwaysFalse() ) ) + if ( nodeCursor.next() ) { visitDegrees( nodeCursor, ( type, out, in ) -> { @@ -191,7 +190,7 @@ private void visitLabels( long nodeId, LongConsumer visitor ) else { nodeCursor.single( nodeId ); - if ( nodeCursor.next( alwaysFalse() ) ) + if ( nodeCursor.next() ) { long[] labels = nodeCursor.labels(); LongDiffSets labelDiff = txState.getNodeState( nodeId ).labelDiffSets(); diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/coreapi/TxStateTransactionDataSnapshot.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/coreapi/TxStateTransactionDataSnapshot.java index f05f9fcec84d6..0f5376569aefe 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/coreapi/TxStateTransactionDataSnapshot.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/coreapi/TxStateTransactionDataSnapshot.java @@ -22,8 +22,6 @@ import org.eclipse.collections.api.LongIterable; import org.eclipse.collections.api.map.primitive.MutableLongObjectMap; import org.eclipse.collections.api.set.primitive.LongSet; -import org.eclipse.collections.impl.block.factory.primitive.IntPredicates; -import org.eclipse.collections.impl.block.factory.primitive.LongPredicates; import org.eclipse.collections.impl.map.mutable.primitive.LongObjectHashMap; import java.util.ArrayList; @@ -59,7 +57,6 @@ import org.neo4j.values.storable.Values; import static java.lang.Math.toIntExact; -import static org.eclipse.collections.impl.block.factory.primitive.LongPredicates.alwaysFalse; /** * Transform for {@link org.neo4j.storageengine.api.txstate.ReadableTransactionState} to make it accessible as {@link TransactionData}. @@ -206,10 +203,10 @@ private void takeSnapshot() state.addedAndRemovedNodes().getRemoved().each( nodeId -> { node.single( nodeId ); - if ( node.next( alwaysFalse() ) ) + if ( node.next() ) { properties.init( node.propertiesReference() ); - while ( properties.next( IntPredicates.alwaysFalse() ) ) + while ( properties.next() ) { try { @@ -239,10 +236,10 @@ private void takeSnapshot() { Relationship relationshipProxy = relationship( relId ); relationship.single( relId ); - if ( relationship.next( alwaysFalse() ) ) + if ( relationship.next() ) { properties.init( relationship.propertiesReference() ); - while ( properties.next( IntPredicates.alwaysFalse() ) ) + while ( properties.next() ) { try { @@ -377,7 +374,7 @@ private Value committedValue( NodeState nodeState, int property, StorageNodeCurs } node.single( nodeState.getId() ); - if ( !node.next( alwaysFalse() ) ) + if ( !node.next() ) { return Values.NO_VALUE; } @@ -388,7 +385,7 @@ private Value committedValue( NodeState nodeState, int property, StorageNodeCurs private Value committedValue( StoragePropertyCursor properties, long propertiesReference, int propertyKey ) { properties.init( propertiesReference ); - while ( properties.next( IntPredicates.alwaysFalse() ) ) + while ( properties.next() ) { if ( properties.propertyKey() == propertyKey ) { @@ -407,7 +404,7 @@ private Value committedValue( RelationshipState relState, int property, StorageR } relationship.single( relState.getId() ); - if ( !relationship.next( LongPredicates.alwaysFalse() ) ) + if ( !relationship.next() ) { return Values.NO_VALUE; } diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/DefaultNodeCursor.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/DefaultNodeCursor.java index caf3edf6d841c..fb2a12450eb21 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/DefaultNodeCursor.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/DefaultNodeCursor.java @@ -188,7 +188,14 @@ public boolean next() return true; } - return storeCursor.next( isDeleted ); + while ( storeCursor.next() ) + { + if ( !hasChanges || !read.txState().nodeIsDeletedInThisTx( storeCursor.nodeReference() ) ) + { + return true; + } + } + return false; } @Override diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/DefaultPropertyCursor.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/DefaultPropertyCursor.java index daea35122790b..7047f41c72fae 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/DefaultPropertyCursor.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/DefaultPropertyCursor.java @@ -133,7 +133,15 @@ private boolean innerNext() } IntPredicate predicate = propertyKey -> propertiesState != null && propertiesState.isPropertyChangedOrRemoved( propertyKey ); - return storeCursor.next( predicate ); + while ( storeCursor.next() ) + { + boolean skip = propertiesState != null && propertiesState.isPropertyChangedOrRemoved( storeCursor.propertyKey() ); + if ( !skip ) + { + return true; + } + } + return false; } @Override diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/DefaultRelationshipScanCursor.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/DefaultRelationshipScanCursor.java index ad2914905645a..afd7e3cb33134 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/DefaultRelationshipScanCursor.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/DefaultRelationshipScanCursor.java @@ -73,7 +73,14 @@ public boolean next() return true; } - return storeCursor.next( isDeleted ); + while ( storeCursor.next() ) + { + if ( !isDeleted.test( storeCursor.relationshipReference() ) ) + { + return true; + } + } + return false; } @Override diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/DefaultRelationshipTraversalCursor.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/DefaultRelationshipTraversalCursor.java index 3b5ed2bc79fad..0a6791c0008f8 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/DefaultRelationshipTraversalCursor.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/DefaultRelationshipTraversalCursor.java @@ -176,7 +176,7 @@ public boolean next() if ( filterState == FilterState.NOT_INITIALIZED && filterStore ) { - storeCursor.next( Predicates.alwaysFalseLong ); + storeCursor.next(); setupFilterState(); } @@ -198,7 +198,15 @@ public boolean next() return true; } - return storeCursor.next( ref -> ( filterStore && !correctTypeAndDirection() ) || isDeleted.test( ref ) ); + while ( storeCursor.next() ) + { + boolean skip = (filterStore && !correctTypeAndDirection()) || isDeleted.test( storeCursor.relationshipReference() ); + if ( !skip ) + { + return true; + } + } + return false; } private void setupFilterState() @@ -245,7 +253,7 @@ protected void collectAddedTxStateSnapshot() { if ( filterState == FilterState.NOT_INITIALIZED ) { - storeCursor.next( Predicates.alwaysFalseLong ); + storeCursor.next(); setupFilterState(); } diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/storageengine/impl/recordstorage/RecordNodeCursor.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/storageengine/impl/recordstorage/RecordNodeCursor.java index 913c3634f8041..88852d591e620 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/storageengine/impl/recordstorage/RecordNodeCursor.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/storageengine/impl/recordstorage/RecordNodeCursor.java @@ -19,8 +19,6 @@ */ package org.neo4j.kernel.impl.storageengine.impl.recordstorage; -import java.util.function.LongPredicate; - import org.neo4j.io.pagecache.PageCursor; import org.neo4j.kernel.impl.store.NodeLabelsField; import org.neo4j.kernel.impl.store.NodeStore; @@ -134,7 +132,7 @@ public long propertiesReference() } @Override - public boolean next( LongPredicate filter ) + public boolean next() { if ( next == NO_ID ) { @@ -144,12 +142,7 @@ public boolean next( LongPredicate filter ) do { - if ( filter.test( next ) ) - { - next++; - setInUse( false ); - } - else if ( nextStoreReference == next ) + if ( nextStoreReference == next ) { nodeAdvance( this, pageCursor ); next++; diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/storageengine/impl/recordstorage/RecordPropertyCursor.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/storageengine/impl/recordstorage/RecordPropertyCursor.java index 9128cacae0586..6a327768c79fc 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/storageengine/impl/recordstorage/RecordPropertyCursor.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/storageengine/impl/recordstorage/RecordPropertyCursor.java @@ -20,7 +20,6 @@ package org.neo4j.kernel.impl.storageengine.impl.recordstorage; import java.nio.ByteBuffer; -import java.util.function.IntPredicate; import org.neo4j.io.pagecache.PageCursor; import org.neo4j.kernel.impl.store.GeometryType; @@ -92,7 +91,7 @@ public void init( long reference ) } @Override - public boolean next( IntPredicate filter ) + public boolean next() { while ( true ) { @@ -122,10 +121,7 @@ public boolean next( IntPredicate filter ) break; } - if ( !filter.test( propertyKey() ) ) - { - return true; - } + return true; } if ( next == NO_ID ) @@ -370,6 +366,12 @@ public void release() } } + @Override + public void reset() + { + clear(); + } + private PageCursor propertyPage( long reference ) { return read.openPageCursorForReading( reference ); diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/storageengine/impl/recordstorage/RecordRelationshipCursor.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/storageengine/impl/recordstorage/RecordRelationshipCursor.java index 167b3fe6c6ea9..0bb41b293e3b6 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/storageengine/impl/recordstorage/RecordRelationshipCursor.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/storageengine/impl/recordstorage/RecordRelationshipCursor.java @@ -48,7 +48,6 @@ public int type() return getType(); } - @Override public boolean hasProperties() { return nextProp != NO_ID; @@ -66,7 +65,6 @@ public long targetNodeReference() return getSecondNode(); } - @Override public long propertiesReference() { return getNextProp(); diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/storageengine/impl/recordstorage/RecordRelationshipScanCursor.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/storageengine/impl/recordstorage/RecordRelationshipScanCursor.java index 4ca2af410fafc..fa15de68208ed 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/storageengine/impl/recordstorage/RecordRelationshipScanCursor.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/storageengine/impl/recordstorage/RecordRelationshipScanCursor.java @@ -19,8 +19,6 @@ */ package org.neo4j.kernel.impl.storageengine.impl.recordstorage; -import java.util.function.LongPredicate; - import org.neo4j.io.pagecache.PageCursor; import org.neo4j.kernel.impl.store.RelationshipGroupStore; import org.neo4j.kernel.impl.store.RelationshipStore; @@ -39,7 +37,7 @@ class RecordRelationshipScanCursor extends RecordRelationshipCursor implements S RecordRelationshipScanCursor( RelationshipStore relationshipStore, RelationshipGroupStore groupStore ) { - super( relationshipStore, groupStore ); + super( relationshipStore ); } @Override @@ -79,7 +77,7 @@ public void single( long reference ) } @Override - public boolean next( LongPredicate filter ) + public boolean next() { if ( next == NO_ID ) { @@ -89,12 +87,7 @@ public boolean next( LongPredicate filter ) do { - if ( filter.test( next ) ) - { - next++; - setInUse( false ); - } - else if ( nextStoreReference == next ) + if ( nextStoreReference == next ) { relationshipAdvance( this, pageCursor ); next++; diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/storageengine/impl/recordstorage/RecordRelationshipTraversalCursor.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/storageengine/impl/recordstorage/RecordRelationshipTraversalCursor.java index 82d78d7103539..8cd8708e66ef8 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/storageengine/impl/recordstorage/RecordRelationshipTraversalCursor.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/storageengine/impl/recordstorage/RecordRelationshipTraversalCursor.java @@ -19,8 +19,6 @@ */ package org.neo4j.kernel.impl.storageengine.impl.recordstorage; -import java.util.function.LongPredicate; - import org.neo4j.io.pagecache.PageCursor; import org.neo4j.kernel.impl.newapi.RelationshipDirection; import org.neo4j.kernel.impl.store.RelationshipGroupStore; @@ -54,12 +52,6 @@ private enum GroupState this.group = new RecordRelationshipGroupCursor( relationshipStore, groupStore ); } - @Override - public void single( long reference ) - { - throw new UnsupportedOperationException( "Not implemented yet" ); - } - @Override public void init( long nodeReference, long reference, RelationshipDirection filterDirection, int filterType ) { @@ -141,11 +133,11 @@ public long originNodeReference() } @Override - public boolean next( LongPredicate filter ) + public boolean next() { if ( hasBufferedData() ) { // We have buffered data, iterate the chain of buffered records - return nextBuffered( filter ); + return nextBuffered(); } do @@ -163,27 +155,24 @@ public boolean next( LongPredicate filter ) relationshipFull( this, next, pageCursor ); computeNext(); - } while ( !inUse() || filter.test( getId() ) ); + } while ( !inUse() ); return true; } - private boolean nextBuffered( LongPredicate isDeleted ) + private boolean nextBuffered() { - do + buffer = buffer.next; + if ( !hasBufferedData() ) { - buffer = buffer.next; - if ( !hasBufferedData() ) - { - reset(); - return false; - } - else - { - // Copy buffer data to self - copyFromBuffer(); - } - } while ( isDeleted.test( getId() ) ); + reset(); + return false; + } + else + { + // Copy buffer data to self + copyFromBuffer(); + } return true; } diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/storemigration/participant/StoreMigrator.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/storemigration/participant/StoreMigrator.java index ad8913700ec68..1aa1fb1ae6aee 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/storemigration/participant/StoreMigrator.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/storemigration/participant/StoreMigrator.java @@ -615,6 +615,12 @@ private static class NodeRecordChunk extends StoreScanChunk super( storageReader.allocateNodeCursor(), storageReader, requiresPropertyMigration ); } + @Override + protected void read( RecordNodeCursor cursor, long id ) + { + cursor.single( id ); + } + @Override protected void visitRecord( RecordNodeCursor record, InputEntityVisitor visitor ) { @@ -631,6 +637,12 @@ private static class RelationshipRecordChunk extends StoreScanChunk implements InputChunk { protected final StoragePropertyCursor storePropertyCursor; @@ -55,7 +51,7 @@ void visitProperties( T record, InputEntityVisitor visitor ) else { storePropertyCursor.init( record.propertiesReference() ); - while ( storePropertyCursor.next( alwaysFalse() ) ) + while ( storePropertyCursor.next() ) { // add key as int here as to have the importer use the token id visitor.property( storePropertyCursor.propertyKey(), storePropertyCursor.propertyValue().asObject() ); @@ -75,8 +71,8 @@ public boolean next( InputEntityVisitor visitor ) throws IOException { if ( id < endId ) { - cursor.single( id ); - if ( cursor.next( LongPredicates.alwaysFalse() ) ) + read( cursor, id ); + if ( cursor.next() ) { visitRecord( cursor, visitor ); visitor.endOfEntity(); @@ -87,6 +83,8 @@ public boolean next( InputEntityVisitor visitor ) throws IOException return false; } + protected abstract void read( T cursor, long id ); + public void initialize( long startId, long endId ) { this.id = startId; diff --git a/community/kernel/src/main/java/org/neo4j/storageengine/api/StorageCursor.java b/community/kernel/src/main/java/org/neo4j/storageengine/api/StorageCursor.java new file mode 100644 index 0000000000000..f3ce39e1c80f7 --- /dev/null +++ b/community/kernel/src/main/java/org/neo4j/storageengine/api/StorageCursor.java @@ -0,0 +1,31 @@ +package org.neo4j.storageengine.api; + +/** + * Base interface for a cursor accessing and reading data as part of {@link StorageReader}. + */ +public interface StorageCursor extends AutoCloseable +{ + /** + * Positions this cursor and reads the next item that it has been designated to read. + * @return {@code true} if the item was read and in use, otherwise {@code false}. + */ + boolean next(); + + /** + * Closes the cursor so that calls to {@link #next()} will not return {@code true} anymore. + * After this point this cursor can still be used, by initializing it with any of the cursor-specific + * initialization method. + */ + @Override + void close(); + + /** + * Releases resources allocated by this cursor so that it cannot be initialized or used again after this call. + */ + void release(); + + /** + * Resets the current data for this cursor so that it returns an unused uninitialized item. + */ + void reset(); +} diff --git a/community/kernel/src/main/java/org/neo4j/storageengine/api/StorageEntityCursor.java b/community/kernel/src/main/java/org/neo4j/storageengine/api/StorageEntityCursor.java index 1ffc62f1239bf..9a2e41ee424a3 100644 --- a/community/kernel/src/main/java/org/neo4j/storageengine/api/StorageEntityCursor.java +++ b/community/kernel/src/main/java/org/neo4j/storageengine/api/StorageEntityCursor.java @@ -1,17 +1,17 @@ package org.neo4j.storageengine.api; -import java.util.function.LongPredicate; - -public interface StorageEntityCursor extends AutoCloseable +/** + * A {@link StorageCursor} for entities, i.e. which has properties. + */ +public interface StorageEntityCursor extends StorageCursor { - boolean next( LongPredicate filter ); - + /** + * @return {@code true} if the entity the cursor is at has any properties, otherwise {@code false}. + */ boolean hasProperties(); + /** + * @return a {@code long} reference to start reading properties for the entity this cursor is at. + */ long propertiesReference(); - - void single( long reference ); - - @Override - void close(); } diff --git a/community/kernel/src/main/java/org/neo4j/storageengine/api/StorageNodeCursor.java b/community/kernel/src/main/java/org/neo4j/storageengine/api/StorageNodeCursor.java index c9e5b46d74b8d..07fbc3bc1bba2 100644 --- a/community/kernel/src/main/java/org/neo4j/storageengine/api/StorageNodeCursor.java +++ b/community/kernel/src/main/java/org/neo4j/storageengine/api/StorageNodeCursor.java @@ -19,25 +19,65 @@ */ package org.neo4j.storageengine.api; +/** + * Cursor over nodes and its data. + */ public interface StorageNodeCursor extends StorageEntityCursor { + /** + * Initializes this cursor so that the next call to {@link #next()} will place this cursor at that node. + * @param reference node to place this cursor at the next call to {@link #next()}. + */ + void single( long reference ); + + /** + * Initializes this cursor so that it will scan over all existing nodes. Each call to {@link #next()} will + * advance the cursor so that the next node is read. + */ void scan(); + /** + * @return reference to the node this cursor currently is placed at. + */ long nodeReference(); + /** + * @return label ids of the node this cursor currently is placed at. + */ long[] labels(); + /** + * @return {@code true} if the node this cursor is placed at has the given {@code label}, otherwise {@code false}. + */ boolean hasLabel( int label ); + /** + * NOTE the fact that this method is here means physical details about underlying storage leaks into this API. + * However this method has to exist as long as the kernel API also exposes this. This needs to change at some point. + * + * @return reference for reading relationship groups, i.e. relationships split up by direction/type of the node this cursor currently is placed at. + */ long relationshipGroupReference(); + /** + * @return reference for reading all relationships of the node this cursor currently is placed at. + */ long allRelationshipsReference(); + /** + * A means of simplifying higher-level cursors which takes into consideration transaction-state. + * This basically tells this cursor to be placed at nodeReference, even if it doesn't exist, such that + * {@link #nodeReference()} will return this reference on the next call. + * + * @param nodeReference the reference to be returned on the next {@link #nodeReference()} call. + */ void setCurrent( long nodeReference ); + /** + * NOTE the fact that this method is here means physical details about underlying storage leaks into this API. + * However this method has to exist as long as the kernel API also exposes this. This needs to change at some point. + * + * @return whether or not this node is dense. + */ boolean isDense(); - - void reset(); - - void release(); } diff --git a/community/kernel/src/main/java/org/neo4j/storageengine/api/StoragePropertyCursor.java b/community/kernel/src/main/java/org/neo4j/storageengine/api/StoragePropertyCursor.java index 301d410d135a4..dc62de89ae1fe 100644 --- a/community/kernel/src/main/java/org/neo4j/storageengine/api/StoragePropertyCursor.java +++ b/community/kernel/src/main/java/org/neo4j/storageengine/api/StoragePropertyCursor.java @@ -19,25 +19,33 @@ */ package org.neo4j.storageengine.api; -import java.util.function.IntPredicate; - import org.neo4j.values.storable.Value; import org.neo4j.values.storable.ValueGroup; -public interface StoragePropertyCursor extends AutoCloseable +/** + * Cursor that can read property data. + */ +public interface StoragePropertyCursor extends StorageCursor { + /** + * Initializes this cursor to that reading property data at the given {@code reference}. + * + * @param reference reference to start reading properties at. + */ void init( long reference ); - @Override - void close(); - + /** + * @return property key of the property this cursor currently is placed at. + */ int propertyKey(); + /** + * @return value group of the property this cursor currently is placed at. + */ ValueGroup propertyType(); + /** + * @return value of the property this cursor currently is placed at. + */ Value propertyValue(); - - void release(); - - boolean next( IntPredicate filter ); } diff --git a/community/kernel/src/main/java/org/neo4j/storageengine/api/StorageRelationshipCursor.java b/community/kernel/src/main/java/org/neo4j/storageengine/api/StorageRelationshipCursor.java index 2175d3eb0f361..59a95b5e1ec49 100644 --- a/community/kernel/src/main/java/org/neo4j/storageengine/api/StorageRelationshipCursor.java +++ b/community/kernel/src/main/java/org/neo4j/storageengine/api/StorageRelationshipCursor.java @@ -21,20 +21,33 @@ import org.neo4j.kernel.impl.api.RelationshipVisitor; +/** + * Shared interface between the two {@link StorageRelationshipScanCursor} and {@link StorageRelationshipTraversalCursor}. + */ public interface StorageRelationshipCursor extends RelationshipVisitor, StorageEntityCursor { + /** + * @return reference to the relationship this cursor is placed at. + */ long relationshipReference(); + /** + * @return relationship type of the relationship this cursor is placed at. + */ int type(); + /** + * @return source node of the relationship this cursor is placed at. + */ long sourceNodeReference(); + /** + * @return target node of the relationship this cursor is placed at. + */ long targetNodeReference(); - // used to visit transaction state + /** + * Used to visit transaction state, for simplifying implementation of higher-level cursor that consider transaction-state. + */ void visit( long relationshipId, int typeId, long startNodeId, long endNodeId ); - - void reset(); - - void release(); } diff --git a/community/kernel/src/main/java/org/neo4j/storageengine/api/StorageRelationshipScanCursor.java b/community/kernel/src/main/java/org/neo4j/storageengine/api/StorageRelationshipScanCursor.java index fccb3905921d7..d4380054e9230 100644 --- a/community/kernel/src/main/java/org/neo4j/storageengine/api/StorageRelationshipScanCursor.java +++ b/community/kernel/src/main/java/org/neo4j/storageengine/api/StorageRelationshipScanCursor.java @@ -19,9 +19,22 @@ */ package org.neo4j.storageengine.api; +/** + * Cursor over relationships. + */ public interface StorageRelationshipScanCursor extends StorageRelationshipCursor { + /** + * Initializes this cursor so that it will scan over existing relationships. Each call to {@link #next()} will + * advance the cursor so that the next node is read. + * + * @param type relationship type to scan over, or -1 for all relationships regardless of type. + */ void scan( int type ); + /** + * Initializes this cursor so that the next call to {@link #next()} will place this cursor at that relationship. + * @param reference relationship to place this cursor at the next call to {@link #next()}. + */ void single( long reference ); } diff --git a/community/kernel/src/main/java/org/neo4j/storageengine/api/StorageRelationshipTraversalCursor.java b/community/kernel/src/main/java/org/neo4j/storageengine/api/StorageRelationshipTraversalCursor.java index c213b5b3908d9..4d15edc7a1770 100644 --- a/community/kernel/src/main/java/org/neo4j/storageengine/api/StorageRelationshipTraversalCursor.java +++ b/community/kernel/src/main/java/org/neo4j/storageengine/api/StorageRelationshipTraversalCursor.java @@ -19,8 +19,6 @@ */ package org.neo4j.storageengine.api; -import java.util.function.LongPredicate; - import org.neo4j.kernel.impl.newapi.RelationshipDirection; public interface StorageRelationshipTraversalCursor extends StorageRelationshipCursor @@ -29,7 +27,5 @@ public interface StorageRelationshipTraversalCursor extends StorageRelationshipC long originNodeReference(); - boolean next( LongPredicate filter ); - void init( long nodeReference, long reference, RelationshipDirection filterDirection, int filterType ); } diff --git a/community/kernel/src/main/java/org/neo4j/unsafe/batchinsert/internal/BatchRelationshipIterable.java b/community/kernel/src/main/java/org/neo4j/unsafe/batchinsert/internal/BatchRelationshipIterable.java index e0d909d07d04f..e7698ae9a6ddc 100644 --- a/community/kernel/src/main/java/org/neo4j/unsafe/batchinsert/internal/BatchRelationshipIterable.java +++ b/community/kernel/src/main/java/org/neo4j/unsafe/batchinsert/internal/BatchRelationshipIterable.java @@ -28,7 +28,6 @@ import org.neo4j.kernel.impl.store.RecordCursors; import org.neo4j.storageengine.api.StorageRelationshipTraversalCursor; -import static org.neo4j.function.Predicates.alwaysFalseLong; import static org.neo4j.internal.kernel.api.Read.ANY_RELATIONSHIP_TYPE; abstract class BatchRelationshipIterable implements Iterable @@ -40,7 +39,7 @@ abstract class BatchRelationshipIterable implements Iterable relationshipCursor = storageReader.allocateRelationshipTraversalCursor(); RecordNodeCursor nodeCursor = storageReader.allocateNodeCursor(); nodeCursor.single( nodeId ); - if ( !nodeCursor.next( alwaysFalseLong ) ) + if ( !nodeCursor.next() ) { throw new NotFoundException( "Node " + nodeId + " not found" ); } @@ -55,7 +54,7 @@ public Iterator iterator() @Override protected T fetchNextOrNull() { - if ( !relationshipCursor.next( alwaysFalseLong ) ) + if ( !relationshipCursor.next() ) { return null; } diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/storageengine/impl/recordstorage/RecordPropertyCursorTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/storageengine/impl/recordstorage/RecordPropertyCursorTest.java index a917337564b36..62fe08bbadb61 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/storageengine/impl/recordstorage/RecordPropertyCursorTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/storageengine/impl/recordstorage/RecordPropertyCursorTest.java @@ -26,7 +26,6 @@ import org.neo4j.values.storable.RandomValues; import org.neo4j.values.storable.Value; -import static org.eclipse.collections.impl.block.factory.primitive.IntPredicates.alwaysFalse; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.neo4j.helpers.collection.Iterators.iterator; @@ -111,7 +110,7 @@ private void assertPropertyChain( Value[] values, long firstPropertyId, RecordPr { Map expectedValues = asMap( values ); cursor.init( firstPropertyId ); - while ( cursor.next( alwaysFalse() ) ) + while ( cursor.next() ) { // then assertEquals( expectedValues.remove( cursor.propertyKey() ), cursor.propertyValue() ); diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/storageengine/impl/recordstorage/RecordRelationshipScanCursorTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/storageengine/impl/recordstorage/RecordRelationshipScanCursorTest.java index d8fa7e2a1e410..60a6c1a2881b4 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/storageengine/impl/recordstorage/RecordRelationshipScanCursorTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/storageengine/impl/recordstorage/RecordRelationshipScanCursorTest.java @@ -42,7 +42,6 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; -import static org.neo4j.function.Predicates.alwaysFalseLong; import static org.neo4j.internal.kernel.api.Read.ANY_RELATIONSHIP_TYPE; public class RecordRelationshipScanCursorTest @@ -81,7 +80,7 @@ public void retrieveUsedRelationship() try ( RecordRelationshipScanCursor cursor = createRelationshipCursor() ) { cursor.single( RELATIONSHIP_ID ); - assertTrue( cursor.next( alwaysFalseLong ) ); + assertTrue( cursor.next() ); assertEquals( RELATIONSHIP_ID, cursor.relationshipReference() ); } } @@ -96,7 +95,7 @@ public void retrieveUnusedRelationship() try ( RecordRelationshipScanCursor cursor = createRelationshipCursor() ) { cursor.single( RELATIONSHIP_ID ); - assertFalse( cursor.next( alwaysFalseLong ) ); + assertFalse( cursor.next() ); } } @@ -151,7 +150,7 @@ private void assertSeesRelationships( Set expected, int type ) try ( RecordRelationshipScanCursor cursor = createRelationshipCursor() ) { cursor.scan( type ); - while ( cursor.next( alwaysFalseLong ) ) + while ( cursor.next() ) { // then assertTrue( cursor.toString(), expected.remove( cursor.relationshipReference() ) ); diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/storageengine/impl/recordstorage/RecordRelationshipTraversalCursorTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/storageengine/impl/recordstorage/RecordRelationshipTraversalCursorTest.java index 9d752f4e4f18c..61d9408e6cc6e 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/storageengine/impl/recordstorage/RecordRelationshipTraversalCursorTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/storageengine/impl/recordstorage/RecordRelationshipTraversalCursorTest.java @@ -49,7 +49,6 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; -import static org.neo4j.function.Predicates.alwaysFalseLong; import static org.neo4j.graphdb.factory.GraphDatabaseSettings.pagecache_memory; import static org.neo4j.internal.kernel.api.Read.ANY_RELATIONSHIP_TYPE; import static org.neo4j.io.pagecache.tracing.cursor.context.EmptyVersionContextSupplier.EMPTY; @@ -115,13 +114,13 @@ public void retrieveNodeRelationships() try ( RecordRelationshipTraversalCursor cursor = getNodeRelationshipCursor() ) { cursor.init( FIRST_OWNING_NODE, 1L, direction, ANY_RELATIONSHIP_TYPE ); - assertTrue( cursor.next( alwaysFalseLong ) ); + assertTrue( cursor.next() ); cursor.init( FIRST_OWNING_NODE, 2, direction, ANY_RELATIONSHIP_TYPE ); - assertTrue( cursor.next( alwaysFalseLong ) ); + assertTrue( cursor.next() ); cursor.init( FIRST_OWNING_NODE, 3, direction, ANY_RELATIONSHIP_TYPE ); - assertTrue( cursor.next( alwaysFalseLong ) ); + assertTrue( cursor.next() ); } } @@ -133,7 +132,7 @@ public void retrieveUsedRelationshipChain() try ( RecordRelationshipTraversalCursor cursor = getNodeRelationshipCursor() ) { cursor.init( FIRST_OWNING_NODE, 1, direction, ANY_RELATIONSHIP_TYPE ); - while ( cursor.next( alwaysFalseLong ) ) + while ( cursor.next() ) { assertEquals( "Should load next relationship in a sequence", expectedNodeId++, cursor.relationshipReference() ); } @@ -151,7 +150,7 @@ public void retrieveRelationshipChainWithUnusedLink() try ( RecordRelationshipTraversalCursor cursor = getNodeRelationshipCursor() ) { cursor.init( FIRST_OWNING_NODE, 1, direction, ANY_RELATIONSHIP_TYPE ); - while ( cursor.next( alwaysFalseLong ) ) + while ( cursor.next() ) { assertEquals( "Should load next relationship in a sequence", expectedRelationshipIds[relationshipIndex++], cursor.relationshipReference() ); @@ -172,7 +171,7 @@ public void shouldHandleDenseNodeWithNoRelationships() cursor.init( FIRST_OWNING_NODE, NO_NEXT_RELATIONSHIP.intValue(), direction, ANY_RELATIONSHIP_TYPE ); // THEN - assertFalse( cursor.next( alwaysFalseLong ) ); + assertFalse( cursor.next() ); } } diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/storageengine/impl/recordstorage/RecordStorageReaderLabelTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/storageengine/impl/recordstorage/RecordStorageReaderLabelTest.java index cda258328326a..55d7bad74b15a 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/storageengine/impl/recordstorage/RecordStorageReaderLabelTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/storageengine/impl/recordstorage/RecordStorageReaderLabelTest.java @@ -27,7 +27,6 @@ import org.neo4j.graphdb.Transaction; import org.neo4j.storageengine.api.StorageNodeCursor; -import static org.eclipse.collections.impl.block.factory.primitive.LongPredicates.alwaysFalse; import static org.eclipse.collections.impl.set.mutable.primitive.LongHashSet.newSetWith; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThat; @@ -62,7 +61,7 @@ public void shouldBeAbleToListLabelsForNode() throws Exception // THEN StorageNodeCursor nodeCursor = storageReader.allocateNodeCursor(); nodeCursor.single( nodeId ); - assertTrue( nodeCursor.next( alwaysFalse() ) ); + assertTrue( nodeCursor.next() ); assertEquals( newSetWith( labelId1, labelId2 ), newSetWith( nodeCursor.labels() ) ); } diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/storageengine/impl/recordstorage/RecordStorageReaderNodeAndRelTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/storageengine/impl/recordstorage/RecordStorageReaderNodeAndRelTest.java index 44b7de38c6c23..a3b36b1237d7d 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/storageengine/impl/recordstorage/RecordStorageReaderNodeAndRelTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/storageengine/impl/recordstorage/RecordStorageReaderNodeAndRelTest.java @@ -25,7 +25,6 @@ import org.neo4j.storageengine.api.StorageNodeCursor; import org.neo4j.storageengine.api.StorageRelationshipScanCursor; -import static org.eclipse.collections.impl.block.factory.primitive.LongPredicates.alwaysFalse; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.neo4j.graphdb.RelationshipType.withName; @@ -91,7 +90,7 @@ private boolean nodeExists( long id ) try ( StorageNodeCursor node = storageReader.allocateNodeCursor() ) { node.single( id ); - return node.next( alwaysFalse() ); + return node.next(); } } @@ -100,7 +99,7 @@ private boolean relationshipExists( long id ) try ( StorageRelationshipScanCursor relationship = storageReader.allocateRelationshipScanCursor() ) { relationship.single( id ); - return relationship.next( alwaysFalse() ); + return relationship.next(); } } } diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/storageengine/impl/recordstorage/RecordStorageReaderPropertyTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/storageengine/impl/recordstorage/RecordStorageReaderPropertyTest.java index 2ffbee812ef5c..6fb4fb07bd6c0 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/storageengine/impl/recordstorage/RecordStorageReaderPropertyTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/storageengine/impl/recordstorage/RecordStorageReaderPropertyTest.java @@ -19,7 +19,6 @@ */ package org.neo4j.kernel.impl.storageengine.impl.recordstorage; -import org.eclipse.collections.impl.block.factory.primitive.IntPredicates; import org.junit.Test; import java.lang.reflect.Array; @@ -33,7 +32,6 @@ import org.neo4j.values.storable.Values; import static java.util.Collections.singletonMap; -import static org.eclipse.collections.impl.block.factory.primitive.LongPredicates.alwaysFalse; import static org.hamcrest.Matchers.greaterThanOrEqualTo; import static org.hamcrest.Matchers.is; import static org.junit.Assert.assertEquals; @@ -103,12 +101,12 @@ public void shouldGetAllNodeProperties() try ( StorageNodeCursor node = storageReader.allocateNodeCursor() ) { node.single( nodeId ); - assertTrue( node.next( alwaysFalse() ) ); + assertTrue( node.next() ); try ( StoragePropertyCursor props = storageReader.allocatePropertyCursor() ) { props.init( node.propertiesReference() ); - if ( props.next( IntPredicates.alwaysFalse() ) ) + if ( props.next() ) { Value propVal = props.propertyValue(); diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/storageengine/impl/recordstorage/RecordStorageReaderRelTypesAndDegreeTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/storageengine/impl/recordstorage/RecordStorageReaderRelTypesAndDegreeTest.java index 6258074bff67d..d656e0142738f 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/storageengine/impl/recordstorage/RecordStorageReaderRelTypesAndDegreeTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/storageengine/impl/recordstorage/RecordStorageReaderRelTypesAndDegreeTest.java @@ -48,7 +48,6 @@ import static java.util.Arrays.asList; import static java.util.Collections.emptySet; -import static org.eclipse.collections.impl.block.factory.primitive.LongPredicates.alwaysFalse; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertTrue; @@ -526,7 +525,7 @@ private StorageNodeCursor newCursor( long nodeId ) { StorageNodeCursor nodeCursor = storageReader.allocateNodeCursor(); nodeCursor.single( nodeId ); - assertTrue( nodeCursor.next( alwaysFalse() ) ); + assertTrue( nodeCursor.next() ); return nodeCursor; } diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/store/NeoStoresTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/store/NeoStoresTest.java index 707d8e128b3d4..4b9da23091a05 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/store/NeoStoresTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/store/NeoStoresTest.java @@ -19,7 +19,6 @@ */ package org.neo4j.kernel.impl.store; -import org.eclipse.collections.impl.block.factory.primitive.IntPredicates; import org.junit.Before; import org.junit.Rule; import org.junit.Test; @@ -107,7 +106,6 @@ import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; -import static org.neo4j.function.Predicates.alwaysFalseLong; import static org.neo4j.graphdb.factory.GraphDatabaseSettings.counts_store_rotation_timeout; import static org.neo4j.helpers.collection.MapUtil.stringMap; import static org.neo4j.internal.kernel.api.Read.ANY_RELATIONSHIP_TYPE; @@ -299,7 +297,7 @@ private StorageProperty nodeAddProperty( long nodeId, int key, Object value ) try ( StorageNodeCursor nodeCursor = storageReader.allocateNodeCursor() ) { nodeCursor.single( nodeId ); - if ( nodeCursor.next( alwaysFalseLong ) ) + if ( nodeCursor.next() ) { StorageProperty fetched = getProperty( key, nodeCursor.propertiesReference() ); if ( fetched != null ) @@ -327,7 +325,7 @@ private StorageProperty relAddProperty( long relationshipId, int key, Object val try ( StorageRelationshipScanCursor cursor = storageReader.allocateRelationshipScanCursor() ) { cursor.single( relationshipId ); - if ( cursor.next( alwaysFalseLong ) ) + if ( cursor.next() ) { StorageProperty fetched = getProperty( key, cursor.propertiesReference() ); if ( fetched != null ) @@ -346,7 +344,7 @@ private StorageProperty getProperty( int key, long propertyId ) try ( StoragePropertyCursor propertyCursor = storageReader.allocatePropertyCursor() ) { propertyCursor.init( propertyId ); - if ( propertyCursor.next( IntPredicates.alwaysFalse() ) ) + if ( propertyCursor.next() ) { Value oldValue = propertyCursor.propertyValue(); if ( oldValue != null ) @@ -1033,10 +1031,10 @@ private int validateAndCountRelationships( long node, long rel1, long rel2, int try ( KernelStatement statement = (KernelStatement) tx.acquireStatement(); StorageNodeCursor nodeCursor = allocateNodeCursor( node ) ) { - assertTrue( nodeCursor.next( alwaysFalseLong ) ); + assertTrue( nodeCursor.next() ); try ( StorageRelationshipTraversalCursor relationships = allocateRelationshipTraversalCursor( nodeCursor ) ) { - while ( relationships.next( alwaysFalseLong ) ) + while ( relationships.next() ) { long rel = relationships.relationshipReference(); if ( rel == rel1 ) @@ -1128,10 +1126,10 @@ else if ( data.propertyKeyId() == prop3.propertyKeyId() ) try ( KernelStatement statement = (KernelStatement) tx.acquireStatement(); StorageNodeCursor nodeCursor = allocateNodeCursor( node ) ) { - assertTrue( nodeCursor.next( alwaysFalseLong ) ); + assertTrue( nodeCursor.next() ); try ( StorageRelationshipTraversalCursor relationships = allocateRelationshipTraversalCursor( nodeCursor ) ) { - while ( relationships.next( alwaysFalseLong ) ) + while ( relationships.next() ) { long rel = relationships.relationshipReference(); if ( rel == rel1 ) @@ -1160,7 +1158,7 @@ private boolean nodeExists( long nodeId ) { try ( StorageNodeCursor node = allocateNodeCursor( nodeId ) ) { - return node.next( alwaysFalseLong ); + return node.next(); } } @@ -1417,10 +1415,10 @@ private void assertHasRelationships( long node ) try ( KernelStatement statement = (KernelStatement) tx.acquireStatement(); StorageNodeCursor nodeCursor = allocateNodeCursor( node ) ) { - assertTrue( nodeCursor.next( alwaysFalseLong ) ); + assertTrue( nodeCursor.next() ); try ( StorageRelationshipTraversalCursor relationships = allocateRelationshipTraversalCursor( nodeCursor ) ) { - assertTrue( relationships.next( alwaysFalseLong ) ); + assertTrue( relationships.next() ); } } } @@ -1526,7 +1524,7 @@ private void testGetRels( long[] relIds ) try ( StorageRelationshipScanCursor relationship = storageReader.allocateRelationshipScanCursor() ) { relationship.single( relId ); - assertFalse( relationship.next( alwaysFalseLong ) ); + assertFalse( relationship.next() ); } } } @@ -1536,10 +1534,10 @@ private void deleteRelationships( long nodeId ) try ( KernelStatement statement = (KernelStatement) tx.acquireStatement(); StorageNodeCursor nodeCursor = allocateNodeCursor( nodeId ) ) { - assertTrue( nodeCursor.next( alwaysFalseLong ) ); + assertTrue( nodeCursor.next() ); try ( StorageRelationshipTraversalCursor relationships = allocateRelationshipTraversalCursor( nodeCursor ) ) { - while ( relationships.next( alwaysFalseLong ) ) + while ( relationships.next() ) { relDelete( relationships.relationshipReference() ); } diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/storemigration/participant/StoreScanChunkIT.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/storemigration/participant/StoreScanChunkIT.java index 201734b0e62ea..360ad54a4047b 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/storemigration/participant/StoreScanChunkIT.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/storemigration/participant/StoreScanChunkIT.java @@ -66,6 +66,12 @@ private class TestStoreScanChunk extends StoreScanChunk super( storageReader.allocateNodeCursor(), storageReader, requiresPropertyMigration ); } + @Override + protected void read( StorageNodeCursor cursor, long id ) + { + cursor.single( id ); + } + @Override void visitRecord( StorageNodeCursor record, InputEntityVisitor visitor ) { diff --git a/community/kernel/src/test/java/org/neo4j/storageengine/api/StubStorageCursors.java b/community/kernel/src/test/java/org/neo4j/storageengine/api/StubStorageCursors.java index 07ebcef8a621d..4697ffe9d074b 100644 --- a/community/kernel/src/test/java/org/neo4j/storageengine/api/StubStorageCursors.java +++ b/community/kernel/src/test/java/org/neo4j/storageengine/api/StubStorageCursors.java @@ -6,13 +6,12 @@ import java.util.Map; import java.util.concurrent.atomic.AtomicLong; import java.util.function.Function; -import java.util.function.IntPredicate; -import java.util.function.LongPredicate; import org.neo4j.collection.PrimitiveLongResourceIterator; import org.neo4j.internal.kernel.api.IndexReference; import org.neo4j.internal.kernel.api.InternalIndexState; import org.neo4j.internal.kernel.api.exceptions.EntityNotFoundException; +import org.neo4j.internal.kernel.api.exceptions.schema.TooManyLabelsException; import org.neo4j.internal.kernel.api.schema.SchemaDescriptor; import org.neo4j.internal.kernel.api.schema.constraints.ConstraintDescriptor; import org.neo4j.kernel.api.schema.index.CapableIndexDescriptor; @@ -601,7 +600,7 @@ public long propertiesReference() } @Override - public boolean next( LongPredicate filter ) + public boolean next() { if ( iterator != null ) { @@ -720,7 +719,7 @@ public void reset() } @Override - public boolean next( LongPredicate filter ) + public boolean next() { if ( iterator != null ) { @@ -794,7 +793,12 @@ public void release() } @Override - public boolean next( IntPredicate filter ) + public void reset() + { + } + + @Override + public boolean next() { if ( iterator.hasNext() ) {