Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
7 / 7
CRAP
100.00% covered (success)
100.00%
29 / 29
DefaultIndexValidator
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
7 / 7
11
100.00% covered (success)
100.00%
29 / 29
 validate
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
7 / 7
 getEntityName
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
1 / 1
 getIndexName
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
1 / 1
 error
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
2 / 2
 validateIndexName
100.00% covered (success)
100.00%
1 / 1
2
100.00% covered (success)
100.00%
6 / 6
 validateIndexPartList
100.00% covered (success)
100.00%
1 / 1
3
100.00% covered (success)
100.00%
7 / 7
 validateIndexPart
100.00% covered (success)
100.00%
1 / 1
2
100.00% covered (success)
100.00%
5 / 5
<?php
declare(strict_types = 1);
namespace Siesta\Validator;
use Siesta\Contract\IndexValidator;
use Siesta\Model\DataModel;
use Siesta\Model\Entity;
use Siesta\Model\Index;
use Siesta\Model\IndexPart;
use Siesta\Model\ValidationLogger;
/**
 * @author Gregor Müller
 */
class DefaultIndexValidator implements IndexValidator
{
    const ERROR_INVALID_INDEX_NAME = "Entity '%s' Index '%s' has invalid name.";
    const ERROR_INVALID_INDEX_NAME_CODE = 1400;
    const ERROR_INVALID_COLUMN = "Entity '%s' Index '%s' refers to non existing column '%s'";
    const ERROR_INVALID_COLUMN_CODE = 1401;
    const ERROR_NO_INDEX_PART = "Entity '%s' Index '%s' has no indexPart.";
    const ERROR_NO_INDEX_PART_CODE = 1402;
    /**
     * @var DataModel
     */
    protected $datamodel;
    /**
     * @var Entity
     */
    protected $entity;
    /**
     * @var Index
     */
    protected $index;
    /**
     * @var ValidationLogger
     */
    protected $logger;
    /**
     * @param DataModel $dataModel
     * @param Entity $entity
     * @param Index $index
     * @param ValidationLogger $logger
     */
    public function validate(DataModel $dataModel, Entity $entity, Index $index, ValidationLogger $logger)
    {
        $this->logger = $logger;
        $this->datamodel = $dataModel;
        $this->entity = $entity;
        $this->index = $index;
        $this->validateIndexName();
        $this->validateIndexPartList();
    }
    /**
     * @return string
     */
    protected function getEntityName()
    {
        return $this->entity->getClassShortName();
    }
    /**
     * @return string
     */
    protected function getIndexName()
    {
        return $this->index->getName();
    }
    /**
     * @param string $text
     * @param int $code
     */
    protected function error(string $text, int $code)
    {
        $this->logger->error($text, $code);
    }
    /**
     *
     */
    protected function validateIndexName()
    {
        $indexName = $this->getIndexName();
        if ($indexName !== null) {
            return;
        }
        $error = sprintf(self::ERROR_INVALID_INDEX_NAME, $this->getEntityName(), $indexName);
        $this->error($error, self::ERROR_INVALID_INDEX_NAME_CODE);
    }
    protected function validateIndexPartList()
    {
        $indexPartList = $this->index->getIndexPartList();
        if (sizeof($indexPartList) === 0) {
            $error = sprintf(self::ERROR_NO_INDEX_PART, $this->getEntityName(), $this->getIndexName());
            $this->error($error, self::ERROR_NO_INDEX_PART_CODE);
        }
        foreach ($this->index->getIndexPartList() as $indexPart) {
            $this->validateIndexPart($indexPart);
        }
    }
    /**
     * @param IndexPart $indexPart
     */
    protected function validateIndexPart(IndexPart $indexPart)
    {
        if ($indexPart->getAttribute() !== null) {
            return;
        }
        $error = sprintf(self::ERROR_INVALID_COLUMN, $this->getEntityName(), $this->getIndexName(), $indexPart->getColumnName());
        $this->error($error, self::ERROR_INVALID_COLUMN_CODE);
    }
}