Class yii\elasticsearch\BatchQueryResult
Inheritance | yii\elasticsearch\BatchQueryResult » yii\base\BaseObject |
---|---|
Implements | Iterator |
Available since extension's version | 2.0.4 |
Source Code | https://github.com/yiisoft/yii2-elasticsearch/blob/master/BatchQueryResult.php |
BatchQueryResult represents a batch query from which you can retrieve data in batches.
You usually do not instantiate BatchQueryResult directly. Instead, you obtain it by calling yii\elasticsearch\Query::batch() or yii\elasticsearch\Query::each(). Because BatchQueryResult implements the Iterator interface, you can iterate it to obtain a batch of data in each iteration.
Batch size is determined by the Query::$limit setting. Query::$offset setting is ignored. New batches will be obtained until the server runs out of results.
If Query::$orderBy parameter is not set, batches will be processed using the highly efficient "scan" mode. In this case, Query::$limit setting determines batch size per shard. See Elasticsearch guide for more information.
Example:
`
php
$query = (new Query)->from('user');
foreach ($query->batch() as $i => $users) {
// $users represents the rows in the $i-th batch
}
foreach ($query->each() as $user) {
}
`
Public Properties
Property | Type | Description | Defined By |
---|---|---|---|
$db | yii\elasticsearch\Connection | The DB connection to be used when performing batch query. | yii\elasticsearch\BatchQueryResult |
$each | boolean | Whether to return a single row during each iteration. | yii\elasticsearch\BatchQueryResult |
$query | yii\elasticsearch\Query | The query object associated with this batch query. | yii\elasticsearch\BatchQueryResult |
$scrollWindow | string | The amount of time to keep the scroll window open (in Elasticsearch time units. | yii\elasticsearch\BatchQueryResult |
Public Methods
Method | Description | Defined By |
---|---|---|
__destruct() | Destructor. | yii\elasticsearch\BatchQueryResult |
current() | Returns the current dataset. | yii\elasticsearch\BatchQueryResult |
key() | Returns the index of the current dataset. | yii\elasticsearch\BatchQueryResult |
next() | Moves the internal pointer to the next dataset. | yii\elasticsearch\BatchQueryResult |
reset() | Resets the batch query. | yii\elasticsearch\BatchQueryResult |
rewind() | Resets the iterator to the initial state. | yii\elasticsearch\BatchQueryResult |
valid() | Returns whether there is a valid dataset at the current position. | yii\elasticsearch\BatchQueryResult |
Protected Methods
Method | Description | Defined By |
---|---|---|
fetchData() | Fetches the next batch of data. | yii\elasticsearch\BatchQueryResult |
Property Details
The DB connection to be used when performing batch query.
If null, the elasticsearch
application component will be used.
Whether to return a single row during each iteration. If false, a whole batch of rows will be returned in each iteration.
The query object associated with this batch query. Do not modify this property directly unless after reset() is called explicitly.
The amount of time to keep the scroll window open (in Elasticsearch time units.
Method Details
Destructor.
public void __destruct ( ) |
public function __destruct()
{
// make sure cursor is closed
$this->reset();
}
Returns the current dataset.
This method is required by the interface Iterator.
public mixed current ( ) | ||
return | mixed |
The current dataset. |
---|
#[ReturnTypeWillChange]
public function current()
{
return $this->_value;
}
Fetches the next batch of data.
protected array fetchData ( ) | ||
return | array |
The data fetched |
---|
protected function fetchData()
{
if (null === $this->_lastScrollId) {
//first query - do search
$options = ['scroll' => $this->scrollWindow];
if(!$this->query->orderBy) {
$query = clone $this->query;
$query->orderBy('_doc');
$cmd = $this->query->createCommand($this->db);
} else {
$cmd = $this->query->createCommand($this->db);
}
$result = $cmd->search($options);
if ($result === false) {
throw new Exception('Elasticsearch search query failed.');
}
} else {
//subsequent queries - do scroll
$result = $this->query->createCommand($this->db)->scroll([
'scroll_id' => $this->_lastScrollId,
'scroll' => $this->scrollWindow,
]);
}
//get last scroll id
$this->_lastScrollId = $result['_scroll_id'];
//get data
return $this->query->populate($result['hits']['hits']);
}
Returns the index of the current dataset.
This method is required by the interface Iterator.
public integer key ( ) | ||
return | integer |
The index of the current row. |
---|
#[ReturnTypeWillChange]
public function key()
{
return $this->_key;
}
Moves the internal pointer to the next dataset.
This method is required by the interface Iterator.
public void next ( ) |
#[ReturnTypeWillChange]
public function next()
{
if ($this->_batch === null || !$this->each || $this->each && next($this->_batch) === false) {
$this->_batch = $this->fetchData();
reset($this->_batch);
}
if ($this->each) {
$this->_value = current($this->_batch);
if ($this->query->indexBy !== null) {
$this->_key = key($this->_batch);
} elseif (key($this->_batch) !== null) {
$this->_key++;
} else {
$this->_key = null;
}
} else {
$this->_value = $this->_batch;
$this->_key = $this->_key === null ? 0 : $this->_key + 1;
}
}
Resets the batch query.
This method will clean up the existing batch query so that a new batch query can be performed.
public void reset ( ) |
public function reset()
{
if(isset($this->_lastScrollId)) {
$this->query->createCommand($this->db)->clearScroll(['scroll_id' => $this->_lastScrollId]);
}
$this->_batch = null;
$this->_value = null;
$this->_key = null;
$this->_lastScrollId = null;
}
Resets the iterator to the initial state.
This method is required by the interface Iterator.
public void rewind ( ) |
#[ReturnTypeWillChange]
public function rewind()
{
$this->reset();
$this->next();
}