Path: blob/master/src/applications/diffusion/query/pathchange/DiffusionPathChangeQuery.php
12242 views
<?php12final class DiffusionPathChangeQuery extends Phobject {34private $request;5private $limit;67public function setLimit($limit) {8$this->limit = $limit;9return $this;10}1112public function getLimit() {13return $this->limit;14}1516private function __construct() {17// <private>18}1920public static function newFromDiffusionRequest(21DiffusionRequest $request) {22$query = new DiffusionPathChangeQuery();23$query->request = $request;2425return $query;26}2728protected function getRequest() {29return $this->request;30}3132public function loadChanges() {33return $this->executeQuery();34}3536protected function executeQuery() {3738$drequest = $this->getRequest();39$repository = $drequest->getRepository();4041$commit = $drequest->loadCommit();4243$conn_r = $repository->establishConnection('r');4445if ($this->limit) {46$limit = qsprintf(47$conn_r,48'LIMIT %d',49$this->limit + 1);50} else {51$limit = qsprintf($conn_r, '');52}5354$raw_changes = queryfx_all(55$conn_r,56'SELECT c.*, p.path pathName, t.path targetPathName,57i.commitIdentifier targetCommitIdentifier58FROM %T c59LEFT JOIN %T p ON c.pathID = p.id60LEFT JOIN %T t ON c.targetPathID = t.id61LEFT JOIN %T i ON c.targetCommitID = i.id62WHERE c.commitID = %d AND isDirect = 1 %Q',63PhabricatorRepository::TABLE_PATHCHANGE,64PhabricatorRepository::TABLE_PATH,65PhabricatorRepository::TABLE_PATH,66$commit->getTableName(),67$commit->getID(),68$limit);6970$limited = $this->limit && (count($raw_changes) > $this->limit);71if ($limited) {72$raw_changes = array_slice($raw_changes, 0, $this->limit);73}7475$changes = array();7677$raw_changes = isort($raw_changes, 'pathName');78foreach ($raw_changes as $raw_change) {79$type = $raw_change['changeType'];80if ($type == DifferentialChangeType::TYPE_CHILD) {81continue;82}8384$change = new DiffusionPathChange();85$change->setPath(ltrim($raw_change['pathName'], '/'));86$change->setChangeType($raw_change['changeType']);87$change->setFileType($raw_change['fileType']);88$change->setCommitIdentifier($commit->getCommitIdentifier());8990$target_path = $raw_change['targetPathName'];91if ($target_path !== null) {92$target_path = ltrim($target_path, '/');93}94$change->setTargetPath($target_path);9596$change->setTargetCommitIdentifier($raw_change['targetCommitIdentifier']);9798$id = $raw_change['pathID'];99$changes[$id] = $change;100}101102// Deduce the away paths by examining all the changes, if we loaded them103// all.104105if (!$limited) {106$away = array();107foreach ($changes as $change) {108if ($change->getTargetPath()) {109$away[$change->getTargetPath()][] = $change->getPath();110}111}112foreach ($changes as $change) {113if (isset($away[$change->getPath()])) {114$change->setAwayPaths($away[$change->getPath()]);115}116}117}118119return $changes;120}121}122123124