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