Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
5 / 5
CRAP
100.00% covered (success)
100.00%
25 / 25
UpdateStatement
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
5 / 5
8
100.00% covered (success)
100.00%
25 / 25
 __construct
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
6 / 6
 buildSignature
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
1 / 1
 buildUpdate
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
3 / 3
 buildDelimitUpdate
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
4 / 4
 extractColumAndValueList
100.00% covered (success)
100.00%
1 / 1
4
100.00% covered (success)
100.00%
11 / 11
<?php
declare(strict_types = 1);
namespace Siesta\Driver\MySQL\StoredProcedure;
use Siesta\Driver\MySQL\MySQLDriver;
use Siesta\Model\DelimitAttributeList;
use Siesta\Model\Entity;
/**
 * @author Gregor Müller
 */
class UpdateStatement
{
    const SP_PARAMETER = "IN %s %s";
    const UPDATE = "UPDATE %s SET %s WHERE %s;";
    const DELIMTER_UPDATE = "UPDATE %s SET `%s` = NOW() WHERE %s AND `%s` IS NULL;";
    const WHERE = "%s = %s";
    const SET = "%s = %s";
    /**
     * @var Entity
     */
    protected $entity;
    /**
     * @var string[]
     */
    protected $setList;
    /**
     * @var string[]
     */
    protected $parameterList;
    /**
     * @var string[]
     */
    protected $whereList;
    /**
     * @param Entity $entity
     */
    public function __construct(Entity $entity)
    {
        $this->entity = $entity;
        $this->setList = [];
        $this->whereList = [];
        $this->parameterList = [];
        $this->extractColumAndValueList();
    }
    /**
     * @return string
     */
    public function buildSignature()
    {
        return "(" . implode(",", $this->parameterList) . ")";
    }
    /**
     * @param string $tableName
     *
     * @return string
     */
    public function buildUpdate($tableName)
    {
        $setList = implode(",", $this->setList);
        $where = implode(" AND ", $this->whereList);
        return sprintf(self::UPDATE, $tableName, $setList, $where);
    }
    /**
     * @return string
     */
    public function buildDelimitUpdate()
    {
        $tableName = MySQLDriver::quote($this->entity->getDelimitTableName());
        $where = implode(" AND ", $this->whereList);
        $validUntilName = DelimitAttributeList::COLUMN_VALID_UNTIL;
        return sprintf(self::DELIMTER_UPDATE, $tableName, $validUntilName, $where, $validUntilName);
    }
    /**
     * @return void
     */
    private function extractColumAndValueList()
    {
        // iterate attributes
        foreach ($this->entity->getAttributeList() as $attribute) {
            // skip transient attributes
            if ($attribute->getIsTransient()) {
                continue;
            }
            $columnName = MySQLDriver::quote($attribute->getDBName());
            $this->setList[] = sprintf(self::SET, $columnName, $attribute->getStoredProcedureParameterName());
            $this->parameterList[] = sprintf(self::SP_PARAMETER, $attribute->getStoredProcedureParameterName(), $attribute->getDbType());
        }
        // build where statement
        foreach ($this->entity->getPrimaryKeyAttributeList() as $attribute) {
            $columnName = MySQLDriver::quote($attribute->getDBName());
            $spParameterName = $attribute->getStoredProcedureParameterName();
            $this->whereList[] = sprintf(self::WHERE, $columnName, $spParameterName);
        }
    }
}