summaryrefslogtreecommitdiff
path: root/sc
diff options
context:
space:
mode:
authorKohei Yoshida <kohei.yoshida@gmail.com>2013-04-18 22:00:19 -0400
committerKohei Yoshida <kohei.yoshida@gmail.com>2013-04-19 00:30:11 -0400
commit77c84dd59f438c10d559393e9cc7b63551529203 (patch)
tree6f0b07ca7065993ddcb2670ee95a9dfc873aef99 /sc
parentd6cfe8de74969928af13a04ebc5ae9dbc9274196 (diff)
Move the dimension order calculation into ScDPSaveData.
To build the dim order map only once. Change-Id: Ibea5cbfc4f5d335ac7fc5893cda255b06336d8c2
Diffstat (limited to 'sc')
-rw-r--r--sc/inc/dpsave.hxx6
-rw-r--r--sc/source/core/data/dpobject.cxx36
-rw-r--r--sc/source/core/data/dpsave.cxx46
3 files changed, 56 insertions, 32 deletions
diff --git a/sc/inc/dpsave.hxx b/sc/inc/dpsave.hxx
index 099f4cb763c1..770349ff5ce9 100644
--- a/sc/inc/dpsave.hxx
+++ b/sc/inc/dpsave.hxx
@@ -229,6 +229,7 @@ class ScDPSaveData
{
typedef boost::unordered_map<OUString, size_t, OUStringHash> DupNameCountType;
public:
+ typedef boost::unordered_map<OUString, size_t, OUStringHash> DimOrderType;
typedef boost::ptr_vector<ScDPSaveDimension> DimsType;
private:
@@ -247,6 +248,7 @@ private:
bool mbDimensionMembersBuilt;
boost::scoped_ptr<OUString> mpGrandTotalName;
+ mutable boost::scoped_ptr<DimOrderType> mpDimOrder; // dimension order for row and column dimensions, to traverse result tree.
public:
SC_DLLPUBLIC ScDPSaveData();
@@ -262,6 +264,8 @@ public:
SC_DLLPUBLIC const DimsType& GetDimensions() const;
+ const DimOrderType& GetDimensionSortOrder() const;
+
/**
* Get all dimensions in a given orientation. The order represents the
* actual order of occurrence. The returned list also includes data
@@ -363,6 +367,8 @@ private:
* @return pointer to the new dimension just inserted.
*/
ScDPSaveDimension* AppendNewDimension(const OUString& rName, bool bDataLayout);
+
+ void DimensionChanged();
};
#endif
diff --git a/sc/source/core/data/dpobject.cxx b/sc/source/core/data/dpobject.cxx
index 8ac05abfb480..04273c8dd23b 100644
--- a/sc/source/core/data/dpobject.cxx
+++ b/sc/source/core/data/dpobject.cxx
@@ -1297,38 +1297,22 @@ public:
}
};
-typedef boost::unordered_map<OUString, size_t, OUStringHash> DimOrderType;
-
-class DimOrderInserter : std::unary_function<const ScDPSaveDimension*, void>
-{
- DimOrderType& mrNames;
-public:
- DimOrderInserter(DimOrderType& rNames) : mrNames(rNames) {}
-
- void operator() (const ScDPSaveDimension* pDim)
- {
- size_t nRank = mrNames.size();
- mrNames.insert(
- DimOrderType::value_type(pDim->GetName(), nRank));
- }
-};
-
class LessByDimOrder : std::binary_function<sheet::DataPilotFieldFilter, sheet::DataPilotFieldFilter, bool>
{
- const DimOrderType& mrDimOrder;
+ const ScDPSaveData::DimOrderType& mrDimOrder;
public:
- LessByDimOrder(const DimOrderType& rDimOrder) : mrDimOrder(rDimOrder) {}
+ LessByDimOrder(const ScDPSaveData::DimOrderType& rDimOrder) : mrDimOrder(rDimOrder) {}
bool operator() (const sheet::DataPilotFieldFilter& r1, const sheet::DataPilotFieldFilter& r2) const
{
size_t nRank1 = mrDimOrder.size();
size_t nRank2 = mrDimOrder.size();
- DimOrderType::const_iterator it1 = mrDimOrder.find(r1.FieldName);
+ ScDPSaveData::DimOrderType::const_iterator it1 = mrDimOrder.find(r1.FieldName);
if (it1 != mrDimOrder.end())
nRank1 = it1->second;
- DimOrderType::const_iterator it2 = mrDimOrder.find(r2.FieldName);
+ ScDPSaveData::DimOrderType::const_iterator it2 = mrDimOrder.find(r2.FieldName);
if (it2 != mrDimOrder.end())
nRank2 = it2->second;
@@ -1363,19 +1347,9 @@ double ScDPObject::GetPivotData(const OUString& rDataFieldName, std::vector<shee
if (!xDPResults.is())
return fRet;
- std::vector<const ScDPSaveDimension*> aRowDims, aColDims;
- pSaveData->GetAllDimensionsByOrientation(sheet::DataPilotFieldOrientation_ROW, aRowDims);
- pSaveData->GetAllDimensionsByOrientation(sheet::DataPilotFieldOrientation_COLUMN, aColDims);
-
// Dimensions must be sorted in order of appearance, and row dimensions
// must come before column dimensions.
- // TODO: dimension order should be generated only once in ScDPSaveData.
- DimOrderType aDimOrder;
- std::for_each(aRowDims.begin(), aRowDims.end(), DimOrderInserter(aDimOrder));
- std::for_each(aColDims.begin(), aColDims.end(), DimOrderInserter(aDimOrder));
-
- // Sort filters by this dimension order...
- std::sort(rFilters.begin(), rFilters.end(), LessByDimOrder(aDimOrder));
+ std::sort(rFilters.begin(), rFilters.end(), LessByDimOrder(pSaveData->GetDimensionSortOrder()));
size_t n = rFilters.size();
uno::Sequence<sheet::DataPilotFieldFilter> aFilters(n);
diff --git a/sc/source/core/data/dpsave.cxx b/sc/source/core/data/dpsave.cxx
index 28d609b5d16c..c6e369ae1e46 100644
--- a/sc/source/core/data/dpsave.cxx
+++ b/sc/source/core/data/dpsave.cxx
@@ -723,7 +723,8 @@ ScDPSaveData::ScDPSaveData(const ScDPSaveData& r) :
bFilterButton( r.bFilterButton ),
bDrillDown( r.bDrillDown ),
mbDimensionMembersBuilt(r.mbDimensionMembersBuilt),
- mpGrandTotalName(NULL)
+ mpGrandTotalName(NULL),
+ mpDimOrder(NULL)
{
if ( r.pDimensionData )
pDimensionData = new ScDPDimensionSaveData( *r.pDimensionData );
@@ -800,6 +801,39 @@ const ScDPSaveData::DimsType& ScDPSaveData::GetDimensions() const
return aDimList;
}
+namespace {
+
+class DimOrderInserter : std::unary_function<const ScDPSaveDimension*, void>
+{
+ ScDPSaveData::DimOrderType& mrNames;
+public:
+ DimOrderInserter(ScDPSaveData::DimOrderType& rNames) : mrNames(rNames) {}
+
+ void operator() (const ScDPSaveDimension* pDim)
+ {
+ size_t nRank = mrNames.size();
+ mrNames.insert(
+ ScDPSaveData::DimOrderType::value_type(pDim->GetName(), nRank));
+ }
+};
+
+}
+
+const ScDPSaveData::DimOrderType& ScDPSaveData::GetDimensionSortOrder() const
+{
+ if (!mpDimOrder)
+ {
+ mpDimOrder.reset(new DimOrderType);
+ std::vector<const ScDPSaveDimension*> aRowDims, aColDims;
+ GetAllDimensionsByOrientation(sheet::DataPilotFieldOrientation_ROW, aRowDims);
+ GetAllDimensionsByOrientation(sheet::DataPilotFieldOrientation_COLUMN, aColDims);
+
+ std::for_each(aRowDims.begin(), aRowDims.end(), DimOrderInserter(*mpDimOrder));
+ std::for_each(aColDims.begin(), aColDims.end(), DimOrderInserter(*mpDimOrder));
+ }
+ return *mpDimOrder;
+}
+
void ScDPSaveData::GetAllDimensionsByOrientation(
sheet::DataPilotFieldOrientation eOrientation, std::vector<const ScDPSaveDimension*>& rDims) const
{
@@ -824,6 +858,8 @@ void ScDPSaveData::AddDimension(ScDPSaveDimension* pDim)
CheckDuplicateName(*pDim);
aDimList.push_back(pDim);
+
+ DimensionChanged();
}
ScDPSaveDimension* ScDPSaveData::GetDimensionByName(const OUString& rName)
@@ -904,6 +940,7 @@ void ScDPSaveData::RemoveDimensionByName(const OUString& rName)
aDimList.erase(iter);
RemoveDuplicateNameCount(rName);
+ DimensionChanged();
return;
}
}
@@ -984,6 +1021,7 @@ void ScDPSaveData::SetPosition( ScDPSaveDimension* pDim, long nNew )
}
aDimList.insert(iterInsert,pDim);
+ DimensionChanged();
}
void ScDPSaveData::SetColumnGrand(bool bSet)
@@ -1361,9 +1399,15 @@ ScDPSaveDimension* ScDPSaveData::AppendNewDimension(const OUString& rName, bool
if (!maDupNameCounts.count(rName))
maDupNameCounts.insert(DupNameCountType::value_type(rName, 0));
+ DimensionChanged();
return pNew;
}
+void ScDPSaveData::DimensionChanged()
+{
+ mpDimOrder.reset();
+}
+
bool operator == (const ::com::sun::star::sheet::DataPilotFieldSortInfo &l, const ::com::sun::star::sheet::DataPilotFieldSortInfo &r )
{
return l.Field == r.Field && l.IsAscending == r.IsAscending && l.Mode == r.Mode;