Program: 31702
Project: 31702
Buggy source:
/** 
 * Invoked when the mapper wishes to mark a set of outgoing relationships like (a)-[:T]-&gt;(*) as deleted, prior to possibly re-establishing them individually as it traverses the entity graph. There are two reasons why a set of relationships might not be be able to be marked deleted: 1) the request to mark them as deleted has already been made 2) the relationship is not persisted in the graph (i.e. its a new relationship) Only case 1) is considered to be a failed request, because this context is only concerned about pre-existing relationships in the graph. In order to distinguish between the two cases, we also maintain a list of successfully deleted relationships, so that uf we try to delete an already-deleted set of relationships we can signal the error.
 * @param src the identity of the node at the start of the relationship
 * @param relationshipType the type of the relationship
 * @return true if the relationship was deleted or doesn't exist in the graph, false otherwise
 */
public boolean deregisterOutgoingRelationships(Long src,String relationshipType){
  Iterator<MappedRelationship> iterator=registeredRelationships.iterator();
  boolean found=false;
  while (iterator.hasNext()) {
    MappedRelationship mappedRelationship=iterator.next();
    if (mappedRelationship.getStartNodeId() == src && mappedRelationship.getRelationshipType().equals(relationshipType)) {
      iterator.remove();
      deletedRelationships.add(mappedRelationship);
      found=true;
    }
  }
  if (found)   return true;
  iterator=deletedRelationships.iterator();
  while (iterator.hasNext()) {
    MappedRelationship mappedRelationship=iterator.next();
    if (mappedRelationship.getStartNodeId() == src && mappedRelationship.getRelationshipType().equals(relationshipType)) {
      return false;
    }
  }
  return true;
}

Fixed version (ground truth):
/** 
 * Invoked when the mapper wishes to mark a set of outgoing relationships like (a)-[:T]-&gt;(*) as deleted, prior to possibly re-establishing them individually as it traverses the entity graph. There are two reasons why a set of relationships might not be be able to be marked deleted: 1) the request to mark them as deleted has already been made 2) the relationship is not persisted in the graph (i.e. its a new relationship) Only case 1) is considered to be a failed request, because this context is only concerned about pre-existing relationships in the graph. In order to distinguish between the two cases, we also maintain a list of successfully deleted relationships, so that uf we try to delete an already-deleted set of relationships we can signal the error.
 * @param src the identity of the node at the start of the relationship
 * @param relationshipType the type of the relationship
 * @return true if the relationship was deleted or doesn't exist in the graph, false otherwise
 */
public boolean deregisterOutgoingRelationships(Long src,String relationshipType){
  Iterator<MappedRelationship> iterator=registeredRelationships.iterator();
  boolean nothingToDelete=true;
  List<MappedRelationship> cleared=new ArrayList<>();
  while (iterator.hasNext()) {
    MappedRelationship mappedRelationship=iterator.next();
    if (mappedRelationship.getStartNodeId() == src && mappedRelationship.getRelationshipType().equals(relationshipType)) {
      cleared.add(mappedRelationship);
      iterator.remove();
      nothingToDelete=false;
    }
  }
  if (nothingToDelete) {
    return true;
  }
  iterator=cleared.iterator();
  while (iterator.hasNext()) {
    MappedRelationship mappedRelationship=iterator.next();
    if (isMappedRelationshipAlreadyDeleted(mappedRelationship)) {
      registerRelationship(mappedRelationship);
      iterator.remove();
    }
 else {
      deletedRelationships.add(mappedRelationship);
    }
  }
  return cleared.size() > 0;
}