face-orm/face

View on GitHub
lib/Face/Sql/Query/SelectBuilder/StandardCompiler.php

Summary

Maintainability
A
2 hrs
Test Coverage
<?php

namespace Face\Sql\Query\SelectBuilder;
use Face\Sql\Query\Clause\From;
use Face\Sql\Query\Clause\Group;
use Face\Sql\Query\Clause\Join;
use Face\Sql\Query\Clause\Limit;
use Face\Sql\Query\Clause\Offset;
use Face\Sql\Query\Clause\OrderBy;
use Face\Sql\Query\Clause\Select;
use Face\Sql\Query\Clause\Where;
use Face\Sql\Query\SelectBuilder;
use Face\Sql\Query\FQuery;
use Face\Sql\Query\SelectInterface;
use Face\Sql\Query\SelectQuery;

/**
 * Class Compiler
 *
 * This class helps to compile a SelectBuilder.
 * It aims to make the selectBuilder class more clean by migrating compile job here
 *
 * @package Face\Sql\Query\SelectBuilder
 */
class StandardCompiler {

    /**
     * @var SelectInterface
     */
    protected $selectBuilder;

    function __construct(SelectInterface $selectBuilder)
    {
        $this->selectBuilder = $selectBuilder;
    }


    public function compile(){

        /* @var $facesToSelect QueryFace[] */
        $facesToSelect["this"] = $this->selectBuilder->getBaseQueryFace();
        $facesToSelect = array_merge($facesToSelect, $this->selectBuilder->getJoins());
        $columns =  $this->selectBuilder->getSelectedColumns();


        $queryBuilder = new Group();

        // SELECT
        $selectClause = new Select($columns);
        $queryBuilder->addItem($selectClause);


        // FROM
        $fromClause = new From($this->selectBuilder->getBaseQueryFace()->getFace());
        $queryBuilder->addItem($fromClause);


        // JOINs
        foreach ($this->selectBuilder->getJoins() as $joinQueryFace) {
            $join = new Join($this->selectBuilder->getBaseQueryFace()->getFace(), $joinQueryFace);
            $queryBuilder->addItem($join);
        }


        // SOFT JOINs
        foreach ($this->selectBuilder->getSoftThroughJoin() as $path => $joinQueryFace) {
            if (!$this->selectBuilder->isJoined($path)) {
                $join = new Join($this->selectBuilder->getBaseQueryFace()->getFace(), $joinQueryFace);
                $queryBuilder->addItem($join);
            }
        }


        // WHERE
        $where = $this->selectBuilder->getWhere();
        if ($where) {
            $queryBuilder->addItem($where);
        }

        // GROUP BY
        if($this->selectBuilder->getGroupBy()){
            $queryBuilder->addItem($this->selectBuilder->getGroupBy());
        }

        // HAVING
        if($this->selectBuilder->getHaving()){
            $queryBuilder->addItem($this->selectBuilder->getHaving());
        }

        // ORDER
        $orders = $this->selectBuilder->getOrderBy();
        $orderByClause = new OrderBy();
        foreach($orders as $order){
            $orderByClause->addItem($order);
        }
        $queryBuilder->addItem($orderByClause);

        // LIMIT
        $limit = new Limit($this->selectBuilder->getLimit());
        $queryBuilder->addItem($limit);

        // OFFSET
        $offset = new Offset($this->selectBuilder->getOffset());
        $queryBuilder->addItem($offset);


        $sqlQ = $queryBuilder->getSqlString($this->selectBuilder);


        return $sqlQ;
    }

}