private void visitDegrees( StorageNodeCursor node, DegreeVisitor visitor ) { groupCursor.init( node.entityReference(), node.relationshipGroupReference() ); while ( groupCursor.next() ) { int loopCount = groupCursor.loopCount(); visitor.visitDegree( groupCursor.type(), groupCursor.outgoingCount() + loopCount, groupCursor.incomingCount() + loopCount ); } }
private StorageRelationshipTraversalCursor allocateRelationshipTraversalCursor( StorageNodeCursor node ) { StorageRelationshipTraversalCursor relationships = storageReader.allocateRelationshipTraversalCursor(); relationships.init( node.entityReference(), node.allRelationshipsReference() ); return relationships; }
private void decrementCountForLabelsAndRelationships( StorageNodeCursor node ) { final long[] labelIds = node.labels(); for ( long labelId : labelIds ) { counts.incrementNodeCount( labelId, -1 ); } visitDegrees( node, ( type, out, in ) -> updateRelationshipsCountsFromDegrees( labelIds, type, -out, -in ) ); }
private Value committedValue( NodeState nodeState, int property, StorageNodeCursor node, StoragePropertyCursor properties ) { if ( state.nodeIsAddedInThisTx( nodeState.getId() ) ) { return Values.NO_VALUE; } node.single( nodeState.getId() ); if ( !node.next() ) { return Values.NO_VALUE; } return committedValue( properties, node.propertiesReference(), property ); }
@Override public boolean next() { // Check tx state boolean hasChanges = hasChanges(); if ( hasChanges && addedNodes.hasNext() ) { storeCursor.setCurrent( addedNodes.next() ); return true; } while ( storeCursor.next() ) { if ( !hasChanges || !read.txState().nodeIsDeletedInThisTx( storeCursor.entityReference() ) ) { return true; } } return false; }
state.addedAndRemovedNodes().getRemoved().each( nodeId -> node.single( nodeId ); if ( node.next() ) properties.init( node.propertiesReference() ); while ( properties.next() ) for ( long labelId : node.labels() )
@Override public LabelSet labels() { if ( hasChanges() ) { TransactionState txState = read.txState(); if ( txState.nodeIsAddedInThisTx( storeCursor.entityReference() ) ) { //Node just added, no reason to go down to store and check return Labels.from( txState.nodeStateLabelDiffSets( storeCursor.entityReference() ).getAdded() ); } else { //Get labels from store and put in intSet, unfortunately we get longs back long[] longs = storeCursor.labels(); final MutableLongSet labels = new LongHashSet(); for ( long labelToken : longs ) { labels.add( labelToken ); } //Augment what was found in store with what we have in tx state return Labels.from( txState.augmentLabels( labels, txState.getNodeState( storeCursor.entityReference() ) ) ); } } else { //Nothing in tx state, just read the data. return Labels.from( storeCursor.labels() ); } }
@Override public boolean hasLabel( int label ) { if ( hasChanges() ) { TransactionState txState = read.txState(); LongDiffSets diffSets = txState.nodeStateLabelDiffSets( storeCursor.entityReference() ); if ( diffSets.getAdded().contains( label ) ) { return true; } if ( diffSets.getRemoved().contains( label ) ) { return false; } } //Get labels from store and put in intSet, unfortunately we get longs back return storeCursor.hasLabel( label ); }
@Override public long nodeReference() { return storeCursor.entityReference(); }
private boolean nodeExists( long nodeId ) { try ( StorageNodeCursor node = allocateNodeCursor( nodeId ) ) { return node.next(); } }
void single( long reference, Read read ) { storeCursor.single( reference ); this.read = read; this.single = reference; this.hasChanges = HasChanges.MAYBE; this.addedNodes = ImmutableEmptyLongIterator.INSTANCE; }
@Override public long allRelationshipsReference() { return storeCursor.allRelationshipsReference(); }
@Override public long relationshipGroupReference() { return storeCursor.relationshipGroupReference(); }
@Override public long propertiesReference() { return storeCursor.propertiesReference(); }
void release() { storeCursor.close(); } }
private StorageProperty nodeAddProperty( long nodeId, int key, Object value ) { StorageProperty property = new PropertyKeyValue( key, Values.of( value ) ); StorageProperty oldProperty = null; try ( StorageNodeCursor nodeCursor = storageReader.allocateNodeCursor() ) { nodeCursor.single( nodeId ); if ( nodeCursor.next() ) { StorageProperty fetched = getProperty( key, nodeCursor.propertiesReference() ); if ( fetched != null ) { oldProperty = fetched; } } } if ( oldProperty == null ) { transaction.nodeDoAddProperty( nodeId, key, property.value() ); } else { transaction.nodeDoChangeProperty( nodeId, key, property.value() ); } return property; }
state.addedAndRemovedNodes().getRemoved().each( nodeId -> node.single( nodeId ); if ( node.next() ) properties.init( node.propertiesReference() ); while ( properties.next() ) for ( long labelId : node.labels() )