1
0
Fork 0
mirror of https://we.phorge.it/source/phorge.git synced 2025-01-02 02:40:58 +01:00

Methods for reading reviewers from edges in differential

Summary: Add `getReviewerStatus` to get an array of `DifferentialReviewer` objects. The method `needReviewerStatus` in `DifferentialRevisionQuery` loads the edges into the revisions loaded.

Test Plan: Added `->needReviewerStatus(true)` to `DifferentialRevisionSearchEngine` and checked through logging that the data was being loaded correctly.

Reviewers: epriestley

Reviewed By: epriestley

CC: aran, Korvin

Differential Revision: https://secure.phabricator.com/D6450
This commit is contained in:
Juan Pablo Civile 2013-07-14 19:18:55 -07:00 committed by epriestley
parent 1b48e922d4
commit d4c28dcbc2
4 changed files with 105 additions and 0 deletions

View file

@ -395,6 +395,7 @@ phutil_register_library_map(array(
'DifferentialRevertPlanFieldSpecification' => 'applications/differential/field/specification/DifferentialRevertPlanFieldSpecification.php',
'DifferentialReviewRequestMail' => 'applications/differential/mail/DifferentialReviewRequestMail.php',
'DifferentialReviewedByFieldSpecification' => 'applications/differential/field/specification/DifferentialReviewedByFieldSpecification.php',
'DifferentialReviewer' => 'applications/differential/storage/DifferentialReviewer.php',
'DifferentialReviewerStatus' => 'applications/differential/constants/DifferentialReviewerStatus.php',
'DifferentialReviewersFieldSpecification' => 'applications/differential/field/specification/DifferentialReviewersFieldSpecification.php',
'DifferentialRevision' => 'applications/differential/storage/DifferentialRevision.php',

View file

@ -56,6 +56,7 @@ final class DifferentialRevisionQuery
private $needDiffIDs = false;
private $needCommitPHIDs = false;
private $needHashes = false;
private $needReviewerStatus = false;
private $buildingGlobalOrder;
@ -326,6 +327,19 @@ final class DifferentialRevisionQuery
}
/**
* Set whether or not the query should load associated reviewer status.
*
* @param bool True to load and attach reviewers.
* @return this
* @task config
*/
public function needReviewerStatus($need_reviewer_status) {
$this->needReviewerStatus = $need_reviewer_status;
return $this;
}
/* -( Query Execution )---------------------------------------------------- */
@ -376,6 +390,10 @@ final class DifferentialRevisionQuery
$this->loadHashes($conn_r, $revisions);
}
if ($this->needReviewerStatus) {
$this->loadReviewers($conn_r, $revisions);
}
return $revisions;
}
@ -903,6 +921,37 @@ final class DifferentialRevisionQuery
}
}
private function loadReviewers(
AphrontDatabaseConnection $conn_r,
array $revisions) {
assert_instances_of($revisions, 'DifferentialRevision');
$edge_type = PhabricatorEdgeConfig::TYPE_DREV_HAS_REVIEWER;
$edges = id(new PhabricatorEdgeQuery())
->withSourcePHIDs(mpull($revisions, 'getPHID'))
->withEdgeTypes(array($edge_type))
->needEdgeData(true)
->execute();
foreach ($revisions as $revision) {
$revision_edges = $edges[$revision->getPHID()][$edge_type];
$reviewers = array();
foreach ($revision_edges as $user_phid => $edge) {
$data = $edge['data'];
$reviewers[] = new DifferentialReviewer(
$user_phid, $data['status'], idx($data, 'diff', null)
);
}
$revision->attachReviewerStatus($reviewers);
}
}
public static function splitResponsible(array $revisions, array $user_phids) {
$blocking = array();
$active = array();

View file

@ -0,0 +1,39 @@
<?php
final class DifferentialReviewer {
protected $reviewerPHID;
protected $status;
protected $diffID;
public function __construct($reviewer_phid, $status, $diff_id = null) {
$this->reviewerPHID = $reviewer_phid;
$this->setStatus($status, $diff_id);
}
public function getReviewerPHID() {
return $this->reviewerPHID;
}
public function getStatus() {
return $this->status;
}
public function getDiffID() {
return $this->diffID;
}
public function setStatus($status, $diff_id = null) {
if ($status == DifferentialReviewerStatus::STATUS_REJECTED
&& $diff_id === null) {
throw new Exception('STATUS_REJECTED must have a diff_id set');
}
$this->status = $status;
$this->diffID = $diff_id;
return $this;
}
}

View file

@ -32,6 +32,7 @@ final class DifferentialRevision extends DifferentialDAO
private $diffIDs;
private $hashes;
private $reviewerStatus;
const RELATIONSHIP_TABLE = 'differential_relationship';
const TABLE_COMMIT = 'differential_commit';
@ -335,4 +336,19 @@ final class DifferentialRevision extends DifferentialDAO
);
}
public function getReviewerStatus() {
if ($this->reviewerStatus === null) {
throw new Exception(
"Call attachReviewerStatus() before getReviewerStatus()!"
);
}
return $this->reviewerStatus;
}
public function attachReviewerStatus(array $reviewers) {
assert_instances_of($reviewers, 'DifferentialReviewer');
$this->reviewerStatus = $reviewers;
return $this;
}
}