Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
0.00% |
0 / 1 |
|
87.50% |
7 / 8 |
CRAP | |
97.78% |
44 / 45 |
MySQLDeleteCollectionManyAssignmentStoredProcedure | |
0.00% |
0 / 1 |
|
87.50% |
7 / 8 |
14 | |
97.78% |
44 / 45 |
__construct | |
100.00% |
1 / 1 |
1 | |
100.00% |
8 / 8 |
|||
buildElements | |
100.00% |
1 / 1 |
1 | |
100.00% |
6 / 6 |
|||
buildSignature | |
100.00% |
1 / 1 |
3 | |
100.00% |
9 / 9 |
|||
buildStatement | |
100.00% |
1 / 1 |
1 | |
100.00% |
4 / 4 |
|||
getWhereCondition | |
100.00% |
1 / 1 |
3 | |
100.00% |
12 / 12 |
|||
getCorrespondingColumnForPKAttribute | |
0.00% |
0 / 1 |
3.14 | |
75.00% |
3 / 4 |
|||
buildTableColumn | |
100.00% |
1 / 1 |
1 | |
100.00% |
1 / 1 |
|||
buildParameterName | |
100.00% |
1 / 1 |
1 | |
100.00% |
1 / 1 |
<?php | |
declare(strict_types = 1); | |
namespace Siesta\Driver\MySQL\StoredProcedure; | |
use Siesta\Database\StoredProcedureNaming; | |
use Siesta\Model\Attribute; | |
use Siesta\Model\CollectionMany; | |
use Siesta\Model\DataModel; | |
use Siesta\Model\Entity; | |
use Siesta\Model\Reference; | |
class MySQLDeleteCollectionManyAssignmentStoredProcedure extends MySQLStoredProcedureBase | |
{ | |
const DELETE = "DELETE FROM %s WHERE %s;"; | |
/** | |
* @var CollectionMany | |
*/ | |
protected $collectionMany; | |
/** | |
* @var Entity | |
*/ | |
protected $foreignEntity; | |
/** | |
* @var Reference | |
*/ | |
protected $foreignReference; | |
/** | |
* @var Entity | |
*/ | |
protected $mappingEntity; | |
/** | |
* @var Reference | |
*/ | |
protected $mappingReference; | |
/** | |
* | |
*/ | |
protected $reference; | |
public function __construct(DataModel $dataModel, Entity $entity, CollectionMany $collectionMany) | |
{ | |
parent::__construct($dataModel, $entity); | |
$this->collectionMany = $collectionMany; | |
$this->foreignEntity = $collectionMany->getForeignEntity(); | |
$this->foreignReference = $collectionMany->getForeignReference(); | |
$this->mappingEntity = $collectionMany->getMappingEntity(); | |
$this->mappingReference = $collectionMany->getMappingReference(); | |
$this->buildElements(); | |
} | |
/** | |
* | |
*/ | |
protected function buildElements() | |
{ | |
$this->modifies = false; | |
$this->name = StoredProcedureNaming::getDeleteCollectionManyAssignmentName($this->collectionMany); | |
$this->determineTableNames(); | |
$this->buildSignature(); | |
$this->buildStatement(); | |
} | |
/** | |
* @return void | |
*/ | |
protected function buildSignature() | |
{ | |
$signaturePart = []; | |
foreach ($this->entity->getPrimaryKeyAttributeList() as $pkAttribute) { | |
$parameterName = $this->buildParameterName($this->entity, $pkAttribute); | |
$signaturePart[] = $this->buildSignatureParameter($parameterName, $pkAttribute->getDbType()); | |
} | |
foreach ($this->foreignEntity->getPrimaryKeyAttributeList() as $pkAttribute) { | |
$parameterName = $this->buildParameterName($this->foreignEntity, $pkAttribute); | |
$signaturePart[] = $this->buildSignatureParameter($parameterName, $pkAttribute->getDbType()); | |
} | |
$this->signature = $this->buildSignatureFromList($signaturePart); | |
} | |
/** | |
* | |
*/ | |
protected function buildStatement() | |
{ | |
$mappingTable = $this->quote($this->mappingEntity->getTableName()); | |
$whereStatement = $this->getWhereCondition(); | |
$this->statement = sprintf(self::DELETE, $mappingTable, $whereStatement); | |
} | |
/** | |
* @return string | |
*/ | |
protected function getWhereCondition() : string | |
{ | |
$mappingTable = $this->mappingEntity->getTableName(); | |
$whereList = []; | |
foreach ($this->entity->getPrimaryKeyAttributeList() as $pkAttribute) { | |
$mappingAttribute = $this->getCorrespondingColumnForPKAttribute($this->mappingReference, $pkAttribute); | |
$parameterName = $this->buildParameterName($this->entity, $pkAttribute); | |
$whereList[] = $this->buildTableColumn($mappingTable, $mappingAttribute) . ' = ' . $parameterName; | |
} | |
foreach ($this->foreignEntity->getPrimaryKeyAttributeList() as $pkAttribute) { | |
$mappingAttribute = $this->getCorrespondingColumnForPKAttribute($this->foreignReference, $pkAttribute); | |
$mappingAttribute = $this->quote($mappingAttribute); | |
$spParam = $this->buildParameterName($this->foreignEntity, $pkAttribute); | |
$whereList[] = "($spParam IS NULL OR $mappingAttribute = $spParam)"; | |
} | |
return implode(" AND ", $whereList); | |
} | |
/** | |
* @param Reference $reference | |
* @param Attribute $pkAttribute | |
* | |
* @return string | |
*/ | |
protected function getCorrespondingColumnForPKAttribute(Reference $reference, Attribute $pkAttribute) : string | |
{ | |
foreach ($reference->getReferenceMappingList() as $referenceMapping) { | |
if ($referenceMapping->getForeignColumnName() === $pkAttribute->getDBName()) { | |
return $referenceMapping->getLocalColumnName(); | |
} | |
} | |
} | |
/** | |
* @param string $tableName | |
* @param string $columnName | |
* | |
* @return string | |
*/ | |
protected function buildTableColumn(string $tableName, string $columnName) : string | |
{ | |
return $this->quote($tableName) . '.' . $this->quote($columnName); | |
} | |
/** | |
* @param Entity $entity | |
* @param Attribute $attribute | |
* | |
* @return string | |
*/ | |
protected function buildParameterName(Entity $entity, Attribute $attribute) | |
{ | |
return 'P_' . $entity->getTableName() . '_' . $attribute->getDBName(); | |
} | |
} |