@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.)
hq.recaptime.dev/wiki/Phorge
phorge
phabricator
1<?php
2
3abstract class PhabricatorChartDataset
4 extends Phobject {
5
6 private $functions;
7
8 final public function getDatasetTypeKey() {
9 return $this->getPhobjectClassConstant('DATASETKEY', 32);
10 }
11
12 final public function getFunctions() {
13 return $this->functions;
14 }
15
16 /**
17 * @param array<PhabricatorComposeChartFunction> $functions
18 */
19 final public function setFunctions(array $functions) {
20 assert_instances_of($functions, PhabricatorComposeChartFunction::class);
21
22 $this->functions = $functions;
23
24 return $this;
25 }
26
27 final public static function getAllDatasetTypes() {
28 return id(new PhutilClassMapQuery())
29 ->setAncestorClass(self::class)
30 ->setUniqueMethod('getDatasetTypeKey')
31 ->execute();
32 }
33
34 final public static function newFromDictionary(array $map) {
35 PhutilTypeSpec::checkMap(
36 $map,
37 array(
38 'type' => 'string',
39 'functions' => 'list<wild>',
40 ));
41
42 $types = self::getAllDatasetTypes();
43
44 $dataset_type = $map['type'];
45 if (!isset($types[$dataset_type])) {
46 throw new Exception(
47 pht(
48 'Trying to construct a dataset of type "%s", but this type is '.
49 'unknown. Supported types are: %s.',
50 $dataset_type,
51 implode(', ', array_keys($types))));
52 }
53
54 $dataset = id(clone $types[$dataset_type]);
55
56 $functions = array();
57 foreach ($map['functions'] as $map) {
58 $functions[] = PhabricatorChartFunction::newFromDictionary($map);
59 }
60 $dataset->setFunctions($functions);
61
62 return $dataset;
63 }
64
65 final public function getChartDisplayData(
66 PhabricatorChartDataQuery $data_query) {
67 return $this->newChartDisplayData($data_query);
68 }
69
70 abstract protected function newChartDisplayData(
71 PhabricatorChartDataQuery $data_query);
72
73 /**
74 * @param PhabricatorChartDataQuery $data_query
75 * @return PhabricatorChartDisplayData
76 */
77 final public function getTabularDisplayData(
78 PhabricatorChartDataQuery $data_query) {
79 $results = array();
80
81 $functions = $this->getFunctions();
82 foreach ($functions as $function) {
83 $datapoints = $function->newDatapoints($data_query);
84
85 $refs = $function->getDataRefs(ipull($datapoints, 'x'));
86
87 foreach ($datapoints as $key => $point) {
88 $x = $point['x'];
89
90 if (isset($refs[$x])) {
91 $xrefs = $refs[$x];
92 } else {
93 $xrefs = array();
94 }
95
96 $datapoints[$key]['refs'] = $xrefs;
97 }
98
99 $results[] = array(
100 'data' => $datapoints,
101 );
102 }
103
104 return id(new PhabricatorChartDisplayData())
105 ->setWireData($results);
106 }
107
108}