[Libreoffice-commits] .: sc/inc sc/source
Kohei Yoshida
kohei at kemper.freedesktop.org
Fri Jan 7 14:14:47 PST 2011
sc/inc/segmenttree.hxx | 10 +++---
sc/inc/table.hxx | 4 +-
sc/source/core/data/segmenttree.cxx | 57 ++++++++++++++++++++++++------------
sc/source/core/data/table2.cxx | 24 ++++-----------
sc/source/core/data/table3.cxx | 4 ++
sc/source/core/data/table5.cxx | 18 +++++++----
sc/source/filter/excel/colrowst.cxx | 8 ++---
7 files changed, 73 insertions(+), 52 deletions(-)
New commits:
commit cb1ea727fd7b66015867fdc2641722129449c2bb
Author: Kohei Yoshida <kyoshida at novell.com>
Date: Tue Jan 4 18:48:20 2011 -0500
Improve filtering performance to an acceptable level.
Note: this change requires mdds 0.5.0.
diff --git a/sc/inc/segmenttree.hxx b/sc/inc/segmenttree.hxx
index 88d9c1f..df434f1 100644
--- a/sc/inc/segmenttree.hxx
+++ b/sc/inc/segmenttree.hxx
@@ -75,13 +75,14 @@ public:
ScFlatBoolRowSegments(const ScFlatBoolRowSegments& r);
~ScFlatBoolRowSegments();
- void setTrue(SCROW nRow1, SCROW nRow2);
- void setFalse(SCROW nRow1, SCROW nRow2);
+ bool setTrue(SCROW nRow1, SCROW nRow2);
+ bool setFalse(SCROW nRow1, SCROW nRow2);
bool getValue(SCROW nRow);
bool getRangeData(SCROW nRow, RangeData& rData);
void removeSegment(SCROW nRow1, SCROW nRow2);
void insertSegment(SCROW nRow, SCROW nSize, bool bSkipStartBoundary);
+ void enableTreeSearch(bool bEnable);
SCROW findLastNotOf(bool bValue) const;
private:
@@ -103,12 +104,13 @@ public:
ScFlatBoolColSegments(const ScFlatBoolColSegments& r);
~ScFlatBoolColSegments();
- void setTrue(SCCOL nCol1, SCCOL nCol2);
- void setFalse(SCCOL nCol1, SCCOL nCol2);
+ bool setTrue(SCCOL nCol1, SCCOL nCol2);
+ bool setFalse(SCCOL nCol1, SCCOL nCol2);
bool getRangeData(SCCOL nCol, RangeData& rData);
void removeSegment(SCCOL nCol1, SCCOL nCol2);
void insertSegment(SCCOL nCol, SCCOL nSize, bool bSkipStartBoundary);
+ void enableTreeSearch(bool bEnable);
void setInsertFromBack(bool bInsertFromBack);
private:
diff --git a/sc/inc/table.hxx b/sc/inc/table.hxx
index b402c5c..82797e4 100644
--- a/sc/inc/table.hxx
+++ b/sc/inc/table.hxx
@@ -730,8 +730,8 @@ public:
bool HasHiddenRows(SCROW nStartRow, SCROW nEndRow) const;
bool ColHidden(SCCOL nCol, SCCOL& rLastCol) const;
bool ColHidden(SCCOL nCol, SCCOL* pFirstCol = NULL, SCCOL* pLastCol = NULL) const;
- void SetRowHidden(SCROW nStartRow, SCROW nEndRow, bool bHidden);
- void SetColHidden(SCCOL nStartCol, SCCOL nEndCol, bool bHidden);
+ bool SetRowHidden(SCROW nStartRow, SCROW nEndRow, bool bHidden);
+ bool SetColHidden(SCCOL nStartCol, SCCOL nEndCol, bool bHidden);
void CopyColHidden(ScTable& rTable, SCCOL nStartCol, SCCOL nEndCol);
void CopyRowHidden(ScTable& rTable, SCROW nStartRow, SCROW nEndRow);
void CopyRowHeight(ScTable& rSrcTable, SCROW nStartRow, SCROW nEndRow, SCROW nSrcOffset);
diff --git a/sc/source/core/data/segmenttree.cxx b/sc/source/core/data/segmenttree.cxx
index 678363c..9a49bb1 100644
--- a/sc/source/core/data/segmenttree.cxx
+++ b/sc/source/core/data/segmenttree.cxx
@@ -57,7 +57,7 @@ public:
ScFlatSegmentsImpl(const ScFlatSegmentsImpl& r);
~ScFlatSegmentsImpl();
- void setValue(SCCOLROW nPos1, SCCOLROW nPos2, ValueType nValue);
+ bool setValue(SCCOLROW nPos1, SCCOLROW nPos2, ValueType nValue);
ValueType getValue(SCCOLROW nPos);
ExtValueType getSumValue(SCCOLROW nPos1, SCCOLROW nPos2);
bool getRangeData(SCCOLROW nPos, RangeData& rData);
@@ -111,12 +111,16 @@ ScFlatSegmentsImpl<_ValueType, _ExtValueType>::~ScFlatSegmentsImpl()
}
template<typename _ValueType, typename _ExtValueType>
-void ScFlatSegmentsImpl<_ValueType, _ExtValueType>::setValue(SCCOLROW nPos1, SCCOLROW nPos2, ValueType nValue)
+bool ScFlatSegmentsImpl<_ValueType, _ExtValueType>::setValue(SCCOLROW nPos1, SCCOLROW nPos2, ValueType nValue)
{
+ ::std::pair<typename fst_type::const_iterator, bool> ret;
if (mbInsertFromBack)
- maSegments.insert_back(nPos1, nPos2+1, nValue);
+ ret = maSegments.insert_back(nPos1, nPos2+1, nValue);
else
- maSegments.insert_front(nPos1, nPos2+1, nValue);
+ ret = maSegments.insert(maItr, nPos1, nPos2+1, nValue);
+
+ maItr = ret.first;
+ return ret.second;
}
template<typename _ValueType, typename _ExtValueType>
@@ -182,8 +186,13 @@ bool ScFlatSegmentsImpl<_ValueType, _ExtValueType>::getRangeData(SCCOLROW nPos,
else
{
// Conduct leaf-node only search. Faster when searching between range insertion.
- if (!maSegments.search(nPos, nValue, &nPos1, &nPos2))
+ ::std::pair<typename fst_type::const_iterator, bool> ret =
+ maSegments.search(maItr, nPos, nValue, &nPos1, &nPos2);
+
+ if (!ret.second)
return false;
+
+ maItr = ret.first;
}
rData.mnPos1 = nPos1;
@@ -268,18 +277,18 @@ public:
{
}
- void setTrue(SCCOLROW nPos1, SCCOLROW nPos2);
- void setFalse(SCCOLROW nPos1, SCCOLROW nPos2);
+ bool setTrue(SCCOLROW nPos1, SCCOLROW nPos2);
+ bool setFalse(SCCOLROW nPos1, SCCOLROW nPos2);
};
-void ScFlatBoolSegmentsImpl::setTrue(SCCOLROW nPos1, SCCOLROW nPos2)
+bool ScFlatBoolSegmentsImpl::setTrue(SCCOLROW nPos1, SCCOLROW nPos2)
{
- setValue(nPos1, nPos2, true);
+ return setValue(nPos1, nPos2, true);
}
-void ScFlatBoolSegmentsImpl::setFalse(SCCOLROW nPos1, SCCOLROW nPos2)
+bool ScFlatBoolSegmentsImpl::setFalse(SCCOLROW nPos1, SCCOLROW nPos2)
{
- setValue(nPos1, nPos2, false);
+ return setValue(nPos1, nPos2, false);
}
// ============================================================================
@@ -362,14 +371,14 @@ ScFlatBoolRowSegments::~ScFlatBoolRowSegments()
{
}
-void ScFlatBoolRowSegments::setTrue(SCROW nRow1, SCROW nRow2)
+bool ScFlatBoolRowSegments::setTrue(SCROW nRow1, SCROW nRow2)
{
- mpImpl->setTrue(static_cast<SCCOLROW>(nRow1), static_cast<SCCOLROW>(nRow2));
+ return mpImpl->setTrue(static_cast<SCCOLROW>(nRow1), static_cast<SCCOLROW>(nRow2));
}
-void ScFlatBoolRowSegments::setFalse(SCROW nRow1, SCROW nRow2)
+bool ScFlatBoolRowSegments::setFalse(SCROW nRow1, SCROW nRow2)
{
- mpImpl->setFalse(static_cast<SCCOLROW>(nRow1), static_cast<SCCOLROW>(nRow2));
+ return mpImpl->setFalse(static_cast<SCCOLROW>(nRow1), static_cast<SCCOLROW>(nRow2));
}
bool ScFlatBoolRowSegments::getValue(SCROW nRow)
@@ -399,6 +408,11 @@ void ScFlatBoolRowSegments::insertSegment(SCROW nRow, SCROW nSize, bool bSkipSta
mpImpl->insertSegment(static_cast<SCCOLROW>(nRow), static_cast<SCCOLROW>(nSize), bSkipStartBoundary);
}
+void ScFlatBoolRowSegments::enableTreeSearch(bool bEnable)
+{
+ mpImpl->enableTreeSearch(bEnable);
+}
+
SCROW ScFlatBoolRowSegments::findLastNotOf(bool bValue) const
{
return static_cast<SCROW>(mpImpl->findLastNotOf(bValue));
@@ -420,14 +434,14 @@ ScFlatBoolColSegments::~ScFlatBoolColSegments()
{
}
-void ScFlatBoolColSegments::setTrue(SCCOL nCol1, SCCOL nCol2)
+bool ScFlatBoolColSegments::setTrue(SCCOL nCol1, SCCOL nCol2)
{
- mpImpl->setTrue(static_cast<SCCOLROW>(nCol1), static_cast<SCCOLROW>(nCol2));
+ return mpImpl->setTrue(static_cast<SCCOLROW>(nCol1), static_cast<SCCOLROW>(nCol2));
}
-void ScFlatBoolColSegments::setFalse(SCCOL nCol1, SCCOL nCol2)
+bool ScFlatBoolColSegments::setFalse(SCCOL nCol1, SCCOL nCol2)
{
- mpImpl->setFalse(static_cast<SCCOLROW>(nCol1), static_cast<SCCOLROW>(nCol2));
+ return mpImpl->setFalse(static_cast<SCCOLROW>(nCol1), static_cast<SCCOLROW>(nCol2));
}
bool ScFlatBoolColSegments::getRangeData(SCCOL nCol, RangeData& rData)
@@ -452,6 +466,11 @@ void ScFlatBoolColSegments::insertSegment(SCCOL nCol, SCCOL nSize, bool bSkipSta
mpImpl->insertSegment(static_cast<SCCOLROW>(nCol), static_cast<SCCOLROW>(nSize), bSkipStartBoundary);
}
+void ScFlatBoolColSegments::enableTreeSearch(bool bEnable)
+{
+ mpImpl->enableTreeSearch(bEnable);
+}
+
void ScFlatBoolColSegments::setInsertFromBack(bool bInsertFromBack)
{
mpImpl->setInsertFromBack(bInsertFromBack);
diff --git a/sc/source/core/data/table2.cxx b/sc/source/core/data/table2.cxx
index 56325ed..e7bcd7f 100644
--- a/sc/source/core/data/table2.cxx
+++ b/sc/source/core/data/table2.cxx
@@ -778,29 +778,19 @@ void ScTable::CopyToTable(SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2,
// Hidden flags.
for (SCROW i = nRow1; i <= nRow2; ++i)
{
- SCROW nThisLastRow, nDestLastRow;
- bool bThisHidden = RowHidden(i, NULL, &nThisLastRow);
- bool bDestHidden = pDestTab->RowHidden(i, NULL, &nDestLastRow);
-
- // If the segment sizes differ, we take the shorter segment of the two.
- SCROW nLastRow = ::std::min(nThisLastRow, nDestLastRow);
+ SCROW nLastRow;
+ bool bHidden = RowHidden(i, NULL, &nLastRow);
if (nLastRow >= nRow2)
// the last row shouldn't exceed the upper bound the caller specified.
nLastRow = nRow2;
-
- pDestTab->SetRowHidden(i, nLastRow, bThisHidden);
-
- bool bThisHiddenChange = (bThisHidden != bDestHidden);
- if (bThisHiddenChange && pCharts)
- {
+ bool bHiddenChanged = pDestTab->SetRowHidden(i, nLastRow, bHidden);
+ if (bHiddenChanged && pCharts)
// Hidden flags differ.
pCharts->SetRangeDirty(ScRange(0, i, nTab, MAXCOL, nLastRow, nTab));
- }
-
- if (bThisHiddenChange)
+
+ if (bHiddenChanged)
bFlagChange = true;
-
- // Jump to the last row of the identical flag segment.
+
i = nLastRow;
}
diff --git a/sc/source/core/data/table3.cxx b/sc/source/core/data/table3.cxx
index 24eef6a..1d87a0a 100644
--- a/sc/source/core/data/table3.cxx
+++ b/sc/source/core/data/table3.cxx
@@ -60,6 +60,7 @@
#include "cellform.hxx"
#include "postit.hxx"
#include "queryparam.hxx"
+#include "segmenttree.hxx"
#include <vector>
@@ -1617,6 +1618,8 @@ static void lcl_PrepareQuery( ScDocument* pDoc, ScTable* pTab, ScQueryParam& rPa
SCSIZE ScTable::Query(ScQueryParam& rParamOrg, BOOL bKeepSub)
{
+ mpHiddenRows->enableTreeSearch(false);
+
ScQueryParam aParam( rParamOrg );
ScStrCollection aScStrCollection;
StrData* pStrData = NULL;
@@ -1722,6 +1725,7 @@ SCSIZE ScTable::Query(ScQueryParam& rParamOrg, BOOL bKeepSub)
delete[] pSpecial;
SetDrawPageSize();
+ mpHiddenRows->enableTreeSearch(true);
return nCount;
}
diff --git a/sc/source/core/data/table5.cxx b/sc/source/core/data/table5.cxx
index 4f39892..66cbe27 100644
--- a/sc/source/core/data/table5.cxx
+++ b/sc/source/core/data/table5.cxx
@@ -602,20 +602,26 @@ bool ScTable::ColHidden(SCCOL nCol, SCCOL* pFirstCol, SCCOL* pLastCol) const
return aData.mbValue;
}
-void ScTable::SetRowHidden(SCROW nStartRow, SCROW nEndRow, bool bHidden)
+bool ScTable::SetRowHidden(SCROW nStartRow, SCROW nEndRow, bool bHidden)
{
+ bool bChanged = false;
if (bHidden)
- mpHiddenRows->setTrue(nStartRow, nEndRow);
+ bChanged = mpHiddenRows->setTrue(nStartRow, nEndRow);
else
- mpHiddenRows->setFalse(nStartRow, nEndRow);
+ bChanged = mpHiddenRows->setFalse(nStartRow, nEndRow);
+
+ return bChanged;
}
-void ScTable::SetColHidden(SCCOL nStartCol, SCCOL nEndCol, bool bHidden)
+bool ScTable::SetColHidden(SCCOL nStartCol, SCCOL nEndCol, bool bHidden)
{
+ bool bChanged = false;
if (bHidden)
- mpHiddenCols->setTrue(nStartCol, nEndCol);
+ bChanged = mpHiddenCols->setTrue(nStartCol, nEndCol);
else
- mpHiddenCols->setFalse(nStartCol, nEndCol);
+ bChanged = mpHiddenCols->setFalse(nStartCol, nEndCol);
+
+ return bChanged;
}
void ScTable::CopyColHidden(ScTable& rTable, SCCOL nStartCol, SCCOL nEndCol)
diff --git a/sc/source/filter/excel/colrowst.cxx b/sc/source/filter/excel/colrowst.cxx
index 2a27b08..cdcaba7 100644
--- a/sc/source/filter/excel/colrowst.cxx
+++ b/sc/source/filter/excel/colrowst.cxx
@@ -143,7 +143,7 @@ void XclImpColRowSettings::SetHeight( SCROW nScRow, sal_uInt16 nHeight )
bool bDefHeight = ::get_flag( nHeight, EXC_ROW_FLAGDEFHEIGHT ) || (nRawHeight == 0);
maRowHeights.insert_back(nScRow, nScRow+1, nRawHeight);
sal_uInt8 nFlagVal = 0;
- if (!maRowFlags.search(nScRow, nFlagVal))
+ if (!maRowFlags.search(nScRow, nFlagVal).second)
return;
::set_flag(nFlagVal, EXC_COLROW_USED);
@@ -166,7 +166,7 @@ void XclImpColRowSettings::SetRowSettings( SCROW nScRow, sal_uInt16 nHeight, sal
SetHeight(nScRow, nHeight);
sal_uInt8 nFlagVal = 0;
- if (!maRowFlags.search(nScRow, nFlagVal))
+ if (!maRowFlags.search(nScRow, nFlagVal).second)
return;
if (::get_flag(nFlags, EXC_ROW_UNSYNCED))
@@ -184,7 +184,7 @@ void XclImpColRowSettings::SetManualRowHeight( SCROW nScRow )
return;
sal_uInt8 nFlagVal = 0;
- if (!maRowFlags.search(nScRow, nFlagVal))
+ if (!maRowFlags.search(nScRow, nFlagVal).second)
return;
::set_flag(nFlagVal, EXC_COLROW_MAN);
@@ -325,7 +325,7 @@ void XclImpColRowSettings::ConvertHiddenFlags( SCTAB nScTab )
if (nLastXLRow < MAXROW)
{
bool bHidden = false;
- if (!maHiddenRows.search(nLastXLRow, bHidden))
+ if (!maHiddenRows.search(nLastXLRow, bHidden).second)
return;
maHiddenRows.insert_back(nLastXLRow, MAXROWCOUNT, bHidden);
More information about the Libreoffice-commits
mailing list