@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
fork

Configure Feed

Select the types of activity you want to include in your feed.

Wrap "<min, max>" chart domain pairs in an "Interval" class

Summary: Ref T13279. Slightly simplify domain handling by putting all the "[x, y]" stuff in an Interval class. I'm planning to do something similar for ranges next, so this should make that easierr.

Test Plan: Viewed chart, saw same chart as before.

Reviewers: amckinley

Reviewed By: amckinley

Subscribers: yelirekim

Maniphest Tasks: T13279

Differential Revision: https://secure.phabricator.com/D20502

+86 -68
+2
src/__phutil_library_map__.php
··· 2669 2669 'PhabricatorChartFunctionArgument' => 'applications/fact/chart/PhabricatorChartFunctionArgument.php', 2670 2670 'PhabricatorChartFunctionArgumentParser' => 'applications/fact/chart/PhabricatorChartFunctionArgumentParser.php', 2671 2671 'PhabricatorChartFunctionLabel' => 'applications/fact/chart/PhabricatorChartFunctionLabel.php', 2672 + 'PhabricatorChartInterval' => 'applications/fact/chart/PhabricatorChartInterval.php', 2672 2673 'PhabricatorChartRenderingEngine' => 'applications/fact/engine/PhabricatorChartRenderingEngine.php', 2673 2674 'PhabricatorChartStackedAreaDataset' => 'applications/fact/chart/PhabricatorChartStackedAreaDataset.php', 2674 2675 'PhabricatorChatLogApplication' => 'applications/chatlog/application/PhabricatorChatLogApplication.php', ··· 8685 8686 'PhabricatorChartFunctionArgument' => 'Phobject', 8686 8687 'PhabricatorChartFunctionArgumentParser' => 'Phobject', 8687 8688 'PhabricatorChartFunctionLabel' => 'Phobject', 8689 + 'PhabricatorChartInterval' => 'Phobject', 8688 8690 'PhabricatorChartRenderingEngine' => 'Phobject', 8689 8691 'PhabricatorChartStackedAreaDataset' => 'PhabricatorChartDataset', 8690 8692 'PhabricatorChatLogApplication' => 'PhabricatorApplication',
+62
src/applications/fact/chart/PhabricatorChartInterval.php
··· 1 + <?php 2 + 3 + final class PhabricatorChartInterval 4 + extends Phobject { 5 + 6 + private $min; 7 + private $max; 8 + 9 + public function __construct($min, $max) { 10 + $this->min = $min; 11 + $this->max = $max; 12 + } 13 + 14 + public static function newFromIntervalList(array $intervals) { 15 + $min = null; 16 + $max = null; 17 + foreach ($intervals as $interval) { 18 + if ($interval === null) { 19 + continue; 20 + } 21 + 22 + $interval_min = $interval->getMin(); 23 + if ($interval_min !== null) { 24 + if ($min === null) { 25 + $min = $interval_min; 26 + } else { 27 + $min = min($min, $interval_min); 28 + } 29 + } 30 + 31 + $interval_max = $interval->getMax(); 32 + if ($interval_max !== null) { 33 + if ($max === null) { 34 + $max = $interval_max; 35 + } else { 36 + $max = max($max, $interval_max); 37 + } 38 + } 39 + } 40 + 41 + return new self($min, $max); 42 + } 43 + 44 + public function setMin($min) { 45 + $this->min = $min; 46 + return $this; 47 + } 48 + 49 + public function getMin() { 50 + return $this->min; 51 + } 52 + 53 + public function setMax($max) { 54 + $this->max = $max; 55 + return $this; 56 + } 57 + 58 + public function getMax() { 59 + return $this->max; 60 + } 61 + 62 + }
+4 -4
src/applications/fact/chart/PhabricatorFactChartFunction.php
··· 73 73 } 74 74 75 75 public function getDomain() { 76 - return array( 77 - head_key($this->map), 78 - last_key($this->map), 79 - ); 76 + $min = head_key($this->map); 77 + $max = last_key($this->map); 78 + 79 + return new PhabricatorChartInterval($min, $max); 80 80 } 81 81 82 82 public function newInputValues(PhabricatorChartDataQuery $query) {
+3 -28
src/applications/fact/chart/PhabricatorHigherOrderChartFunction.php
··· 4 4 extends PhabricatorChartFunction { 5 5 6 6 public function getDomain() { 7 - $minv = array(); 8 - $maxv = array(); 7 + $domains = array(); 9 8 foreach ($this->getFunctionArguments() as $function) { 10 - $domain = $function->getDomain(); 11 - if ($domain !== null) { 12 - list($min, $max) = $domain; 13 - if ($min !== null) { 14 - $minv[] = $min; 15 - } 16 - if ($max !== null) { 17 - $maxv[] = $max; 18 - } 19 - } 9 + $domains[] = $function->getDomain(); 20 10 } 21 11 22 - if (!$minv && !$maxv) { 23 - return null; 24 - } 25 - 26 - $min = null; 27 - $max = null; 28 - 29 - if ($minv) { 30 - $min = min($minv); 31 - } 32 - 33 - if ($maxv) { 34 - $max = max($maxv); 35 - } 36 - 37 - return array($min, $max); 12 + return PhabricatorChartInterval::newFromIntervalList($domains); 38 13 } 39 14 40 15 public function newInputValues(PhabricatorChartDataQuery $query) {
+15 -36
src/applications/fact/engine/PhabricatorChartRenderingEngine.php
··· 133 133 $subfunction->loadData(); 134 134 } 135 135 136 - list($domain_min, $domain_max) = $this->getDomain($functions); 136 + $domain = $this->getDomain($functions); 137 137 138 138 $axis = id(new PhabricatorChartAxis()) 139 - ->setMinimumValue($domain_min) 140 - ->setMaximumValue($domain_max); 139 + ->setMinimumValue($domain->getMin()) 140 + ->setMaximumValue($domain->getMax()); 141 141 142 142 $data_query = id(new PhabricatorChartDataQuery()) 143 - ->setMinimumValue($domain_min) 144 - ->setMaximumValue($domain_max) 143 + ->setMinimumValue($domain->getMin()) 144 + ->setMaximumValue($domain->getMax()) 145 145 ->setLimit(2000); 146 146 147 147 $wire_datasets = array(); ··· 155 155 156 156 $chart_data = array( 157 157 'datasets' => $wire_datasets, 158 - 'xMin' => $domain_min, 159 - 'xMax' => $domain_max, 158 + 'xMin' => $domain->getMin(), 159 + 'xMax' => $domain->getMax(), 160 160 'yMin' => $y_min, 161 161 'yMax' => $y_max, 162 162 ); ··· 165 165 } 166 166 167 167 private function getDomain(array $functions) { 168 - $domain_min_list = null; 169 - $domain_max_list = null; 170 - 168 + $domains = array(); 171 169 foreach ($functions as $function) { 172 - $domain = $function->getDomain(); 173 - 174 - list($function_min, $function_max) = $domain; 175 - 176 - if ($function_min !== null) { 177 - $domain_min_list[] = $function_min; 178 - } 179 - 180 - if ($function_max !== null) { 181 - $domain_max_list[] = $function_max; 182 - } 170 + $domains[] = $function->getDomain(); 183 171 } 184 172 185 - $domain_min = null; 186 - $domain_max = null; 187 - 188 - if ($domain_min_list) { 189 - $domain_min = min($domain_min_list); 190 - } 191 - 192 - if ($domain_max_list) { 193 - $domain_max = max($domain_max_list); 194 - } 173 + $domain = PhabricatorChartInterval::newFromIntervalList($domains); 195 174 196 175 // If we don't have any domain data from the actual functions, pick a 197 176 // plausible domain automatically. 198 177 199 - if ($domain_max === null) { 200 - $domain_max = PhabricatorTime::getNow(); 178 + if ($domain->getMax() === null) { 179 + $domain->setMax(PhabricatorTime::getNow()); 201 180 } 202 181 203 - if ($domain_min === null) { 204 - $domain_min = $domain_max - phutil_units('365 days in seconds'); 182 + if ($domain->getMin() === null) { 183 + $domain->setMin($domain->getMax() - phutil_units('365 days in seconds')); 205 184 } 206 185 207 - return array($domain_min, $domain_max); 186 + return $domain; 208 187 } 209 188 210 189 }