[Libreoffice-commits] core.git: sc/inc sc/source
Luboš Luňák (via logerrit)
logerrit at kemper.freedesktop.org
Wed May 15 11:38:07 UTC 2019
sc/inc/column.hxx | 2 ++
sc/source/core/data/column2.cxx | 16 ++++++++++++++++
sc/source/core/data/table1.cxx | 12 ++++++++++--
3 files changed, 28 insertions(+), 2 deletions(-)
New commits:
commit 3e664b8f194392eb27aae953c0d33a8bdfd32982
Author: Luboš Luňák <l.lunak at collabora.com>
AuthorDate: Wed May 15 11:04:03 2019 +0200
Commit: Dennis Francis <dennis.francis at collabora.com>
CommitDate: Wed May 15 13:36:46 2019 +0200
cache cell positions when opening standard filter in calc (tdf#80853)
Part of the performance problem in the bugreport. Mdds otherwise
always starts a search from the beginning of the contaier.
Change-Id: Ic5c542220b7a8dc3aec0cfa93a0888997435fbfe
Reviewed-on: https://gerrit.libreoffice.org/72347
Tested-by: Jenkins
Reviewed-by: Dennis Francis <dennis.francis at collabora.com>
diff --git a/sc/inc/column.hxx b/sc/inc/column.hxx
index 023e77427e01..f55bc63b9541 100644
--- a/sc/inc/column.hxx
+++ b/sc/inc/column.hxx
@@ -216,6 +216,8 @@ public:
SCSIZE GetEmptyLinesInBlock( SCROW nStartRow, SCROW nEndRow, ScDirection eDir ) const;
bool HasDataAt(SCROW nRow, bool bConsiderCellNotes=false,
bool bConsiderCellDrawObjects=false) const;
+ bool HasDataAt(sc::ColumnBlockConstPosition& rBlockPos, SCROW nRow, bool bConsiderCellNotes=false,
+ bool bConsiderCellDrawObjects=false) const;
bool HasVisibleDataAt(SCROW nRow) const;
SCROW GetFirstDataPos() const;
SCROW GetLastDataPos() const;
diff --git a/sc/source/core/data/column2.cxx b/sc/source/core/data/column2.cxx
index bea0497e4c84..25680418ca39 100644
--- a/sc/source/core/data/column2.cxx
+++ b/sc/source/core/data/column2.cxx
@@ -3084,6 +3084,22 @@ bool ScColumn::HasDataAt(SCROW nRow, bool bConsiderCellNotes, bool bConsiderCell
return maCells.get_type(nRow) != sc::element_type_empty;
}
+bool ScColumn::HasDataAt(sc::ColumnBlockConstPosition& rBlockPos, SCROW nRow,
+ bool bConsiderCellNotes, bool bConsiderCellDrawObjects) const
+{
+ if (bConsiderCellNotes && !IsNotesEmptyBlock(nRow, nRow))
+ return true;
+
+ if (bConsiderCellDrawObjects && !IsDrawObjectsEmptyBlock(nRow, nRow))
+ return true;
+
+ std::pair<sc::CellStoreType::const_iterator,size_t> aPos = maCells.position(rBlockPos.miCellPos, nRow);
+ if (aPos.first == maCells.end())
+ return false;
+ rBlockPos.miCellPos = aPos.first; // Store this for next call.
+ return aPos.first->type != sc::element_type_empty;
+}
+
bool ScColumn::IsAllAttrEqual( const ScColumn& rCol, SCROW nStartRow, SCROW nEndRow ) const
{
if (pAttrArray && rCol.pAttrArray)
diff --git a/sc/source/core/data/table1.cxx b/sc/source/core/data/table1.cxx
index 24d0439935ea..c18c039c46db 100644
--- a/sc/source/core/data/table1.cxx
+++ b/sc/source/core/data/table1.cxx
@@ -801,6 +801,11 @@ void ScTable::GetDataArea( SCCOL& rStartCol, SCROW& rStartRow, SCCOL& rEndCol, S
bool bBottom = false;
bool bChanged = false;
+ // We need to cache sc::ColumnBlockConstPosition per each column.
+ std::vector< sc::ColumnBlockConstPosition > blockPos( rEndCol + 1 );
+ for( SCCOL i = 0; i <= rEndCol; ++i )
+ aCol[ i ].InitBlockPosition( blockPos[ i ] );
+
do
{
bChanged = false;
@@ -815,7 +820,10 @@ void ScTable::GetDataArea( SCCOL& rStartCol, SCROW& rStartRow, SCCOL& rEndCol, S
if (rEndCol < (aCol.size()-1))
if (!aCol[rEndCol+1].IsEmptyBlock(nStart,nEnd))
{
+ assert( int( blockPos.size()) == rEndCol + 1 );
++rEndCol;
+ blockPos.resize( blockPos.size() + 1 );
+ aCol[ rEndCol ].InitBlockPosition( blockPos[ rEndCol ] );
bChanged = true;
bRight = true;
}
@@ -833,7 +841,7 @@ void ScTable::GetDataArea( SCCOL& rStartCol, SCROW& rStartRow, SCCOL& rEndCol, S
SCROW nTest = rStartRow-1;
bool needExtend = false;
for ( SCCOL i = rStartCol; i<=rEndCol && !needExtend; i++)
- if (aCol[i].HasDataAt(nTest))
+ if (aCol[i].HasDataAt(blockPos[i], nTest))
needExtend = true;
if (needExtend)
{
@@ -849,7 +857,7 @@ void ScTable::GetDataArea( SCCOL& rStartCol, SCROW& rStartRow, SCCOL& rEndCol, S
SCROW nTest = rEndRow+1;
bool needExtend = false;
for ( SCCOL i = rStartCol; i<=rEndCol && !needExtend; i++)
- if (aCol[i].HasDataAt(nTest))
+ if (aCol[i].HasDataAt(blockPos[ i ], nTest))
needExtend = true;
if (needExtend)
{
More information about the Libreoffice-commits
mailing list