Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F14621477
D20442.id48749.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
8 KB
Referenced Files
None
Subscribers
None
D20442.id48749.diff
View Options
diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php
--- a/src/__phutil_library_map__.php
+++ b/src/__phutil_library_map__.php
@@ -2644,7 +2644,8 @@
'PhabricatorChangeParserTestCase' => 'applications/repository/worker/__tests__/PhabricatorChangeParserTestCase.php',
'PhabricatorChangesetCachePurger' => 'applications/cache/purger/PhabricatorChangesetCachePurger.php',
'PhabricatorChangesetResponse' => 'infrastructure/diff/PhabricatorChangesetResponse.php',
- 'PhabricatorChartFunction' => 'applications/fact/function/PhabricatorChartFunction.php',
+ 'PhabricatorChartAxis' => 'applications/fact/chart/PhabricatorChartAxis.php',
+ 'PhabricatorChartFunction' => 'applications/fact/chart/PhabricatorChartFunction.php',
'PhabricatorChatLogApplication' => 'applications/chatlog/application/PhabricatorChatLogApplication.php',
'PhabricatorChatLogChannel' => 'applications/chatlog/storage/PhabricatorChatLogChannel.php',
'PhabricatorChatLogChannelListController' => 'applications/chatlog/controller/PhabricatorChatLogChannelListController.php',
@@ -3199,7 +3200,7 @@
'PhabricatorFactApplication' => 'applications/fact/application/PhabricatorFactApplication.php',
'PhabricatorFactChart' => 'applications/fact/storage/PhabricatorFactChart.php',
'PhabricatorFactChartController' => 'applications/fact/controller/PhabricatorFactChartController.php',
- 'PhabricatorFactChartFunction' => 'applications/fact/function/PhabricatorFactChartFunction.php',
+ 'PhabricatorFactChartFunction' => 'applications/fact/chart/PhabricatorFactChartFunction.php',
'PhabricatorFactController' => 'applications/fact/controller/PhabricatorFactController.php',
'PhabricatorFactCursor' => 'applications/fact/storage/PhabricatorFactCursor.php',
'PhabricatorFactDAO' => 'applications/fact/storage/PhabricatorFactDAO.php',
@@ -8609,6 +8610,7 @@
'PhabricatorChangeParserTestCase' => 'PhabricatorWorkingCopyTestCase',
'PhabricatorChangesetCachePurger' => 'PhabricatorCachePurger',
'PhabricatorChangesetResponse' => 'AphrontProxyResponse',
+ 'PhabricatorChartAxis' => 'Phobject',
'PhabricatorChartFunction' => 'Phobject',
'PhabricatorChatLogApplication' => 'PhabricatorApplication',
'PhabricatorChatLogChannel' => array(
diff --git a/src/applications/fact/chart/PhabricatorChartAxis.php b/src/applications/fact/chart/PhabricatorChartAxis.php
new file mode 100644
--- /dev/null
+++ b/src/applications/fact/chart/PhabricatorChartAxis.php
@@ -0,0 +1,27 @@
+<?php
+
+final class PhabricatorChartAxis
+ extends Phobject {
+
+ private $minimumValue;
+ private $maximumValue;
+
+ public function setMinimumValue($minimum_value) {
+ $this->minimumValue = $minimum_value;
+ return $this;
+ }
+
+ public function getMinimumValue() {
+ return $this->minimumValue;
+ }
+
+ public function setMaximumValue($maximum_value) {
+ $this->maximumValue = $maximum_value;
+ return $this;
+ }
+
+ public function getMaximumValue() {
+ return $this->maximumValue;
+ }
+
+}
diff --git a/src/applications/fact/function/PhabricatorChartFunction.php b/src/applications/fact/chart/PhabricatorChartFunction.php
rename from src/applications/fact/function/PhabricatorChartFunction.php
rename to src/applications/fact/chart/PhabricatorChartFunction.php
--- a/src/applications/fact/function/PhabricatorChartFunction.php
+++ b/src/applications/fact/chart/PhabricatorChartFunction.php
@@ -3,6 +3,10 @@
abstract class PhabricatorChartFunction
extends Phobject {
+ private $xAxis;
+ private $yAxis;
+ private $limit;
+
final public function getFunctionKey() {
return $this->getPhobjectClassConstant('FUNCTIONKEY', 32);
}
@@ -21,4 +25,22 @@
abstract protected function newArguments(array $arguments);
+ final public function setXAxis(PhabricatorChartAxis $x_axis) {
+ $this->xAxis = $x_axis;
+ return $this;
+ }
+
+ final public function getXAxis() {
+ return $this->xAxis;
+ }
+
+ final public function setYAxis(PhabricatorChartAxis $y_axis) {
+ $this->yAxis = $y_axis;
+ return $this;
+ }
+
+ final public function getYAxis() {
+ return $this->yAxis;
+ }
+
}
diff --git a/src/applications/fact/function/PhabricatorFactChartFunction.php b/src/applications/fact/chart/PhabricatorFactChartFunction.php
rename from src/applications/fact/function/PhabricatorFactChartFunction.php
rename to src/applications/fact/chart/PhabricatorFactChartFunction.php
--- a/src/applications/fact/function/PhabricatorFactChartFunction.php
+++ b/src/applications/fact/chart/PhabricatorFactChartFunction.php
@@ -83,6 +83,26 @@
return array();
}
+ $axis = $this->getXAxis();
+ $x_min = $axis->getMinimumValue();
+ $x_max = $axis->getMaximumValue();
+
+ if ($x_min !== null) {
+ foreach ($points as $key => $point) {
+ if ($point['x'] < $x_min) {
+ unset($points[$key]);
+ }
+ }
+ }
+
+ if ($x_max !== null) {
+ foreach ($points as $key => $point) {
+ if ($point['x'] > $x_max) {
+ unset($points[$key]);
+ }
+ }
+ }
+
// If we have too many data points, throw away some of the data.
$count = count($points);
if ($count > $limit) {
@@ -99,4 +119,15 @@
return $points;
}
+ public function hasDomain() {
+ return true;
+ }
+
+ public function getDomain() {
+ // TODO: We can examine the data to fit a better domain.
+
+ $now = PhabricatorTime::getNow();
+ return array($now - phutil_units('90 days in seconds'), $now);
+ }
+
}
diff --git a/src/applications/fact/controller/PhabricatorFactChartController.php b/src/applications/fact/controller/PhabricatorFactChartController.php
--- a/src/applications/fact/controller/PhabricatorFactChartController.php
+++ b/src/applications/fact/controller/PhabricatorFactChartController.php
@@ -24,8 +24,16 @@
return $this->newChartResponse();
}
+ list($domain_min, $domain_max) = $this->getDomain($functions);
+
+ $axis = id(new PhabricatorChartAxis())
+ ->setMinimumValue($domain_min)
+ ->setMaximumValue($domain_max);
+
$datasets = array();
foreach ($functions as $function) {
+ $function->setXAxis($axis);
+
$function->loadData();
$points = $function->getDatapoints(2000);
@@ -45,10 +53,9 @@
);
}
+
$y_min = 0;
$y_max = 0;
- $x_min = null;
- $x_max = 0;
foreach ($datasets as $dataset) {
if (!$dataset['y']) {
continue;
@@ -56,20 +63,12 @@
$y_min = min($y_min, min($dataset['y']));
$y_max = max($y_max, max($dataset['y']));
-
- if ($x_min === null) {
- $x_min = min($dataset['x']);
- } else {
- $x_min = min($x_min, min($dataset['x']));
- }
-
- $x_max = max($x_max, max($dataset['x']));
}
$chart_data = array(
'datasets' => $datasets,
- 'xMin' => $x_min,
- 'xMax' => $x_max,
+ 'xMin' => $domain_min,
+ 'xMax' => $domain_max,
'yMin' => $y_min,
'yMax' => $y_max,
);
@@ -117,4 +116,50 @@
}
+ private function getDomain(array $functions) {
+ $domain_min_list = null;
+ $domain_max_list = null;
+ foreach ($functions as $function) {
+ if ($function->hasDomain()) {
+ $domain = $function->getDomain();
+
+ $domain_min = $domain[0];
+ $domain_max = $domain[1];
+
+ if ($domain_min !== null) {
+ $domain_min_list[] = $domain_min;
+ }
+
+ if ($domain_max !== null) {
+ $domain_max_list[] = $domain_max;
+ }
+ }
+ }
+
+ $domain_min = null;
+ $domain_max = null;
+
+ if ($domain_min_list) {
+ $domain_min = min($domain_min_list);
+ }
+
+ if ($domain_max_list) {
+ $domain_max = max($domain_max_list);
+ }
+
+ // If we don't have any domain data from the actual functions, pick a
+ // plausible domain automatically.
+
+ if ($domain_max === null) {
+ $domain_max = PhabricatorTime::getNow();
+ }
+
+ if ($domain_min === null) {
+ $domain_min = $domain_max - phutil_units('365 days in seconds');
+ }
+
+ return array($domain_min, $domain_max);
+ }
+
+
}
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sat, Jan 11, 6:56 AM (9 h, 40 m)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
6984751
Default Alt Text
D20442.id48749.diff (8 KB)
Attached To
Mode
D20442: Select the domain (X-axis range) for charts before pulling data
Attached
Detach File
Event Timeline
Log In to Comment