You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

120 lines
2.6 KiB

<?php
/**
* @author Carsten Brandt <mail@cebe.cc>
*/
namespace yii\elasticsearch;
use yii\base\Component;
use yii\helpers\Json;
class Command extends Component
{
/**
* @var Connection
*/
public $db;
public $api = '_search';
/**
* @var string|array the indexes to execute the query on. Defaults to null meaning all indexes
* @see http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search.html#search-multi-index
*/
public $index;
/**
* @var string|array the types to execute the query on. Defaults to null meaning all types
*/
public $type;
/**
* @var array|string array or json
*/
public $query;
private function createUrl($endPoint = null)
{
if ($endPoint === null) {
$endPoint = $this->api;
}
if ($this->index === null && $this->type === null) {
return '/' . $endPoint;
}
$index = $this->index;
if ($index === null) {
$index = '_all';
} elseif (is_array($index)) {
$index = implode(',', $index);
}
$type = $this->type;
if (is_array($type)) {
$type = implode(',', $type);
}
return '/' . $index . '/' . (empty($type) ? '' : $type . '/') . $endPoint;
}
public function queryAll()
{
$query = $this->query;
if (empty($query)) {
$query = '{}';
}
if (is_array($query)) {
$query = Json::encode($query);
}
$http = $this->db->http();
$response = $http->post($this->createUrl(), null, $query)->send();
$data = Json::decode($response->getBody(true));
// TODO store query meta data for later use
$docs = array();
switch ($this->api) {
default:
case '_search':
if (isset($data['hits']['hits'])) {
$docs = $data['hits']['hits'];
}
break;
case '_mget':
if (isset($data['docs'])) {
$docs = $data['docs'];
}
break;
}
$rows = array();
foreach($docs as $doc) {
// TODO maybe return type info
if (isset($doc['exists']) && !$doc['exists']) {
continue;
}
$row = $doc['_source'];
$row['id'] = $doc['_id'];
$rows[] = $row;
}
return $rows;
}
public function queryOne()
{
// TODO set limit
$rows = $this->queryAll();
return reset($rows);
}
public function queryCount()
{
//http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-count.html
$query = $this->query;
if (empty($query)) {
$query = '';
}
if (is_array($query)) {
$query = Json::encode($query);
}
$http = $this->db->http();
$response = $http->post($this->createUrl('_count'), null, $query)->send();
$data = Json::decode($response->getBody(true));
// TODO store query meta data for later use
return $data['count'];
}
}