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.
		
		
		
		
		
			
		
			
				
					
					
						
							221 lines
						
					
					
						
							7.3 KiB
						
					
					
				
			
		
		
	
	
							221 lines
						
					
					
						
							7.3 KiB
						
					
					
				| <?php | |
| /** | |
|  * @link http://www.yiiframework.com/ | |
|  * @copyright Copyright (c) 2008 Yii Software LLC | |
|  * @license http://www.yiiframework.com/license/ | |
|  */ | |
|  | |
| namespace yii\elasticsearch; | |
|  | |
| use Yii; | |
| use yii\base\Component; | |
| use yii\db\QueryInterface; | |
| use yii\db\QueryTrait; | |
|  | |
| /** | |
|  * Class Query | |
|  * | |
|  * @author Carsten Brandt <mail@cebe.cc> | |
|  * @since 2.0 | |
|  */ | |
| class Query extends Component implements QueryInterface | |
| { | |
| 	use QueryTrait; | |
|  | |
| 	/** | |
| 	 * @var array the columns being selected. For example, `array('id', 'name')`. | |
| 	 * This is used to construct the SELECT clause in a SQL statement. If not set, if means selecting all columns. | |
| 	 * @see select() | |
| 	 */ | |
| 	public $select; // TODO fields | |
|  | |
| 	public $index; | |
|  | |
| 	public $type; | |
|  | |
| 	/** | |
| 	 * Creates a DB command that can be used to execute this query. | |
| 	 * @param Connection $db the database connection used to generate the SQL statement. | |
| 	 * If this parameter is not given, the `elasticsearch` application component will be used. | |
| 	 * @return Command the created DB command instance. | |
| 	 */ | |
| 	public function createCommand($db = null) | |
| 	{ | |
| 		if ($db === null) { | |
| 			$db = Yii::$app->getComponent('elasticsearch'); | |
| 		} | |
|  | |
| 		$query = $db->getQueryBuilder()->build($this); | |
| 		return $db->createCommand($query, $this->index, $this->type); | |
| 	} | |
|  | |
| 	/** | |
| 	 * Executes the query and returns all results as an array. | |
| 	 * @param Connection $db the database connection used to generate the SQL statement. | |
| 	 * If this parameter is not given, the `db` application component will be used. | |
| 	 * @return array the query results. If the query results in nothing, an empty array will be returned. | |
| 	 */ | |
| 	public function all($db = null) | |
| 	{ | |
| 		$rows = $this->createCommand($db)->queryAll(); | |
| 		if ($this->indexBy === null) { | |
| 			return $rows; | |
| 		} | |
| 		$result = []; | |
| 		foreach ($rows as $row) { | |
| 			if (is_string($this->indexBy)) { | |
| 				$key = $row[$this->indexBy]; | |
| 			} else { | |
| 				$key = call_user_func($this->indexBy, $row); | |
| 			} | |
| 			$result[$key] = $row; | |
| 		} | |
| 		return $result; | |
| 	} | |
|  | |
| 	/** | |
| 	 * Executes the query and returns a single row of result. | |
| 	 * @param Connection $db the database connection used to generate the SQL statement. | |
| 	 * If this parameter is not given, the `db` application component will be used. | |
| 	 * @return array|boolean the first row (in terms of an array) of the query result. False is returned if the query | |
| 	 * results in nothing. | |
| 	 */ | |
| 	public function one($db = null) | |
| 	{ | |
| 		return $this->createCommand($db)->queryOne(); | |
| 	} | |
|  | |
| 	/** | |
| 	 * Returns the query result as a scalar value. | |
| 	 * The value returned will be the first column in the first row of the query results. | |
| 	 * @param string $column name of the column to select | |
| 	 * @param Connection $db the database connection used to execute the query. | |
| 	 * If this parameter is not given, the `db` application component will be used. | |
| 	 * @return string|boolean the value of the first column in the first row of the query result. | |
| 	 * False is returned if the query result is empty. | |
| 	 */ | |
| 	public function scalar($column, $db = null) | |
| 	{ | |
| 		$record = $this->one($db); | |
| 		if ($record === null) { | |
| 			return false; | |
| 		} else { | |
| 			return $record->$column; | |
| 		} | |
| 	} | |
|  | |
| 	/** | |
| 	 * Executes the query and returns the first column of the result. | |
| 	 * @param Connection $db the database connection used to generate the SQL statement. | |
| 	 * If this parameter is not given, the `db` application component will be used. | |
| 	 * @return array the first column of the query result. An empty array is returned if the query results in nothing. | |
| 	 */ | |
| 	public function column($db = null) | |
| 	{ | |
| 		return $this->createCommand($db)->queryColumn(); | |
| 	} | |
|  | |
| 	/** | |
| 	 * Returns the number of records. | |
| 	 * @param string $q the COUNT expression. This parameter is ignored by this implementation. | |
| 	 * @param Connection $db the database connection used to generate the SQL statement. | |
| 	 * If this parameter is not given (or null), the `db` application component will be used. | |
| 	 * @return integer number of records | |
| 	 */ | |
| 	public function count($q = '*', $db = null) | |
| 	{ | |
| 		$count = $this->createCommand($db)->queryCount()['total']; | |
| 		if ($this->limit === null && $this->offset === null) { | |
| 			return $count; | |
| 		} elseif ($this->offset !== null) { | |
| 			$count = $this->offset < $count ? $count - $this->offset : 0; | |
| 		} | |
| 		return $this->limit === null ? $count : ($this->limit > $count ? $count : $this->limit); | |
| 	} | |
|  | |
|  | |
| 	/** | |
| 	 * Returns the sum of the specified column values. | |
| 	 * @param string $q the column name or expression. | |
| 	 * Make sure you properly quote column names in the expression. | |
| 	 * @param Connection $db the database connection used to generate the SQL statement. | |
| 	 * If this parameter is not given, the `db` application component will be used. | |
| 	 * @return integer the sum of the specified column values | |
| 	 */ | |
| 	public function sum($q, $db = null) | |
| 	{ | |
| 		$this->select = ["SUM($q)"]; | |
| 		return $this->createCommand($db)->queryScalar(); | |
| 	} | |
|  | |
| 	/** | |
| 	 * Returns the average of the specified column values. | |
| 	 * @param string $q the column name or expression. | |
| 	 * Make sure you properly quote column names in the expression. | |
| 	 * @param Connection $db the database connection used to generate the SQL statement. | |
| 	 * If this parameter is not given, the `db` application component will be used. | |
| 	 * @return integer the average of the specified column values. | |
| 	 */ | |
| 	public function average($q, $db = null) | |
| 	{ | |
| 		$this->select = ["AVG($q)"]; | |
| 		return $this->createCommand($db)->queryScalar(); | |
| 	} | |
|  | |
| 	/** | |
| 	 * Returns the minimum of the specified column values. | |
| 	 * @param string $q the column name or expression. | |
| 	 * Make sure you properly quote column names in the expression. | |
| 	 * @param Connection $db the database connection used to generate the SQL statement. | |
| 	 * If this parameter is not given, the `db` application component will be used. | |
| 	 * @return integer the minimum of the specified column values. | |
| 	 */ | |
| 	public function min($q, $db = null) | |
| 	{ | |
| 		$this->select = ["MIN($q)"]; | |
| 		return $this->createCommand($db)->queryScalar(); | |
| 	} | |
|  | |
| 	/** | |
| 	 * Returns the maximum of the specified column values. | |
| 	 * @param string $q the column name or expression. | |
| 	 * Make sure you properly quote column names in the expression. | |
| 	 * @param Connection $db the database connection used to generate the SQL statement. | |
| 	 * If this parameter is not given, the `db` application component will be used. | |
| 	 * @return integer the maximum of the specified column values. | |
| 	 */ | |
| 	public function max($q, $db = null) | |
| 	{ | |
| 		$this->select = ["MAX($q)"]; | |
| 		return $this->createCommand($db)->queryScalar(); | |
| 	} | |
|  | |
| 	/** | |
| 	 * Returns a value indicating whether the query result contains any row of data. | |
| 	 * @param Connection $db the database connection used to execute the query. | |
| 	 * If this parameter is not given, the `db` application component will be used. | |
| 	 * @return boolean whether the query result contains any row of data. | |
| 	 */ | |
| 	public function exists($db = null) | |
| 	{ | |
| 		// TODO check for exists | |
| 		return $this->one($db) !== null; | |
| 	} | |
|  | |
| 	/** | |
| 	 * Executes the query and returns all results as an array. | |
| 	 * @param Connection $db the database connection used to execute the query. | |
| 	 * If this parameter is not given, the `elasticsearch` application component will be used. | |
| 	 * @return array the query results. If the query results in nothing, an empty array will be returned. | |
| 	 */ | |
| 	public function delete($db = null) | |
| 	{ | |
| 		// TODO http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/docs-delete-by-query.html | |
| 	} | |
|  | |
| 	public function from($index, $type = null) | |
| 	{ | |
| 		$this->index = $index; | |
| 		$this->type = $type; | |
| 	} | |
| } |