/** * Process ParsedQueryData from DELETE query and deletes entity/entities data from Storage. * Source parsed query does not contain any special Sql functions (e.g. NOW) * * @param ParsedQueryData $parsedQueryData */ private function processDeleteQuery($parsedQueryData) { $entityInfo = $this->dbSchemaInfo->getEntityInfo($parsedQueryData->entityName); if (!$entityInfo || !$entityInfo->usesGeneratedVpids) { foreach ($parsedQueryData->ids as $ids) { $where = []; foreach ($parsedQueryData->idColumnsNames as $key => $idColumnName) { $where[$idColumnName] = $ids[$key]; $this->vpidRepository->deleteId($parsedQueryData->entityName, $ids[$key]); } if (!$entityInfo) { $referenceDetails = $this->dbSchemaInfo->getMnReferenceDetails($parsedQueryData->table); if (!$referenceDetails) { return; } $this->deleteReference($referenceDetails, $where); } else { $this->mirror->delete($parsedQueryData->entityName, $where); } } return; } foreach ($parsedQueryData->ids as $ids) { $id = $ids[0]; // Composite primary key is not yet supported. $where['vp_id'] = $this->vpidRepository->getVpidForEntity($parsedQueryData->entityName, $id); if (!$where['vp_id']) { continue; // already deleted - deleting postmeta is sometimes called twice } if ($this->dbSchemaInfo->isChildEntity($parsedQueryData->entityName)) { $parentVpReference = "vp_" . $entityInfo->parentReference; $where[$parentVpReference] = $this->fillParentId($parsedQueryData->entityName, $entityInfo, $id); } $this->vpidRepository->deleteId($parsedQueryData->entityName, $id); $this->mirror->delete($parsedQueryData->entityName, $where); } }
/** * Returns ID column for a table * * @param DbSchemaInfo $schema * @param string $table * @return string[]|null */ private function resolveIdColumns($schema, $table) { $entity = $schema->getEntityInfoByPrefixedTableName($table); if ($entity) { return [$entity->idColumnName]; } // Temporary hack for M:N references until VP will support composite PKs $referenceDetails = $schema->getMnReferenceDetails($schema->trimPrefix($table)); if ($referenceDetails) { return [$referenceDetails['source-column'], $referenceDetails['target-column']]; } return null; }