Skip to content

Commit

Permalink
Tighter coupling between cursor and progressor
Browse files Browse the repository at this point in the history
Allow the type of the progressor of the cursor to be known at compile
time. This removes a megmorphic call site and gives big boost in
performance benchmarks.
  • Loading branch information
pontusmelke committed Jan 17, 2018
1 parent 0986449 commit 5f23bc7
Show file tree
Hide file tree
Showing 9 changed files with 30 additions and 29 deletions.
Expand Up @@ -33,7 +33,7 @@
* iterate over each set bit, returning actual node ids, i.e. {@code nodeIdRange+bitOffset}. * iterate over each set bit, returning actual node ids, i.e. {@code nodeIdRange+bitOffset}.
* *
*/ */
class LabelScanValueIndexProgressor extends LabelScanValueIndexAccessor implements IndexProgressor, Resource public class LabelScanValueIndexProgressor extends LabelScanValueIndexAccessor implements IndexProgressor, Resource
{ {


private final NodeLabelClient client; private final NodeLabelClient client;
Expand Down
Expand Up @@ -22,7 +22,7 @@
import org.neo4j.kernel.api.ExplicitIndexHits; import org.neo4j.kernel.api.ExplicitIndexHits;
import org.neo4j.storageengine.api.schema.IndexProgressor; import org.neo4j.storageengine.api.schema.IndexProgressor;


class ExplicitIndexProgressor implements IndexProgressor public class ExplicitIndexProgressor implements IndexProgressor
{ {
private final ExplicitClient client; private final ExplicitClient client;
private final ExplicitIndexHits hits; private final ExplicitIndexHits hits;
Expand Down
Expand Up @@ -21,11 +21,11 @@


import org.neo4j.storageengine.api.schema.IndexProgressor; import org.neo4j.storageengine.api.schema.IndexProgressor;


abstract class IndexCursor abstract class IndexCursor<T extends IndexProgressor>
{ {
private IndexProgressor progressor; protected T progressor;


final void initialize( IndexProgressor progressor ) final void initialize( T progressor )
{ {
if ( this.progressor != null ) if ( this.progressor != null )
{ {
Expand Down
Expand Up @@ -20,12 +20,11 @@
package org.neo4j.kernel.impl.newapi; package org.neo4j.kernel.impl.newapi;


import org.neo4j.internal.kernel.api.NodeCursor; import org.neo4j.internal.kernel.api.NodeCursor;
import org.neo4j.storageengine.api.schema.IndexProgressor;
import org.neo4j.storageengine.api.schema.IndexProgressor.ExplicitClient; import org.neo4j.storageengine.api.schema.IndexProgressor.ExplicitClient;


import static org.neo4j.kernel.impl.store.record.AbstractBaseRecord.NO_ID; import static org.neo4j.kernel.impl.store.record.AbstractBaseRecord.NO_ID;


class NodeExplicitIndexCursor extends IndexCursor class NodeExplicitIndexCursor extends IndexCursor<ExplicitIndexProgressor>
implements org.neo4j.internal.kernel.api.NodeExplicitIndexCursor, ExplicitClient implements org.neo4j.internal.kernel.api.NodeExplicitIndexCursor, ExplicitClient
{ {
private Read read; private Read read;
Expand All @@ -39,7 +38,7 @@ class NodeExplicitIndexCursor extends IndexCursor
} }


@Override @Override
public void initialize( IndexProgressor progressor, int expectedSize ) public void initialize( ExplicitIndexProgressor progressor, int expectedSize )
{ {
super.initialize( progressor ); super.initialize( progressor );
this.expectedSize = expectedSize; this.expectedSize = expectedSize;
Expand Down
Expand Up @@ -19,50 +19,51 @@
*/ */
package org.neo4j.kernel.impl.newapi; package org.neo4j.kernel.impl.newapi;


import java.util.HashSet;
import java.util.Set;

import org.neo4j.collection.primitive.PrimitiveLongCollections; import org.neo4j.collection.primitive.PrimitiveLongCollections;
import org.neo4j.collection.primitive.PrimitiveLongIterator; import org.neo4j.collection.primitive.PrimitiveLongIterator;
import org.neo4j.internal.kernel.api.LabelSet; import org.neo4j.internal.kernel.api.LabelSet;
import org.neo4j.internal.kernel.api.NodeCursor; import org.neo4j.internal.kernel.api.NodeCursor;
import org.neo4j.kernel.impl.index.labelscan.LabelScanValueIndexProgressor;
import org.neo4j.storageengine.api.schema.IndexProgressor; import org.neo4j.storageengine.api.schema.IndexProgressor;
import org.neo4j.storageengine.api.schema.IndexProgressor.NodeLabelClient; import org.neo4j.storageengine.api.schema.IndexProgressor.NodeLabelClient;
import org.neo4j.storageengine.api.txstate.ReadableDiffSets; import org.neo4j.storageengine.api.txstate.ReadableDiffSets;


import static org.neo4j.kernel.impl.store.record.AbstractBaseRecord.NO_ID; import static org.neo4j.kernel.impl.store.record.AbstractBaseRecord.NO_ID;


class NodeLabelIndexCursor extends IndexCursor class NodeLabelIndexCursor extends IndexCursor<LabelScanValueIndexProgressor>
implements org.neo4j.internal.kernel.api.NodeLabelIndexCursor, NodeLabelClient implements org.neo4j.internal.kernel.api.NodeLabelIndexCursor, NodeLabelClient
{ {
private Read read; private Read read;
private long node; private long node;
private LabelSet labels; private LabelSet labels;
private PrimitiveLongIterator added; private PrimitiveLongIterator added;
private ReadableDiffSets<Long> changes; private Set<Long> removed;


NodeLabelIndexCursor() NodeLabelIndexCursor()
{ {
node = NO_ID; node = NO_ID;
} }


@Override @Override
public void scan( IndexProgressor progressor, boolean providesLabels, int label ) public void scan( LabelScanValueIndexProgressor progressor, boolean providesLabels, int label )
{ {
super.initialize( progressor ); super.initialize( progressor );
if ( read.hasTxStateWithChanges() ) if ( read.hasTxStateWithChanges() )
{ {
changes = read.txState().nodesWithLabelChanged( label ); ReadableDiffSets<Long> changes =
read.txState().nodesWithLabelChanged( label );
added = changes.augment( PrimitiveLongCollections.emptyIterator() ); added = changes.augment( PrimitiveLongCollections.emptyIterator() );
removed = new HashSet<>( read.txState().addedAndRemovedNodes().getRemoved() );
removed.addAll( changes.getRemoved() );
} }
} }


@Override @Override
public void unionScan( IndexProgressor progressor, boolean providesLabels, int... labels ) public void unionScan( IndexProgressor progressor, boolean providesLabels, int... labels )
{ {
super.initialize( progressor );
if ( read.hasTxStateWithChanges() )
{
changes = read.txState().nodesWithAnyOfLabelsChanged( labels );
added = changes.augment( PrimitiveLongCollections.emptyIterator() );
}
//TODO: Currently we don't have a good way of handling this in the tx state //TODO: Currently we don't have a good way of handling this in the tx state
//The problem is this case: //The problem is this case:
//Given a node with label :A //Given a node with label :A
Expand All @@ -75,7 +76,6 @@ public void unionScan( IndexProgressor progressor, boolean providesLabels, int..
@Override @Override
public void intersectionScan( IndexProgressor progressor, boolean providesLabels, int... labels ) public void intersectionScan( IndexProgressor progressor, boolean providesLabels, int... labels )
{ {
super.initialize( progressor );
//TODO: Currently we don't have a good way of handling this in the tx state //TODO: Currently we don't have a good way of handling this in the tx state
//The problem is for the nodes where some - but not all of the labels - are //The problem is for the nodes where some - but not all of the labels - are
//added in the transaction. For these we need to go to disk and check if they //added in the transaction. For these we need to go to disk and check if they
Expand Down Expand Up @@ -109,7 +109,8 @@ public boolean next()
} }
else else
{ {
return innerNext(); LabelScanValueIndexProgressor p = progressor;
return p != null && p.next();
} }
} }


Expand Down Expand Up @@ -143,6 +144,7 @@ public void close()
node = NO_ID; node = NO_ID;
labels = null; labels = null;
read = null; read = null;
removed = null;
} }


@Override @Override
Expand All @@ -167,7 +169,6 @@ public String toString()


private boolean isRemoved( long reference ) private boolean isRemoved( long reference )
{ {
return (changes != null && changes.isRemoved( reference ) ) || return removed != null && removed.contains( reference );
(read.hasTxStateWithChanges() && read.txState().addedAndRemovedNodes().isRemoved( reference ));
} }
} }
Expand Up @@ -35,7 +35,7 @@
import static org.neo4j.kernel.impl.api.StateHandlingStatementOperations.assertOnlyExactPredicates; import static org.neo4j.kernel.impl.api.StateHandlingStatementOperations.assertOnlyExactPredicates;
import static org.neo4j.kernel.impl.store.record.AbstractBaseRecord.NO_ID; import static org.neo4j.kernel.impl.store.record.AbstractBaseRecord.NO_ID;


class NodeValueIndexCursor extends IndexCursor class NodeValueIndexCursor extends IndexCursor<IndexProgressor>
implements org.neo4j.internal.kernel.api.NodeValueIndexCursor, NodeValueClient implements org.neo4j.internal.kernel.api.NodeValueIndexCursor, NodeValueClient
{ {
private Read read; private Read read;
Expand Down
Expand Up @@ -21,12 +21,11 @@


import org.neo4j.internal.kernel.api.NodeCursor; import org.neo4j.internal.kernel.api.NodeCursor;
import org.neo4j.internal.kernel.api.RelationshipScanCursor; import org.neo4j.internal.kernel.api.RelationshipScanCursor;
import org.neo4j.storageengine.api.schema.IndexProgressor;
import org.neo4j.storageengine.api.schema.IndexProgressor.ExplicitClient; import org.neo4j.storageengine.api.schema.IndexProgressor.ExplicitClient;


import static org.neo4j.kernel.impl.store.record.AbstractBaseRecord.NO_ID; import static org.neo4j.kernel.impl.store.record.AbstractBaseRecord.NO_ID;


class RelationshipExplicitIndexCursor extends IndexCursor class RelationshipExplicitIndexCursor extends IndexCursor<ExplicitIndexProgressor>
implements org.neo4j.internal.kernel.api.RelationshipExplicitIndexCursor, ExplicitClient implements org.neo4j.internal.kernel.api.RelationshipExplicitIndexCursor, ExplicitClient
{ {
private Read read; private Read read;
Expand All @@ -35,7 +34,7 @@ class RelationshipExplicitIndexCursor extends IndexCursor
private float score; private float score;


@Override @Override
public void initialize( IndexProgressor progressor, int expectedSize ) public void initialize( ExplicitIndexProgressor progressor, int expectedSize )
{ {
super.initialize( progressor ); super.initialize( progressor );
this.expectedSize = expectedSize; this.expectedSize = expectedSize;
Expand Down
Expand Up @@ -22,6 +22,8 @@
import org.neo4j.internal.kernel.api.IndexQuery; import org.neo4j.internal.kernel.api.IndexQuery;
import org.neo4j.internal.kernel.api.LabelSet; import org.neo4j.internal.kernel.api.LabelSet;
import org.neo4j.kernel.api.schema.index.IndexDescriptor; import org.neo4j.kernel.api.schema.index.IndexDescriptor;
import org.neo4j.kernel.impl.index.labelscan.LabelScanValueIndexProgressor;
import org.neo4j.kernel.impl.newapi.ExplicitIndexProgressor;
import org.neo4j.values.storable.Value; import org.neo4j.values.storable.Value;


/** /**
Expand Down Expand Up @@ -100,7 +102,7 @@ interface NodeLabelClient
* @param providesLabels true if the progression can provide label information * @param providesLabels true if the progression can provide label information
* @param label the label to scan for * @param label the label to scan for
*/ */
void scan( IndexProgressor progressor, boolean providesLabels, int label ); void scan( LabelScanValueIndexProgressor progressor, boolean providesLabels, int label );


void unionScan( IndexProgressor progressor, boolean providesLabels, int... labels ); void unionScan( IndexProgressor progressor, boolean providesLabels, int... labels );


Expand All @@ -126,7 +128,7 @@ interface ExplicitClient
* @param progressor the progressor * @param progressor the progressor
* @param expectedSize expected number of entries this progressor will feed the client. * @param expectedSize expected number of entries this progressor will feed the client.
*/ */
void initialize( IndexProgressor progressor, int expectedSize ); void initialize( ExplicitIndexProgressor progressor, int expectedSize );


/** /**
* Accept the entity id and a score. Return true if the entry is accepted, false otherwise * Accept the entity id and a score. Return true if the entry is accepted, false otherwise
Expand Down
Expand Up @@ -46,7 +46,7 @@ public void shouldClosePreviousBeforeReinitialize()
assertFalse( "new still open", otherProgressor.isClosed ); assertFalse( "new still open", otherProgressor.isClosed );
} }


private static class StubIndexCursor extends IndexCursor private static class StubIndexCursor extends IndexCursor<StubProgressor>
{ {
} }


Expand Down

0 comments on commit 5f23bc7

Please sign in to comment.