Skip to content

Commit

Permalink
NodeProgression should handle the TransactionState
Browse files Browse the repository at this point in the history
  • Loading branch information
davidegrohmann committed May 8, 2017
1 parent 370e810 commit b1da1b7
Show file tree
Hide file tree
Showing 23 changed files with 317 additions and 264 deletions.
Expand Up @@ -118,6 +118,18 @@ public void clear()
}
}

@Override
public PrimitiveIntSet augmentLabels( PrimitiveIntSet labels )
{
ReadableDiffSets<Integer> labelDiffSets = labelDiffSets();
if ( !labelDiffSets.isEmpty() )
{
labelDiffSets.getRemoved().forEach( labels::remove );
labelDiffSets.getAdded().forEach( labels::add );
}
return labels;
}

@Override
public int augmentDegree( Direction direction, int degree )
{
Expand Down Expand Up @@ -242,116 +254,7 @@ final NodeStateImpl createValue( Long id, TxState state )
@Override
final NodeState defaultValue()
{
return DEFAULT;
return NodeState.EMPTY;
}

private static final NodeState DEFAULT = new NodeState()
{
@Override
public Iterator<StorageProperty> addedProperties()
{
return Iterators.emptyIterator();
}

@Override
public Iterator<StorageProperty> changedProperties()
{
return Iterators.emptyIterator();
}

@Override
public Iterator<Integer> removedProperties()
{
return Iterators.emptyIterator();
}

@Override
public Iterator<StorageProperty> addedAndChangedProperties()
{
return Iterators.emptyIterator();
}

@Override
public Iterator<StorageProperty> augmentProperties( Iterator<StorageProperty> iterator )
{
return iterator;
}

@Override
public void accept( PropertyContainerState.Visitor visitor ) throws ConstraintValidationException
{
}

@Override
public ReadableDiffSets<Integer> labelDiffSets()
{
return ReadableDiffSets.Empty.instance();
}

@Override
public int augmentDegree( Direction direction, int degree )
{
return degree;
}

@Override
public int augmentDegree( Direction direction, int degree, int typeId )
{
return degree;
}

@Override
public void accept( NodeState.Visitor visitor )
{
}

@Override
public PrimitiveIntSet relationshipTypes()
{
return Primitive.intSet();
}

@Override
public long getId()
{
throw new UnsupportedOperationException( "id not defined" );
}

@Override
public boolean hasChanges()
{
return false;
}

@Override
public StorageProperty getChangedProperty( int propertyKeyId )
{
return null;
}

@Override
public StorageProperty getAddedProperty( int propertyKeyId )
{
return null;
}

@Override
public boolean isPropertyRemoved( int propertyKeyId )
{
return false;
}

@Override
public PrimitiveLongIterator getAddedRelationships( Direction direction )
{
return null;
}

@Override
public PrimitiveLongIterator getAddedRelationships( Direction direction, int[] relTypes )
{
return null;
}
};
}
}
Expand Up @@ -642,18 +642,6 @@ public RelationshipState getRelationshipState( long id )
return RELATIONSHIP_STATE.get( this, id );
}

@Override
public PrimitiveIntSet augmentLabels( PrimitiveIntSet labels, NodeState nodeState )
{
ReadableDiffSets<Integer> labelDiffSets = nodeState.labelDiffSets();
if ( !labelDiffSets.isEmpty() )
{
labelDiffSets.getRemoved().forEach( labels::remove );
labelDiffSets.getAdded().forEach( labels::add );
}
return labels;
}

@Override
public ReadableDiffSets<Long> nodesWithLabelChanged( int labelId )
{
Expand Down
Expand Up @@ -19,17 +19,24 @@
*/
package org.neo4j.kernel.impl.api.store;

import java.util.Iterator;

import org.neo4j.kernel.impl.store.NodeStore;
import org.neo4j.storageengine.api.txstate.NodeState;
import org.neo4j.storageengine.api.txstate.ReadableTransactionState;

public class AllNodeProgression implements NodeProgression
{
private final NodeStore nodeStore;
private final ReadableTransactionState state;

private long start;
private boolean done;

AllNodeProgression( NodeStore nodeStore )
AllNodeProgression( NodeStore nodeStore, ReadableTransactionState state )
{
this.nodeStore = nodeStore;
this.state = state;
this.start = nodeStore.getNumberOfReservedLowIds();
}

Expand Down Expand Up @@ -57,8 +64,26 @@ public boolean nextBatch( Batch batch )
}

@Override
public TransactionStateAccessMode mode()
public Iterator<Long> addedNodes()
{
return state == null ? null : state.addedAndRemovedNodes().getAdded().iterator();
}

@Override
public boolean fetchFromTxState( long id )
{
return false;
}

@Override
public boolean fetchFromDisk( long id )
{
return state == null || !state.nodeIsDeletedInThisTx( id );
}

@Override
public NodeState nodeState( long id )
{
return TransactionStateAccessMode.APPEND;
return state == null ? NodeState.EMPTY : state.getNodeState( id );
}
}
Expand Up @@ -35,11 +35,8 @@
import org.neo4j.kernel.impl.util.IoPrimitiveUtils;
import org.neo4j.storageengine.api.NodeItem;
import org.neo4j.storageengine.api.txstate.NodeState;
import org.neo4j.storageengine.api.txstate.ReadableTransactionState;

