From 1fbca25d99bbdf2804bcd53962cfd86051b4f604 Mon Sep 17 00:00:00 2001 From: Thomas Gelf Date: Fri, 6 Jun 2014 06:21:35 +0000 Subject: [PATCH] Data\DataArray: use SimpleQuery and new interfaces Removed ArrayQuery implementation as SimpleQuery is enough here. Renamed the Datasource class to ArrayDatasource. refs #6418 --- application/controllers/ConfigController.php | 1 + .../Icinga/Application/Modules/Manager.php | 6 +- .../{Datasource.php => ArrayDatasource.php} | 62 +++++++++--- library/Icinga/Data/DataArray/Query.php | 99 ------------------- library/Icinga/Data/Filterable.php | 2 +- 5 files changed, 52 insertions(+), 118 deletions(-) rename library/Icinga/Data/DataArray/{Datasource.php => ArrayDatasource.php} (60%) delete mode 100644 library/Icinga/Data/DataArray/Query.php diff --git a/application/controllers/ConfigController.php b/application/controllers/ConfigController.php index 009990b06..d34ee516f 100644 --- a/application/controllers/ConfigController.php +++ b/application/controllers/ConfigController.php @@ -156,6 +156,7 @@ class ConfigController extends BaseConfigController $this->view->modules = Icinga::app()->getModuleManager()->select() ->from('modules') + ->order('enabled', 'desc') ->order('name'); $this->render('module/overview'); } diff --git a/library/Icinga/Application/Modules/Manager.php b/library/Icinga/Application/Modules/Manager.php index c0e835c8d..e38383188 100644 --- a/library/Icinga/Application/Modules/Manager.php +++ b/library/Icinga/Application/Modules/Manager.php @@ -32,8 +32,8 @@ namespace Icinga\Application\Modules; use Icinga\Application\ApplicationBootstrap; use Icinga\Application\Icinga; use Icinga\Logger\Logger; -use Icinga\Data\DataArray\Datasource as ArrayDatasource; -use Icinga\Data\DataArray\Query as ArrayQuery; +use Icinga\Data\DataArray\ArrayDatasource; +use Icinga\Data\SimpleQuery; use Icinga\Exception\ConfigurationError; use Icinga\Exception\SystemPermissionException; use Icinga\Exception\ProgrammingError; @@ -110,7 +110,7 @@ class Manager /** * Query interface for the module manager * - * @return ArrayQuery + * @return SimpleQuery */ public function select() { diff --git a/library/Icinga/Data/DataArray/Datasource.php b/library/Icinga/Data/DataArray/ArrayDatasource.php similarity index 60% rename from library/Icinga/Data/DataArray/Datasource.php rename to library/Icinga/Data/DataArray/ArrayDatasource.php index 0f1936935..55dc597f0 100644 --- a/library/Icinga/Data/DataArray/Datasource.php +++ b/library/Icinga/Data/DataArray/ArrayDatasource.php @@ -2,11 +2,14 @@ namespace Icinga\Data\DataArray; -use Icinga\Data\DatasourceInterface; +use Icinga\Data\Selectable; +use Icinga\Data\SimpleQuery; -class Datasource implements DatasourceInterface +class ArrayDatasource implements Selectable { protected $data; + + protected $result; /** * Constructor, create a new Datasource for the given Array @@ -21,14 +24,14 @@ class Datasource implements DatasourceInterface /** * Instantiate a Query object * - * @return Query + * @return SimpleQuery */ public function select() { - return new Query($this); + return new SimpleQuery($this); } - public function fetchColumn(Query $query) + public function fetchColumn(SimpleQuery $query) { $result = array(); foreach ($this->getResult($query) as $row) { @@ -38,7 +41,7 @@ class Datasource implements DatasourceInterface return $result; } - public function fetchPairs(Query $query) + public function fetchPairs(SimpleQuery $query) { $result = array(); $keys = null; @@ -54,27 +57,31 @@ class Datasource implements DatasourceInterface return $result; } - public function fetchAll(Query $query) + public function fetchAll(SimpleQuery $query) { return $this->getResult($query); } - public function count(Query $query) + public function count(SimpleQuery $query) { $this->createResult($query); - return $query->getCount(); + return count($this->result); } - protected function createResult(Query $query) + protected function createResult(SimpleQuery $query) { - if ($query->hasResult()) { + if ($this->hasResult()) { return $this; } $result = array(); $columns = $query->getColumns(); + $filter = $query->getFilter(); foreach ($this->data as & $row) { + if (! $filter->matches($row)) { + continue; + } // Get only desired columns if asked so if (empty($columns)) { @@ -96,19 +103,44 @@ class Datasource implements DatasourceInterface } // Sort the result + if ($query->hasOrder()) { usort($result, array($query, 'compare')); } - $query->setResult($result); + $this->setResult($result); return $this; } - protected function getResult(Query $query) + protected function getLimitedResult($query) { - if (! $query->hasResult()) { + if ($query->hasLimit()) { + if ($query->hasOffset()) { + $offset = $query->getOffset(); + } else { + $offset = 0; + } + return array_slice($this->result, $offset, $query->getLimit()); + } else { + return $this->result; + } + } + + protected function hasResult() + { + return $this->result !== null; + } + + protected function setResult($result) + { + return $this->result = $result; + } + + protected function getResult(SimpleQuery $query) + { + if (! $this->hasResult()) { $this->createResult($query); } - return $query->getLimitedResult(); + return $this->getLimitedResult($query); } } diff --git a/library/Icinga/Data/DataArray/Query.php b/library/Icinga/Data/DataArray/Query.php deleted file mode 100644 index 2f4129e52..000000000 --- a/library/Icinga/Data/DataArray/Query.php +++ /dev/null @@ -1,99 +0,0 @@ -count; - } - - public function hasResult() - { - return $this->result !== null; - } - - public function getFullResult() - { - return $this->result; - } - - public function getLimitedResult() - { - if ($this->hasLimit()) { - if ($this->hasOffset()) { - $offset = $this->getOffset(); - } else { - $offset = 0; - } - return array_slice($this->result, $offset, $this->getLimit()); - } else { - return $this->result; - } - } - - public function setResult($result) - { - $this->result = $result; - $this->count = count($result); - return $this; - } - - /** - * ArrayDatasource will apply this function to sort the array - * - * @param mixed $a Left side comparsion value - * @param mixed $b Right side comparsion value - * @param int $col_num Current position in order_columns array - * - * @return int - */ - public function compare(& $a, & $b, $col_num = 0) - { - $orderColumns = $this->getOrderColumns(); - if (! array_key_exists($col_num, $orderColumns)) { - return 0; - } - - $col = $orderColumns[$col_num][0]; - $dir = $orderColumns[$col_num][1]; - - //$res = strnatcmp(strtolower($a->$col), strtolower($b->$col)); - $res = strcmp(strtolower($a->$col), strtolower($b->$col)); - if ($res === 0) { - if (array_key_exists(++$col_num, $orderColumns)) { - return $this->compare($a, $b, $col_num); - } else { - return 0; - } - } - if ($dir === self::SORT_ASC) { - return $res; - } else { - return $res * -1; - } - } - - public function parseFilterExpression($expression, $parameters = null) - { - return null; - } - - public function applyFilter() - { - return null; - } -} diff --git a/library/Icinga/Data/Filterable.php b/library/Icinga/Data/Filterable.php index f9746fbd8..d33dcabf4 100644 --- a/library/Icinga/Data/Filterable.php +++ b/library/Icinga/Data/Filterable.php @@ -13,7 +13,7 @@ interface Filterable public function setFilter(Filter $filter); - public function getFilter(Filter $filter); + public function getFilter(); public function addFilter(Filter $filter);