/**
  * Query vertical (y) axis
  *
  * @return  SimpleQuery
  */
 protected function queryYAxis()
 {
     if ($this->yAxisQuery === null) {
         $this->yAxisQuery = clone $this->baseQuery;
         $this->yAxisQuery->group($this->yAxisColumn);
         $this->yAxisQuery->columns(array($this->yAxisColumn));
         $this->yAxisQuery->setUseSubqueryCount();
         if ($this->yAxisFilter !== null) {
             $this->yAxisQuery->addFilter($this->yAxisFilter);
         }
         if (!$this->yAxisQuery->hasOrder($this->yAxisColumn)) {
             $this->yAxisQuery->order($this->yAxisColumn, 'asc');
         }
     }
     return $this->yAxisQuery;
 }
 /**
  * Create and return the result for the given query
  *
  * @param   SimpleQuery     $query
  *
  * @return  array
  */
 protected function createResult(SimpleQuery $query)
 {
     $columns = $query->getColumns();
     $filter = $query->getFilter();
     $offset = $query->hasOffset() ? $query->getOffset() : 0;
     $limit = $query->hasLimit() ? $query->getLimit() : 0;
     $foundStringKey = false;
     $result = array();
     $skipped = 0;
     foreach ($this->data as $key => $row) {
         if (is_string($key) && $this->keyColumn !== null && !isset($row->{$this->keyColumn})) {
             $row = clone $row;
             // Make sure that this won't affect the actual data
             $row->{$this->keyColumn} = $key;
         }
         if (!$filter->matches($row)) {
             continue;
         } elseif ($skipped < $offset) {
             $skipped++;
             continue;
         }
         // Get only desired columns if asked so
         if (!empty($columns)) {
             $filteredRow = (object) array();
             foreach ($columns as $alias => $name) {
                 if (!is_string($alias)) {
                     $alias = $name;
                 }
                 if (isset($row->{$name})) {
                     $filteredRow->{$alias} = $row->{$name};
                 } else {
                     $filteredRow->{$alias} = null;
                 }
             }
         } else {
             $filteredRow = $row;
         }
         $foundStringKey |= is_string($key);
         $result[$key] = $filteredRow;
         if (count($result) === $limit) {
             break;
         }
     }
     // Sort the result
     if ($query->hasOrder()) {
         if ($foundStringKey) {
             uasort($result, array($query, 'compare'));
         } else {
             usort($result, array($query, 'compare'));
         }
     } elseif (!$foundStringKey) {
         $result = array_values($result);
     }
     return $result;
 }