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
<?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']; |
|
} |
|
} |