face-orm/face

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

Summary

Maintainability
C
1 day
Test Coverage
<?php

namespace Face\Sql\Query\SelectBuilder;

use Face\Core\EntityFace;
use Face\Exception\BadParameterException;
use Face\Sql\Query\Clause\Select\Column;

class QueryFace {

    /**
     * @var EntityFace
     */
    protected $face;
    protected $columns = [];

    protected $basePath;

    protected $isSilent = false;


    function __construct($basePath, EntityFace $face)
    {
        $this->face = $face;
        $this->basePath = $basePath;
    }

    /**
     * @param bool $silent
     */
    public function setSilent($silent){
        $this->isSilent = $silent;
    }

    public function isSilent(){
        return $this->isSilent;
    }


    /**
     * @return array
     */
    public function getColumns()
    {
        return $this->columns;
    }

    /**
     * @param array $columns
     * @return $this
     */
    public function setColumns($columns)
    {
        $this->columns = [];

        if(null === $columns){
            return $this;
        }else if(!is_array($columns)){
            throw new BadParameterException("First parameter of Queryface should be an array. " . gettype($columns) . " given");
        }else{


            foreach($columns as $k=>$v){

                if($v{0} == '!' || $v == "*"){
                    $this->addColumn($v);
                }else{

                    if(is_int($k)){
                        $alias = null;
                        $column = $v;
                    }else{
                        $alias = $v;
                        $column = $k;
                    }

                    $this->addColumn($column, $alias);
                }

            }

        }

        return $this;
    }

    /**
     * @param $column
     * @return $this
     */
    public function addColumn($column, $alias = null){
        if(null === $alias){
            $this->columns[] = $column;
        }else{
            $this->columns[] = ["column" => $column, "alias" => $alias];
        }
        return $this;
    }

    /**
     * @return EntityFace
     */
    public function getFace()
    {
        return $this->face;
    }

    /**
     * @return mixed
     */
    public function getPath()
    {
        return $this->basePath;
    }


    /**
     * @param bool $userPrefix
     * @return Column[] list of joined columns with this format :   $array["real.path"] = @see Face\Sql\Query\Clause\Select\Column;
     */
    public function getColumnsReal(){

        if($this->isSilent()){
            return [];
        }

        $finalColumns = [];


        if(count($this->columns) == 0){
            $this->_includeAllColumns($finalColumns);
        }else {
            foreach ($this->columns as $column) {
                if ($column == "*") {
                    $this->_includeAllColumns($finalColumns);
                } else {

                    if(is_array($column)){
                        $alias = $column["alias"];
                        $column = $column["column"];
                    }else{
                        $alias = null;
                    }

                    if ($column{0} == "!") {
                        $realPath = $this->makePath(substr($column, 1));
                        unset($finalColumns[$realPath]);
                    } else {
                        $elm = $this->getFace()->getDirectElement($column);
                        $realPath = $this->makePath($column);
                        if(!$alias){
                            $alias = $realPath;
                        }

                        $elementColumn = new Column\ElementColumn($this->getPath(), $elm);
                        $elementColumn->setQueryAlias($alias);
                        $finalColumns[$realPath] = $elementColumn;
                    }

                }
            }



        }

        $this->_includeIdentifiers($finalColumns);

        return $finalColumns;

    }

    protected function _includeIdentifiers(&$columns){
        foreach($this->face->getElements() as $elm){
            if($elm->isValue() && $elm->isIdentifier()){
                $realPath = $this->makePath($elm->getName());
                if(!isset($columns[$realPath])) {
                    $column = new Column\ElementColumn($this->getPath(), $elm);
                    $column->setQueryAlias($realPath);
                    $columns[$realPath] = $column;
                }
            }
        }
    }

    private function _includeAllColumns(&$columns){

        foreach($this->face->getElements() as $elm){
            if($elm->isValue()){
                $realPath = $this->makePath($elm->getName());
                $column = new Column\ElementColumn($this->getPath(), $elm);
                $column->setQueryAlias($realPath);
                $columns[$realPath] = $column;
            }
        }

    }

    public function makePath($columnName){
        return $this->basePath . "." . $columnName;
    }


}