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}')"); }
/** * @test */ public function rulesOfIgnoredEntitiesEqualEntitySchema() { $expectedRules = [['some_field' => ['value'], 'other_field' => ['a']], ['other_field' => ['value']]]; $this->assertSame($expectedRules, $this->entityInfo->getRulesForIgnoredEntities()); }