Skip to content

Commit

Permalink
Multiple queries to tables have been replaced with a single one (#612)
Browse files Browse the repository at this point in the history
  • Loading branch information
SavageDays committed Apr 13, 2024
1 parent 502b84c commit 9844258
Showing 1 changed file with 31 additions and 24 deletions.
55 changes: 31 additions & 24 deletions src/EventListener/LogRevisionsListener.php
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,9 @@ public function postFlush(PostFlushEventArgs $eventArgs): void
continue;
}

$sql = 'UPDATE '.$this->config->getTableName($meta).' ';
$params = $types = [];

foreach ($updateData[$meta->table['name']] as $column => $value) {
$field = $meta->getFieldName($column);
$fieldName = $meta->getFieldForColumn($column);
Expand All @@ -128,13 +131,15 @@ public function postFlush(PostFlushEventArgs $eventArgs): void
}
}

$sql = 'UPDATE '.$this->config->getTableName($meta).' '.
'SET '.$field.' = '.$placeholder.' '.
'WHERE '.$this->config->getRevisionFieldName().' = ? ';
if ($column === array_key_first($updateData[$meta->table['name']])) {
$sql .= 'SET ';
} else {
$sql = trim($sql).', ';
}

$params = [$value, $this->getRevisionId($conn)];
$sql .= $field.' = '.$placeholder.' ';

$types = [];
$params[] = $value;

if (\array_key_exists($column, $meta->fieldNames)) {
$types[] = $meta->getTypeOfField($fieldName);
Expand All @@ -161,29 +166,31 @@ public function postFlush(PostFlushEventArgs $eventArgs): void

$types[] = $type;
}
}

$types[] = $this->config->getRevisionIdFieldType();

foreach ($meta->identifier as $idField) {
if (isset($meta->fieldMappings[$idField])) {
$columnName = $meta->fieldMappings[$idField]['columnName'];
$types[] = $meta->fieldMappings[$idField]['type'];
} elseif (isset($meta->associationMappings[$idField]['joinColumns'])) {
$columnName = $meta->associationMappings[$idField]['joinColumns'][0]['name'];
$types[] = $meta->associationMappings[$idField]['type'];
} else {
throw new \RuntimeException('column name not found for'.$idField);
}

$reflField = $meta->reflFields[$idField];
\assert(null !== $reflField);
$params[] = $reflField->getValue($entity);

$sql .= ' AND '.$columnName.' = ?';
$sql .= 'WHERE '.$this->config->getRevisionFieldName().' = ? ';
$params[] = $this->getRevisionId($conn);
$types[] = $this->config->getRevisionIdFieldType();

foreach ($meta->identifier as $idField) {
if (isset($meta->fieldMappings[$idField])) {
$columnName = $meta->fieldMappings[$idField]['columnName'];
$types[] = $meta->fieldMappings[$idField]['type'];
} elseif (isset($meta->associationMappings[$idField]['joinColumns'])) {
$columnName = $meta->associationMappings[$idField]['joinColumns'][0]['name'];
$types[] = $meta->associationMappings[$idField]['type'];
} else {
throw new \RuntimeException('column name not found for'.$idField);
}

$em->getConnection()->executeQuery($sql, $params, $types);
$reflField = $meta->reflFields[$idField];
\assert(null !== $reflField);
$params[] = $reflField->getValue($entity);

$sql .= ' AND '.$columnName.' = ?';
}

$em->getConnection()->executeQuery($sql, $params, $types);
}

foreach ($this->deferredChangedManyToManyEntityRevisionsToPersist as $deferredChangedManyToManyEntityRevisionToPersist) {
Expand Down

0 comments on commit 9844258

Please sign in to comment.