Skip to content

Commit

Permalink
refs #1816 ratio calculation should be a bit faster this way
Browse files Browse the repository at this point in the history
  • Loading branch information
tsteur committed Nov 20, 2013
1 parent a782e06 commit 552874c
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 51 deletions.
109 changes: 59 additions & 50 deletions core/API/DataTableManipulator/AddRatioColumn.php
Expand Up @@ -28,6 +28,11 @@
class AddRatioColumn extends DataTableManipulator
{
protected $roundPrecision = 1;

/**
* Array [readableMetric] => [summed value]
* @var array
*/
private $totalValues = array();
private static $reportMetadata = array();

Expand Down Expand Up @@ -55,28 +60,62 @@ protected function manipulateDataTable($dataTable)
}

$metricsToCalculate = Metrics::getMetricIdsToProcessRatio();
$parentTable = $this->getFirstLevelDataTable($dataTable);

$parentTable = $this->getFirstLevelDataTable($dataTable);

if ($parentTable instanceof DataTable\Map) {
// TODO
}
foreach ($metricsToCalculate as $metricId) {
if (!$this->hasDataTableMetric($parentTable, $metricId)) {
continue;
}

foreach ($parentTable->getRows() as $row) {
foreach ($metricsToCalculate as $metricId) {
foreach ($parentTable->getRows() as $row) {
$this->addColumnValueToTotal($row, $metricId);
}
}

foreach ($dataTable->getRows() as $row) {
foreach ($metricsToCalculate as $metricId) {
$this->addRatioColumnIfNeeded($row, $metricId);
foreach ($this->totalValues as $metricId => $totalValue) {
if (!$this->hasDataTableMetric($dataTable, $metricId)) {
continue;
}

foreach ($dataTable->getRows() as $row) {
$this->addRatioColumnIfPossible($row, $metricId, $totalValue);
}
}

return $dataTable;
}

protected function hasDataTableMetric(DataTable $dataTable, $metricId)
{
$firstRow = $dataTable->getFirstRow();

if (empty($firstRow)) {
return false;
}

if (false === $this->getColumn($firstRow, $metricId)) {
return false;
}

return true;
}

protected function getColumn($row, $columnIdRaw)
{
$columnIdReadable = Metrics::getReadableColumnName($columnIdRaw);

if ($row instanceof Row) {
$raw = $row->getColumn($columnIdRaw);
if ($raw !== false) {
return $raw;
}

return $row->getColumn($columnIdReadable);
}

return false;
}

protected function getCurrentReport()
{
foreach ($this->getReportMetadata() as $report) {
Expand Down Expand Up @@ -121,38 +160,33 @@ protected function getFirstLevelDataTable($table)
return $this->callApiAndReturnDataTable($module, $action, $request);
}

private function addColumnValueToTotal(Row $row, $columnIdRaw)
private function addColumnValueToTotal(Row $row, $metricId)
{
$value = $this->getColumn($row, $columnIdRaw);
$value = $this->getColumn($row, $metricId);

if (false === $value) {

return;
}

if (array_key_exists($columnIdRaw, $this->totalValues)) {
$this->totalValues[$columnIdRaw] += $value;
if (array_key_exists($metricId, $this->totalValues)) {
$this->totalValues[$metricId] += $value;
} else {
$this->totalValues[$columnIdRaw] = $value;
$this->totalValues[$metricId] = $value;
}
}

private function addRatioColumnIfNeeded(Row $row, $columnIdRaw)
private function addRatioColumnIfPossible(Row $row, $metricId, $totalValue)
{
if (!array_key_exists($columnIdRaw, $this->totalValues)) {
return;
}

$value = $this->getColumn($row, $columnIdRaw);
$value = $this->getColumn($row, $metricId);

if (false === $value) {
return;
}

$columnIdReadable = Metrics::getReadableColumnName($columnIdRaw);

$relativeValue = $this->getPercentage($value, $this->totalValues[$columnIdRaw]);
$ratioMetric = Metrics::makeReportRatioMetricName($columnIdReadable);
$relativeValue = $this->getPercentage($value, $totalValue);
$metricName = Metrics::getReadableColumnName($metricId);
$ratioMetric = Metrics::makeReportRatioMetricName($metricName);

$row->addColumn($ratioMetric, $relativeValue);
}
Expand All @@ -164,31 +198,6 @@ private function getPercentage($value, $totalValue)
return $percentage . '%';
}

/**
* Returns column from a given row.
* Will work with 2 types of datatable
* - raw datatables coming from the archive DB, which columns are int indexed
* - datatables processed resulting of API calls, which columns have human readable english names
*
* @param Row|array $row
* @param int $columnIdRaw see consts in Archive::
* @return mixed Value of column, false if not found
*/
protected function getColumn($row, $columnIdRaw)
{
$columnIdReadable = Metrics::getReadableColumnName($columnIdRaw);

if ($row instanceof Row) {
$raw = $row->getColumn($columnIdRaw);
if ($raw !== false) {
return $raw;
}
return $row->getColumn($columnIdReadable);
}

return false;
}

/**
* Make sure to get all rows of the first level table.
*
Expand Down
2 changes: 1 addition & 1 deletion plugins/CoreHome/templates/_dataTableCell.twig
Expand Up @@ -21,6 +21,6 @@
{% endif %}
{% if row.getMetadata(tooltipIndex) %}</span>{% endif %}
{% if row.getColumn([column, '_ratio_report']|join) -%}
<span class="ratio">&nbsp;{{ row.getColumn([column, '_ratio_report']|join) }}</span>
<span class="ratio">&nbsp;&nbsp;&nbsp;{{ row.getColumn([column, '_ratio_report']|join) }}</span>
{%- endif %}
{% endspaceless %}

0 comments on commit 552874c

Please sign in to comment.