From ea473cf08a661baac9de10864dbfebf0f44d1954 Mon Sep 17 00:00:00 2001 From: Johannes Meyer Date: Thu, 20 Mar 2014 13:21:18 +0100 Subject: [PATCH] Fix sorting of pivot tables --- library/Icinga/Data/BaseQuery.php | 10 +++++++++ library/Icinga/Data/PivotTable.php | 33 +++++++++++++++++++++++++++++- 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/library/Icinga/Data/BaseQuery.php b/library/Icinga/Data/BaseQuery.php index 6da7dbb13..ef25cd9ea 100644 --- a/library/Icinga/Data/BaseQuery.php +++ b/library/Icinga/Data/BaseQuery.php @@ -274,6 +274,16 @@ abstract class BaseQuery implements Filterable return $this; } + /** + * Set the columns used for ordering + * + * @param array $orderColumns + */ + public function setOrderColumns(array $orderColumns) + { + $this->orderColumns = $orderColumns; + } + /** * Determine the default sort direction constant for the given column * diff --git a/library/Icinga/Data/PivotTable.php b/library/Icinga/Data/PivotTable.php index 4d4b8fbd7..4a30741e5 100644 --- a/library/Icinga/Data/PivotTable.php +++ b/library/Icinga/Data/PivotTable.php @@ -58,11 +58,13 @@ class PivotTable $this->baseQuery = $query; $this->xAxisColumn = $xAxisColumn; $this->yAxisColumn = $yAxisColumn; - $this->prepareQueries(); + $this->prepareQueries()->adjustSorting(); } /** * Prepare the queries used for the pre processing + * + * @return self */ protected function prepareQueries() { @@ -72,6 +74,35 @@ class PivotTable $this->yAxisQuery = clone $this->baseQuery; $this->yAxisQuery->distinct(); $this->yAxisQuery->setColumns(array($this->yAxisColumn)); + + return $this; + } + + /** + * Set a default sorting for the x- and y-axis without losing any existing rules + * + * @return self + */ + protected function adjustSorting() + { + $currentOrderColumns = $this->baseQuery->getOrderColumns(); + $xAxisOrderColumns = array(array($this->baseQuery->getMappedField($this->xAxisColumn), BaseQuery::SORT_ASC)); + $yAxisOrderColumns = array(array($this->baseQuery->getMappedField($this->yAxisColumn), BaseQuery::SORT_ASC)); + + foreach ($currentOrderColumns as $orderInfo) { + if ($orderInfo[0] === $xAxisOrderColumns[0][0]) { + $xAxisOrderColumns[0] = $orderInfo; + } elseif ($orderInfo[0] === $yAxisOrderColumns[0][0]) { + $yAxisOrderColumns[0] = $orderInfo; + } else { + $xAxisOrderColumns[] = $orderInfo; + $yAxisOrderColumns[] = $orderInfo; + } + } + + $this->xAxisQuery->setOrderColumns($xAxisOrderColumns); + $this->yAxisQuery->setOrderColumns($yAxisOrderColumns); + return $this; } /**