Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
17 / 17
CRAP
100.00% covered (success)
100.00%
61 / 61
Sql
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
17 / 17
23
100.00% covered (success)
100.00%
61 / 61
 __construct
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
9 / 9
 setValues
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
1 / 1
 values
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
1 / 1
 select
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
6 / 6
 selectCount
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
3 / 3
 insert
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
4 / 4
 update
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
6 / 6
 delete
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
3 / 3
 addWhere
100.00% covered (success)
100.00%
1 / 1
3
100.00% covered (success)
100.00%
6 / 6
 addJoin
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
3 / 3
 setLimit
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
2 / 2
 join
100.00% covered (success)
100.00%
1 / 1
2
100.00% covered (success)
100.00%
3 / 3
 where
100.00% covered (success)
100.00%
1 / 1
2
100.00% covered (success)
100.00%
3 / 3
 setOrderBy
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
2 / 2
 addOrderBy
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
2 / 2
 limit
100.00% covered (success)
100.00%
1 / 1
2
100.00% covered (success)
100.00%
3 / 3
 orderBy
100.00% covered (success)
100.00%
1 / 1
2
100.00% covered (success)
100.00%
4 / 4
<?php
namespace Win\Repositories;
/**
 * Cria comandos SQL
 */
class Sql
{
    public ?array $columns = null;
    private string $table;
    private array $values;
    private array $join;
    private array $joinValues;
    private array $where;
    private array $whereValues;
    private array $orderBy;
    private string $limit;
    /**
     * Prepara a query
     * @param string $table
     */
    public function __construct(&$table)
    {
        $this->table = &$table;
        $this->values = [];
        $this->join = [];
        $this->joinValues = [];
        $this->where = [];
        $this->whereValues = [];
        $this->orderBy = [];
        $this->limit = '';
    }
    /** @param mixed[] */
    public function setValues($values)
    {
        return $this->values = $values;
    }
    /** @return mixed[] */
    public function values()
    {
        return array_merge($this->values, $this->joinValues, $this->whereValues);
    }
    /**
     * SELECT * FROM ...
     * @return string
     */
    public function select()
    {
        return 'SELECT ' . implode(', ', $this->columns ?? ['*'])
            . ' FROM ' . $this->table
            . $this->join()
            . $this->where()
            . $this->orderBy()
            . $this->limit();
    }
    /**
     * SELECT COUNT(*) FROM
     * @return string
     */
    public function selectCount()
    {
        return 'SELECT COUNT(*) FROM ' . $this->table
            . $this->join()
            . $this->where();
    }
    /**
     * INSERT INTO ... VALUES
     * @return string
     */
    public function insert()
    {
        $params = str_split(str_repeat('?', count($this->values)));
        return 'INSERT INTO ' . $this->table
            . ' (' . implode(',', array_keys($this->values)) . ')'
            . ' VALUES (' . implode(', ', $params) . ')';
    }
    /**
     * UPDATE ... SET
     * @return string
     */
    public function update()
    {
        $keys = array_keys($this->values);
        $columns = array_map(fn ($column) => $column . ' = ?', $keys);
        return 'UPDATE ' . $this->table
            . ' SET ' . implode(', ', $columns)
            . $this->where()
            . $this->limit();
    }
    /**
     * DELETE FROM ...
     * @return string
     */
    public function delete()
    {
        return 'DELETE FROM ' . $this->table
            . $this->where()
            . $this->limit();
    }
    /**
     * WHERE ...
     * @param string $comparator
     * @param mixed $values
     */
    public function addWhere($comparator, $values)
    {
        $hasBindParams = preg_match('/[:\?]/', $comparator);
        if ($values && !$hasBindParams) {
            $comparator .= ' = ?';
        }
        $this->where[] = '(' . $comparator . ')';
        $this->whereValues = array_merge($this->whereValues, $values);
    }
    /**
     * JOIN, LEFT JOIN ...
     * @param string $join
     * @param array $values
     */
    public function addJoin($join, $values)
    {
        $this->join[] = $join;
        $this->joinValues = array_merge($this->joinValues, $values);
    }
    /**
     * Define o limit
     * @param int $offset
     * @param int $limit
     */
    public function setLimit($offset, $limit)
    {
        $this->limit = $offset . ',' . $limit;
    }
    private function join()
    {
        if (empty($this->join)) {
            return '';
        }
        return ' ' . implode(' ', $this->join);
    }
    /**
     * Retorna o SQL
     * @return string
     */
    private function where()
    {
        if (empty($this->where)) {
            return '';
        }
        return ' WHERE ' . implode(' AND ', $this->where);
    }
    /**
     * Define a ordenação principal
     * @param string $orderBy
     */
    public function setOrderBy($orderBy)
    {
        $this->orderBy = [$orderBy];
    }
    /**
     * Adiciona uma ordenação
     * @param string $orderBy
     * @param int $priority
     */
    public function addOrderBy($orderBy, $priority = 0)
    {
        $this->orderBy[$priority] = $orderBy;
    }
    /**
     * LIMIT ...
     * @return string
     */
    private function limit()
    {
        if (empty($this->limit)) {
            return '';
        }
        return ' LIMIT ' . $this->limit;
    }
    /**
     * ORDER BY...
     * @return string
     */
    private function orderBy()
    {
        if (empty($this->orderBy)) {
            return '';
        }
        ksort($this->orderBy);
        return ' ORDER BY ' . implode(', ', $this->orderBy);
    }
}