import static org.neo4j.collection.primitive.PrimitiveIntCollections.asSet;
import static org.neo4j.kernel.impl.api.store.TransactionStateAccessMode.APPEND;
import static org.neo4j.kernel.impl.api.store.TransactionStateAccessMode.FETCH;
import static org.neo4j.kernel.impl.locking.LockService.NO_LOCK;
import static org.neo4j.kernel.impl.locking.LockService.NO_LOCK_SERVICE;
import static org.neo4j.kernel.impl.store.record.RecordLoad.CHECK;
Expand All @@ -55,7 +52,6 @@ public class NodeCursor implements NodeItem, Cursor<NodeItem>, Disposable
private final PageCursor pageCursor;

private NodeProgression progression;
private ReadableTransactionState state;
private boolean fetched;
private long[] labels;
private Iterator<Long> added;
Expand All @@ -69,13 +65,10 @@ public class NodeCursor implements NodeItem, Cursor<NodeItem>, Disposable
this.lockService = lockService;
}

public Cursor<NodeItem> init( NodeProgression progression, ReadableTransactionState state )
public Cursor<NodeItem> init( NodeProgression progression )
{
this.progression = progression;
this.state = state;
this.added = state != null && progression.mode() == APPEND
? state.addedAndRemovedNodes().getAdded().iterator()
: null;
this.added = progression.addedNodes();
return this;
}

Expand All @@ -91,20 +84,18 @@ private boolean fetchNext()
while ( progression != null && (batch.hasNext() || progression.nextBatch( batch ) ) )
{
long id = batch.next();
if ( state != null && progression.mode() == FETCH && state.nodeIsAddedInThisTx( id ) )
if ( progression.fetchFromTxState( id ) )
{
recordFromTxState( id );
return true;
}

if ( (state == null || !state.nodeIsDeletedInThisTx( id )) &&
nodeStore.readRecord( id, nodeRecord, CHECK, pageCursor ).inUse() )
if ( progression.fetchFromDisk( id ) && nodeStore.readRecord( id, nodeRecord, CHECK, pageCursor ).inUse() )
{
return true;
}
}

progression = null; // we are done with the progression here, let's skip the checks on next iterations
if ( added != null && added.hasNext() )
{
recordFromTxState( added.next() );
Expand All @@ -126,7 +117,6 @@ public void close()
fetched = false;
labels = null;
added = null;
state = null;
progression = null;
batch.nothing();
instanceCache.accept( this );
Expand All @@ -153,19 +143,19 @@ public NodeItem get()
public PrimitiveIntSet labels()
{
PrimitiveIntSet labels = asSet( loadedLabels(), IoPrimitiveUtils::safeCastLongToInt );
return state != null ? state.augmentLabels( labels, state.getNodeState( id() ) ) : labels;
return progression.nodeState( id() ).augmentLabels( labels );
}

@Override
public boolean hasLabel( int labelId )
{
NodeState nodeState = state == null ? null : state.getNodeState( id() );
if ( state != null && nodeState.labelDiffSets().getRemoved().contains( labelId ) )
NodeState nodeState = progression.nodeState( id() );
if ( nodeState.labelDiffSets().getRemoved().contains( labelId ) )
{
return false;
}

if ( state != null && nodeState.labelDiffSets().getAdded().contains( labelId ) )
if ( nodeState.labelDiffSets().getAdded().contains( labelId ) )
{
return true;
}
Expand Down Expand Up @@ -223,7 +213,7 @@ public long nextPropertyId()
@Override
public Lock lock()
{
return state != null && state.nodeIsAddedInThisTx( id() ) ? NO_LOCK : acquireLock();
return progression.fetchFromTxState( id() ) ? NO_LOCK : acquireLock();
}

private Lock acquireLock()
Expand Down
Expand Up @@ -19,13 +19,22 @@
*/
package org.neo4j.kernel.impl.api.store;

import java.util.Iterator;

import org.neo4j.collection.primitive.PrimitiveLongIterator;
import org.neo4j.storageengine.api.txstate.NodeState;

public interface NodeProgression
{
boolean nextBatch( Batch batch );

TransactionStateAccessMode mode();
Iterator<Long> addedNodes();

boolean fetchFromTxState( long id );

boolean fetchFromDisk( long id );

NodeState nodeState( long id );

class Batch implements PrimitiveLongIterator
{
Expand Down
Expand Up @@ -19,14 +19,21 @@
*/
package org.neo4j.kernel.impl.api.store;

import java.util.Iterator;

import org.neo4j.storageengine.api.txstate.NodeState;
import org.neo4j.storageengine.api.txstate.ReadableTransactionState;

import static org.neo4j.kernel.api.StatementConstants.NO_SUCH_NODE;

public class SingleNodeProgression implements NodeProgression
{
private final ReadableTransactionState state;
private long nodeId;

SingleNodeProgression( long nodeId )
public SingleNodeProgression( long nodeId, ReadableTransactionState state )
{
this.state = state;
this.nodeId = nodeId;
}

Expand All @@ -47,8 +54,26 @@ public boolean nextBatch( Batch batch )
}

@Override
public TransactionStateAccessMode mode()
public Iterator<Long> addedNodes()
{
return null;
}

@Override
public boolean fetchFromTxState( long id )
{
return state != null && state.nodeIsAddedInThisTx( id );
}

@Override
public boolean fetchFromDisk( long id )
{
return state == null || !state.nodeIsDeletedInThisTx( id );
}

@Override
public NodeState nodeState( long id )
{
return TransactionStateAccessMode.FETCH;
return state == null ? NodeState.EMPTY : state.getNodeState( id );
}
}

0 comments on commit b1da1b7

Please sign in to comment.