@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() ); } }
@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 ) ); }
void basicCompareTo( PropertyEntry<T> entry ) { assertEquals( entry.entity(), entity() ); assertEquals( entry.key(), key() ); assertEqualsMaybeNull( entry.previouslyCommitedValue(), previouslyCommitedValue(), entry.entity(), entry.key() ); }
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()); } } } }); }); }
private boolean hasNotActuallyChanged(PropertyEntry<T> propertyEntry) { return propertyEntry.previouslyCommitedValue() != null && propertyEntry.previouslyCommitedValue().equals(propertyEntry.value()); } }
private boolean hasNotActuallyChanged(PropertyEntry<T> propertyEntry) { return propertyEntry.previouslyCommitedValue() != null && propertyEntry.previouslyCommitedValue().equals(propertyEntry.value()); } }
/** * Inform this object about a new value of a node's property about to be set. After it has been done, * {@link #nodePropertySet(org.neo4j.graphdb.Node, String, Object)} must be called. * * @param node on which a new property value is about to be set. * @param key of the property. * @param value of the property about to be set. */ public void nodePropertyToBeSet(Node node, String key, Object value) { if (commitInProgress) { return; } IdAndKey idAndKey = new IdAndKey(node.getId(), key); Object previousValue; if (removedNodeProperties.containsKey(idAndKey)) { previousValue = removedNodeProperties.get(idAndKey).previouslyCommitedValue(); removedNodeProperties.remove(idAndKey); } else if (assignedNodeProperties.containsKey(idAndKey)) { previousValue = assignedNodeProperties.get(idAndKey).previouslyCommitedValue(); } else { previousValue = node.getProperty(key, null); } assignedNodeProperties.put(idAndKey, PropertyEntryImpl.assigned(node, key, value, previousValue)); }
/** * Inform this object about a new value of a relationship's property about to be set. After it has been done, * {@link #relationshipPropertySet(org.neo4j.graphdb.Relationship, String, Object)} must be called. * * @param relationship on which a new property value is about to be set. * @param key of the property. * @param value of the property about to be set. */ public void relationshipPropertyToBeSet(Relationship relationship, String key, Object value) { if (commitInProgress) { return; } IdAndKey idAndKey = new IdAndKey(relationship.getId(), key); Object previousValue; if (removedRelationshipProperties.containsKey(idAndKey)) { previousValue = removedRelationshipProperties.get(idAndKey).previouslyCommitedValue(); removedRelationshipProperties.remove(idAndKey); } else if (assignedRelationshipProperties.containsKey(idAndKey)) { previousValue = assignedRelationshipProperties.get(idAndKey).previouslyCommitedValue(); } else { previousValue = relationship.getProperty(key, null); } assignedRelationshipProperties.put(idAndKey, PropertyEntryImpl.assigned(relationship, key, value, previousValue)); }
/** * Inform this object about a node's property about to be removed. After is has been done, * {@link #nodePropertyRemoved(org.neo4j.graphdb.Node, String)} must be called. * * @param node whose property is about to be removed. * @param property about to be removed. */ public void nodePropertyToBeRemoved(Node node, String property) { if (commitInProgress) { return; } IdAndKey idAndKey = new IdAndKey(node.getId(), property); if (removedNodeProperties.containsKey(idAndKey)) { return; } Object previousValue; if (assignedNodeProperties.containsKey(idAndKey)) { previousValue = assignedNodeProperties.get(idAndKey).previouslyCommitedValue(); assignedNodeProperties.remove(idAndKey); if (previousValue == null) { return; } } else { previousValue = node.getProperty(property, null); } removedNodeProperties.put(idAndKey, PropertyEntryImpl.removed(node, property, previousValue)); }
/** * Inform this object about a relationship's property about to be removed. After it has been done, * {@link #relationshipPropertyRemoved(org.neo4j.graphdb.Relationship, String)} must be called. * * @param relationship whose property is about to be removed. * @param property about to be removed. */ public void relationshipPropertyToBeRemoved(Relationship relationship, String property) { if (commitInProgress) { return; } IdAndKey idAndKey = new IdAndKey(relationship.getId(), property); if (removedRelationshipProperties.containsKey(idAndKey)) { return; } Object previousValue; if (assignedRelationshipProperties.containsKey(idAndKey)) { previousValue = assignedRelationshipProperties.get(idAndKey).previouslyCommitedValue(); assignedRelationshipProperties.remove(idAndKey); if (previousValue == null) { return; } } else { previousValue = relationship.getProperty(property, null); } removedRelationshipProperties.put(idAndKey, PropertyEntryImpl.removed(relationship, property, previousValue)); }
if (propertyEntry.previouslyCommitedValue() == null) { if (!createdProperties.containsKey(entity.getId())) { createdProperties.put(entity.getId(), new HashMap<String, Object>()); 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());
if (propertyEntry.previouslyCommitedValue() == null) { if (!createdProperties.containsKey(id(container))) { createdProperties.put(id(container), new HashMap<String, Object>()); 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());