mirror of
https://github.com/nextcloud/tables.git
synced 2025-07-25 01:28:47 +00:00
refactor: optimized parseEntities for better efficiency
Signed-off-by: ailkiv <a.ilkiv.ye@gmail.com>
This commit is contained in:
@ -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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Reference in New Issue
Block a user