public function read($query, array $options = array())
{
$defaults = array('return' => is_string($query) ? 'array' : 'item', 'schema' => null, 'quotes' => $this->_quotes);
$options += $defaults;
return $this->_filter(__METHOD__, compact('query', 'options'), function ($self, $params) {
$query = $params['query'];
$args = $params['options'];
$return = $args['return'];
unset($args['return']);
$model = is_object($query) ? $query->model() : null;
if (is_string($query)) {
$sql = String::insert($query, $self->value($args));
} else {
if (!($data = $self->invokeMethod('_queryExport', array($query)))) {
return false;
}
$sql = $self->renderCommand($data['type'], $data);
}
$result = $self->invokeMethod('_execute', array($sql));
if ($return === 'resource') {
return $result;
}
if ($return === 'item') {
return $model::create(array(), compact('query', 'result') + array('class' => 'set', 'defaults' => false));
}
$columns = $args['schema'] ?: $self->schema($query, $result);
if (!is_array(reset($columns))) {
$columns = array('' => $columns);
}
$i = 0;
$records = array();
foreach ($result as $data) {
$offset = 0;
$records[$i] = array();
foreach ($columns as $path => $cols) {
$len = count($cols);
$values = array_combine($cols, array_slice($data, $offset, $len));
$path ? $records[$i][$path] = $values : ($records[$i] += $values);
$offset += $len;
}
$i++;
}
return Set::expand($records);
});
}