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