private function deleteEntitiesWhichAreNotInStorage()
{
if ($this->isSelectiveSynchronization) {
$savedVpIds = array_column($this->entities, $this->entityInfo->vpidColumnName);
$vpIdsToSynchronize = array_column($this->entitiesToSynchronize, 'vp_id');
if ($this->entityInfo->hasNaturalVpid) {
$sql = "SELECT `{$this->idColumnName}` FROM {$this->prefixedTableName} ";
$sql .= sprintf("WHERE {$this->idColumnName} IN (\"%s\") ", join('", "', $vpIdsToSynchronize));
$sql .= sprintf("AND {$this->idColumnName} NOT IN (\"%s\")", join('", "', $savedVpIds));
} else {
$sql = sprintf('SELECT id FROM %s WHERE `table` = "%s" ', $this->database->vp_id, $this->tableName);
$sql .= sprintf('AND HEX(vp_id) IN ("%s") ', join('", "', $vpIdsToSynchronize));
$sql .= sprintf('AND HEX(vp_id) NOT IN ("%s")', join('", "', $savedVpIds));
}
$ids = $this->database->get_col($sql);
} else {
$allVpids = array_column($this->entities, $this->entityInfo->vpidColumnName);
if ($this->entityInfo->hasNaturalVpid) {
$rules = $this->entityInfo->getRulesForIgnoredEntities();
$restrictionForIgnoredEntities = join(' OR ', array_map(function ($rule) {
$restrictionPart = QueryLanguageUtils::createSqlRestrictionFromRule($rule);
return "({$restrictionPart})";
}, $rules));
$sql = "SELECT `{$this->idColumnName}` FROM {$this->prefixedTableName} WHERE NOT ({$restrictionForIgnoredEntities})";
if (count($allVpids) > 0) {
$sql .= " AND `{$this->idColumnName}` NOT IN (\"" . join('", "', $allVpids) . "\")";
}
} else {
$sql = "SELECT id FROM {$this->database->vp_id} WHERE `table` = \"{$this->tableName}\"" . (count($allVpids) > 0 ? "AND HEX(vp_id) NOT IN (\"" . join('", "', $allVpids) . "\")" : "");
}
$ids = $this->database->get_col($sql);
}
$this->deletedIds = $ids;
if (count($ids) == 0) {
return;
}
$idsString = join("', '", $ids);
$this->database->query("DELETE FROM {$this->prefixedTableName} WHERE {$this->idColumnName} IN ('{$idsString}')");
$this->database->query("DELETE FROM {$this->database->vp_id} WHERE `table` = \"{$this->tableName}\" AND id IN ('{$idsString}')");
}