sc/inc/dpsave.hxx|2 +
sc/qa/unit/ucalc.cxx | 29 ++
sc/source/core/data/dpobject.cxx | 12 +-
sc/source/core/data/dpsave.cxx | 37 +
sc/source/ui/view/dbfunc3.cxx| 43 ++-
5 files changed, 86 insertions(+), 37 deletions(-)
New commits:
commit f421e804371670001bc5af25b8b66d67dfdb3261
Author: Kohei Yoshida kohei.yosh...@gmail.com
Date: Wed Dec 5 12:53:03 2012 -0500
fdo#57497: Remove group table data when all group dimensions are gone.
Otherwise ungrouping date grouped dimension may crash, or produce
incorrect results.
Change-Id: I3634e3c0bf8336fc1221f5d234cb7e01eb1f07c6
Reviewed-on: https://gerrit.libreoffice.org/1247
Reviewed-by: Markus Mohrhard markus.mohrh...@googlemail.com
Tested-by: Markus Mohrhard markus.mohrh...@googlemail.com
diff --git a/sc/inc/dpsave.hxx b/sc/inc/dpsave.hxx
index 14a0032..4225d1b 100644
--- a/sc/inc/dpsave.hxx
+++ b/sc/inc/dpsave.hxx
@@ -345,6 +345,8 @@ public:
const ScDPDimensionSaveData* GetExistingDimensionData() const
{ return pDimensionData; }
+void RemoveAllGroupDimensions( const rtl::OUString rSrcDimName,
std::vectorrtl::OUString* pDeletedNames = NULL );
+
SC_DLLPUBLIC ScDPDimensionSaveData* GetDimensionData(); // create if not
there
void SetDimensionData( const ScDPDimensionSaveData* pNew ); // copied
void BuildAllDimensionMembers(ScDPTableData* pData);
diff --git a/sc/qa/unit/ucalc.cxx b/sc/qa/unit/ucalc.cxx
index cab47a6..795bea3 100644
--- a/sc/qa/unit/ucalc.cxx
+++ b/sc/qa/unit/ucalc.cxx
@@ -2688,6 +2688,35 @@ void Test::testPivotTableDateGrouping()
CPPUNIT_ASSERT_MESSAGE(Table output check failed, bSuccess);
}
+// Remove all date grouping. The source dimension Date has two
+// external dimensions (Years and Quarters) and one internal (Date
+// the same name but different hierarchy). Remove all of them.
+pSaveData = pDPObj-GetSaveData();
+pSaveData-RemoveAllGroupDimensions(aBaseDimName);
+pDPObj-SetSaveData(*pSaveData);
+pDPObj-ReloadGroupTableData();
+pDPObj-InvalidateData();
+
+aOutRange = refresh(pDPObj);
+{
+// Expected output table content. 0 = empty cell
+const char* aOutputCheck[][2] = {
+{ Date, 0 },
+{ 2011-01-01, 1 },
+{ 2011-03-02, 2 },
+{ 2011-09-03, 7 },
+{ 2012-01-04, 3 },
+{ 2012-02-23, 4 },
+{ 2012-02-24, 5 },
+{ 2012-03-15, 6 },
+{ 2012-12-25, 8 },
+{ Total Result, 36 }
+};
+
+bSuccess = checkDPTableOutput2(m_pDoc, aOutRange, aOutputCheck,
Remove all date grouping.);
+CPPUNIT_ASSERT_MESSAGE(Table output check failed, bSuccess);
+}
+
pDPs-FreeTable(pDPObj);
CPPUNIT_ASSERT_EQUAL_MESSAGE(There should be no more tables.,
pDPs-GetCount(), static_castsize_t(0));
CPPUNIT_ASSERT_EQUAL_MESSAGE(There shouldn't be any more cache stored.,
diff --git a/sc/source/core/data/dpobject.cxx b/sc/source/core/data/dpobject.cxx
index f4b39ff..8db3c16 100644
--- a/sc/source/core/data/dpobject.cxx
+++ b/sc/source/core/data/dpobject.cxx
@@ -567,8 +567,18 @@ void ScDPObject::ReloadGroupTableData()
const ScDPDimensionSaveData* pDimData =
pSaveData-GetExistingDimensionData();
if (!pDimData || !pDimData-HasGroupDimensions())
-// No group dimensions exist.
+{
+// No group dimensions exist. Check if it currently has group
+// dimensions, and if so, remove all of them.
+ScDPGroupTableData* pData =
dynamic_castScDPGroupTableData*(mpTableData.get());
+if (pData)
+{
+// Replace the existing group table data with the source data.
+shared_ptrScDPTableData pSource = pData-GetSourceTableData();
+mpTableData = pSource;
+}
return;
+}
ScDPGroupTableData* pData =
dynamic_castScDPGroupTableData*(mpTableData.get());
if (pData)
diff --git a/sc/source/core/data/dpsave.cxx b/sc/source/core/data/dpsave.cxx
index 5c987da..f86dce4 100644
--- a/sc/source/core/data/dpsave.cxx
+++ b/sc/source/core/data/dpsave.cxx
@@ -1221,6 +1221,43 @@ bool ScDPSaveData::IsEmpty() const
return true; // no entries that are not hidden
}
+void ScDPSaveData::RemoveAllGroupDimensions( const OUString rSrcDimName,
std::vectorOUString* pDeletedNames )
+{
+if (!pDimensionData)
+// No group dimensions exist. Nothing to do.
+return;
+
+// Remove numeric group dimension (exists once at most). No need to delete
+// anything in save data (grouping was done inplace in an existing base
+// dimension).
+pDimensionData-RemoveNumGroupDimension(rSrcDimName);
+
+// Remove named group dimension(s). Dimensions have to be removed from
+// dimension save data and from save data too.
+const