| <?php |
|
|
| |
| |
| |
| |
| |
| |
|
|
| namespace Piwik\Metrics; |
|
|
| use Piwik\DataTable; |
| use Piwik\DataTable\Row; |
| use Piwik\Metrics; |
| use Piwik\Plugin\Metric; |
|
|
| class Sorter |
| { |
| |
| |
| |
| private $config; |
|
|
| public function __construct(Sorter\Config $config) |
| { |
| $this->config = $config; |
| } |
|
|
| |
| |
| |
| |
| |
| public function sort(DataTable $table) |
| { |
| |
| |
|
|
| $table->setTableSortedBy($this->config->primaryColumnToSort); |
|
|
| $rows = $table->getRowsWithoutSummaryRow(); |
|
|
| |
| |
| $rowsWithValues = array(); |
| $rowsWithoutValues = array(); |
|
|
| $valuesToSort = array(); |
| foreach ($rows as $key => $row) { |
| $value = $this->getColumnValue($row); |
| if (isset($value)) { |
| $valuesToSort[] = $value; |
| $rowsWithValues[] = $row; |
| } else { |
| $rowsWithoutValues[] = $row; |
| } |
| } |
|
|
| unset($rows); |
|
|
| if ($this->config->isSecondaryColumnSortEnabled && $this->config->secondaryColumnToSort) { |
| $secondaryValues = array(); |
| foreach ($rowsWithValues as $key => $row) { |
| $secondaryValues[$key] = $row->getColumn($this->config->secondaryColumnToSort); |
| } |
|
|
| array_multisort($valuesToSort, $this->config->primarySortOrder, $this->config->primarySortFlags, $secondaryValues, $this->config->secondarySortOrder, $this->config->secondarySortFlags, $rowsWithValues); |
| } else { |
| array_multisort($valuesToSort, $this->config->primarySortOrder, $this->config->primarySortFlags, $rowsWithValues); |
| } |
|
|
| if (!empty($rowsWithoutValues) && $this->config->secondaryColumnToSort) { |
| $secondaryValues = array(); |
| foreach ($rowsWithoutValues as $key => $row) { |
| $secondaryValues[$key] = $row->getColumn($this->config->secondaryColumnToSort); |
| } |
|
|
| array_multisort($secondaryValues, $this->config->secondarySortOrder, $this->config->secondarySortFlags, $rowsWithoutValues); |
| } |
|
|
| unset($secondaryValues); |
|
|
| foreach ($rowsWithoutValues as $row) { |
| $rowsWithValues[] = $row; |
| } |
|
|
| $table->setRows(array_values($rowsWithValues)); |
| } |
|
|
| private function getColumnValue(Row $row) |
| { |
| $value = $row->getColumn($this->config->primaryColumnToSort); |
|
|
| if ($value === false || is_array($value)) { |
| return null; |
| } |
|
|
| return $value; |
| } |
|
|
| |
| |
| |
| |
| public function getPrimarySortOrder($order) |
| { |
| if ($order === 'asc') { |
| return SORT_ASC; |
| } |
|
|
| return SORT_DESC; |
| } |
|
|
| |
| |
| |
| |
| |
| public function getSecondarySortOrder($order, $secondarySortColumn) |
| { |
| if ($secondarySortColumn === 'label') { |
| $secondaryOrder = SORT_ASC; |
| if ($order === 'asc') { |
| $secondaryOrder = SORT_DESC; |
| } |
|
|
| return $secondaryOrder; |
| } |
|
|
| return $this->getPrimarySortOrder($order); |
| } |
|
|
| |
| |
| |
| |
| |
| |
| public function getPrimaryColumnToSort(DataTable $table, $columnToSort) |
| { |
| |
| $columnsToCheck = array($columnToSort, 'nb_visits'); |
|
|
| $row = $table->getFirstRow(); |
|
|
| foreach ($columnsToCheck as $column) { |
| $column = Metric::getActualMetricColumn($table, $column); |
|
|
| if ($row->hasColumn($column)) { |
| |
| return $column; |
| } |
| } |
|
|
| return $columnToSort; |
| } |
|
|
| |
| |
| |
| |
| |
| |
| public function getSecondaryColumnToSort(Row $row, $primaryColumnToSort) |
| { |
| $defaultSecondaryColumn = array(Metrics::INDEX_NB_VISITS, 'nb_visits'); |
|
|
| if (in_array($primaryColumnToSort, $defaultSecondaryColumn)) { |
| |
| $column = 'label'; |
| $value = $row->hasColumn($column); |
| if ($value !== false) { |
| return $column; |
| } |
|
|
| return null; |
| } |
|
|
| if ($primaryColumnToSort !== 'label') { |
| |
| $defaultSecondaryColumn[] = 'label'; |
| } |
|
|
| foreach ($defaultSecondaryColumn as $column) { |
| $value = $row->hasColumn($column); |
| if ($value !== false) { |
| return $column; |
| } |
| } |
|
|
| return null; |
| } |
|
|
| |
| |
| |
| |
| |
| |
| public function getBestSortFlags(DataTable $table, $columnToSort) |
| { |
| |
| if (isset($columnToSort) && $columnToSort !== 'label') { |
| foreach ($table->getRowsWithoutSummaryRow() as $row) { |
| $value = $row->getColumn($columnToSort); |
|
|
| if ($value !== false && $value !== null && !is_array($value)) { |
| if (is_numeric($value)) { |
| $sortFlags = SORT_NUMERIC; |
| } else { |
| $sortFlags = $this->getStringSortFlags(); |
| } |
|
|
| return $sortFlags; |
| } |
| } |
| } |
|
|
| return $this->getStringSortFlags(); |
| } |
|
|
| private function getStringSortFlags() |
| { |
| if ($this->config->naturalSort) { |
| $sortFlags = SORT_NATURAL | SORT_FLAG_CASE; |
| } else { |
| $sortFlags = SORT_STRING | SORT_FLAG_CASE; |
| } |
|
|
| return $sortFlags; |
| } |
| } |
|
|