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