Path: blob/master/src/applications/fact/chart/PhabricatorFactChartFunction.php
12256 views
<?php12final class PhabricatorFactChartFunction3extends PhabricatorChartFunction {45const FUNCTIONKEY = 'fact';67private $fact;8private $map;9private $refs;1011protected function newArguments() {12$key_argument = $this->newArgument()13->setName('fact-key')14->setType('fact-key');1516$parser = $this->getArgumentParser();17$parser->parseArgument($key_argument);1819$fact = $this->getArgument('fact-key');20$this->fact = $fact;2122return $fact->getFunctionArguments();23}2425public function loadData() {26$fact = $this->fact;2728$key_id = id(new PhabricatorFactKeyDimension())29->newDimensionID($fact->getKey());30if (!$key_id) {31$this->map = array();32return;33}3435$table = $fact->newDatapoint();36$conn = $table->establishConnection('r');37$table_name = $table->getTableName();3839$where = array();4041$where[] = qsprintf(42$conn,43'keyID = %d',44$key_id);4546$parser = $this->getArgumentParser();4748$parts = $fact->buildWhereClauseParts($conn, $parser);49foreach ($parts as $part) {50$where[] = $part;51}5253$data = queryfx_all(54$conn,55'SELECT id, value, epoch FROM %T WHERE %LA ORDER BY epoch ASC',56$table_name,57$where);5859$map = array();60$refs = array();61if ($data) {62foreach ($data as $row) {63$ref = (string)$row['id'];64$value = (int)$row['value'];65$epoch = (int)$row['epoch'];6667if (!isset($map[$epoch])) {68$map[$epoch] = 0;69}7071$map[$epoch] += $value;7273if (!isset($refs[$epoch])) {74$refs[$epoch] = array();75}7677$refs[$epoch][] = $ref;78}79}8081$this->map = $map;82$this->refs = $refs;83}8485public function getDomain() {86$min = head_key($this->map);87$max = last_key($this->map);8889return new PhabricatorChartInterval($min, $max);90}9192public function newInputValues(PhabricatorChartDataQuery $query) {93return array_keys($this->map);94}9596public function evaluateFunction(array $xv) {97$map = $this->map;9899$yv = array();100101foreach ($xv as $x) {102if (isset($map[$x])) {103$yv[] = $map[$x];104} else {105$yv[] = null;106}107}108109return $yv;110}111112public function getDataRefs(array $xv) {113return array_select_keys($this->refs, $xv);114}115116public function loadRefs(array $refs) {117$fact = $this->fact;118119$datapoint_table = $fact->newDatapoint();120$conn = $datapoint_table->establishConnection('r');121122$dimension_table = new PhabricatorFactObjectDimension();123124$where = array();125126$where[] = qsprintf(127$conn,128'p.id IN (%Ld)',129$refs);130131132$rows = queryfx_all(133$conn,134'SELECT135p.id id,136p.value,137od.objectPHID objectPHID,138dd.objectPHID dimensionPHID139FROM %R p140LEFT JOIN %R od ON od.id = p.objectID141LEFT JOIN %R dd ON dd.id = p.dimensionID142WHERE %LA',143$datapoint_table,144$dimension_table,145$dimension_table,146$where);147$rows = ipull($rows, null, 'id');148149$results = array();150151foreach ($refs as $ref) {152if (!isset($rows[$ref])) {153continue;154}155156$row = $rows[$ref];157158$results[$ref] = array(159'objectPHID' => $row['objectPHID'],160'dimensionPHID' => $row['dimensionPHID'],161'value' => (float)$row['value'],162);163}164165return $results;166}167168}169170171