Changeset View
Changeset View
Standalone View
Standalone View
src/applications/phrequent/storage/PhrequentTimeBlock.php
Show All 31 Lines | public function getObjectTimeRanges($now) { | ||||
foreach ($this->events as $event) { | foreach ($this->events as $event) { | ||||
// First, convert each event's preempting stack into a linear timeline | // First, convert each event's preempting stack into a linear timeline | ||||
// of events. | // of events. | ||||
$timeline = array(); | $timeline = array(); | ||||
$timeline[] = array( | $timeline[] = array( | ||||
'event' => $event, | 'event' => $event, | ||||
'at' => $event->getDateStarted(), | 'at' => (int)$event->getDateStarted(), | ||||
'type' => 'start', | 'type' => 'start', | ||||
); | ); | ||||
$timeline[] = array( | $timeline[] = array( | ||||
'event' => $event, | 'event' => $event, | ||||
'at' => nonempty($event->getDateEnded(), $now), | 'at' => (int)nonempty($event->getDateEnded(), $now), | ||||
'type' => 'end', | 'type' => 'end', | ||||
); | ); | ||||
$base_phid = $event->getObjectPHID(); | $base_phid = $event->getObjectPHID(); | ||||
$preempts = $event->getPreemptingEvents(); | $preempts = $event->getPreemptingEvents(); | ||||
foreach ($preempts as $preempt) { | foreach ($preempts as $preempt) { | ||||
$same_object = ($preempt->getObjectPHID() == $base_phid); | $same_object = ($preempt->getObjectPHID() == $base_phid); | ||||
$timeline[] = array( | $timeline[] = array( | ||||
'event' => $preempt, | 'event' => $preempt, | ||||
'at' => $preempt->getDateStarted(), | 'at' => (int)$preempt->getDateStarted(), | ||||
'type' => $same_object ? 'start' : 'push', | 'type' => $same_object ? 'start' : 'push', | ||||
); | ); | ||||
$timeline[] = array( | $timeline[] = array( | ||||
'event' => $preempt, | 'event' => $preempt, | ||||
'at' => nonempty($preempt->getDateEnded(), $now), | 'at' => (int)nonempty($preempt->getDateEnded(), $now), | ||||
'type' => $same_object ? 'end' : 'pop', | 'type' => $same_object ? 'end' : 'pop', | ||||
); | ); | ||||
} | } | ||||
// Now, figure out how much time was actually spent working on the | // Now, figure out how much time was actually spent working on the | ||||
// object. | // object. | ||||
usort($timeline, array(__CLASS__, 'sortTimeline')); | usort($timeline, array(__CLASS__, 'sortTimeline')); | ||||
▲ Show 20 Lines • Show All 109 Lines • ▼ Show 20 Lines | public function getObjectTimeRanges($now) { | ||||
foreach ($object_ranges as $phid => $ranges) { | foreach ($object_ranges as $phid => $ranges) { | ||||
$object_ranges[$phid] = self::mergeTimeRanges(array_mergev($ranges)); | $object_ranges[$phid] = self::mergeTimeRanges(array_mergev($ranges)); | ||||
} | } | ||||
return $object_ranges; | return $object_ranges; | ||||
} | } | ||||
/** | |||||
* Returns the current list of work. | |||||
*/ | |||||
public function getCurrentWorkStack($now, $include_inactive = false) { | |||||
$ranges = $this->getObjectTimeRanges($now); | |||||
$results = array(); | |||||
foreach ($ranges as $phid => $blocks) { | |||||
$total = 0; | |||||
foreach ($blocks as $block) { | |||||
$total += $block[1] - $block[0]; | |||||
} | |||||
$type = 'inactive'; | |||||
foreach ($blocks as $block) { | |||||
if ($block[1] === $now) { | |||||
if ($block[0] === $block[1]) { | |||||
$type = 'suspended'; | |||||
} else { | |||||
$type = 'active'; | |||||
} | |||||
break; | |||||
} | |||||
} | |||||
if ($include_inactive || $type !== 'inactive') { | |||||
$results[] = array( | |||||
'phid' => $phid, | |||||
'time' => $total, | |||||
'type' => $type); | |||||
} | |||||
} | |||||
return $results; | |||||
} | |||||
/** | /** | ||||
* Merge a list of time ranges (pairs of `<start, end>` epochs) so that no | * Merge a list of time ranges (pairs of `<start, end>` epochs) so that no | ||||
* elements overlap. For example, the ranges: | * elements overlap. For example, the ranges: | ||||
* | * | ||||
* array( | * array( | ||||
* array(50, 150), | * array(50, 150), | ||||
* array(100, 175), | * array(100, 175), | ||||
▲ Show 20 Lines • Show All 78 Lines • Show Last 20 Lines |