Skip to content

Commit

Permalink
Reuse pagecursor in relationship scan
Browse files Browse the repository at this point in the history
  • Loading branch information
pontusmelke authored and fickludd committed Nov 9, 2017
1 parent 4adafa5 commit dca922c
Show file tree
Hide file tree
Showing 2 changed files with 56 additions and 13 deletions.
Expand Up @@ -33,6 +33,7 @@
import org.neo4j.kernel.impl.store.NodeStore;
import org.neo4j.kernel.impl.store.RecordCursor;
import org.neo4j.kernel.impl.store.RecordStore;
import org.neo4j.kernel.impl.store.RelationshipStore;
import org.neo4j.kernel.impl.store.record.AbstractBaseRecord;
import org.neo4j.kernel.impl.store.record.DynamicRecord;
import org.neo4j.kernel.impl.store.record.NodeRecord;
Expand All @@ -52,11 +53,13 @@ public class Read implements org.neo4j.internal.kernel.api.Read
{
private final NeoStores stores;
private NodeStore nodeStore;
private RelationshipStore relationshipStore;

public Read( NeoStores stores )
{
this.stores = stores;
this.nodeStore = stores.getNodeStore();
this.relationshipStore = stores.getRelationshipStore();
}

@Override
Expand Down Expand Up @@ -91,7 +94,7 @@ public void allNodesScan( org.neo4j.internal.kernel.api.NodeCursor cursor )
{
try
{
PageCursor pageCursor = stores.getNodeStore().openPageCursor( 0 );
PageCursor pageCursor = nodeStore.openPageCursor( 0 );
((NodeCursor) cursor).scan( pageCursor );
}
catch ( IOException e )
Expand All @@ -112,7 +115,7 @@ public void singleNode( long reference, org.neo4j.internal.kernel.api.NodeCursor
{
try
{
PageCursor pageCursor = stores.getNodeStore().openPageCursor( reference );
PageCursor pageCursor = nodeStore.openPageCursor( reference );
((NodeCursor) cursor).single( reference, pageCursor );
}
catch ( IOException e )
Expand All @@ -124,13 +127,31 @@ public void singleNode( long reference, org.neo4j.internal.kernel.api.NodeCursor
@Override
public void singleRelationship( long reference, org.neo4j.internal.kernel.api.RelationshipScanCursor cursor )
{
((RelationshipScanCursor) cursor).single( reference );
try
{
PageCursor pageCursor = relationshipStore.openPageCursor( reference );
((RelationshipScanCursor) cursor).single( reference, pageCursor );
}
catch ( IOException e )
{
//TODO
throw new RuntimeException( e );
}
}

@Override
public void allRelationshipsScan( org.neo4j.internal.kernel.api.RelationshipScanCursor cursor )
{
((RelationshipScanCursor) cursor).scan( -1/*include all labels*/ );
try
{
PageCursor pageCursor = relationshipStore.openPageCursor( 0L );
((RelationshipScanCursor) cursor).scan( -1/*include all labels*/, pageCursor );
}
catch ( IOException e )
{
//TODO
throw new RuntimeException( e );
}
}

@Override
Expand All @@ -142,7 +163,16 @@ public Scan<org.neo4j.internal.kernel.api.RelationshipScanCursor> allRelationshi
@Override
public void relationshipLabelScan( int label, org.neo4j.internal.kernel.api.RelationshipScanCursor cursor )
{
((RelationshipScanCursor) cursor).scan( label );
try
{
PageCursor pageCursor = relationshipStore.openPageCursor( 0L );
((RelationshipScanCursor) cursor).scan( label, pageCursor );
}
catch ( IOException e )
{
//TODO
throw new RuntimeException( e );
}
}

@Override
Expand Down Expand Up @@ -246,7 +276,7 @@ public void futureRelationshipPropertyReferenceRead( long reference )

RecordCursor<DynamicRecord> labelCursor()
{
return newCursor( stores.getNodeStore().getDynamicLabelStore() );
return newCursor( nodeStore.getDynamicLabelStore() );
}

private static <R extends AbstractBaseRecord> RecordCursor<R> newCursor( RecordStore<R> store )
Expand All @@ -259,9 +289,14 @@ void node( NodeRecord record, long reference, PageCursor pageCursor )
nodeStore.getRecordByCursor( reference, record, RecordLoad.CHECK, pageCursor );
}

void relationship( RelationshipRecord record, long reference )
void relationship( RelationshipRecord record, long reference, PageCursor pageCursor )
{
relationshipStore.getRecordByCursor( reference, record, RecordLoad.CHECK, pageCursor );
}

void relationship( RelationshipRecord record, long reference)
{
stores.getRelationshipStore().getRecord( reference, record, RecordLoad.CHECK );
relationshipStore.getRecord( reference, record, RecordLoad.CHECK );
}

void property( PropertyRecord record, long reference )
Expand All @@ -276,12 +311,12 @@ void group( RelationshipGroupRecord record, long reference )

long nodeHighMark()
{
return stores.getNodeStore().getHighestPossibleIdInUse();
return nodeStore.getHighestPossibleIdInUse();
}

long relationshipHighMark()
{
return stores.getRelationshipStore().getHighestPossibleIdInUse();
return relationshipStore.getHighestPossibleIdInUse();
}

TextValue string( PropertyCursor cursor, long reference )
Expand Down
Expand Up @@ -26,29 +26,32 @@ class RelationshipScanCursor extends RelationshipCursor implements org.neo4j.int
private int label;
private long next;
private long highMark;
private PageCursor pageCursor;

RelationshipScanCursor( Read read )
{
super( read );
}

void scan( int label )
void scan( int label, PageCursor pageCursor )
{
if ( getId() != NO_ID )
{
close();
}
this.pageCursor = pageCursor;
next = 0;
this.label = label;
highMark = read.relationshipHighMark();
}

void single( long reference )
void single( long reference, PageCursor pageCursor )
{
if ( getId() != NO_ID )
{
close();
}
this.pageCursor = pageCursor;
next = reference;
label = -1;
highMark = NO_ID;
Expand All @@ -66,7 +69,7 @@ public boolean next()
}
do
{
read.relationship( this, next++ );
read.relationship( this, next++, pageCursor );
if ( next > highMark )
{
if ( highMark == NO_ID )
Expand Down Expand Up @@ -100,6 +103,11 @@ public boolean shouldRetry()
@Override
public void close()
{
if ( pageCursor != null )
{
pageCursor.close();
pageCursor = null;
}
setId( next = NO_ID );
}
}

0 comments on commit dca922c

Please sign in to comment.