2013-06-07 11:44:37 +02:00
|
|
|
<?php
|
|
|
|
|
|
|
|
namespace Icinga\Data;
|
|
|
|
|
|
|
|
class ArrayDatasource implements DatasourceInterface
|
|
|
|
{
|
|
|
|
protected $data;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Constructor, create a new Datasource for the given Array
|
|
|
|
*
|
|
|
|
* @param array $array The array you're going to use as a data source
|
|
|
|
*/
|
|
|
|
public function __construct(array $array)
|
|
|
|
{
|
|
|
|
$this->data = (array) $array;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Instantiate an ArrayQuery object
|
|
|
|
*
|
|
|
|
* @return ArrayQuery
|
|
|
|
*/
|
|
|
|
public function select()
|
|
|
|
{
|
|
|
|
return new ArrayQuery($this);
|
|
|
|
}
|
|
|
|
|
|
|
|
public function fetchColumn(ArrayQuery $query)
|
|
|
|
{
|
|
|
|
$result = array();
|
|
|
|
foreach ($this->getResult($query) as $row) {
|
|
|
|
$arr = (array) $row;
|
|
|
|
$result[] = array_shift($arr);
|
|
|
|
}
|
|
|
|
return $result;
|
|
|
|
}
|
|
|
|
|
2013-07-12 13:40:21 +02:00
|
|
|
public function fetchPairs(ArrayQuery $query)
|
|
|
|
{
|
|
|
|
$result = array();
|
|
|
|
$keys = null;
|
|
|
|
foreach ($this->getResult($query) as $row) {
|
|
|
|
if ($keys === null) {
|
|
|
|
$keys = array_keys((array) $row);
|
|
|
|
if (count($keys) < 2) {
|
|
|
|
$keys[1] = $keys[0];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
$result[$row->{$keys[0]}] = $row->{$keys[1]};
|
|
|
|
}
|
|
|
|
return $result;
|
|
|
|
}
|
|
|
|
|
2013-06-07 11:44:37 +02:00
|
|
|
public function fetchAll(ArrayQuery $query)
|
|
|
|
{
|
|
|
|
$result = $this->getResult($query);
|
|
|
|
return $result;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function count(ArrayQuery $query)
|
|
|
|
{
|
|
|
|
$this->createResult($query);
|
|
|
|
return $query->getCount();
|
|
|
|
}
|
|
|
|
|
|
|
|
protected function createResult(ArrayQuery $query)
|
|
|
|
{
|
|
|
|
if ($query->hasResult()) {
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
$result = array();
|
|
|
|
$filters = $query->listFilters();
|
|
|
|
$columns = $query->listColumns();
|
|
|
|
foreach ($this->data as & $row) {
|
|
|
|
|
|
|
|
// Skip rows that do not match applied filters
|
|
|
|
foreach ($filters as $f) {
|
|
|
|
if ($row->{$f[0]} !== $f[1]) {
|
|
|
|
continue 2;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Get only desired columns if asked so
|
|
|
|
if (empty($columns)) {
|
|
|
|
$result[] = $row;
|
|
|
|
} else {
|
|
|
|
$c_row = (object) array();
|
2013-07-12 13:40:21 +02:00
|
|
|
foreach ($columns as $alias => $key) {
|
|
|
|
if (is_int($alias)) {
|
|
|
|
$alias = $key;
|
|
|
|
}
|
2013-06-07 11:44:37 +02:00
|
|
|
if (isset($row->$key)) {
|
2013-07-12 13:40:21 +02:00
|
|
|
$c_row->$alias = $row->$key;
|
2013-06-07 11:44:37 +02:00
|
|
|
} else {
|
2013-07-12 13:40:21 +02:00
|
|
|
$c_row->$alias = null;
|
2013-06-07 11:44:37 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
$result[] = $c_row;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Sort the result
|
|
|
|
if ($query->hasOrder()) {
|
|
|
|
usort($result, array($query, 'compare'));
|
|
|
|
}
|
|
|
|
|
|
|
|
$query->setResult($result);
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
protected function getResult(ArrayQuery $query)
|
|
|
|
{
|
|
|
|
if (! $query->hasResult()) {
|
|
|
|
$this->createResult($query);
|
|
|
|
}
|
|
|
|
return $query->getLimitedResult();
|
|
|
|
}
|
|
|
|
}
|