Kaydet (Commit) 44cd9971 authored tarafından Kohei Yoshida's avatar Kohei Yoshida

Test the new logic of our pivot data cache life cycle.

üst 2ab84dca
...@@ -271,6 +271,7 @@ public: ...@@ -271,6 +271,7 @@ public:
SheetCaches(ScDocument* pDoc); SheetCaches(ScDocument* pDoc);
bool hasCache(const ScRange& rRange) const; bool hasCache(const ScRange& rRange) const;
const ScDPCache* getCache(const ScRange& rRange); const ScDPCache* getCache(const ScRange& rRange);
size_t size() const;
void updateReference( void updateReference(
UpdateRefMode eMode, const ScRange& r, SCsCOL nDx, SCsROW nDy, SCsTAB nDz); UpdateRefMode eMode, const ScRange& r, SCsCOL nDx, SCsROW nDy, SCsTAB nDz);
...@@ -294,6 +295,7 @@ public: ...@@ -294,6 +295,7 @@ public:
NameCaches(ScDocument* pDoc); NameCaches(ScDocument* pDoc);
bool hasCache(const rtl::OUString& rName) const; bool hasCache(const rtl::OUString& rName) const;
const ScDPCache* getCache(const ::rtl::OUString& rName, const ScRange& rRange); const ScDPCache* getCache(const ::rtl::OUString& rName, const ScRange& rRange);
size_t size() const;
private: private:
void updateCache(const rtl::OUString& rName, const ScRange& rRange, std::set<ScDPObject*>& rRefs); void updateCache(const rtl::OUString& rName, const ScRange& rRange, std::set<ScDPObject*>& rRefs);
void removeCache(const ::rtl::OUString& rName); void removeCache(const ::rtl::OUString& rName);
...@@ -329,6 +331,8 @@ public: ...@@ -329,6 +331,8 @@ public:
public: public:
DBCaches(ScDocument* pDoc); DBCaches(ScDocument* pDoc);
const ScDPCache* getCache(sal_Int32 nSdbType, const ::rtl::OUString& rDBName, const ::rtl::OUString& rCommand); const ScDPCache* getCache(sal_Int32 nSdbType, const ::rtl::OUString& rDBName, const ::rtl::OUString& rCommand);
size_t size() const;
private: private:
com::sun::star::uno::Reference<com::sun::star::sdbc::XRowSet> createRowSet( com::sun::star::uno::Reference<com::sun::star::sdbc::XRowSet> createRowSet(
sal_Int32 nSdbType, const ::rtl::OUString& rDBName, const ::rtl::OUString& rCommand); sal_Int32 nSdbType, const ::rtl::OUString& rDBName, const ::rtl::OUString& rCommand);
......
...@@ -1323,6 +1323,7 @@ void Test::testDataPilot() ...@@ -1323,6 +1323,7 @@ void Test::testDataPilot()
bSuccess = checkDPTableOutput<5>(m_pDoc, aOutRange, aOutputCheck, "DataPilot table output"); bSuccess = checkDPTableOutput<5>(m_pDoc, aOutRange, aOutputCheck, "DataPilot table output");
CPPUNIT_ASSERT_MESSAGE("Table output check failed", bSuccess); CPPUNIT_ASSERT_MESSAGE("Table output check failed", bSuccess);
} }
CPPUNIT_ASSERT_MESSAGE("There should be only one data cache.", pDPs->GetSheetCaches().size() == 1);
// Update the cell values. // Update the cell values.
double aData2[] = { 100, 200, 300, 400, 500, 600 }; double aData2[] = { 100, 200, 300, 400, 500, 600 };
...@@ -1361,15 +1362,22 @@ void Test::testDataPilot() ...@@ -1361,15 +1362,22 @@ void Test::testDataPilot()
CPPUNIT_ASSERT_MESSAGE("Table output check failed", bSuccess); CPPUNIT_ASSERT_MESSAGE("Table output check failed", bSuccess);
} }
CPPUNIT_ASSERT_MESSAGE("There should be only one data cache.", pDPs->GetSheetCaches().size() == 1);
// Free the first datapilot object after the 2nd one gets reloaded, to // Free the first datapilot object after the 2nd one gets reloaded, to
// prevent the data cache from being deleted before the reload. // prevent the data cache from being deleted before the reload.
pDPs->FreeTable(pDPObj); pDPs->FreeTable(pDPObj);
CPPUNIT_ASSERT_MESSAGE("There should be only one data cache.", pDPs->GetSheetCaches().size() == 1);
// This time clear the cache to refresh the data from the source range. // This time clear the cache to refresh the data from the source range.
CPPUNIT_ASSERT_MESSAGE("This datapilot should be based on sheet data.", pDPObj2->IsSheetData()); CPPUNIT_ASSERT_MESSAGE("This datapilot should be based on sheet data.", pDPObj2->IsSheetData());
std::set<ScDPObject*> aRefs; std::set<ScDPObject*> aRefs;
sal_uLong nErrId = pDPs->ReloadCache(pDPObj2, aRefs); sal_uLong nErrId = pDPs->ReloadCache(pDPObj2, aRefs);
CPPUNIT_ASSERT_MESSAGE("Cache removal failed.", nErrId == 0); CPPUNIT_ASSERT_MESSAGE("Cache reload failed.", nErrId == 0);
CPPUNIT_ASSERT_MESSAGE("Reloading a cache shouldn't remove any cache.",
pDPs->GetSheetCaches().size() == 1);
pDPObj2->ClearSource(); pDPObj2->ClearSource();
pDPObj2->Output(aOutRange.aStart); pDPObj2->Output(aOutRange.aStart);
...@@ -1395,6 +1403,8 @@ void Test::testDataPilot() ...@@ -1395,6 +1403,8 @@ void Test::testDataPilot()
// Swap the two sheets. // Swap the two sheets.
m_pDoc->MoveTab(1, 0); m_pDoc->MoveTab(1, 0);
CPPUNIT_ASSERT_MESSAGE("Swapping the sheets shouldn't remove the cache.",
pDPs->GetSheetCaches().size() == 1);
CPPUNIT_ASSERT_MESSAGE("Cache should have moved.", !pDPs->GetSheetCaches().hasCache(aSrcRange)); CPPUNIT_ASSERT_MESSAGE("Cache should have moved.", !pDPs->GetSheetCaches().hasCache(aSrcRange));
aSrcRange.aStart.SetTab(1); aSrcRange.aStart.SetTab(1);
aSrcRange.aEnd.SetTab(1); aSrcRange.aEnd.SetTab(1);
...@@ -1404,6 +1414,9 @@ void Test::testDataPilot() ...@@ -1404,6 +1414,9 @@ void Test::testDataPilot()
CPPUNIT_ASSERT_MESSAGE("There shouldn't be any data pilot table stored with the document.", CPPUNIT_ASSERT_MESSAGE("There shouldn't be any data pilot table stored with the document.",
pDPs->GetCount() == 0); pDPs->GetCount() == 0);
CPPUNIT_ASSERT_MESSAGE("There shouldn't be any more data cache.",
pDPs->GetSheetCaches().size() == 0);
m_pDoc->DeleteTab(1); m_pDoc->DeleteTab(1);
m_pDoc->DeleteTab(0); m_pDoc->DeleteTab(0);
} }
...@@ -1673,6 +1686,9 @@ void Test::testDataPilotNamedSource() ...@@ -1673,6 +1686,9 @@ void Test::testDataPilotNamedSource()
CPPUNIT_ASSERT_MESSAGE("Table output check failed", bSuccess); CPPUNIT_ASSERT_MESSAGE("Table output check failed", bSuccess);
} }
CPPUNIT_ASSERT_MESSAGE("There should be one named range data cache.",
pDPs->GetNameCaches().size() == 1 && pDPs->GetSheetCaches().size() == 0);
// Move the table with pivot table to the left of the source data sheet. // Move the table with pivot table to the left of the source data sheet.
m_pDoc->MoveTab(1, 0); m_pDoc->MoveTab(1, 0);
rtl::OUString aTabName; rtl::OUString aTabName;
...@@ -1680,14 +1696,21 @@ void Test::testDataPilotNamedSource() ...@@ -1680,14 +1696,21 @@ void Test::testDataPilotNamedSource()
CPPUNIT_ASSERT_MESSAGE("Wrong sheet name.", aTabName.equalsAscii("Table")); CPPUNIT_ASSERT_MESSAGE("Wrong sheet name.", aTabName.equalsAscii("Table"));
CPPUNIT_ASSERT_MESSAGE("Pivot table output is on the wrong sheet!", CPPUNIT_ASSERT_MESSAGE("Pivot table output is on the wrong sheet!",
pDPObj->GetOutRange().aStart.Tab() == 0); pDPObj->GetOutRange().aStart.Tab() == 0);
CPPUNIT_ASSERT_MESSAGE("Moving the pivot table to another sheet shouldn't have changed the cache state.",
pDPs->GetNameCaches().size() == 1 && pDPs->GetSheetCaches().size() == 0);
const ScSheetSourceDesc* pDesc = pDPObj->GetSheetDesc(); const ScSheetSourceDesc* pDesc = pDPObj->GetSheetDesc();
CPPUNIT_ASSERT_MESSAGE("Sheet source description doesn't exist.", pDesc); CPPUNIT_ASSERT_MESSAGE("Sheet source description doesn't exist.", pDesc);
CPPUNIT_ASSERT_MESSAGE("Named source range has been altered unexpectedly!", CPPUNIT_ASSERT_MESSAGE("Named source range has been altered unexpectedly!",
pDesc->GetRangeName().equals(aRangeName)); pDesc->GetRangeName().equals(aRangeName));
CPPUNIT_ASSERT_MESSAGE("Cache should exist.", pDPs->GetNameCaches().hasCache(aRangeName)); CPPUNIT_ASSERT_MESSAGE("Cache should exist.", pDPs->GetNameCaches().hasCache(aRangeName));
pDPs->FreeTable(pDPObj); pDPs->FreeTable(pDPObj);
CPPUNIT_ASSERT_MESSAGE("There should be no more tables.", pDPs->GetCount() == 0); CPPUNIT_ASSERT_MESSAGE("There should be no more tables.", pDPs->GetCount() == 0);
CPPUNIT_ASSERT_MESSAGE("There shouldn't be any more cache stored.",
pDPs->GetNameCaches().size() == 0);
pNames->clear(); pNames->clear();
m_pDoc->DeleteTab(1); m_pDoc->DeleteTab(1);
......
...@@ -2499,8 +2499,10 @@ const ScDPCache* ScDPCollection::SheetCaches::getCache(const ScRange& rRange) ...@@ -2499,8 +2499,10 @@ const ScDPCache* ScDPCollection::SheetCaches::getCache(const ScRange& rRange)
size_t nIndex = std::distance(maRanges.begin(), it); size_t nIndex = std::distance(maRanges.begin(), it);
CachesType::iterator itCache = maCaches.find(nIndex); CachesType::iterator itCache = maCaches.find(nIndex);
if (itCache == maCaches.end()) if (itCache == maCaches.end())
// cache pool and index pool out-of-sync !!! {
OSL_FAIL("Cache pool and index pool out-of-sync !!!");
return NULL; return NULL;
}
return itCache->second; return itCache->second;
} }
...@@ -2532,6 +2534,11 @@ const ScDPCache* ScDPCollection::SheetCaches::getCache(const ScRange& rRange) ...@@ -2532,6 +2534,11 @@ const ScDPCache* ScDPCollection::SheetCaches::getCache(const ScRange& rRange)
return p; return p;
} }
size_t ScDPCollection::SheetCaches::size() const
{
return maCaches.size();
}
void ScDPCollection::SheetCaches::updateReference( void ScDPCollection::SheetCaches::updateReference(
UpdateRefMode eMode, const ScRange& r, SCsCOL nDx, SCsROW nDy, SCsTAB nDz) UpdateRefMode eMode, const ScRange& r, SCsCOL nDx, SCsROW nDy, SCsTAB nDz)
{ {
...@@ -2579,7 +2586,7 @@ void ScDPCollection::SheetCaches::updateCache(const ScRange& rRange, std::set<Sc ...@@ -2579,7 +2586,7 @@ void ScDPCollection::SheetCaches::updateCache(const ScRange& rRange, std::set<Sc
CachesType::iterator itCache = maCaches.find(nIndex); CachesType::iterator itCache = maCaches.find(nIndex);
if (itCache == maCaches.end()) if (itCache == maCaches.end())
{ {
// Cache pool and index pool out-of-sync !!! OSL_FAIL("Cache pool and index pool out-of-sync !!!");
rRefs.clear(); rRefs.clear();
return; return;
} }
...@@ -2600,8 +2607,10 @@ void ScDPCollection::SheetCaches::removeCache(const ScRange& rRange) ...@@ -2600,8 +2607,10 @@ void ScDPCollection::SheetCaches::removeCache(const ScRange& rRange)
size_t nIndex = std::distance(maRanges.begin(), it); size_t nIndex = std::distance(maRanges.begin(), it);
CachesType::iterator itCache = maCaches.find(nIndex); CachesType::iterator itCache = maCaches.find(nIndex);
if (itCache == maCaches.end()) if (itCache == maCaches.end())
// Cache pool and index pool out-of-sync !!! {
OSL_FAIL("Cache pool and index pool out-of-sync !!!");
return; return;
}
it->SetInvalid(); // Make this slot available for future caches. it->SetInvalid(); // Make this slot available for future caches.
maCaches.erase(itCache); maCaches.erase(itCache);
...@@ -2646,6 +2655,11 @@ const ScDPCache* ScDPCollection::NameCaches::getCache(const OUString& rName, con ...@@ -2646,6 +2655,11 @@ const ScDPCache* ScDPCollection::NameCaches::getCache(const OUString& rName, con
return p; return p;
} }
size_t ScDPCollection::NameCaches::size() const
{
return maCaches.size();
}
void ScDPCollection::NameCaches::updateCache(const OUString& rName, const ScRange& rRange, std::set<ScDPObject*>& rRefs) void ScDPCollection::NameCaches::updateCache(const OUString& rName, const ScRange& rRange, std::set<ScDPObject*>& rRefs)
{ {
CachesType::iterator itr = maCaches.find(rName); CachesType::iterator itr = maCaches.find(rName);
...@@ -2715,6 +2729,11 @@ const ScDPCache* ScDPCollection::DBCaches::getCache(sal_Int32 nSdbType, const OU ...@@ -2715,6 +2729,11 @@ const ScDPCache* ScDPCollection::DBCaches::getCache(sal_Int32 nSdbType, const OU
return p; return p;
} }
size_t ScDPCollection::DBCaches::size() const
{
return maCaches.size();
}
uno::Reference<sdbc::XRowSet> ScDPCollection::DBCaches::createRowSet( uno::Reference<sdbc::XRowSet> ScDPCollection::DBCaches::createRowSet(
sal_Int32 nSdbType, const ::rtl::OUString& rDBName, const ::rtl::OUString& rCommand) sal_Int32 nSdbType, const ::rtl::OUString& rDBName, const ::rtl::OUString& rCommand)
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment