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.
		
		
		
		
			
				
					75 lines
				
				2.0 KiB
			
		
		
			
		
	
	
					75 lines
				
				2.0 KiB
			| 
								 
											12 years ago
										 
									 | 
							
								<?php
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * @link http://www.yiiframework.com/
							 | 
						||
| 
								 | 
							
								 * @copyright Copyright (c) 2008 Yii Software LLC
							 | 
						||
| 
								 | 
							
								 * @license http://www.yiiframework.com/license/
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace yii\sphinx;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * Class QueryBuilder
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @author Paul Klimov <klimov.paul@gmail.com>
							 | 
						||
| 
								 | 
							
								 * @since 2.0
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								class QueryBuilder extends \yii\db\mysql\QueryBuilder
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
									 * Generates a SELECT SQL statement from a [[Query]] object.
							 | 
						||
| 
								 | 
							
									 * @param Query $query the [[Query]] object from which the SQL statement will be generated
							 | 
						||
| 
								 | 
							
									 * @return array the generated SQL statement (the first array element) and the corresponding
							 | 
						||
| 
								 | 
							
									 * parameters to be bound to the SQL statement (the second array element).
							 | 
						||
| 
								 | 
							
									 */
							 | 
						||
| 
								 | 
							
									public function build($query)
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										$params = $query->params;
							 | 
						||
| 
								 | 
							
										$clauses = [
							 | 
						||
| 
								 | 
							
											$this->buildSelect($query->select, $query->distinct, $query->selectOption),
							 | 
						||
| 
								 | 
							
											$this->buildFrom($query->from),
							 | 
						||
| 
								 | 
							
											$this->buildWhere($query->where, $params),
							 | 
						||
| 
								 | 
							
											$this->buildGroupBy($query->groupBy),
							 | 
						||
| 
								 | 
							
											$this->buildWithin($query->within),
							 | 
						||
| 
								 | 
							
											$this->buildOrderBy($query->orderBy),
							 | 
						||
| 
								 | 
							
											$this->buildLimit($query->limit, $query->offset),
							 | 
						||
| 
								 | 
							
											$this->buildOption($query->options),
							 | 
						||
| 
								 | 
							
										];
							 | 
						||
| 
								 | 
							
										return [implode($this->separator, array_filter($clauses)), $params];
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
									 * @param array $columns
							 | 
						||
| 
								 | 
							
									 * @return string the ORDER BY clause built from [[query]].
							 | 
						||
| 
								 | 
							
									 */
							 | 
						||
| 
								 | 
							
									public function buildWithin($columns)
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										if (empty($columns)) {
							 | 
						||
| 
								 | 
							
											return '';
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										$orders = [];
							 | 
						||
| 
								 | 
							
										foreach ($columns as $name => $direction) {
							 | 
						||
| 
								 | 
							
											if (is_object($direction)) {
							 | 
						||
| 
								 | 
							
												$orders[] = (string)$direction;
							 | 
						||
| 
								 | 
							
											} else {
							 | 
						||
| 
								 | 
							
												$orders[] = $this->db->quoteColumnName($name) . ($direction === Query::SORT_DESC ? ' DESC' : '');
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										return 'WITHIN GROUP ORDER BY ' . implode(', ', $orders);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
									 * @param array $options
							 | 
						||
| 
								 | 
							
									 * @return string the OPTION clause build from [[query]]
							 | 
						||
| 
								 | 
							
									 */
							 | 
						||
| 
								 | 
							
									public function buildOption(array $options)
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										if (empty($options)) {
							 | 
						||
| 
								 | 
							
											return '';
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										$optionLines = [];
							 | 
						||
| 
								 | 
							
										foreach ($options as $name => $value) {
							 | 
						||
| 
								 | 
							
											$optionLines[] = $name . ' = ' . $value;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										return 'OPTION ' . implode(', ', $optionLines);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 |