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
120 lines
2.6 KiB
11 years ago
|
<?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'];
|
||
|
}
|
||
|
}
|