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
11 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);
|
||
|
}
|
||
|
}
|