Skip to content

Commit

Permalink
Use a set instead of re-checking tx state
Browse files Browse the repository at this point in the history
  • Loading branch information
pontusmelke authored and fickludd committed Jan 24, 2018
1 parent 431a096 commit cadf7a1
Showing 1 changed file with 37 additions and 15 deletions.
Expand Up @@ -21,29 +21,34 @@

import java.util.Arrays;

import org.neo4j.collection.primitive.PrimitiveLongCollections;
import org.neo4j.collection.primitive.PrimitiveLongIterator;
import org.neo4j.collection.primitive.PrimitiveLongSet;
import org.neo4j.internal.kernel.api.IndexQuery;
import org.neo4j.internal.kernel.api.NodeCursor;
import org.neo4j.kernel.api.schema.index.IndexDescriptor;
import org.neo4j.kernel.api.txstate.TransactionState;
import org.neo4j.storageengine.api.schema.IndexProgressor;
import org.neo4j.storageengine.api.schema.IndexProgressor.NodeValueClient;
import org.neo4j.storageengine.api.txstate.PrimitiveLongReadableDiffSets;
import org.neo4j.values.storable.Value;

import static java.util.Arrays.stream;
import static org.neo4j.collection.primitive.PrimitiveLongCollections.asSet;
import static org.neo4j.collection.primitive.PrimitiveLongCollections.emptyIterator;
import static org.neo4j.collection.primitive.PrimitiveLongCollections.emptySet;
import static org.neo4j.kernel.impl.api.StateHandlingStatementOperations.assertOnlyExactPredicates;
import static org.neo4j.kernel.impl.store.record.AbstractBaseRecord.NO_ID;

class NodeValueIndexCursor extends IndexCursor<IndexProgressor>
final class NodeValueIndexCursor extends IndexCursor<IndexProgressor>
implements org.neo4j.internal.kernel.api.NodeValueIndexCursor, NodeValueClient
{
private Read read;
private long node;
private IndexQuery[] query;
private Value[] values;
private PrimitiveLongIterator added;
private PrimitiveLongReadableDiffSets changes;
private PrimitiveLongIterator added = emptyIterator();
private PrimitiveLongSet removed = emptySet();

NodeValueIndexCursor()
{
Expand Down Expand Up @@ -91,12 +96,11 @@ public void initialize( IndexDescriptor descriptor, IndexProgressor progressor,

private boolean isRemoved( long reference )
{
return (changes != null && changes.isRemoved( reference )) ||
(read.hasTxStateWithChanges() && read.txState().addedAndRemovedNodes().isRemoved( reference ));
return removed.contains( reference );
}

@Override
public boolean acceptNode( long reference, Value[] values )
public final boolean acceptNode( long reference, Value[] values )
{
if ( isRemoved( reference ) )
{
Expand All @@ -111,9 +115,9 @@ public boolean acceptNode( long reference, Value[] values )
}

@Override
public boolean next()
public final boolean next()
{
if ( added != null && added.hasNext() )
if ( added.hasNext() )
{
this.node = added.next();
this.values = null;
Expand Down Expand Up @@ -174,8 +178,8 @@ public void close()
this.query = null;
this.values = null;
this.read = null;
this.added = null;
this.changes = null;
this.added = emptyIterator();
this.removed = PrimitiveLongCollections.emptySet();
}

@Override
Expand Down Expand Up @@ -204,39 +208,48 @@ private void prefixQuery( IndexDescriptor descriptor, IndexQuery.StringPrefixPre
{
if ( read.hasTxStateWithChanges() )
{
changes = read.txState().indexUpdatesForRangeSeekByPrefix( descriptor, predicate.prefix() );
TransactionState txState = read.txState();
PrimitiveLongReadableDiffSets changes = txState
.indexUpdatesForRangeSeekByPrefix( descriptor, predicate.prefix() );
added = changes.augment( emptyIterator() );
removed = removed( txState, changes );
}
}

private void stringRangeQuery( IndexDescriptor descriptor, IndexQuery.StringRangePredicate predicate )
{
if ( read.hasTxStateWithChanges() )
{
changes = read.txState().indexUpdatesForRangeSeekByString(
TransactionState txState = read.txState();
PrimitiveLongReadableDiffSets changes = read.txState().indexUpdatesForRangeSeekByString(
descriptor, predicate.from(), predicate.fromInclusive(), predicate.to(),
predicate.toInclusive() );
added = changes.augment( emptyIterator() );
removed = removed( txState, changes );
}
}

private void numericRangeQuery( IndexDescriptor descriptor, IndexQuery.NumberRangePredicate predicate )
{
if ( read.hasTxStateWithChanges() )
{
changes = read.txState().indexUpdatesForRangeSeekByNumber(
TransactionState txState = read.txState();
PrimitiveLongReadableDiffSets changes = read.txState().indexUpdatesForRangeSeekByNumber(
descriptor, predicate.from(), predicate.fromInclusive(), predicate.to(),
predicate.toInclusive() );
added = changes.augment( emptyIterator() );
removed = removed( txState, changes );
}
}

private void scanQuery( IndexDescriptor descriptor )
{
if ( read.hasTxStateWithChanges() )
{
changes = read.txState().indexUpdatesForScan( descriptor );
TransactionState txState = read.txState();
PrimitiveLongReadableDiffSets changes = read.txState().indexUpdatesForScan( descriptor );
added = changes.augment( emptyIterator() );
removed = removed( txState, changes );
}
}

Expand All @@ -245,9 +258,18 @@ private void seekQuery( IndexDescriptor descriptor, IndexQuery[] query )
IndexQuery.ExactPredicate[] exactPreds = assertOnlyExactPredicates( query );
if ( read.hasTxStateWithChanges() )
{
changes = read.txState()
TransactionState txState = read.txState();
PrimitiveLongReadableDiffSets changes = read.txState()
.indexUpdatesForSeek( descriptor, IndexQuery.asValueTuple( exactPreds ) );
added = changes.augment( emptyIterator() );
removed = removed( txState, changes );
}
}

private PrimitiveLongSet removed( TransactionState txState, PrimitiveLongReadableDiffSets changes )
{
PrimitiveLongSet longSet = asSet( txState.addedAndRemovedNodes().getRemoved() );
longSet.addAll( changes.getRemoved().iterator() );
return longSet;
}
}

0 comments on commit cadf7a1

Please sign in to comment.