Skip to content

Commit

Permalink
Removed next(filter) from storage cursors
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
tinwelint committed Jun 11, 2018
1 parent 37245ad commit a7154e0
Show file tree
Hide file tree
Showing 31 changed files with 270 additions and 159 deletions.
Expand Up @@ -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;

Expand Down Expand Up @@ -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 );
}
Expand Down Expand Up @@ -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 ) ->
{
Expand Down Expand Up @@ -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();
Expand Down
Expand Up @@ -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;
Expand Down Expand Up @@ -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}.
Expand Down Expand Up @@ -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
{
Expand Down Expand Up @@ -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
{
Expand Down Expand Up @@ -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;
}
Expand All @@ -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 )
{
Expand All @@ -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;
}
Expand Down
Expand Up @@ -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
Expand Down
Expand Up @@ -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
Expand Down
Expand Up @@ -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
Expand Down
Expand Up @@ -176,7 +176,7 @@ public boolean next()

if ( filterState == FilterState.NOT_INITIALIZED && filterStore )
{
storeCursor.next( Predicates.alwaysFalseLong );
storeCursor.next();
setupFilterState();
}

Expand All @@ -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()
Expand Down Expand Up @@ -245,7 +253,7 @@ protected void collectAddedTxStateSnapshot()
{
if ( filterState == FilterState.NOT_INITIALIZED )
{
storeCursor.next( Predicates.alwaysFalseLong );
storeCursor.next();
setupFilterState();
}

Expand Down
Expand Up @@ -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;
Expand Down Expand Up @@ -134,7 +132,7 @@ public long propertiesReference()
}

@Override
public boolean next( LongPredicate filter )
public boolean next()
{
if ( next == NO_ID )
{
Expand All @@ -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++;
Expand Down
Expand Up @@ -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;
Expand Down Expand Up @@ -92,7 +91,7 @@ public void init( long reference )
}

@Override
public boolean next( IntPredicate filter )
public boolean next()
{
while ( true )
{
Expand Down Expand Up @@ -122,10 +121,7 @@ public boolean next( IntPredicate filter )
break;
}

if ( !filter.test( propertyKey() ) )
{
return true;
}
return true;
}

if ( next == NO_ID )
Expand Down Expand Up @@ -370,6 +366,12 @@ public void release()
}
}

@Override
public void reset()
{
clear();
}

private PageCursor propertyPage( long reference )
{
return read.openPageCursorForReading( reference );
Expand Down
Expand Up @@ -48,7 +48,6 @@ public int type()
return getType();
}

@Override
public boolean hasProperties()
{
return nextProp != NO_ID;
Expand All @@ -66,7 +65,6 @@ public long targetNodeReference()
return getSecondNode();
}

@Override
public long propertiesReference()
{
return getNextProp();
Expand Down
Expand Up @@ -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;
Expand All @@ -39,7 +37,7 @@ class RecordRelationshipScanCursor extends RecordRelationshipCursor implements S

RecordRelationshipScanCursor( RelationshipStore relationshipStore, RelationshipGroupStore groupStore )
{
super( relationshipStore, groupStore );
super( relationshipStore );
}

@Override
Expand Down Expand Up @@ -79,7 +77,7 @@ public void single( long reference )
}

@Override
public boolean next( LongPredicate filter )
public boolean next()
{
if ( next == NO_ID )
{
Expand All @@ -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++;
Expand Down
Expand Up @@ -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;
Expand Down Expand Up @@ -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 )
{
Expand Down Expand Up @@ -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
Expand All @@ -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;
}
Expand Down

0 comments on commit a7154e0

Please sign in to comment.