refactor: optimized parseEntities for better efficiency

Signed-off-by: ailkiv <a.ilkiv.ye@gmail.com>
This commit is contained in:
ailkiv
2025-04-20 18:09:49 +00:00
parent 76fea1df06
commit 16f9446cf5

View File

@ -536,8 +536,6 @@ class Row2Mapper {
* @throws InternalError * @throws InternalError
*/ */
private function parseEntities(IResult $result, array $sleeves, array $columnTypes): array { private function parseEntities(IResult $result, array $sleeves, array $columnTypes): array {
$data = $result->fetchAll();
$rows = []; $rows = [];
foreach ($sleeves as $sleeve) { foreach ($sleeves as $sleeve) {
$rows[$sleeve->getId()] = new Row2(); $rows[$sleeve->getId()] = new Row2();
@ -552,8 +550,9 @@ class Row2Mapper {
$rowValues = []; $rowValues = [];
$keyToColumnId = []; $keyToColumnId = [];
$keyToRowId = []; $keyToRowId = [];
$cellMapperCache = [];
foreach ($data as $rowData) { while ($rowData = $result->fetch()) {
if (!isset($rowData['row_id']) || !isset($rows[$rowData['row_id']])) { if (!isset($rowData['row_id']) || !isset($rows[$rowData['row_id']])) {
break; break;
} }
@ -561,11 +560,12 @@ class Row2Mapper {
$columnType = $this->columns[$rowData['column_id']]->getType(); $columnType = $this->columns[$rowData['column_id']]->getType();
$cellClassName = 'OCA\Tables\Db\RowCell' . ucfirst($columnType); $cellClassName = 'OCA\Tables\Db\RowCell' . ucfirst($columnType);
$entity = call_user_func($cellClassName . '::fromRowData', $rowData); // >5.2.3 $entity = call_user_func($cellClassName . '::fromRowData', $rowData); // >5.2.3
$cellMapper = $this->getCellMapperFromType($columnType); if (!isset($cellMapperCache[$columnType])) {
$value = $cellMapper->formatEntity($this->columns[$rowData['column_id']], $entity); $cellMapperCache[$columnType] = $this->getCellMapperFromType($columnType);
}
$value = $cellMapperCache[$columnType]->formatEntity($this->columns[$rowData['column_id']], $entity);
$compositeKey = (string)$rowData['row_id'] . ',' . (string)$rowData['column_id']; $compositeKey = (string)$rowData['row_id'] . ',' . (string)$rowData['column_id'];
if ($cellMapperCache[$columnType]->hasMultipleValues()) {
if ($cellMapper->hasMultipleValues()) {
if (array_key_exists($compositeKey, $rowValues)) { if (array_key_exists($compositeKey, $rowValues)) {
$rowValues[$compositeKey][] = $value; $rowValues[$compositeKey][] = $value;
} else { } else {
@ -582,12 +582,7 @@ class Row2Mapper {
$rows[$keyToRowId[$compositeKey]]->addCell($keyToColumnId[$compositeKey], $value); $rows[$keyToRowId[$compositeKey]]->addCell($keyToColumnId[$compositeKey], $value);
} }
// format an array without keys return array_values($rows);
$return = [];
foreach ($rows as $row) {
$return[] = $row;
}
return $return;
} }
/** /**