Changeset View
Changeset View
Standalone View
Standalone View
src/applications/fact/chart/PhabricatorFactChartFunction.php
<?php | <?php | ||||
final class PhabricatorFactChartFunction | final class PhabricatorFactChartFunction | ||||
extends PhabricatorChartFunction { | extends PhabricatorChartFunction { | ||||
const FUNCTIONKEY = 'fact'; | const FUNCTIONKEY = 'fact'; | ||||
private $fact; | private $fact; | ||||
private $datapoints; | private $map; | ||||
protected function newArguments() { | protected function newArguments() { | ||||
$key_argument = $this->newArgument() | $key_argument = $this->newArgument() | ||||
->setName('fact-key') | ->setName('fact-key') | ||||
->setType('fact-key'); | ->setType('fact-key'); | ||||
$parser = $this->getArgumentParser(); | $parser = $this->getArgumentParser(); | ||||
$parser->parseArgument($key_argument); | $parser->parseArgument($key_argument); | ||||
Show All 21 Lines | $data = queryfx_all( | ||||
$conn, | $conn, | ||||
'SELECT value, epoch FROM %T WHERE keyID = %d ORDER BY epoch ASC', | 'SELECT value, epoch FROM %T WHERE keyID = %d ORDER BY epoch ASC', | ||||
$table_name, | $table_name, | ||||
$key_id); | $key_id); | ||||
if (!$data) { | if (!$data) { | ||||
return; | return; | ||||
} | } | ||||
$points = array(); | $map = array(); | ||||
foreach ($data as $row) { | |||||
$value = (int)$row['value']; | |||||
$epoch = (int)$row['epoch']; | |||||
$sum = 0; | if (!isset($map[$epoch])) { | ||||
foreach ($data as $key => $row) { | $map[$epoch] = 0; | ||||
$sum += (int)$row['value']; | |||||
$points[] = array( | |||||
'x' => (int)$row['epoch'], | |||||
'y' => $sum, | |||||
); | |||||
} | } | ||||
$this->datapoints = $points; | $map[$epoch] += $value; | ||||
} | } | ||||
public function getDatapoints(PhabricatorChartDataQuery $query) { | $this->map = $map; | ||||
$points = $this->datapoints; | |||||
if (!$points) { | |||||
return array(); | |||||
} | } | ||||
$x_min = $query->getMinimumValue(); | public function getDomain() { | ||||
$x_max = $query->getMaximumValue(); | return array( | ||||
$limit = $query->getLimit(); | head_key($this->map), | ||||
last_key($this->map), | |||||
if ($x_min !== null) { | ); | ||||
foreach ($points as $key => $point) { | |||||
if ($point['x'] < $x_min) { | |||||
unset($points[$key]); | |||||
} | |||||
} | |||||
} | } | ||||
if ($x_max !== null) { | public function newInputValues(PhabricatorChartDataQuery $query) { | ||||
foreach ($points as $key => $point) { | return array_keys($this->map); | ||||
if ($point['x'] > $x_max) { | |||||
unset($points[$key]); | |||||
} | |||||
} | |||||
} | } | ||||
// If we have too many data points, throw away some of the data. | public function evaluateFunction(array $xv) { | ||||
if ($limit !== null) { | $map = $this->map; | ||||
$count = count($points); | |||||
if ($count > $limit) { | |||||
$ii = 0; | |||||
$every = ceil($count / $limit); | |||||
foreach ($points as $key => $point) { | |||||
$ii++; | |||||
if (($ii % $every) && ($ii != $count)) { | |||||
unset($points[$key]); | |||||
} | |||||
} | |||||
} | |||||
} | |||||
return $points; | $yv = array(); | ||||
} | |||||
public function hasDomain() { | foreach ($xv as $x) { | ||||
return true; | if (isset($map[$x])) { | ||||
$yv[] = $map[$x]; | |||||
} else { | |||||
$yv[] = null; | |||||
} | |||||
} | } | ||||
public function getDomain() { | return $yv; | ||||
// TODO: We can examine the data to fit a better domain. | |||||
$now = PhabricatorTime::getNow(); | |||||
return array($now - phutil_units('90 days in seconds'), $now); | |||||
} | } | ||||
} | } |