tdf#166121 speed up de-duplication by merge deletes
takes the de-dupe time from 4s to <1s, and the undo time from 14s to <1s. Change-Id: I31835775d2c005059fc133c1f88ecff84733251e Reviewed-on: https://gerrit.libreoffice.org/c/core/+/198376 Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk> Tested-by: Jenkins
This commit is contained in:
@@ -2077,19 +2077,27 @@ void ScTabViewShell::HandleDuplicateRecordsRemove(const rtl::Reference<ScTableSh
|
||||
if (bDuplicateRows)
|
||||
{
|
||||
std::vector<uno::Sequence<uno::Any>> aUnionArray;
|
||||
sal_uInt32 nRow = bIncludesHeaders ? 1 : 0;
|
||||
sal_uInt32 lRows = aDataArray.getLength();
|
||||
SCROW nRow = bIncludesHeaders ? 1 : 0;
|
||||
SCROW lRows = aDataArray.getLength();
|
||||
sal_uInt32 nDeleteCount = 0;
|
||||
SCROW nPrevRowDeleted = -1;
|
||||
std::vector<table::CellRangeAddress> aDelRanges;
|
||||
|
||||
while (nRow < lRows)
|
||||
{
|
||||
if (lcl_CheckInArrayRows(aUnionArray, aDataArray[nRow], rSelectedEntries))
|
||||
{
|
||||
table::CellRangeAddress aCellRange(aRange.Sheet, aRange.StartColumn,
|
||||
aRange.StartRow + nRow - nDeleteCount,
|
||||
aRange.EndColumn, aRange.StartRow + nRow - nDeleteCount);
|
||||
ActiveSheet->removeRange(aCellRange, sheet::CellDeleteMode_UP);
|
||||
if (nPrevRowDeleted + 1 == nRow)
|
||||
aDelRanges.back().EndRow++;
|
||||
else
|
||||
{
|
||||
table::CellRangeAddress aCellRange(aRange.Sheet, aRange.StartColumn,
|
||||
aRange.StartRow + nRow - nDeleteCount,
|
||||
aRange.EndColumn, aRange.StartRow + nRow - nDeleteCount);
|
||||
aDelRanges.push_back(aCellRange);
|
||||
}
|
||||
++nDeleteCount;
|
||||
nPrevRowDeleted = nRow;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -2097,6 +2105,8 @@ void ScTabViewShell::HandleDuplicateRecordsRemove(const rtl::Reference<ScTableSh
|
||||
}
|
||||
++nRow;
|
||||
}
|
||||
for (const table::CellRangeAddress & rRange : aDelRanges)
|
||||
ActiveSheet->removeRange(rRange, sheet::CellDeleteMode_UP);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user