p0larbeer
11 years ago
1 changed files with 75 additions and 0 deletions
@ -0,0 +1,75 @@ |
|||||||
|
<?php |
||||||
|
|
||||||
|
namespace yii\db\oci; |
||||||
|
|
||||||
|
use yii\db\Exception; |
||||||
|
use yii\base\InvalidParamException; |
||||||
|
|
||||||
|
/** |
||||||
|
* QueryBuilder is the query builder for MySQL databases. |
||||||
|
* |
||||||
|
* @author Qiang Xue <qiang.xue@gmail.com> |
||||||
|
* @since 2.0 |
||||||
|
*/ |
||||||
|
class QueryBuilder extends \yii\db\QueryBuilder { |
||||||
|
|
||||||
|
private $sql; |
||||||
|
|
||||||
|
public function build($query) { |
||||||
|
//var_dump($query);exit; |
||||||
|
$params = $query->params; |
||||||
|
$clauses = [ |
||||||
|
$this->buildSelect($query->select, $query->distinct, $query->selectOption), |
||||||
|
$this->buildFrom($query->from), |
||||||
|
$this->buildJoin($query->join, $params), |
||||||
|
$this->buildWhere($query->where, $params), |
||||||
|
$this->buildGroupBy($query->groupBy), |
||||||
|
$this->buildHaving($query->having, $params), |
||||||
|
$this->buildUnion($query->union, $params), |
||||||
|
$this->buildOrderBy($query->orderBy), |
||||||
|
//$this->buildLimit($query->limit, $query->offset), |
||||||
|
]; |
||||||
|
//var_dump( [implode($this->separator, array_filter($clauses)), $params]);exit; |
||||||
|
$this->sql = implode($this->separator, array_filter($clauses)); |
||||||
|
|
||||||
|
if (!is_null($query->limit) && !is_null($query->offset)) { |
||||||
|
$this->sql = $this->buildLimit($query->limit, $query->offset); |
||||||
|
} |
||||||
|
return [$this->sql, $params]; |
||||||
|
//return [implode($this->separator, array_filter($clauses)), $params]; |
||||||
|
} |
||||||
|
|
||||||
|
public function buildLimit($limit, $offset) { |
||||||
|
//var_dump($limit >= 0); |
||||||
|
//var_dump($offset);exit; |
||||||
|
//var_dump($limit, $offset); |
||||||
|
if (($limit < 0) && ($offset < 0)) { |
||||||
|
return $this->sql; |
||||||
|
} |
||||||
|
$filters = array(); |
||||||
|
if ($offset > 0) { |
||||||
|
$filters[] = 'rowNumId > ' . (int) $offset; |
||||||
|
} |
||||||
|
|
||||||
|
if ($limit >= 0) { |
||||||
|
$filters[] = 'rownum <= ' . (int) $limit; |
||||||
|
} |
||||||
|
|
||||||
|
if (count($filters) > 0) { |
||||||
|
$filter = implode(' and ', $filters); |
||||||
|
$filter = " WHERE " . $filter; |
||||||
|
} else { |
||||||
|
$filter = ''; |
||||||
|
} |
||||||
|
|
||||||
|
$sql = <<<EOD |
||||||
|
WITH USER_SQL AS ({$this->sql}), |
||||||
|
PAGINATION AS (SELECT USER_SQL.*, rownum as rowNumId FROM USER_SQL) |
||||||
|
SELECT * |
||||||
|
FROM PAGINATION |
||||||
|
{$filter} |
||||||
|
EOD; |
||||||
|
return $sql; |
||||||
|
} |
||||||
|
|
||||||
|
} |
Loading…
Reference in new issue