From be466321c637f1f7ead44acb27b39ae5c61eb08a Mon Sep 17 00:00:00 2001 From: Pontus Melke Date: Tue, 21 Nov 2017 16:43:38 +0100 Subject: [PATCH] Added new utilities to tx state - means to keep track of changes for a property reference - minor utility method to find changed properties --- .../kernel/api/txstate/TransactionState.java | 4 +++ .../kernel/impl/api/state/NodeStateImpl.java | 13 +++++++- .../api/state/PropertyContainerStateImpl.java | 17 ++++++++-- .../impl/api/state/RelationshipStateImpl.java | 12 +++++++ .../neo4j/kernel/impl/api/state/TxState.java | 15 +++++++++ .../api/txstate/PropertyContainerState.java | 16 +++++++++ .../api/txstate/ReadableTransactionState.java | 2 ++ .../kernel/impl/api/state/TxStateTest.java | 33 +++++++++++++++++++ 8 files changed, 109 insertions(+), 3 deletions(-) diff --git a/community/kernel/src/main/java/org/neo4j/kernel/api/txstate/TransactionState.java b/community/kernel/src/main/java/org/neo4j/kernel/api/txstate/TransactionState.java index 8f54b10daf5ce..367665190359c 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/api/txstate/TransactionState.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/api/txstate/TransactionState.java @@ -23,6 +23,7 @@ import org.neo4j.kernel.api.schema.constaints.ConstraintDescriptor; import org.neo4j.kernel.api.schema.constaints.IndexBackedConstraintDescriptor; import org.neo4j.kernel.api.schema.index.IndexDescriptor; +import org.neo4j.storageengine.api.txstate.PropertyContainerState; import org.neo4j.storageengine.api.txstate.ReadableTransactionState; import org.neo4j.values.storable.Value; import org.neo4j.values.storable.ValueTuple; @@ -67,6 +68,8 @@ public interface TransactionState extends ReadableTransactionState void nodeDoRemoveLabel( int labelId, long nodeId ); + void registerProperties( long ref, PropertyContainerState state ); + // TOKEN RELATED void labelDoCreateForName( String labelName, int id ); @@ -92,4 +95,5 @@ public interface TransactionState extends ReadableTransactionState boolean constraintDoUnRemove( ConstraintDescriptor constraint ); void indexDoUpdateEntry( LabelSchemaDescriptor descriptor, long nodeId, ValueTuple before, ValueTuple after ); + } diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/state/NodeStateImpl.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/state/NodeStateImpl.java index 51d27315d420c..183cb6c546b10 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/state/NodeStateImpl.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/state/NodeStateImpl.java @@ -28,7 +28,6 @@ import org.neo4j.collection.primitive.PrimitiveIntSet; import org.neo4j.collection.primitive.PrimitiveLongCollections; import org.neo4j.collection.primitive.PrimitiveLongIterator; -import org.neo4j.helpers.collection.Iterators; import org.neo4j.kernel.api.exceptions.schema.ConstraintValidationException; import org.neo4j.kernel.impl.api.state.RelationshipChangesForNode.DiffStrategy; import org.neo4j.kernel.impl.util.diffsets.DiffSets; @@ -324,6 +323,12 @@ public boolean hasChanges() return false; } + @Override + public boolean hasPropertyChanges() + { + return false; + } + @Override public StorageProperty getChangedProperty( int propertyKeyId ) { @@ -336,6 +341,12 @@ public StorageProperty getAddedProperty( int propertyKeyId ) return null; } + @Override + public boolean isPropertyChangedOrRemoved( int propertyKey ) + { + return false; + } + @Override public boolean isPropertyRemoved( int propertyKeyId ) { diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/state/PropertyContainerStateImpl.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/state/PropertyContainerStateImpl.java index 0e044e9e06216..7b0ca1a6810ac 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/state/PropertyContainerStateImpl.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/state/PropertyContainerStateImpl.java @@ -78,7 +78,7 @@ public void clear() } } - public void changeProperty( int propertyKeyId, Value value ) + void changeProperty( int propertyKeyId, Value value ) { if ( addedProperties != null ) { @@ -101,7 +101,7 @@ public void changeProperty( int propertyKeyId, Value value ) } } - public void addProperty( int propertyKeyId, Value value ) + void addProperty( int propertyKeyId, Value value ) { if ( removedProperties != null ) { @@ -204,6 +204,12 @@ public void accept( Visitor visitor ) throws ConstraintValidationException @Override public boolean hasChanges() + { + return hasPropertyChanges(); + } + + @Override + public boolean hasPropertyChanges() { return addedProperties != null || removedProperties != null || changedProperties != null; } @@ -220,6 +226,13 @@ public StorageProperty getAddedProperty( int propertyKeyId ) return addedProperties == null ? null : getPropertyOrNull( addedProperties, propertyKeyId ); } + @Override + public boolean isPropertyChangedOrRemoved( int propertyKey ) + { + return (removedProperties != null && removedProperties.containsKey( propertyKey )) + || (changedProperties != null && changedProperties.containsKey( propertyKey )); + } + @Override public boolean isPropertyRemoved( int propertyKeyId ) { diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/state/RelationshipStateImpl.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/state/RelationshipStateImpl.java index 4a2c5c245cceb..fd56c36a18190 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/state/RelationshipStateImpl.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/state/RelationshipStateImpl.java @@ -131,6 +131,12 @@ public boolean hasChanges() return false; } + @Override + public boolean hasPropertyChanges() + { + return false; + } + @Override public StorageProperty getChangedProperty( int propertyKeyId ) { @@ -143,6 +149,12 @@ public StorageProperty getAddedProperty( int propertyKeyId ) return null; } + @Override + public boolean isPropertyChangedOrRemoved( int propertyKey ) + { + return false; + } + @Override public boolean isPropertyRemoved( int propertyKeyId ) { diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/state/TxState.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/state/TxState.java index 958b6a23e72bf..b9cb07c9913b2 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/state/TxState.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/state/TxState.java @@ -32,6 +32,7 @@ import org.neo4j.collection.primitive.PrimitiveIntObjectVisitor; import org.neo4j.collection.primitive.PrimitiveIntSet; import org.neo4j.collection.primitive.PrimitiveLongIterator; +import org.neo4j.collection.primitive.PrimitiveLongObjectMap; import org.neo4j.collection.primitive.PrimitiveLongSet; import org.neo4j.cursor.Cursor; import org.neo4j.helpers.collection.Iterables; @@ -151,6 +152,8 @@ void setMap( TxState state, Map map ) // Tracks added and removed relationships, not modified relationships private RelationshipDiffSets relationships; + private PrimitiveLongObjectMap propertiesMap = Primitive.longObjectMap(); + /** * These two sets are needed because create-delete in same transaction is a no-op in {@link DiffSets} * but we still need to provide correct answer in {@link #nodeIsDeletedInThisTx(long)} and @@ -661,6 +664,12 @@ public void nodeDoRemoveLabel( int labelId, long nodeId ) dataChanged(); } + @Override + public void registerProperties( long ref, PropertyContainerState state ) + { + propertiesMap.put( ref, state ); + } + @Override public void labelDoCreateForName( String labelName, int id ) { @@ -706,6 +715,12 @@ public RelationshipState getRelationshipState( long id ) return RELATIONSHIP_STATE.get( this, id ); } + @Override + public PropertyContainerState getPropertiesState( long reference ) + { + return propertiesMap.get( reference ); + } + @Override public Cursor augmentSingleNodeCursor( Cursor cursor, long nodeId ) { diff --git a/community/kernel/src/main/java/org/neo4j/storageengine/api/txstate/PropertyContainerState.java b/community/kernel/src/main/java/org/neo4j/storageengine/api/txstate/PropertyContainerState.java index 5c1358e7e70be..b8a08eb8b0b21 100644 --- a/community/kernel/src/main/java/org/neo4j/storageengine/api/txstate/PropertyContainerState.java +++ b/community/kernel/src/main/java/org/neo4j/storageengine/api/txstate/PropertyContainerState.java @@ -57,10 +57,14 @@ void visitPropertyChanges( long entityId, Iterator added, boolean hasChanges(); + boolean hasPropertyChanges(); + StorageProperty getChangedProperty( int propertyKeyId ); StorageProperty getAddedProperty( int propertyKeyId ); + boolean isPropertyChangedOrRemoved( int propertyKey ); + boolean isPropertyRemoved( int propertyKeyId ); PropertyContainerState EMPTY = new EmptyPropertyContainerState(); @@ -108,6 +112,12 @@ public boolean hasChanges() return false; } + @Override + public boolean hasPropertyChanges() + { + return false; + } + @Override public StorageProperty getChangedProperty( int propertyKeyId ) { @@ -120,6 +130,12 @@ public StorageProperty getAddedProperty( int propertyKeyId ) return null; } + @Override + public boolean isPropertyChangedOrRemoved( int propertyKey ) + { + return false; + } + @Override public boolean isPropertyRemoved( int propertyKeyId ) { diff --git a/community/kernel/src/main/java/org/neo4j/storageengine/api/txstate/ReadableTransactionState.java b/community/kernel/src/main/java/org/neo4j/storageengine/api/txstate/ReadableTransactionState.java index 587281672eb19..0a5e60a1b5f48 100644 --- a/community/kernel/src/main/java/org/neo4j/storageengine/api/txstate/ReadableTransactionState.java +++ b/community/kernel/src/main/java/org/neo4j/storageengine/api/txstate/ReadableTransactionState.java @@ -142,6 +142,8 @@ ReadableDiffSets indexUpdatesForRangeSeekByString( IndexDescriptor index, RelationshipState getRelationshipState( long id ); + PropertyContainerState getPropertiesState( long reference ); + Cursor augmentSingleNodeCursor( Cursor cursor, long nodeId ); Cursor augmentPropertyCursor( Cursor cursor, diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/state/TxStateTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/state/TxStateTest.java index 03b0bd5cd2f20..65ea63d6f72b3 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/state/TxStateTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/state/TxStateTest.java @@ -46,7 +46,10 @@ import org.neo4j.kernel.api.txstate.TransactionState; import org.neo4j.storageengine.api.Direction; import org.neo4j.storageengine.api.RelationshipItem; +import org.neo4j.storageengine.api.txstate.NodeState; +import org.neo4j.storageengine.api.txstate.PropertyContainerState; import org.neo4j.storageengine.api.txstate.ReadableDiffSets; +import org.neo4j.storageengine.api.txstate.RelationshipState; import org.neo4j.storageengine.api.txstate.TxStateVisitor; import org.neo4j.test.rule.RandomRule; import org.neo4j.test.rule.RepeatRule; @@ -1470,6 +1473,36 @@ public void shouldObserveCorrectAugmentedNodeRelationshipsState() throws Excepti } } + @Test + public void shouldGetNodeStateFromPropertyReference() throws Exception + { + // GIVEN + state.nodeDoCreate( 1337L ); + NodeState nodeState = state.getNodeState( 1337L ); + state.registerProperties( 42L, nodeState ); + + // WHEN + PropertyContainerState propertiesState = state.getPropertiesState( 42L ); + + // Then + assertThat( propertiesState, equalTo( nodeState ) ); + } + + @Test + public void shouldGetRelationshipStateFromPropertyReference() throws Exception + { + // GIVEN + state.relationshipDoCreate( 1337L, 0, 1L, 2L ); + RelationshipState relState = state.getRelationshipState( 1337L ); + state.registerProperties( 42L, relState ); + + // WHEN + PropertyContainerState propertiesState = state.getPropertiesState( 42L ); + + // Then + assertThat( propertiesState, equalTo( relState ) ); + } + private Map relationshipsForNode( long nodeId, Map allRelationships, Direction direction, int[] relationshipTypes ) {