@Override public void afterCommit( TransactionData data, Object state ) { for ( PropertyEntry<Node> entry : data.removedNodeProperties() ) { String key = entry.key(); Object value = entry.previouslyCommitedValue(); nodeProps.put( key, value ); } for ( PropertyEntry<Relationship> entry : data.removedRelationshipProperties() ) { relProps.put( entry.key(), entry.previouslyCommitedValue() ); } }
<T extends PropertyContainer> PropertyEntryImpl<T> fetchExpectedPropertyEntry( Map<T, Map<String, PropertyEntryImpl<T>>> map, PropertyEntry<T> entry ) { T entity = entry.entity(); boolean hasEntity = map.containsKey( entity ); if ( ignoreAdditionalData && !hasEntity ) { return null; } assertTrue( "Unexpected entity " + entry, hasEntity ); Map<String, PropertyEntryImpl<T>> innerMap = map.get( entity ); PropertyEntryImpl<T> expectedEntry = innerMap.remove( entry.key() ); if ( expectedEntry == null && ignoreAdditionalData ) { return null; } assertNotNull( "Unexpected property entry " + entry, expectedEntry ); if ( innerMap.isEmpty() ) { map.remove( entity ); } return expectedEntry; } }
void compareToAssigned( PropertyEntry<T> entry ) { basicCompareTo( entry ); assertEqualsMaybeNull( entry.value(), value(), entry.entity(), entry.key() ); }
@Test public void showsRemovedRelationships() throws Exception { // Given state.relationshipDoDelete( 1L, 1, 1L, 2L ); state.relationshipDoDelete( 2L, 1, 1L, 1L ); ops.withRelationship( 1, 1, 1, 2 ); ops.withRelationship( 2, 1, 1, 1, genericMap( "key", Values.of( "p") ) ); // When & Then TxStateTransactionDataSnapshot snapshot = snapshot(); assertThat( idList( snapshot.deletedRelationships() ), equalTo( asList( 1L, 2L ) ) ); assertThat( single( snapshot.removedRelationshipProperties() ).key(), equalTo( "key" ) ); }
@Test public void showsDeletedNodes() throws Exception { // Given state.nodeDoDelete( 1L ); state.nodeDoDelete( 2L ); int labelId = 15; when( tokenRead.nodeLabelName( labelId ) ).thenReturn( "label" ); ops.withNode( 1, new long[]{labelId}, genericMap( "key", Values.of( "p" ) ) ); ops.withNode( 2, NO_LABELS ); // When & Then TxStateTransactionDataSnapshot snapshot = snapshot(); assertThat( idList( snapshot.deletedNodes() ), equalTo( asList( 1L, 2L ) ) ); assertThat( single( snapshot.removedLabels() ).label().name(), equalTo( "label" ) ); assertThat( single( snapshot.removedNodeProperties() ).key(), equalTo( "key" ) ); }
@Test public void shouldListRemovedRelationshipProperties() throws Exception { // Given int propertyKeyId = ops.propertyKeyTokenHolder().getOrCreateId( "theKey" ); Value prevValue = Values.of( "prevValue" ); state.relationshipDoRemoveProperty( 1L, propertyKeyId ); ops.withRelationship( 1, 0, 0, 0, genericMap( "theKey", prevValue ) ); // When Iterable<PropertyEntry<Relationship>> propertyEntries = snapshot().removedRelationshipProperties(); // Then PropertyEntry<Relationship> entry = single( propertyEntries ); assertThat( entry.key(), equalTo( "theKey" ) ); assertThat( entry.previouslyCommitedValue(), equalTo( "prevValue" ) ); assertThat( entry.entity().getId(), equalTo( 1L ) ); }
@Test public void shouldListRemovedNodeProperties() throws Exception { // Given int propertyKeyId = ops.propertyKeyTokenHolder().getOrCreateId( "theKey" ); Value prevValue = Values.of( "prevValue" ); state.nodeDoRemoveProperty( 1L, propertyKeyId ); ops.withNode( 1, NO_LABELS, genericMap( "theKey", prevValue ) ); // When Iterable<PropertyEntry<Node>> propertyEntries = snapshot().removedNodeProperties(); // Then PropertyEntry<Node> entry = single( propertyEntries ); assertThat( entry.key(), equalTo( "theKey" ) ); assertThat( entry.previouslyCommitedValue(), equalTo( "prevValue" ) ); assertThat( entry.entity().getId(), equalTo( 1L ) ); }
@Test public void shouldListAddedNodePropertiesProperties() throws Exception { // Given int propertyKeyId = ops.propertyKeyTokenHolder().getOrCreateId( "theKey" ); Value prevValue = Values.of( "prevValue" ); state.nodeDoChangeProperty( 1L, propertyKeyId, Values.of( "newValue" ) ); ops.withNode( 1, NO_LABELS, genericMap( "theKey", prevValue ) ); // When Iterable<PropertyEntry<Node>> propertyEntries = snapshot().assignedNodeProperties(); // Then PropertyEntry<Node> entry = single( propertyEntries ); assertThat( entry.key(), equalTo( "theKey" ) ); assertThat( entry.value(), equalTo( "newValue" ) ); assertThat( entry.previouslyCommitedValue(), equalTo( "prevValue" ) ); assertThat( entry.entity().getId(), equalTo( 1L ) ); }
@Test public void shouldListAddedRelationshipProperties() throws Exception { // Given Value prevValue = Values.of( "prevValue" ); int propertyKeyId = ops.propertyKeyTokenHolder().getOrCreateId( "theKey" ); state.relationshipDoReplaceProperty( 1L, propertyKeyId, prevValue, Values.of( "newValue" ) ); ops.withRelationship( 1, 0, 0, 0, genericMap( "theKey", prevValue ) ); // When Iterable<PropertyEntry<Relationship>> propertyEntries = snapshot().assignedRelationshipProperties(); // Then PropertyEntry<Relationship> entry = single( propertyEntries ); assertThat( entry.key(), equalTo( "theKey" ) ); assertThat( entry.value(), equalTo( "newValue" ) ); assertThat( entry.previouslyCommitedValue(), equalTo( "prevValue" ) ); assertThat( entry.entity().getId(), equalTo( 1L ) ); }
private static <T extends PropertyContainer> Map<String,List<Map<String,Object>>> aggregatePropertyKeys(Iterable<PropertyEntry<T>> entries, boolean nodes, boolean removed) { if (!entries.iterator().hasNext()) return Collections.emptyMap(); Map<String,List<Map<String,Object>>> result = new HashMap<>(); String entityType = nodes ? "node" : "relationship"; for (PropertyEntry<T> entry : entries) { result.compute(entry.key(), (k, v) -> { if (v == null) v = new ArrayList<>(100); Map<String, Object> map = map("key", k, entityType, entry.entity(), "old", entry.previouslyCommitedValue()); if (!removed) map.put("new", entry.value()); v.add(map); return v; }); } return result; } private static Map<String,List<Node>> aggregateLabels(Iterable<LabelEntry> labelEntries) {
private void iterateNodePropertyChange(Stream<PropertyEntry<Node>> stream, boolean propertyRemoved, IndexFunction<Index<Node>, Node, String, Object, Object> function) { stream.forEach(nodePropertyEntry -> { final Node entity = nodePropertyEntry.entity(); final String key = nodePropertyEntry.key(); final Object value = propertyRemoved ? null : nodePropertyEntry.value(); entity.getLabels().forEach(label -> { final String labelName = label.name(); final Map<String, Collection<Index<Node>>> propertyIndexMap = indexesByLabelAndProperty.get(labelName); if (propertyIndexMap!=null) { final Collection<Index<Node>> indices = propertyIndexMap.get(key); if (indices!= null) { for (Index<Node> index : indices) { String indexKey = labelName + "." + key; function.apply(index, entity, indexKey, value, nodePropertyEntry.previouslyCommitedValue()); } } } }); }); }
createdProperties.put(id(container), new HashMap<String, Object>()); createdProperties.get(id(container)).put(propertyEntry.key(), propertyEntry.value()); } else { if (!changedProperties.containsKey(id(container))) { changedProperties.put(id(container), new HashMap<String, Change<Object>>()); changedProperties.get(id(container)).put(propertyEntry.key(), new Change<>(propertyEntry.previouslyCommitedValue(), propertyEntry.value())); deletedContainersProperties.put(id(container), new HashMap<String, Object>()); deletedContainersProperties.get(id(container)).put(propertyEntry.key(), propertyEntry.previouslyCommitedValue()); continue; deletedProperties.get(id(container)).put(propertyEntry.key(), propertyEntry.previouslyCommitedValue());
createdProperties.put(entity.getId(), new HashMap<String, Object>()); createdProperties.get(entity.getId()).put(propertyEntry.key(), propertyEntry.value()); } else { if (!changedProperties.containsKey(entity.getId())) { changedProperties.put(entity.getId(), new HashMap<String, Change<Object>>()); changedProperties.get(entity.getId()).put(propertyEntry.key(), new Change<>(propertyEntry.previouslyCommitedValue(), propertyEntry.value())); deletedEntityProperties.put(entity.getId(), new HashMap<String, Object>()); deletedEntityProperties.get(entity.getId()).put(propertyEntry.key(), propertyEntry.previouslyCommitedValue()); continue; deletedProperties.get(entity.getId()).put(propertyEntry.key(), propertyEntry.previouslyCommitedValue());