Kaydet (Commit) 77c84dd5 authored tarafından Kohei Yoshida's avatar Kohei Yoshida

Move the dimension order calculation into ScDPSaveData.

To build the dim order map only once.

Change-Id: Ibea5cbfc4f5d335ac7fc5893cda255b06336d8c2
üst d6cfe8de
......@@ -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
......
......@@ -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);
......
......@@ -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;
......
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