private static function alterRelationships(DifferentialRevision $revision, array $stable_phids, array $rem_phids, array $add_phids, $reason_phid, $relation_type)
 {
     $rem_map = array_fill_keys($rem_phids, true);
     $add_map = array_fill_keys($add_phids, true);
     $seq_map = array_values($stable_phids);
     $seq_map = array_flip($seq_map);
     foreach ($rem_map as $phid => $ignored) {
         if (!isset($seq_map[$phid])) {
             $seq_map[$phid] = count($seq_map);
         }
     }
     foreach ($add_map as $phid => $ignored) {
         if (!isset($seq_map[$phid])) {
             $seq_map[$phid] = count($seq_map);
         }
     }
     $raw = $revision->getRawRelations($relation_type);
     $raw = ipull($raw, null, 'objectPHID');
     $sequence = count($seq_map);
     foreach ($raw as $phid => $ignored) {
         if (isset($seq_map[$phid])) {
             $raw[$phid]['sequence'] = $seq_map[$phid];
         } else {
             $raw[$phid]['sequence'] = $sequence++;
         }
     }
     $raw = isort($raw, 'sequence');
     foreach ($raw as $phid => $ignored) {
         if (isset($rem_map[$phid])) {
             unset($raw[$phid]);
         }
     }
     foreach ($add_phids as $add) {
         $reason = is_array($reason_phid) ? idx($reason_phid, $add) : $reason_phid;
         $raw[$add] = array('objectPHID' => $add, 'sequence' => idx($seq_map, $add, $sequence++), 'reasonPHID' => $reason);
     }
     $conn_w = $revision->establishConnection('w');
     $sql = array();
     foreach ($raw as $relation) {
         $sql[] = qsprintf($conn_w, '(%d, %s, %s, %d, %s)', $revision->getID(), $relation_type, $relation['objectPHID'], $relation['sequence'], $relation['reasonPHID']);
     }
     $conn_w->openTransaction();
     queryfx($conn_w, 'DELETE FROM %T WHERE revisionID = %d AND relation = %s', DifferentialRevision::RELATIONSHIP_TABLE, $revision->getID(), $relation_type);
     if ($sql) {
         queryfx($conn_w, 'INSERT INTO %T
         (revisionID, relation, objectPHID, sequence, reasonPHID)
       VALUES %Q', DifferentialRevision::RELATIONSHIP_TABLE, implode(', ', $sql));
     }
     $conn_w->saveTransaction();
     $revision->loadRelationships();
 }