2012-03-28 01:22:40 +02:00
|
|
|
<?php
|
|
|
|
|
2013-08-14 01:17:42 +02:00
|
|
|
final class PhabricatorFlagQuery
|
|
|
|
extends PhabricatorCursorPagedPolicyAwareQuery {
|
2012-03-28 01:22:40 +02:00
|
|
|
|
|
|
|
private $ownerPHIDs;
|
|
|
|
private $types;
|
|
|
|
private $objectPHIDs;
|
2013-08-14 01:17:42 +02:00
|
|
|
private $colors;
|
2012-03-28 01:22:40 +02:00
|
|
|
|
|
|
|
private $needHandles;
|
|
|
|
private $needObjects;
|
|
|
|
|
|
|
|
public function withOwnerPHIDs(array $owner_phids) {
|
|
|
|
$this->ownerPHIDs = $owner_phids;
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function withTypes(array $types) {
|
|
|
|
$this->types = $types;
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function withObjectPHIDs(array $object_phids) {
|
|
|
|
$this->objectPHIDs = $object_phids;
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
2013-08-14 01:17:42 +02:00
|
|
|
public function withColors(array $colors) {
|
|
|
|
$this->colors = $colors;
|
2013-03-26 22:05:45 +01:00
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
2012-03-28 01:22:40 +02:00
|
|
|
public function needHandles($need) {
|
|
|
|
$this->needHandles = $need;
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function needObjects($need) {
|
|
|
|
$this->needObjects = $need;
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public static function loadUserFlag(PhabricatorUser $user, $object_phid) {
|
|
|
|
// Specifying the type in the query allows us to use a key.
|
2013-08-14 01:17:42 +02:00
|
|
|
return id(new PhabricatorFlagQuery())
|
|
|
|
->setViewer($user)
|
|
|
|
->withOwnerPHIDs(array($user->getPHID()))
|
|
|
|
->withTypes(array(phid_get_type($object_phid)))
|
|
|
|
->withObjectPHIDs(array($object_phid))
|
|
|
|
->executeOne();
|
2012-03-28 01:22:40 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2013-08-14 01:17:42 +02:00
|
|
|
public function loadPage() {
|
2012-03-28 01:22:40 +02:00
|
|
|
$table = new PhabricatorFlag();
|
|
|
|
$conn_r = $table->establishConnection('r');
|
|
|
|
|
|
|
|
$data = queryfx_all(
|
|
|
|
$conn_r,
|
|
|
|
'SELECT * FROM %T flag %Q %Q %Q',
|
|
|
|
$table->getTableName(),
|
2013-08-14 01:17:42 +02:00
|
|
|
$this->buildWhereClause($conn_r),
|
|
|
|
$this->buildOrderClause($conn_r),
|
|
|
|
$this->buildLimitClause($conn_r));
|
|
|
|
|
|
|
|
return $table->loadAllFromArray($data);
|
|
|
|
}
|
|
|
|
|
|
|
|
public function willFilterPage(array $flags) {
|
|
|
|
|
|
|
|
if ($this->needObjects) {
|
|
|
|
$objects = id(new PhabricatorObjectQuery())
|
|
|
|
->setViewer($this->getViewer())
|
|
|
|
->withPHIDs(mpull($flags, 'getObjectPHID'))
|
|
|
|
->execute();
|
|
|
|
$objects = mpull($objects, null, 'getPHID');
|
|
|
|
foreach ($flags as $key => $flag) {
|
|
|
|
$object = idx($objects, $flag->getObjectPHID());
|
|
|
|
if ($object) {
|
|
|
|
$flags[$key]->attachObject($object);
|
|
|
|
} else {
|
|
|
|
unset($flags[$key]);
|
2012-03-28 01:22:40 +02:00
|
|
|
}
|
|
|
|
}
|
2013-08-14 01:17:42 +02:00
|
|
|
}
|
2012-03-28 01:22:40 +02:00
|
|
|
|
2013-08-14 01:17:42 +02:00
|
|
|
if ($this->needHandles) {
|
|
|
|
$handles = id(new PhabricatorHandleQuery())
|
|
|
|
->setViewer($this->getViewer())
|
|
|
|
->withPHIDs(mpull($flags, 'getObjectPHID'))
|
|
|
|
->execute();
|
|
|
|
|
|
|
|
foreach ($flags as $flag) {
|
|
|
|
$flag->attachHandle($handles[$flag->getObjectPHID()]);
|
2012-03-28 01:22:40 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return $flags;
|
|
|
|
}
|
|
|
|
|
|
|
|
private function buildWhereClause($conn_r) {
|
|
|
|
$where = array();
|
|
|
|
|
|
|
|
if ($this->ownerPHIDs) {
|
|
|
|
$where[] = qsprintf(
|
|
|
|
$conn_r,
|
|
|
|
'flag.ownerPHID IN (%Ls)',
|
|
|
|
$this->ownerPHIDs);
|
|
|
|
}
|
|
|
|
|
|
|
|
if ($this->types) {
|
|
|
|
$where[] = qsprintf(
|
|
|
|
$conn_r,
|
|
|
|
'flag.type IN (%Ls)',
|
|
|
|
$this->types);
|
|
|
|
}
|
|
|
|
|
|
|
|
if ($this->objectPHIDs) {
|
|
|
|
$where[] = qsprintf(
|
|
|
|
$conn_r,
|
|
|
|
'flag.objectPHID IN (%Ls)',
|
|
|
|
$this->objectPHIDs);
|
|
|
|
}
|
|
|
|
|
2013-08-14 01:17:42 +02:00
|
|
|
if ($this->colors) {
|
2013-08-09 03:54:35 +02:00
|
|
|
$where[] = qsprintf(
|
|
|
|
$conn_r,
|
2013-08-14 01:17:42 +02:00
|
|
|
'flag.color IN (%Ld)',
|
|
|
|
$this->colors);
|
2013-08-09 03:54:35 +02:00
|
|
|
}
|
|
|
|
|
2013-08-14 01:17:42 +02:00
|
|
|
$where[] = $this->buildPagingClause($conn_r);
|
2012-03-28 01:22:40 +02:00
|
|
|
|
2013-08-14 01:17:42 +02:00
|
|
|
return $this->formatWhereClause($where);
|
2012-03-28 01:22:40 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
}
|