@Override public void visitGraphPropertyChanges( Iterator<StorageProperty> added, Iterator<StorageProperty> changed, IntIterable removed ) { removed.each( recordState::graphRemoveProperty ); while ( changed.hasNext() ) { StorageProperty prop = changed.next(); recordState.graphChangeProperty( prop.propertyKeyId(), prop.value() ); } while ( added.hasNext() ) { StorageProperty prop = added.next(); recordState.graphAddProperty( prop.propertyKeyId(), prop.value() ); } }
@Override public Value propertyValue() { if ( txStateValue != null ) { return txStateValue.value(); } Value value = storeCursor.propertyValue(); assertOpen.assertOpen(); return value; }
@Override public int next() { return properties.next().propertyKeyId(); } }
@Override public ValueGroup propertyType() { if ( txStateValue != null ) { return txStateValue.value().valueGroup(); } return storeCursor.propertyType(); }
@Override public int propertyKey() { if ( txStateValue != null ) { return txStateValue.propertyKeyId(); } return storeCursor.propertyKey(); }
@Override public void visitNodePropertyChanges( long id, Iterator<StorageProperty> added, Iterator<StorageProperty> changed, IntIterable removed ) { removed.each( propId -> recordState.nodeRemoveProperty( id, propId ) ); while ( changed.hasNext() ) { StorageProperty prop = changed.next(); recordState.nodeChangeProperty( id, prop.propertyKeyId(), prop.value() ); } while ( added.hasNext() ) { StorageProperty prop = added.next(); recordState.nodeAddProperty( id, prop.propertyKeyId(), prop.value() ); } }
@Test public void shouldGenerateUpdatesForLabelRemovalWithExistingProperties() { // When EntityUpdates updates = EntityUpdates.forEntity( nodeId ).withTokens( label ).withTokensAfter( empty ).build(); // Then assertThat( updates.forIndexKeys( indexes, propertyLoader( property1, property2, property3 ), EntityType.NODE ), containsInAnyOrder( IndexEntryUpdate.remove( nodeId, index1, property1.value() ), IndexEntryUpdate.remove( nodeId, index2, property2.value() ), IndexEntryUpdate.remove( nodeId, index3, property3.value() ), IndexEntryUpdate.remove( nodeId, index123, values123 ) ) ); }
private PropertyReceiver<StorageProperty> newPropertyReceiver( Map<Integer,Pair<StorageProperty,Long>> props ) { return ( property, propertyRecordId ) -> props.put( property.propertyKeyId(), Pair.of( property, propertyRecordId ) ); }
@Override public void visitRelPropertyChanges( long id, Iterator<StorageProperty> added, Iterator<StorageProperty> changed, IntIterable removed ) { removed.each( relId -> recordState.relRemoveProperty( id, relId ) ); while ( changed.hasNext() ) { StorageProperty prop = changed.next(); recordState.relChangeProperty( id, prop.propertyKeyId(), prop.value() ); } while ( added.hasNext() ) { StorageProperty prop = added.next(); recordState.relAddProperty( id, prop.propertyKeyId(), prop.value() ); } }
@Test public void shouldGenerateUpdateForLabelAdditionWithExistingProperty() { // When EntityUpdates updates = EntityUpdates.forEntity( nodeId ).withTokens( empty ).withTokensAfter( label ).build(); // Then assertThat( updates.forIndexKeys( indexes, propertyLoader( property1 ), EntityType.NODE ), containsInAnyOrder( IndexEntryUpdate.add( nodeId, index1, property1.value() ) ) ); }
@Test public void testProps1() throws Exception { initializeStores( databaseLayout, stringMap() ); startTx(); long nodeId = nextId( Node.class ); transaction.nodeDoCreate( nodeId ); pStore.nextId(); StorageProperty prop = nodeAddProperty( nodeId, index( "nisse" ), 10 ); commitTx(); ds.stop(); initializeStores( databaseLayout, stringMap() ); startTx(); StorageProperty prop2 = nodeAddProperty( nodeId, prop.propertyKeyId(), 5 ); transaction.nodeDoRemoveProperty( nodeId, prop2.propertyKeyId() ); transaction.nodeDoDelete( nodeId ); commitTx(); ds.stop(); }
@Test public void shouldNotGenerateUpdatesForLabelAddAndPropertyRemove() { // When EntityUpdates updates = EntityUpdates.forEntity( nodeId ).withTokens( empty ).withTokensAfter( label ) .removed( property1.propertyKeyId(), property1.value() ) .removed( property2.propertyKeyId(), property2.value() ) .removed( property3.propertyKeyId(), property3.value() ) .build(); // Then assertThat( updates.forIndexKeys( indexes, assertNoLoading(), EntityType.NODE ), emptyIterable() ); }
@Test public void shouldGenerateUpdateForLabelRemovalWithExistingProperty() { // When EntityUpdates updates = EntityUpdates.forEntity( nodeId ).withTokens( label ).withTokensAfter( empty ).build(); // Then assertThat( updates.forIndexKeys( indexes, propertyLoader( property1 ), EntityType.NODE ), containsInAnyOrder( IndexEntryUpdate.remove( nodeId, index1, property1.value() ) ) ); }
@Override public int next() { return properties.next().propertyKeyId(); } }
@Test public void shouldNotGenerateUpdatesForLabelRemoveAndPropertyAdd() { // When EntityUpdates updates = EntityUpdates.forEntity( nodeId ).withTokens( label ).withTokensAfter( empty ) .added( property1.propertyKeyId(), property1.value() ) .added( property2.propertyKeyId(), property2.value() ) .added( property3.propertyKeyId(), property3.value() ) .build(); // Then assertThat( updates.forIndexKeys( indexes, assertNoLoading(), EntityType.NODE ), emptyIterable() ); }
@Test public void shouldGenerateUpdateForPartialNonSchemaIndexUpdate() { // When EntityUpdates updates = EntityUpdates.forEntity( nodeId ).withTokens( label ).withTokensAfter( label ) .added( propertyKeyId1, Values.of( "Neo" ) ) .build(); // Then assertThat( updates.forIndexKeys( singleton( nonSchemaIndex ), propertyLoader(), EntityType.NODE ), containsInAnyOrder( IndexEntryUpdate.add( nodeId, nonSchemaIndex, property1.value(), null, null ) ) ); }
@Override public int propertyKey() { if ( txStateValue != null ) { return txStateValue.propertyKeyId(); } return storeCursor.propertyKey(); }
@Test public void shouldGenerateUpdatesForMultiplePropertyAdditionWithLabels() { // When EntityUpdates updates = EntityUpdates.forEntity( nodeId ).withTokens( label ) .added( property1.propertyKeyId(), property1.value() ) .added( property2.propertyKeyId(), property2.value() ) .added( property3.propertyKeyId(), property3.value() ) .build(); // Then assertThat( updates.forIndexKeys( indexes, propertyLoader( property1, property2, property3 ), EntityType.NODE ), containsInAnyOrder( IndexEntryUpdate.add( nodeId, index1, property1.value() ), IndexEntryUpdate.add( nodeId, index2, property2.value() ), IndexEntryUpdate.add( nodeId, index3, property3.value() ), IndexEntryUpdate.add( nodeId, index123, values123 ) ) ); }
@Test public void shouldGenerateUpdatesForLabelAdditionWithExistingProperties() { // When EntityUpdates updates = EntityUpdates.forEntity( nodeId ).withTokens( empty ).withTokensAfter( label ) .existing( propertyKeyId1, Values.of( "Neo" ) ) .existing( propertyKeyId2, Values.of( 100L ) ) .existing( propertyKeyId3, Values.pointValue( CoordinateReferenceSystem.WGS84, 12.3, 45.6 ) ) .build(); // Then assertThat( updates.forIndexKeys( indexes, propertyLoader( property1, property2, property3 ), EntityType.NODE ), containsInAnyOrder( IndexEntryUpdate.add( nodeId, index1, property1.value() ), IndexEntryUpdate.add( nodeId, index2, property2.value() ), IndexEntryUpdate.add( nodeId, index3, property3.value() ), IndexEntryUpdate.add( nodeId, index123, values123 ) ) ); }
@Test public void shouldGenerateUpdateForFullNonSchemaIndexUpdate() { // When EntityUpdates updates = EntityUpdates.forEntity( nodeId ).withTokens( label ).withTokensAfter( label ) .added( property1.propertyKeyId(), property1.value() ) .added( property2.propertyKeyId(), property2.value() ) .added( property3.propertyKeyId(), property3.value() ) .build(); // Then assertThat( updates.forIndexKeys( singleton( nonSchemaIndex ), propertyLoader(), EntityType.NODE ), containsInAnyOrder( IndexEntryUpdate.add( nodeId, nonSchemaIndex, values123 ) ) ); }