diff options
author | Kohei Yoshida <kohei.yoshida@gmail.com> | 2013-04-18 22:00:19 -0400 |
---|---|---|
committer | Kohei Yoshida <kohei.yoshida@gmail.com> | 2013-04-19 00:30:11 -0400 |
commit | 77c84dd59f438c10d559393e9cc7b63551529203 (patch) | |
tree | 6f0b07ca7065993ddcb2670ee95a9dfc873aef99 /sc/source/core | |
parent | d6cfe8de74969928af13a04ebc5ae9dbc9274196 (diff) |
Move the dimension order calculation into ScDPSaveData.
To build the dim order map only once.
Change-Id: Ibea5cbfc4f5d335ac7fc5893cda255b06336d8c2
Diffstat (limited to 'sc/source/core')
-rw-r--r-- | sc/source/core/data/dpobject.cxx | 36 | ||||
-rw-r--r-- | sc/source/core/data/dpsave.cxx | 46 |
2 files changed, 50 insertions, 32 deletions
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; |