summaryrefslogtreecommitdiff
path: root/sc/inc/dptabres.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'sc/inc/dptabres.hxx')
-rw-r--r--sc/inc/dptabres.hxx738
1 files changed, 738 insertions, 0 deletions
diff --git a/sc/inc/dptabres.hxx b/sc/inc/dptabres.hxx
new file mode 100644
index 000000000000..7f9720a4b143
--- /dev/null
+++ b/sc/inc/dptabres.hxx
@@ -0,0 +1,738 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef SC_DPTABRES_HXX
+#define SC_DPTABRES_HXX
+
+#include <svl/svarray.hxx>
+#include <tools/string.hxx>
+#include <com/sun/star/sheet/MemberResult.hpp>
+#include <com/sun/star/sheet/DataResult.hpp>
+#include <com/sun/star/uno/Sequence.hxx>
+#include "global.hxx" // enum ScSubTotalFunc
+#include "dpcachetable.hxx"
+#include <hash_map>
+#include <hash_set>
+#include <vector>
+#include <memory>
+
+namespace com { namespace sun { namespace star { namespace sheet {
+ struct DataPilotFieldReference;
+} } } }
+
+
+class ScAddress;
+class ScDocument;
+class ScDPSource;
+class ScDPDimension;
+class ScDPDimensions;
+class ScDPLevel;
+class ScDPMember;
+class ScDPAggData;
+class ScDPResultMember;
+class ScDPResultVisibilityData;
+
+struct ScDPValueData;
+// Wang Xu Ming -- 2009-8-17
+// DataPilot Migration - Cache&&Performance
+class ScDPItemData;
+// End Comments
+//
+// Member names that are being processed for InitFrom/LateInitFrom
+// (needed for initialization of grouped items)
+//
+
+class ScDPInitState
+{
+ long* pIndex; // array
+// Wang Xu Ming -- 2009-8-17
+// DataPilot Migration - Cache&&Performance
+ SCROW* pData; // array
+ // End Comments
+ long nCount;
+
+public:
+ ScDPInitState();
+ ~ScDPInitState();
+
+ void AddMember( long nSourceIndex,SCROW nMember);
+ void RemoveMember();
+
+ long GetCount() const { return nCount; }
+ const long* GetSource() const { return pIndex; }
+// Wang Xu Ming -- 2009-8-17
+// DataPilot Migration - Cache&&Performance
+ const SCROW* GetNameIds() const { return pData; }
+ SCROW GetNameIdForIndex( long nIndexValue ) const;
+// End Comments
+};
+
+typedef ::std::vector<sal_Int32> ScMemberSortOrder;
+
+//
+// selected subtotal information, passed down the dimensions
+//
+
+struct ScDPSubTotalState
+{
+ ScSubTotalFunc eColForce;
+ ScSubTotalFunc eRowForce;
+ long nColSubTotalFunc;
+ long nRowSubTotalFunc;
+
+ ScDPSubTotalState() :
+ eColForce( SUBTOTAL_FUNC_NONE ),
+ eRowForce( SUBTOTAL_FUNC_NONE ),
+ nColSubTotalFunc( -1 ),
+ nRowSubTotalFunc( -1 )
+ {}
+};
+
+//
+// indexes when calculating running totals
+// Col/RowVisible: simple counts from 0 - without sort order applied - visible index
+// (only used for running total / relative index)
+// Col/RowIndexes: with sort order applied - member index
+// (used otherwise - so other members' children can be accessed)
+//
+
+class ScDPRunningTotalState
+{
+ ScDPResultMember* pColResRoot;
+ ScDPResultMember* pRowResRoot;
+ long* pColVisible;
+ long* pColIndexes;
+ long* pRowVisible;
+ long* pRowIndexes;
+ long nColIndexPos;
+ long nRowIndexPos;
+
+public:
+ ScDPRunningTotalState( ScDPResultMember* pColRoot, ScDPResultMember* pRowRoot );
+ ~ScDPRunningTotalState();
+
+ ScDPResultMember* GetColResRoot() const { return pColResRoot; }
+ ScDPResultMember* GetRowResRoot() const { return pRowResRoot; }
+
+ const long* GetColVisible() const { return pColVisible; }
+ const long* GetColIndexes() const { return pColIndexes; }
+ const long* GetRowVisible() const { return pRowVisible; }
+ const long* GetRowIndexes() const { return pRowIndexes; }
+
+ void AddColIndex( long nVisible, long nSorted );
+ void AddRowIndex( long nVisible, long nSorted );
+ void RemoveColIndex();
+ void RemoveRowIndex();
+};
+
+struct ScDPRelativePos
+{
+ long nBasePos; // simple count, without sort order applied
+ long nDirection;
+
+ ScDPRelativePos( long nBase, long nDir );
+};
+
+//
+// aggregated data
+//! separate header file?
+//
+
+// Possible values for the nCount member:
+// (greater than 0 counts the collected values)
+const long SC_DPAGG_EMPTY = 0; // empty during data collection
+const long SC_DPAGG_DATA_ERROR = -1; // error during data collection
+const long SC_DPAGG_RESULT_EMPTY = -2; // empty result calculated
+const long SC_DPAGG_RESULT_VALID = -3; // valid result calculated
+const long SC_DPAGG_RESULT_ERROR = -4; // error in calculated result
+
+class ScDPAggData
+{
+private:
+ double fVal;
+ double fAux;
+ long nCount;
+ ScDPAggData* pChild;
+
+public:
+ ScDPAggData() : fVal(0.0), fAux(0.0), nCount(SC_DPAGG_EMPTY), pChild(NULL) {}
+ ~ScDPAggData() { delete pChild; }
+
+ void Update( const ScDPValueData& rNext, ScSubTotalFunc eFunc, const ScDPSubTotalState& rSubState );
+ void Calculate( ScSubTotalFunc eFunc, const ScDPSubTotalState& rSubState );
+ BOOL IsCalculated() const;
+
+ double GetResult() const;
+ BOOL HasError() const;
+ BOOL HasData() const;
+
+ void SetResult( double fNew );
+ void SetEmpty( BOOL bSet );
+ void SetError();
+
+ double GetAuxiliary() const;
+ void SetAuxiliary( double fNew );
+
+ void Reset(); // also deletes children
+
+ const ScDPAggData* GetExistingChild() const { return pChild; }
+ ScDPAggData* GetChild();
+};
+
+//
+// Row and grand total state, passed down (column total is at result member)
+//
+
+class ScDPRowTotals
+{
+ ScDPAggData aRowTotal;
+ ScDPAggData aGrandTotal;
+ BOOL bIsInColRoot;
+
+public:
+ ScDPRowTotals();
+ ~ScDPRowTotals();
+
+ ScDPAggData* GetRowTotal( long nMeasure );
+ ScDPAggData* GetGrandTotal( long nMeasure );
+
+ BOOL IsInColRoot() const { return bIsInColRoot; }
+ void SetInColRoot(BOOL bSet) { bIsInColRoot = bSet; }
+};
+
+// --------------------------------------------------------------------
+//
+// results for a hierarchy dimension
+//
+
+#define SC_DP_RES_GROW 16
+
+class ScDPResultDimension;
+class ScDPDataDimension;
+class ScDPDataMember;
+
+#define SC_DPMEASURE_ALL -1
+#define SC_DPMEASURE_ANY -2
+// Wang Xu Ming -- 2009-8-17
+// DataPilot Migration - Cache&&Performance
+
+struct MemberHashIndexFunc : public std::unary_function< const SCROW &, size_t >
+{
+ size_t operator() (const SCROW &rDataIndex) const { return rDataIndex; }
+};
+
+class ScDPParentDimData
+{
+public:
+ const SCROW mnOrder; //! Ref
+ const ScDPDimension* mpParentDim; //! Ref
+ const ScDPLevel* mpParentLevel; //! Ref
+ const ScDPMember* mpMemberDesc; //! Ref
+
+ ScDPParentDimData():mnOrder(-1), mpParentDim( NULL), mpParentLevel( NULL ), mpMemberDesc( NULL ){}
+ ScDPParentDimData( const SCROW nIndex, ScDPDimension* pDim, const ScDPLevel* pLev, const ScDPMember* pMember ): mnOrder( nIndex ), mpParentDim( pDim), mpParentLevel( pLev ), mpMemberDesc( pMember ){}
+};
+
+typedef std::vector <ScDPParentDimData *> DimMemberArray;
+typedef std::hash_map < SCROW, ScDPParentDimData *, MemberHashIndexFunc> DimMemberHash;
+
+class ResultMembers
+{
+ DimMemberHash maMemberHash;
+ BOOL mbHasHideDetailsMember;
+public:
+ ScDPParentDimData* FindMember( const SCROW& nIndex ) const;
+ void InsertMember( ScDPParentDimData* pNew );
+ BOOL IsHasHideDetailsMembers() const { return mbHasHideDetailsMember; }
+ void SetHasHideDetailsMembers( BOOL b ) { mbHasHideDetailsMember=b; }
+ ResultMembers();
+ virtual ~ResultMembers();
+};
+
+class LateInitParams
+{
+private:
+ const ::std::vector<ScDPDimension*>& mppDim;
+ const ::std::vector<ScDPLevel*>& mppLev;
+
+ BOOL mbRow;
+ BOOL mbInitChild;
+ BOOL mbAllChildren;
+public:
+ LateInitParams( const ::std::vector<ScDPDimension*>& ppDim, const ::std::vector<ScDPLevel*>& ppLev,
+ BOOL bRow, BOOL bInitChild = TRUE , BOOL bAllChildren = FALSE);
+ ~LateInitParams();
+
+ void SetInitChild( BOOL b ) { mbInitChild = b; }
+ void SetInitAllChildren( BOOL b ) { mbAllChildren = b; }
+
+ inline ScDPDimension* GetDim( size_t nPos ) const { return mppDim[nPos];}
+ inline ScDPLevel* GetLevel( size_t nPos ) const { return mppLev[nPos];}
+
+ inline BOOL GetInitChild() const {return mbInitChild; }
+ inline BOOL GetInitAllChild() const { return mbAllChildren; }
+ inline BOOL IsRow() const { return mbRow; }
+ BOOL IsEnd( size_t nPos ) const ;
+};
+// End Comments
+
+class ScDPResultData
+{
+private:
+ ScDPSource* pSource; //! Ref
+ //! keep things like measure lists here
+
+ long nMeasCount;
+ ScSubTotalFunc* pMeasFuncs;
+ ::com::sun::star::sheet::DataPilotFieldReference* pMeasRefs;
+ USHORT* pMeasRefOrient;
+ String* pMeasNames;
+ BOOL bLateInit;
+ BOOL bDataAtCol;
+ BOOL bDataAtRow;
+
+ //! add "displayed values" settings
+ mutable std::vector< ResultMembers* > mpDimMembers;
+public:
+ ScDPResultData( ScDPSource* pSrc ); //! Ref
+ ~ScDPResultData();
+
+ void SetMeasureData( long nCount, const ScSubTotalFunc* pFunctions,
+ const ::com::sun::star::sheet::DataPilotFieldReference* pRefs,
+ const USHORT* pRefOrient, const String* pNames );
+ void SetDataLayoutOrientation( USHORT nOrient );
+ void SetLateInit( BOOL bSet );
+
+ long GetMeasureCount() const { return nMeasCount; }
+ ScSubTotalFunc GetMeasureFunction(long nMeasure) const;
+ String GetMeasureString(long nMeasure, BOOL bForce, ScSubTotalFunc eForceFunc, bool& rbTotalResult) const;
+ String GetMeasureDimensionName(long nMeasure) const;
+ const ::com::sun::star::sheet::DataPilotFieldReference& GetMeasureRefVal(long nMeasure) const;
+ USHORT GetMeasureRefOrient(long nMeasure) const;
+
+ BOOL IsDataAtCol() const { return bDataAtCol; }
+ BOOL IsDataAtRow() const { return bDataAtRow; }
+ BOOL IsLateInit() const { return bLateInit; }
+
+ long GetColStartMeasure() const;
+ long GetRowStartMeasure() const;
+
+ long GetCountForMeasure( long nMeas ) const
+ { return ( nMeas == SC_DPMEASURE_ALL ) ? nMeasCount : 1; }
+
+ BOOL IsBaseForGroup( long nDim ) const; // any group
+ long GetGroupBase( long nGroupDim ) const;
+ BOOL IsNumOrDateGroup( long nDim ) const;
+ // Wang Xu Ming -- 2009-8-17
+// DataPilot Migration - Cache&&Performance
+ BOOL IsInGroup( const ScDPItemData& rGroupData, long nGroupIndex,
+ long nBaseDataId, long nBaseIndex ) const;
+ BOOL IsInGroup( SCROW nGroupDataId, long nGroupIndex,
+ const ScDPItemData& rBaseData, long nBaseIndex ) const;
+ BOOL HasCommonElement( SCROW nFirstDataId, long nFirstIndex,
+ const ScDPItemData& rSecondData, long nSecondIndex ) const;
+
+ ResultMembers* GetDimResultMembers( long nDim , ScDPDimension* pDim , ScDPLevel* pLevel) const ;
+
+// End Comments
+ const ScDPSource* GetSource() const;
+};
+
+
+class ScDPResultMember
+{
+private:
+ const ScDPResultData* pResultData;
+ // Wang Xu Ming -- 2009-8-17
+ // DataPilot Migration - Cache&&Performance
+ ScDPParentDimData aParentDimData;
+ // End Comments
+ ScDPResultDimension* pChildDimension;
+ ScDPDataMember* pDataRoot;
+ BOOL bHasElements;
+ BOOL bForceSubTotal;
+ BOOL bHasHiddenDetails;
+ BOOL bInitialized;
+ BOOL bAutoHidden;
+ ScDPAggData aColTotal; // to store column totals
+
+ USHORT nMemberStep; // step to show details
+public:
+ // Wang Xu Ming -- 2009-8-17
+ // DataPilot Migration - Cache&&Performance
+ ScDPResultMember( const ScDPResultData* pData, const ScDPParentDimData& rParentDimData,
+ BOOL bForceSub ); //! Ref
+ ScDPResultMember( const ScDPResultData* pData, BOOL bForceSub );
+ // End Comments
+ ~ScDPResultMember();
+
+ // Wang Xu Ming -- 2009-8-17
+ // DataPilot Migration - Cache&&Performance
+ void InitFrom( const ::std::vector<ScDPDimension*>& ppDim,
+ const ::std::vector<ScDPLevel*>& ppLev,
+ size_t nPos,
+ ScDPInitState& rInitState,
+ BOOL bInitChild = TRUE );
+ void LateInitFrom(
+ LateInitParams& rParams,
+ const ::std::vector< SCROW >& pItemData,
+ size_t nPos,
+ ScDPInitState& rInitState);
+ void CheckShowEmpty( BOOL bShow = FALSE );
+ // End Comments
+ String GetName() const;
+ void FillItemData( ScDPItemData& rData ) const;
+ BOOL IsValid() const;
+ BOOL IsVisible() const;
+ long GetSize(long nMeasure) const;
+ BOOL HasHiddenDetails() const;
+ BOOL IsSubTotalInTitle(long nMeasure) const;
+
+// BOOL SubTotalEnabled() const;
+ long GetSubTotalCount( long* pUserSubStart = NULL ) const;
+
+ // Wang Xu Ming -- 2009-8-17
+ // DataPilot Migration - Cache&&Performance
+ BOOL IsNamedItem( SCROW nIndex ) const;
+ bool IsValidEntry( const ::std::vector< SCROW >& aMembers ) const;
+ // End Comments
+
+ void SetHasElements() { bHasElements = TRUE; }
+ void SetAutoHidden() { bAutoHidden = TRUE; }
+
+ // Wang Xu Ming -- 2009-8-17
+ // DataPilot Migration - Cache&&Performance
+ void ProcessData( const ::std::vector<SCROW>& aChildMembers,
+ const ScDPResultDimension* pDataDim,
+ const ::std::vector<SCROW>& aDataMembers,
+ const ::std::vector<ScDPValueData>& aValues );
+ // End Comments
+ void FillMemberResults( com::sun::star::uno::Sequence<
+ com::sun::star::sheet::MemberResult>* pSequences,
+ long& rPos, long nMeasure, BOOL bRoot,
+ const String* pMemberName,
+ const String* pMemberCaption );
+
+ void FillDataResults( const ScDPResultMember* pRefMember,
+ com::sun::star::uno::Sequence<
+ com::sun::star::uno::Sequence<
+ com::sun::star::sheet::DataResult> >& rSequence,
+ long& rRow, long nMeasure ) const;
+
+ void UpdateDataResults( const ScDPResultMember* pRefMember, long nMeasure ) const;
+ void UpdateRunningTotals( const ScDPResultMember* pRefMember, long nMeasure,
+ ScDPRunningTotalState& rRunning, ScDPRowTotals& rTotals ) const;
+
+ void SortMembers( ScDPResultMember* pRefMember );
+ void DoAutoShow( ScDPResultMember* pRefMember );
+
+ void ResetResults( BOOL bRoot );
+
+ void DumpState( const ScDPResultMember* pRefMember, ScDocument* pDoc, ScAddress& rPos ) const;
+
+ //! this will be removed!
+ const ScDPResultDimension* GetChildDimension() const { return pChildDimension; }
+ ScDPResultDimension* GetChildDimension() { return pChildDimension; }
+
+ ScDPDataMember* GetDataRoot() const { return pDataRoot; }
+
+ // Wang Xu Ming -- 2009-8-17
+ // DataPilot Migration - Cache&&Performance
+ const ScDPDimension* GetParentDim() const { return aParentDimData.mpParentDim; } //! Ref
+ const ScDPLevel* GetParentLevel() const { return aParentDimData.mpParentLevel; } //! Ref
+ const ScDPMember* GetDPMember()const { return aParentDimData.mpMemberDesc; } //! Ref
+ inline SCROW GetOrder() const { return aParentDimData.mnOrder; } //! Ref
+ inline BOOL IsRoot() const { return GetParentLevel() == NULL; }
+ SCROW GetDataId( ) const ;
+ // End Comments
+ ScDPAggData* GetColTotal( long nMeasure ) const;
+
+ void FillVisibilityData(ScDPResultVisibilityData& rData) const;
+};
+
+class ScDPDataMember
+{
+private:
+ const ScDPResultData* pResultData;
+ const ScDPResultMember* pResultMember; //! Ref?
+ ScDPDataDimension* pChildDimension;
+ ScDPAggData aAggregate;
+
+ void UpdateValues( const ::std::vector<ScDPValueData>& aValues, const ScDPSubTotalState& rSubState );
+
+public:
+ ScDPDataMember( const ScDPResultData* pData, const ScDPResultMember* pRes );
+ ~ScDPDataMember();
+
+ void InitFrom( const ScDPResultDimension* pDim );
+
+ String GetName() const;
+ BOOL IsVisible() const;
+ BOOL HasData( long nMeasure, const ScDPSubTotalState& rSubState ) const;
+
+ // Wang Xu Ming -- 2009-8-17
+ // DataPilot Migration - Cache&&Performance
+ BOOL IsNamedItem( SCROW r ) const;
+ // End Comments
+ BOOL HasHiddenDetails() const;
+
+ // Wang Xu Ming -- 2009-8-17
+ // DataPilot Migration - Cache&&Performance
+ void ProcessData( const ::std::vector< SCROW >& aChildMembers, const ::std::vector<ScDPValueData>& aValues,
+ const ScDPSubTotalState& rSubState );
+ // End Comments
+ BOOL HasError( long nMeasure, const ScDPSubTotalState& rSubState ) const;
+ double GetAggregate( long nMeasure, const ScDPSubTotalState& rSubState ) const;
+ const ScDPAggData* GetConstAggData( long nMeasure, const ScDPSubTotalState& rSubState ) const;
+ ScDPAggData* GetAggData( long nMeasure, const ScDPSubTotalState& rSubState );
+
+ void FillDataRow( const ScDPResultMember* pRefMember,
+ com::sun::star::uno::Sequence<com::sun::star::sheet::DataResult>& rSequence,
+ long& rCol, long nMeasure, BOOL bIsSubTotalRow,
+ const ScDPSubTotalState& rSubState ) const;
+
+ void UpdateDataRow( const ScDPResultMember* pRefMember, long nMeasure, BOOL bIsSubTotalRow,
+ const ScDPSubTotalState& rSubState );
+ void UpdateRunningTotals( const ScDPResultMember* pRefMember, long nMeasure, BOOL bIsSubTotalRow,
+ const ScDPSubTotalState& rSubState, ScDPRunningTotalState& rRunning,
+ ScDPRowTotals& rTotals, const ScDPResultMember& rRowParent );
+
+ void SortMembers( ScDPResultMember* pRefMember );
+ void DoAutoShow( ScDPResultMember* pRefMember );
+
+ void ResetResults();
+
+ void DumpState( const ScDPResultMember* pRefMember, ScDocument* pDoc, ScAddress& rPos ) const;
+
+ //! this will be removed!
+ const ScDPDataDimension* GetChildDimension() const { return pChildDimension; }
+ ScDPDataDimension* GetChildDimension() { return pChildDimension; }
+};
+
+//! replace PtrArr with 32-bit array ????
+
+typedef ScDPDataMember* ScDPDataMemberPtr;
+SV_DECL_PTRARR_DEL(ScDPDataMembers, ScDPDataMemberPtr, SC_DP_RES_GROW, SC_DP_RES_GROW)
+
+
+// result dimension contains only members
+
+class ScDPResultDimension
+{
+public :
+ // Wang Xu Ming -- 2009-8-17
+ // DataPilot Migration - Cache&&Performance
+ typedef std::vector <ScDPResultMember *> MemberArray;
+ typedef std::map < SCROW , ScDPResultMember *> MemberHash;
+ // End Comments
+private:
+ const ScDPResultData* pResultData;
+ MemberArray maMemberArray;
+ MemberHash maMemberHash;
+ BOOL bInitialized;
+ String aDimensionName; //! or ptr to IntDimension?
+ BOOL bIsDataLayout; //! or ptr to IntDimension?
+ BOOL bSortByData;
+ BOOL bSortAscending;
+ long nSortMeasure;
+ ScMemberSortOrder aMemberOrder; // used when sorted by measure
+ BOOL bAutoShow;
+ BOOL bAutoTopItems;
+ long nAutoMeasure;
+ long nAutoCount;
+
+ // Wang Xu Ming -- 2009-8-17
+ // DataPilot Migration - Cache&&Performance
+ ScDPResultMember* FindMember( SCROW iData ) const;
+ ScDPResultMember* AddMember( const ScDPParentDimData& aData );
+ ScDPResultMember* InsertMember( ScDPParentDimData* pMemberData );
+ ResultMembers* GetResultMember( ScDPDimension* pDim, ScDPLevel* pLevel );
+ void InitWithMembers( LateInitParams& rParams,
+ const ::std::vector< SCROW >& pItemData,
+ size_t nPos,
+ ScDPInitState& rInitState );
+ // End Comments
+public:
+ ScDPResultDimension( const ScDPResultData* pData );
+ ~ScDPResultDimension();
+
+ // allocates new members
+ // Wang Xu Ming -- 2009-8-17
+ // DataPilot Migration - Cache&&Performance
+ void InitFrom( const ::std::vector<ScDPDimension*>& ppDim,
+ const ::std::vector<ScDPLevel*>& ppLev,
+ size_t nPos,
+ ScDPInitState& rInitState , BOOL bInitChild = TRUE );
+ void LateInitFrom( LateInitParams& rParams,
+ const ::std::vector< SCROW >& pItemData,
+ size_t nPos,
+ ScDPInitState& rInitState );
+ void CheckShowEmpty( BOOL bShow = FALSE );
+
+ // End Comments
+ long GetSize(long nMeasure) const;
+
+ // Wang Xu Ming -- 2009-8-17
+ // DataPilot Migration - Cache&&Performance
+ bool IsValidEntry( const ::std::vector<SCROW>& aMembers ) const;
+
+ // modifies existing members, allocates data dimensions
+ void ProcessData( const ::std::vector<SCROW>& aMembers,
+ const ScDPResultDimension* pDataDim,
+ const ::std::vector<SCROW>& aDataMembers,
+ const ::std::vector<ScDPValueData>& aValues ) const; //! Test
+ // End Comments
+ void FillMemberResults( com::sun::star::uno::Sequence<
+ com::sun::star::sheet::MemberResult>* pSequences,
+ long nStart, long nMeasure );
+
+ void FillDataResults( const ScDPResultMember* pRefMember,
+ com::sun::star::uno::Sequence<
+ com::sun::star::uno::Sequence<
+ com::sun::star::sheet::DataResult> >& rSequence,
+ long nRow, long nMeasure ) const;
+
+ void UpdateDataResults( const ScDPResultMember* pRefMember, long nMeasure ) const;
+ void UpdateRunningTotals( const ScDPResultMember* pRefMember, long nMeasure,
+ ScDPRunningTotalState& rRunning, ScDPRowTotals& rTotals ) const;
+
+ void SortMembers( ScDPResultMember* pRefMember );
+ long GetSortedIndex( long nUnsorted ) const;
+
+ void DoAutoShow( ScDPResultMember* pRefMember );
+
+ void ResetResults();
+
+ // called for the reference dimension
+ ScDPDataMember* GetRowReferenceMember( const ScDPRelativePos* pMemberPos, const String* pName,
+ const long* pRowIndexes, const long* pColIndexes ) const;
+
+ // uses row root member from ScDPRunningTotalState
+ static ScDPDataMember* GetColReferenceMember( const ScDPRelativePos* pMemberPos, const String* pName,
+ long nRefDimPos, const ScDPRunningTotalState& rRunning );
+
+ void DumpState( const ScDPResultMember* pRefMember, ScDocument* pDoc, ScAddress& rPos ) const;
+
+ // for ScDPDataDimension::InitFrom
+ long GetMemberCount() const;
+ const ScDPResultMember* GetMember(long n) const;
+ ScDPResultMember* GetMember(long n);
+
+ const ScMemberSortOrder& GetMemberOrder() const { return aMemberOrder; }
+ ScMemberSortOrder& GetMemberOrder() { return aMemberOrder; }
+
+ BOOL IsDataLayout() const { return bIsDataLayout; }
+ String GetName() const { return aDimensionName; }
+
+ BOOL IsSortByData() const { return bSortByData; }
+ BOOL IsSortAscending() const { return bSortAscending; }
+ long GetSortMeasure() const { return nSortMeasure; }
+
+ BOOL IsAutoShow() const { return bAutoShow; }
+ BOOL IsAutoTopItems() const { return bAutoTopItems; }
+ long GetAutoMeasure() const { return nAutoMeasure; }
+ long GetAutoCount() const { return nAutoCount; }
+
+ ScDPResultDimension* GetFirstChildDimension() const;
+
+ void FillVisibilityData(ScDPResultVisibilityData& rData) const;
+};
+
+class ScDPDataDimension
+{
+private:
+ const ScDPResultData* pResultData;
+ const ScDPResultDimension* pResultDimension; // column
+ ScDPDataMembers aMembers;
+ BOOL bIsDataLayout; //! or ptr to IntDimension?
+
+public:
+ ScDPDataDimension( const ScDPResultData* pData );
+ ~ScDPDataDimension();
+
+ void InitFrom( const ScDPResultDimension* pDim ); // recursive
+ // Wang Xu Ming -- 2009-8-17
+ // DataPilot Migration - Cache&&Performance
+ void ProcessData( const ::std::vector< SCROW >& aDataMembers, const ::std::vector<ScDPValueData>& aValues,
+ const ScDPSubTotalState& rSubState );
+ // End Comments
+ void FillDataRow( const ScDPResultDimension* pRefDim,
+ com::sun::star::uno::Sequence<com::sun::star::sheet::DataResult>& rSequence,
+ long nCol, long nMeasure, BOOL bIsSubTotalRow,
+ const ScDPSubTotalState& rSubState ) const;
+
+ void UpdateDataRow( const ScDPResultDimension* pRefDim, long nMeasure, BOOL bIsSubTotalRow,
+ const ScDPSubTotalState& rSubState ) const;
+ void UpdateRunningTotals( const ScDPResultDimension* pRefDim, long nMeasure, BOOL bIsSubTotalRow,
+ const ScDPSubTotalState& rSubState, ScDPRunningTotalState& rRunning,
+ ScDPRowTotals& rTotals, const ScDPResultMember& rRowParent ) const;
+
+ void SortMembers( ScDPResultDimension* pRefDim );
+ long GetSortedIndex( long nUnsorted ) const;
+
+ void DoAutoShow( ScDPResultDimension* pRefDim );
+
+ void ResetResults();
+
+ void DumpState( const ScDPResultDimension* pRefDim, ScDocument* pDoc, ScAddress& rPos ) const;
+
+ long GetMemberCount() const;
+ ScDPDataMember* GetMember(long n) const;
+};
+
+// ----------------------------------------------------------------------------
+
+/**
+ * This class collects visible members of each dimension and uses that
+ * information to create filtering criteria (e.g. for drill-down data).
+ */
+class ScDPResultVisibilityData
+{
+public:
+ // Wang Xu Ming -- 2009-8-17
+ // DataPilot Migration - Cache&&Performance
+ ScDPResultVisibilityData( ScDPSource* pSource);
+ // End Comments
+ ~ScDPResultVisibilityData();
+
+ void addVisibleMember(const String& rDimName, const ScDPItemData& rMemberItem);
+ void fillFieldFilters(::std::vector<ScDPCacheTable::Criterion>& rFilters) const;
+
+private:
+ struct MemberHash
+ {
+ size_t operator()(const ScDPItemData& r) const;
+ };
+ typedef ::std::hash_set<ScDPItemData, MemberHash> VisibleMemberType;
+ typedef ::std::hash_map<String, VisibleMemberType, ScStringHashCode> DimMemberType;
+ DimMemberType maDimensions;
+
+ ScDPSource* mpSource;
+};
+
+#endif
+