mirror of
https://we.phorge.it/source/phorge.git
synced 2024-12-12 00:26:13 +01:00
2fb266de7c
Summary: Depends on D19121. Ref T13083. Group transactions and show groups in the debugging view. Fix some of the most obvious issues with fact generation: - No more 0-point facts. - Engine can now generate at least one of every type of fact. Test Plan: Generated facts, viewed them in the debugging view, fact generation largely appeared to align with reality. No more "no facts in storage" facts. Subscribers: yelirekim Maniphest Tasks: T13083 Differential Revision: https://secure.phabricator.com/D19122
84 lines
2.3 KiB
PHP
84 lines
2.3 KiB
PHP
<?php
|
|
|
|
abstract class PhabricatorTransactionFactEngine
|
|
extends PhabricatorFactEngine {
|
|
|
|
public function newTransactionGroupsForObject(PhabricatorLiskDAO $object) {
|
|
$viewer = $this->getViewer();
|
|
|
|
$xaction_query = PhabricatorApplicationTransactionQuery::newQueryForObject(
|
|
$object);
|
|
$xactions = $xaction_query
|
|
->setViewer($viewer)
|
|
->withObjectPHIDs(array($object->getPHID()))
|
|
->execute();
|
|
|
|
$xactions = msortv($xactions, 'newChronologicalSortVector');
|
|
|
|
return $this->groupTransactions($xactions);
|
|
}
|
|
|
|
protected function groupTransactions(array $xactions) {
|
|
// These grouping rules are generally much looser than the display grouping
|
|
// rules. As long as the same user is editing the task and they don't leave
|
|
// it alone for a particularly long time, we'll group things together.
|
|
|
|
$breaks = array();
|
|
|
|
$touch_window = phutil_units('15 minutes in seconds');
|
|
$user_type = PhabricatorPeopleUserPHIDType::TYPECONST;
|
|
|
|
$last_actor = null;
|
|
$last_epoch = null;
|
|
|
|
foreach ($xactions as $key => $xaction) {
|
|
$this_actor = $xaction->getAuthorPHID();
|
|
if (phid_get_type($this_actor) != $user_type) {
|
|
$this_actor = null;
|
|
}
|
|
|
|
if ($this_actor && $last_actor && ($this_actor != $last_actor)) {
|
|
$breaks[$key] = true;
|
|
}
|
|
|
|
// If too much time passed between changes, group them separately.
|
|
$this_epoch = $xaction->getDateCreated();
|
|
if ($last_epoch) {
|
|
if (($this_epoch - $last_epoch) > $touch_window) {
|
|
$breaks[$key] = true;
|
|
}
|
|
}
|
|
|
|
// The clock gets reset every time the same real user touches the
|
|
// task, but does not reset if an automated actor touches things.
|
|
if (!$last_actor || ($this_actor == $last_actor)) {
|
|
$last_epoch = $this_epoch;
|
|
}
|
|
|
|
if ($this_actor && ($last_actor != $this_actor)) {
|
|
$last_actor = $this_actor;
|
|
$last_epoch = $this_epoch;
|
|
}
|
|
}
|
|
|
|
$groups = array();
|
|
$group = array();
|
|
foreach ($xactions as $key => $xaction) {
|
|
if (isset($breaks[$key])) {
|
|
if ($group) {
|
|
$groups[] = $group;
|
|
$group = array();
|
|
}
|
|
}
|
|
|
|
$group[] = $xaction;
|
|
}
|
|
|
|
if ($group) {
|
|
$groups[] = $group;
|
|
}
|
|
|
|
return $groups;
|
|
}
|
|
|
|
}
|