[Libreoffice-commits] core.git: Branch 'feature/pivot-table-result-tree' - sc/inc sc/source

Kohei Yoshida kohei.yoshida at gmail.com
Thu Apr 18 19:00:33 PDT 2013


 sc/inc/dpsave.hxx                |    6 +++++
 sc/source/core/data/dpobject.cxx |   36 ++++--------------------------
 sc/source/core/data/dpsave.cxx   |   46 ++++++++++++++++++++++++++++++++++++++-
 3 files changed, 56 insertions(+), 32 deletions(-)

New commits:
commit 6c335c39e64cabbb963ca309a8d76151c2c67a99
Author: Kohei Yoshida <kohei.yoshida at gmail.com>
Date:   Thu Apr 18 22:00:19 2013 -0400

    Move the dimension order calculation into ScDPSaveData.
    
    To build the dim order map only once.
    
    Change-Id: Ibea5cbfc4f5d335ac7fc5893cda255b06336d8c2

diff --git a/sc/inc/dpsave.hxx b/sc/inc/dpsave.hxx
index 099f4cb..770349f 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 d4446a8..238ee97 100644
--- a/sc/source/core/data/dpobject.cxx
+++ b/sc/source/core/data/dpobject.cxx
@@ -1295,38 +1295,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;
 
@@ -1361,19 +1345,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 28d609b..c6e369a 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;


More information about the Libreoffice-commits mailing list