2011-02-08 19:53:59 +01:00
|
|
|
<?php
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Copyright 2011 Facebook, Inc.
|
|
|
|
*
|
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
* you may not use this file except in compliance with the License.
|
|
|
|
* You may obtain a copy of the License at
|
|
|
|
*
|
|
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
*
|
|
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
* See the License for the specific language governing permissions and
|
|
|
|
* limitations under the License.
|
|
|
|
*/
|
|
|
|
|
2011-07-04 22:04:22 +02:00
|
|
|
/**
|
|
|
|
* @group maniphest
|
|
|
|
*/
|
2011-02-08 19:53:59 +01:00
|
|
|
class ManiphestTask extends ManiphestDAO {
|
|
|
|
|
|
|
|
protected $phid;
|
|
|
|
protected $authorPHID;
|
|
|
|
protected $ownerPHID;
|
2011-02-21 05:08:16 +01:00
|
|
|
protected $ccPHIDs = array();
|
2011-02-08 19:53:59 +01:00
|
|
|
|
|
|
|
protected $status;
|
|
|
|
protected $priority;
|
|
|
|
|
|
|
|
protected $title;
|
|
|
|
protected $description;
|
2011-10-14 22:11:58 +02:00
|
|
|
protected $originalEmailSource;
|
2011-05-05 08:09:42 +02:00
|
|
|
protected $mailKey;
|
|
|
|
|
2011-02-17 23:32:01 +01:00
|
|
|
protected $attached = array();
|
2011-02-21 05:08:16 +01:00
|
|
|
protected $projectPHIDs = array();
|
2011-06-30 01:16:33 +02:00
|
|
|
private $projectsNeedUpdate;
|
2011-07-07 19:24:49 +02:00
|
|
|
private $subscribersNeedUpdate;
|
2011-02-08 19:53:59 +01:00
|
|
|
|
Allow Maniphest to scale to a massive size
Summary:
Maniphest is missing some keys and some query strategy which will make it
cumbersome to manage more than a few tens of thousands of tasks.
Test Plan:
Handily manipulated 100k-scale task groups. Maniphest takes about 250ms to
select and render pages of 1,000 tasks and has no problem paging and filtering
them, etc. We should be good to scale to multiple millions of tasks with these
changes.
Reviewed By: gc3
Reviewers: fratrik, jungejason, aran, tuomaspelkonen, gc3
Commenters: jungejason
CC: anjali, aran, epriestley, gc3, jungejason
Differential Revision: 534
2011-06-27 03:50:17 +02:00
|
|
|
protected $ownerOrdering;
|
|
|
|
|
2011-02-08 19:53:59 +01:00
|
|
|
public function getConfiguration() {
|
|
|
|
return array(
|
|
|
|
self::CONFIG_AUX_PHID => true,
|
|
|
|
self::CONFIG_SERIALIZATION => array(
|
|
|
|
'ccPHIDs' => self::SERIALIZATION_JSON,
|
2011-02-17 23:32:01 +01:00
|
|
|
'attached' => self::SERIALIZATION_JSON,
|
2011-02-21 05:08:16 +01:00
|
|
|
'projectPHIDs' => self::SERIALIZATION_JSON,
|
2011-02-08 19:53:59 +01:00
|
|
|
),
|
|
|
|
) + parent::getConfiguration();
|
|
|
|
}
|
|
|
|
|
2011-02-17 23:32:01 +01:00
|
|
|
public function getAttachedPHIDs($type) {
|
|
|
|
return array_keys(idx($this->attached, $type, array()));
|
|
|
|
}
|
|
|
|
|
2011-02-08 19:53:59 +01:00
|
|
|
public function generatePHID() {
|
2011-03-03 03:58:21 +01:00
|
|
|
return PhabricatorPHID::generateNewPHID(
|
|
|
|
PhabricatorPHIDConstants::PHID_TYPE_TASK);
|
2011-02-08 19:53:59 +01:00
|
|
|
}
|
|
|
|
|
2011-02-09 21:47:24 +01:00
|
|
|
public function getCCPHIDs() {
|
|
|
|
return nonempty($this->ccPHIDs, array());
|
|
|
|
}
|
|
|
|
|
2011-06-30 01:16:33 +02:00
|
|
|
public function setProjectPHIDs(array $phids) {
|
|
|
|
$this->projectPHIDs = $phids;
|
|
|
|
$this->projectsNeedUpdate = true;
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
2011-07-07 19:24:49 +02:00
|
|
|
public function setCCPHIDs(array $phids) {
|
|
|
|
$this->ccPHIDs = $phids;
|
|
|
|
$this->subscribersNeedUpdate = true;
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function setOwnerPHID($phid) {
|
|
|
|
$this->ownerPHID = $phid;
|
|
|
|
$this->subscribersNeedUpdate = true;
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
2011-07-26 00:34:56 +02:00
|
|
|
public function setAuxiliaryAttribute($key, $val) {
|
|
|
|
$this->removeAuxiliaryAttribute($key);
|
|
|
|
|
|
|
|
$attribute = new ManiphestTaskAuxiliaryStorage();
|
|
|
|
$attribute->setTaskPHID($this->phid);
|
|
|
|
$attribute->setName($key);
|
|
|
|
$attribute->setValue($val);
|
|
|
|
$attribute->save();
|
|
|
|
}
|
|
|
|
|
|
|
|
public function loadAuxiliaryAttribute($key) {
|
|
|
|
$attribute = id(new ManiphestTaskAuxiliaryStorage())->loadOneWhere(
|
|
|
|
'taskPHID = %s AND name = %s',
|
|
|
|
$this->getPHID(),
|
|
|
|
$key);
|
|
|
|
|
|
|
|
return $attribute;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function removeAuxiliaryAttribute($key) {
|
|
|
|
$attribute = id(new ManiphestTaskAuxiliaryStorage())->loadOneWhere(
|
|
|
|
'taskPHID = %s AND name = %s',
|
|
|
|
$this->getPHID(),
|
|
|
|
$key);
|
|
|
|
|
|
|
|
if ($attribute) {
|
|
|
|
$attribute->delete();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public function loadAuxiliaryAttributes() {
|
|
|
|
$attributes = id(new ManiphestTaskAuxiliaryStorage())->loadAllWhere(
|
|
|
|
'taskPHID = %s',
|
|
|
|
$this->getPHID());
|
|
|
|
|
|
|
|
return $attributes;
|
|
|
|
}
|
|
|
|
|
2011-05-05 08:09:42 +02:00
|
|
|
public function save() {
|
|
|
|
if (!$this->mailKey) {
|
|
|
|
$this->mailKey = sha1(Filesystem::readRandomBytes(20));
|
|
|
|
}
|
2011-06-30 01:16:33 +02:00
|
|
|
|
|
|
|
$result = parent::save();
|
|
|
|
|
|
|
|
if ($this->projectsNeedUpdate) {
|
|
|
|
// If we've changed the project PHIDs for this task, update the link
|
|
|
|
// table.
|
|
|
|
ManiphestTaskProject::updateTaskProjects($this);
|
|
|
|
$this->projectsNeedUpdate = false;
|
|
|
|
}
|
|
|
|
|
2011-07-07 19:24:49 +02:00
|
|
|
if ($this->subscribersNeedUpdate) {
|
|
|
|
// If we've changed the subscriber PHIDs for this task, update the link
|
|
|
|
// table.
|
|
|
|
ManiphestTaskSubscriber::updateTaskSubscribers($this);
|
|
|
|
$this->subscribersNeedUpdate = false;
|
|
|
|
}
|
|
|
|
|
2011-06-30 01:16:33 +02:00
|
|
|
return $result;
|
2011-05-05 08:09:42 +02:00
|
|
|
}
|
|
|
|
|
2011-02-08 19:53:59 +01:00
|
|
|
}
|