xref: /aoo4110/main/sc/inc/dptabres.hxx (revision b1cdbd2c)
1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski #ifndef SC_DPTABRES_HXX
25*b1cdbd2cSJim Jagielski #define SC_DPTABRES_HXX
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include <svl/svarray.hxx>
28*b1cdbd2cSJim Jagielski #include <tools/string.hxx>
29*b1cdbd2cSJim Jagielski #include <com/sun/star/sheet/MemberResult.hpp>
30*b1cdbd2cSJim Jagielski #include <com/sun/star/sheet/DataResult.hpp>
31*b1cdbd2cSJim Jagielski #include <com/sun/star/uno/Sequence.hxx>
32*b1cdbd2cSJim Jagielski #include "global.hxx"		// enum ScSubTotalFunc
33*b1cdbd2cSJim Jagielski #include "dpcachetable.hxx"
34*b1cdbd2cSJim Jagielski #include <hash_map>
35*b1cdbd2cSJim Jagielski #include <hash_set>
36*b1cdbd2cSJim Jagielski #include <vector>
37*b1cdbd2cSJim Jagielski #include <memory>
38*b1cdbd2cSJim Jagielski 
39*b1cdbd2cSJim Jagielski namespace com { namespace sun { namespace star { namespace sheet {
40*b1cdbd2cSJim Jagielski     struct DataPilotFieldReference;
41*b1cdbd2cSJim Jagielski } } } }
42*b1cdbd2cSJim Jagielski 
43*b1cdbd2cSJim Jagielski 
44*b1cdbd2cSJim Jagielski class ScAddress;
45*b1cdbd2cSJim Jagielski class ScDocument;
46*b1cdbd2cSJim Jagielski class ScDPSource;
47*b1cdbd2cSJim Jagielski class ScDPDimension;
48*b1cdbd2cSJim Jagielski class ScDPDimensions;
49*b1cdbd2cSJim Jagielski class ScDPLevel;
50*b1cdbd2cSJim Jagielski class ScDPMember;
51*b1cdbd2cSJim Jagielski class ScDPAggData;
52*b1cdbd2cSJim Jagielski class ScDPResultMember;
53*b1cdbd2cSJim Jagielski class ScDPResultVisibilityData;
54*b1cdbd2cSJim Jagielski 
55*b1cdbd2cSJim Jagielski struct ScDPValueData;
56*b1cdbd2cSJim Jagielski // Wang Xu Ming -- 2009-8-17
57*b1cdbd2cSJim Jagielski // DataPilot Migration - Cache&&Performance
58*b1cdbd2cSJim Jagielski class ScDPItemData;
59*b1cdbd2cSJim Jagielski // End Comments
60*b1cdbd2cSJim Jagielski //
61*b1cdbd2cSJim Jagielski //  Member names that are being processed for InitFrom/LateInitFrom
62*b1cdbd2cSJim Jagielski //  (needed for initialization of grouped items)
63*b1cdbd2cSJim Jagielski //
64*b1cdbd2cSJim Jagielski 
65*b1cdbd2cSJim Jagielski class ScDPInitState
66*b1cdbd2cSJim Jagielski {
67*b1cdbd2cSJim Jagielski     long*           pIndex;     // array
68*b1cdbd2cSJim Jagielski // Wang Xu Ming -- 2009-8-17
69*b1cdbd2cSJim Jagielski // DataPilot Migration - Cache&&Performance
70*b1cdbd2cSJim Jagielski     SCROW*     pData; // array
71*b1cdbd2cSJim Jagielski  // End Comments
72*b1cdbd2cSJim Jagielski     long            nCount;
73*b1cdbd2cSJim Jagielski 
74*b1cdbd2cSJim Jagielski public:
75*b1cdbd2cSJim Jagielski             ScDPInitState();
76*b1cdbd2cSJim Jagielski             ~ScDPInitState();
77*b1cdbd2cSJim Jagielski 
78*b1cdbd2cSJim Jagielski     void    AddMember( long nSourceIndex,SCROW nMember);
79*b1cdbd2cSJim Jagielski     void    RemoveMember();
80*b1cdbd2cSJim Jagielski 
GetCount() const81*b1cdbd2cSJim Jagielski     long                GetCount() const    { return nCount; }
GetSource() const82*b1cdbd2cSJim Jagielski     const long*         GetSource() const   { return pIndex; }
83*b1cdbd2cSJim Jagielski // Wang Xu Ming -- 2009-8-17
84*b1cdbd2cSJim Jagielski // DataPilot Migration - Cache&&Performance
GetNameIds() const85*b1cdbd2cSJim Jagielski     const SCROW* GetNameIds() const    { return pData; }
86*b1cdbd2cSJim Jagielski     SCROW   GetNameIdForIndex( long nIndexValue ) const;
87*b1cdbd2cSJim Jagielski // End Comments
88*b1cdbd2cSJim Jagielski };
89*b1cdbd2cSJim Jagielski 
90*b1cdbd2cSJim Jagielski typedef ::std::vector<sal_Int32> ScMemberSortOrder;
91*b1cdbd2cSJim Jagielski 
92*b1cdbd2cSJim Jagielski //
93*b1cdbd2cSJim Jagielski //	selected subtotal information, passed down the dimensions
94*b1cdbd2cSJim Jagielski //
95*b1cdbd2cSJim Jagielski 
96*b1cdbd2cSJim Jagielski struct ScDPSubTotalState
97*b1cdbd2cSJim Jagielski {
98*b1cdbd2cSJim Jagielski 	ScSubTotalFunc eColForce;
99*b1cdbd2cSJim Jagielski 	ScSubTotalFunc eRowForce;
100*b1cdbd2cSJim Jagielski 	long nColSubTotalFunc;
101*b1cdbd2cSJim Jagielski 	long nRowSubTotalFunc;
102*b1cdbd2cSJim Jagielski 
ScDPSubTotalStateScDPSubTotalState103*b1cdbd2cSJim Jagielski 	ScDPSubTotalState() :
104*b1cdbd2cSJim Jagielski 		eColForce( SUBTOTAL_FUNC_NONE ),
105*b1cdbd2cSJim Jagielski 		eRowForce( SUBTOTAL_FUNC_NONE ),
106*b1cdbd2cSJim Jagielski 		nColSubTotalFunc( -1 ),
107*b1cdbd2cSJim Jagielski 		nRowSubTotalFunc( -1 )
108*b1cdbd2cSJim Jagielski 	{}
109*b1cdbd2cSJim Jagielski };
110*b1cdbd2cSJim Jagielski 
111*b1cdbd2cSJim Jagielski //
112*b1cdbd2cSJim Jagielski //  indexes when calculating running totals
113*b1cdbd2cSJim Jagielski //  Col/RowVisible: simple counts from 0 - without sort order applied - visible index
114*b1cdbd2cSJim Jagielski //                  (only used for running total / relative index)
115*b1cdbd2cSJim Jagielski //  Col/RowIndexes: with sort order applied - member index
116*b1cdbd2cSJim Jagielski //                  (used otherwise - so other members' children can be accessed)
117*b1cdbd2cSJim Jagielski //
118*b1cdbd2cSJim Jagielski 
119*b1cdbd2cSJim Jagielski class ScDPRunningTotalState
120*b1cdbd2cSJim Jagielski {
121*b1cdbd2cSJim Jagielski     ScDPResultMember*   pColResRoot;
122*b1cdbd2cSJim Jagielski     ScDPResultMember*   pRowResRoot;
123*b1cdbd2cSJim Jagielski     long*               pColVisible;
124*b1cdbd2cSJim Jagielski     long*               pColIndexes;
125*b1cdbd2cSJim Jagielski     long*               pRowVisible;
126*b1cdbd2cSJim Jagielski     long*               pRowIndexes;
127*b1cdbd2cSJim Jagielski     long                nColIndexPos;
128*b1cdbd2cSJim Jagielski     long                nRowIndexPos;
129*b1cdbd2cSJim Jagielski 
130*b1cdbd2cSJim Jagielski public:
131*b1cdbd2cSJim Jagielski             ScDPRunningTotalState( ScDPResultMember* pColRoot, ScDPResultMember* pRowRoot );
132*b1cdbd2cSJim Jagielski             ~ScDPRunningTotalState();
133*b1cdbd2cSJim Jagielski 
GetColResRoot() const134*b1cdbd2cSJim Jagielski     ScDPResultMember*   GetColResRoot() const   { return pColResRoot; }
GetRowResRoot() const135*b1cdbd2cSJim Jagielski     ScDPResultMember*   GetRowResRoot() const   { return pRowResRoot; }
136*b1cdbd2cSJim Jagielski 
GetColVisible() const137*b1cdbd2cSJim Jagielski     const long*         GetColVisible() const   { return pColVisible; }
GetColIndexes() const138*b1cdbd2cSJim Jagielski     const long*         GetColIndexes() const   { return pColIndexes; }
GetRowVisible() const139*b1cdbd2cSJim Jagielski     const long*         GetRowVisible() const   { return pRowVisible; }
GetRowIndexes() const140*b1cdbd2cSJim Jagielski     const long*         GetRowIndexes() const   { return pRowIndexes; }
141*b1cdbd2cSJim Jagielski 
142*b1cdbd2cSJim Jagielski     void    AddColIndex( long nVisible, long nSorted );
143*b1cdbd2cSJim Jagielski     void    AddRowIndex( long nVisible, long nSorted );
144*b1cdbd2cSJim Jagielski     void    RemoveColIndex();
145*b1cdbd2cSJim Jagielski     void    RemoveRowIndex();
146*b1cdbd2cSJim Jagielski };
147*b1cdbd2cSJim Jagielski 
148*b1cdbd2cSJim Jagielski struct ScDPRelativePos
149*b1cdbd2cSJim Jagielski {
150*b1cdbd2cSJim Jagielski     long    nBasePos;       // simple count, without sort order applied
151*b1cdbd2cSJim Jagielski     long    nDirection;
152*b1cdbd2cSJim Jagielski 
153*b1cdbd2cSJim Jagielski     ScDPRelativePos( long nBase, long nDir );
154*b1cdbd2cSJim Jagielski };
155*b1cdbd2cSJim Jagielski 
156*b1cdbd2cSJim Jagielski //
157*b1cdbd2cSJim Jagielski //	aggregated data
158*b1cdbd2cSJim Jagielski //!	separate header file?
159*b1cdbd2cSJim Jagielski //
160*b1cdbd2cSJim Jagielski 
161*b1cdbd2cSJim Jagielski //  Possible values for the nCount member:
162*b1cdbd2cSJim Jagielski //  (greater than 0 counts the collected values)
163*b1cdbd2cSJim Jagielski const long SC_DPAGG_EMPTY        =  0;  // empty during data collection
164*b1cdbd2cSJim Jagielski const long SC_DPAGG_DATA_ERROR   = -1;  // error during data collection
165*b1cdbd2cSJim Jagielski const long SC_DPAGG_RESULT_EMPTY = -2;  // empty result calculated
166*b1cdbd2cSJim Jagielski const long SC_DPAGG_RESULT_VALID = -3;  // valid result calculated
167*b1cdbd2cSJim Jagielski const long SC_DPAGG_RESULT_ERROR = -4;  // error in calculated result
168*b1cdbd2cSJim Jagielski 
169*b1cdbd2cSJim Jagielski class ScDPAggData
170*b1cdbd2cSJim Jagielski {
171*b1cdbd2cSJim Jagielski private:
172*b1cdbd2cSJim Jagielski 	double			fVal;
173*b1cdbd2cSJim Jagielski 	double			fAux;
174*b1cdbd2cSJim Jagielski 	long			nCount;
175*b1cdbd2cSJim Jagielski 	ScDPAggData*	pChild;
176*b1cdbd2cSJim Jagielski 
177*b1cdbd2cSJim Jagielski public:
ScDPAggData()178*b1cdbd2cSJim Jagielski 			ScDPAggData() : fVal(0.0), fAux(0.0), nCount(SC_DPAGG_EMPTY), pChild(NULL) {}
~ScDPAggData()179*b1cdbd2cSJim Jagielski 			~ScDPAggData() { delete pChild; }
180*b1cdbd2cSJim Jagielski 
181*b1cdbd2cSJim Jagielski 	void	Update( const ScDPValueData& rNext, ScSubTotalFunc eFunc, const ScDPSubTotalState& rSubState );
182*b1cdbd2cSJim Jagielski 	void	Calculate( ScSubTotalFunc eFunc, const ScDPSubTotalState& rSubState );
183*b1cdbd2cSJim Jagielski 	sal_Bool	IsCalculated() const;
184*b1cdbd2cSJim Jagielski 
185*b1cdbd2cSJim Jagielski 	double	GetResult() const;
186*b1cdbd2cSJim Jagielski 	sal_Bool	HasError() const;
187*b1cdbd2cSJim Jagielski 	sal_Bool	HasData() const;
188*b1cdbd2cSJim Jagielski 
189*b1cdbd2cSJim Jagielski 	void	SetResult( double fNew );
190*b1cdbd2cSJim Jagielski 	void	SetEmpty( sal_Bool bSet );
191*b1cdbd2cSJim Jagielski 	void	SetError();
192*b1cdbd2cSJim Jagielski 
193*b1cdbd2cSJim Jagielski 	double	GetAuxiliary() const;
194*b1cdbd2cSJim Jagielski 	void	SetAuxiliary( double fNew );
195*b1cdbd2cSJim Jagielski 
196*b1cdbd2cSJim Jagielski 	void    Reset();        // also deletes children
197*b1cdbd2cSJim Jagielski 
GetExistingChild() const198*b1cdbd2cSJim Jagielski 	const ScDPAggData*	GetExistingChild() const	{ return pChild; }
199*b1cdbd2cSJim Jagielski 	ScDPAggData*		GetChild();
200*b1cdbd2cSJim Jagielski };
201*b1cdbd2cSJim Jagielski 
202*b1cdbd2cSJim Jagielski //
203*b1cdbd2cSJim Jagielski //  Row and grand total state, passed down (column total is at result member)
204*b1cdbd2cSJim Jagielski //
205*b1cdbd2cSJim Jagielski 
206*b1cdbd2cSJim Jagielski class ScDPRowTotals
207*b1cdbd2cSJim Jagielski {
208*b1cdbd2cSJim Jagielski     ScDPAggData aRowTotal;
209*b1cdbd2cSJim Jagielski     ScDPAggData aGrandTotal;
210*b1cdbd2cSJim Jagielski     sal_Bool        bIsInColRoot;
211*b1cdbd2cSJim Jagielski 
212*b1cdbd2cSJim Jagielski public:
213*b1cdbd2cSJim Jagielski             ScDPRowTotals();
214*b1cdbd2cSJim Jagielski             ~ScDPRowTotals();
215*b1cdbd2cSJim Jagielski 
216*b1cdbd2cSJim Jagielski     ScDPAggData*    GetRowTotal( long nMeasure );
217*b1cdbd2cSJim Jagielski     ScDPAggData*    GetGrandTotal( long nMeasure );
218*b1cdbd2cSJim Jagielski 
IsInColRoot() const219*b1cdbd2cSJim Jagielski     sal_Bool            IsInColRoot() const     { return bIsInColRoot; }
SetInColRoot(sal_Bool bSet)220*b1cdbd2cSJim Jagielski     void            SetInColRoot(sal_Bool bSet) { bIsInColRoot = bSet; }
221*b1cdbd2cSJim Jagielski };
222*b1cdbd2cSJim Jagielski 
223*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
224*b1cdbd2cSJim Jagielski //
225*b1cdbd2cSJim Jagielski //	results for a hierarchy dimension
226*b1cdbd2cSJim Jagielski //
227*b1cdbd2cSJim Jagielski 
228*b1cdbd2cSJim Jagielski #define SC_DP_RES_GROW	16
229*b1cdbd2cSJim Jagielski 
230*b1cdbd2cSJim Jagielski class ScDPResultDimension;
231*b1cdbd2cSJim Jagielski class ScDPDataDimension;
232*b1cdbd2cSJim Jagielski class ScDPDataMember;
233*b1cdbd2cSJim Jagielski 
234*b1cdbd2cSJim Jagielski #define SC_DPMEASURE_ALL	-1
235*b1cdbd2cSJim Jagielski #define SC_DPMEASURE_ANY	-2
236*b1cdbd2cSJim Jagielski // Wang Xu Ming -- 2009-8-17
237*b1cdbd2cSJim Jagielski // DataPilot Migration - Cache&&Performance
238*b1cdbd2cSJim Jagielski 
239*b1cdbd2cSJim Jagielski struct MemberHashIndexFunc : public std::unary_function< const SCROW &, size_t >
240*b1cdbd2cSJim Jagielski {
operator ()MemberHashIndexFunc241*b1cdbd2cSJim Jagielski 	size_t operator() (const SCROW &rDataIndex) const { return rDataIndex; }
242*b1cdbd2cSJim Jagielski };
243*b1cdbd2cSJim Jagielski 
244*b1cdbd2cSJim Jagielski class ScDPParentDimData
245*b1cdbd2cSJim Jagielski {
246*b1cdbd2cSJim Jagielski public:
247*b1cdbd2cSJim Jagielski 	const SCROW						mnOrder;						//! Ref
248*b1cdbd2cSJim Jagielski 	const ScDPDimension*			mpParentDim;			//! Ref
249*b1cdbd2cSJim Jagielski 	const ScDPLevel*				mpParentLevel;			//! Ref
250*b1cdbd2cSJim Jagielski 	const ScDPMember*				mpMemberDesc;			//! Ref
251*b1cdbd2cSJim Jagielski 
ScDPParentDimData()252*b1cdbd2cSJim Jagielski 	ScDPParentDimData():mnOrder(-1), mpParentDim( NULL), mpParentLevel( NULL ), mpMemberDesc( NULL ){}
ScDPParentDimData(const SCROW nIndex,ScDPDimension * pDim,const ScDPLevel * pLev,const ScDPMember * pMember)253*b1cdbd2cSJim Jagielski 	ScDPParentDimData( const SCROW nIndex, ScDPDimension* pDim, const ScDPLevel* pLev, const ScDPMember* pMember ): mnOrder( nIndex ), mpParentDim( pDim), mpParentLevel( pLev ), mpMemberDesc( pMember ){}
254*b1cdbd2cSJim Jagielski };
255*b1cdbd2cSJim Jagielski 
256*b1cdbd2cSJim Jagielski typedef std::vector <ScDPParentDimData *>                 DimMemberArray;
257*b1cdbd2cSJim Jagielski typedef std::hash_map < SCROW, ScDPParentDimData *, MemberHashIndexFunc>  DimMemberHash;
258*b1cdbd2cSJim Jagielski 
259*b1cdbd2cSJim Jagielski class ResultMembers
260*b1cdbd2cSJim Jagielski {
261*b1cdbd2cSJim Jagielski     DimMemberHash      maMemberHash;
262*b1cdbd2cSJim Jagielski     sal_Bool 				mbHasHideDetailsMember;
263*b1cdbd2cSJim Jagielski public:
264*b1cdbd2cSJim Jagielski     ScDPParentDimData* FindMember( const SCROW& nIndex ) const;
265*b1cdbd2cSJim Jagielski     void                             InsertMember(  ScDPParentDimData* pNew );
IsHasHideDetailsMembers() const266*b1cdbd2cSJim Jagielski     sal_Bool			IsHasHideDetailsMembers() const { return mbHasHideDetailsMember; }
SetHasHideDetailsMembers(sal_Bool b)267*b1cdbd2cSJim Jagielski     void			SetHasHideDetailsMembers( sal_Bool b ) { mbHasHideDetailsMember=b; }
268*b1cdbd2cSJim Jagielski     ResultMembers();
269*b1cdbd2cSJim Jagielski     virtual ~ResultMembers();
270*b1cdbd2cSJim Jagielski };
271*b1cdbd2cSJim Jagielski 
272*b1cdbd2cSJim Jagielski class LateInitParams
273*b1cdbd2cSJim Jagielski {
274*b1cdbd2cSJim Jagielski private:
275*b1cdbd2cSJim Jagielski     const ::std::vector<ScDPDimension*>& mppDim;
276*b1cdbd2cSJim Jagielski     const ::std::vector<ScDPLevel*>& mppLev;
277*b1cdbd2cSJim Jagielski 
278*b1cdbd2cSJim Jagielski     sal_Bool      mbRow;
279*b1cdbd2cSJim Jagielski     sal_Bool      mbInitChild;
280*b1cdbd2cSJim Jagielski     sal_Bool      mbAllChildren;
281*b1cdbd2cSJim Jagielski public:
282*b1cdbd2cSJim Jagielski     LateInitParams( const ::std::vector<ScDPDimension*>& ppDim, const ::std::vector<ScDPLevel*>& ppLev,
283*b1cdbd2cSJim Jagielski         sal_Bool bRow, sal_Bool bInitChild = sal_True , sal_Bool bAllChildren = sal_False);
284*b1cdbd2cSJim Jagielski     ~LateInitParams();
285*b1cdbd2cSJim Jagielski 
SetInitChild(sal_Bool b)286*b1cdbd2cSJim Jagielski     void  SetInitChild( sal_Bool b ) { mbInitChild = b; }
SetInitAllChildren(sal_Bool b)287*b1cdbd2cSJim Jagielski     void  SetInitAllChildren( sal_Bool b ) { mbAllChildren = b; }
288*b1cdbd2cSJim Jagielski 
GetDim(size_t nPos) const289*b1cdbd2cSJim Jagielski     inline ScDPDimension* GetDim( size_t nPos ) const { return mppDim[nPos];}
GetLevel(size_t nPos) const290*b1cdbd2cSJim Jagielski     inline ScDPLevel*         GetLevel( size_t nPos ) const { return mppLev[nPos];}
291*b1cdbd2cSJim Jagielski 
GetInitChild() const292*b1cdbd2cSJim Jagielski     inline sal_Bool  GetInitChild() const {return mbInitChild; }
GetInitAllChild() const293*b1cdbd2cSJim Jagielski     inline sal_Bool  GetInitAllChild() const { return mbAllChildren; }
IsRow() const294*b1cdbd2cSJim Jagielski     inline sal_Bool  IsRow() const { return mbRow; }
295*b1cdbd2cSJim Jagielski     sal_Bool  IsEnd( size_t nPos ) const ;
296*b1cdbd2cSJim Jagielski };
297*b1cdbd2cSJim Jagielski // End Comments
298*b1cdbd2cSJim Jagielski 
299*b1cdbd2cSJim Jagielski class ScDPResultData
300*b1cdbd2cSJim Jagielski {
301*b1cdbd2cSJim Jagielski private:
302*b1cdbd2cSJim Jagielski 	ScDPSource*				pSource;				//! Ref
303*b1cdbd2cSJim Jagielski 	//!	keep things like measure lists here
304*b1cdbd2cSJim Jagielski 
305*b1cdbd2cSJim Jagielski 	long					nMeasCount;
306*b1cdbd2cSJim Jagielski 	ScSubTotalFunc*			pMeasFuncs;
307*b1cdbd2cSJim Jagielski 	::com::sun::star::sheet::DataPilotFieldReference* pMeasRefs;
308*b1cdbd2cSJim Jagielski 	sal_uInt16*					pMeasRefOrient;
309*b1cdbd2cSJim Jagielski 	String*					pMeasNames;
310*b1cdbd2cSJim Jagielski 	sal_Bool					bLateInit;
311*b1cdbd2cSJim Jagielski 	sal_Bool					bDataAtCol;
312*b1cdbd2cSJim Jagielski 	sal_Bool					bDataAtRow;
313*b1cdbd2cSJim Jagielski 
314*b1cdbd2cSJim Jagielski 	//! add "displayed values" settings
315*b1cdbd2cSJim Jagielski     	mutable std::vector< ResultMembers* > mpDimMembers;
316*b1cdbd2cSJim Jagielski public:
317*b1cdbd2cSJim Jagielski 						ScDPResultData( ScDPSource* pSrc );		//! Ref
318*b1cdbd2cSJim Jagielski 						~ScDPResultData();
319*b1cdbd2cSJim Jagielski 
320*b1cdbd2cSJim Jagielski 	void				SetMeasureData( long nCount, const ScSubTotalFunc* pFunctions,
321*b1cdbd2cSJim Jagielski 										const ::com::sun::star::sheet::DataPilotFieldReference* pRefs,
322*b1cdbd2cSJim Jagielski 										const sal_uInt16* pRefOrient, const String* pNames );
323*b1cdbd2cSJim Jagielski 	void				SetDataLayoutOrientation( sal_uInt16 nOrient );
324*b1cdbd2cSJim Jagielski 	void				SetLateInit( sal_Bool bSet );
325*b1cdbd2cSJim Jagielski 
GetMeasureCount() const326*b1cdbd2cSJim Jagielski 	long				GetMeasureCount() const		{ return nMeasCount; }
327*b1cdbd2cSJim Jagielski 	ScSubTotalFunc		GetMeasureFunction(long nMeasure) const;
328*b1cdbd2cSJim Jagielski     String              GetMeasureString(long nMeasure, sal_Bool bForce, ScSubTotalFunc eForceFunc, bool& rbTotalResult) const;
329*b1cdbd2cSJim Jagielski 	String				GetMeasureDimensionName(long nMeasure) const;
330*b1cdbd2cSJim Jagielski 	const ::com::sun::star::sheet::DataPilotFieldReference& GetMeasureRefVal(long nMeasure) const;
331*b1cdbd2cSJim Jagielski 	sal_uInt16				GetMeasureRefOrient(long nMeasure) const;
332*b1cdbd2cSJim Jagielski 
IsDataAtCol() const333*b1cdbd2cSJim Jagielski 	sal_Bool				IsDataAtCol() const				{ return bDataAtCol; }
IsDataAtRow() const334*b1cdbd2cSJim Jagielski 	sal_Bool				IsDataAtRow() const				{ return bDataAtRow; }
IsLateInit() const335*b1cdbd2cSJim Jagielski 	sal_Bool				IsLateInit() const				{ return bLateInit; }
336*b1cdbd2cSJim Jagielski 
337*b1cdbd2cSJim Jagielski 	long				GetColStartMeasure() const;
338*b1cdbd2cSJim Jagielski 	long				GetRowStartMeasure() const;
339*b1cdbd2cSJim Jagielski 
GetCountForMeasure(long nMeas) const340*b1cdbd2cSJim Jagielski 	long				GetCountForMeasure( long nMeas ) const
341*b1cdbd2cSJim Jagielski 								{ return ( nMeas == SC_DPMEASURE_ALL ) ? nMeasCount : 1; }
342*b1cdbd2cSJim Jagielski 
343*b1cdbd2cSJim Jagielski     sal_Bool                IsBaseForGroup( long nDim ) const;              // any group
344*b1cdbd2cSJim Jagielski     long                GetGroupBase( long nGroupDim ) const;
345*b1cdbd2cSJim Jagielski     sal_Bool                IsNumOrDateGroup( long nDim ) const;
346*b1cdbd2cSJim Jagielski  // Wang Xu Ming -- 2009-8-17
347*b1cdbd2cSJim Jagielski // DataPilot Migration - Cache&&Performance
348*b1cdbd2cSJim Jagielski     sal_Bool                IsInGroup( const ScDPItemData& rGroupData, long nGroupIndex,
349*b1cdbd2cSJim Jagielski                                                long nBaseDataId, long nBaseIndex ) const;
350*b1cdbd2cSJim Jagielski     sal_Bool                IsInGroup( SCROW nGroupDataId, long nGroupIndex,
351*b1cdbd2cSJim Jagielski                                               const ScDPItemData& rBaseData, long nBaseIndex ) const;
352*b1cdbd2cSJim Jagielski     sal_Bool                HasCommonElement( SCROW nFirstDataId, long nFirstIndex,
353*b1cdbd2cSJim Jagielski                                           const ScDPItemData& rSecondData, long nSecondIndex ) const;
354*b1cdbd2cSJim Jagielski 
355*b1cdbd2cSJim Jagielski     ResultMembers* GetDimResultMembers( long nDim , ScDPDimension* pDim , ScDPLevel*   pLevel) const ;
356*b1cdbd2cSJim Jagielski 
357*b1cdbd2cSJim Jagielski // End Comments
358*b1cdbd2cSJim Jagielski     const ScDPSource*   GetSource() const;
359*b1cdbd2cSJim Jagielski };
360*b1cdbd2cSJim Jagielski 
361*b1cdbd2cSJim Jagielski 
362*b1cdbd2cSJim Jagielski class ScDPResultMember
363*b1cdbd2cSJim Jagielski {
364*b1cdbd2cSJim Jagielski private:
365*b1cdbd2cSJim Jagielski     const ScDPResultData*   pResultData;
366*b1cdbd2cSJim Jagielski     // Wang Xu Ming -- 2009-8-17
367*b1cdbd2cSJim Jagielski     // DataPilot Migration - Cache&&Performance
368*b1cdbd2cSJim Jagielski     ScDPParentDimData        aParentDimData;
369*b1cdbd2cSJim Jagielski     // End Comments
370*b1cdbd2cSJim Jagielski 	ScDPResultDimension*	pChildDimension;
371*b1cdbd2cSJim Jagielski 	ScDPDataMember*			pDataRoot;
372*b1cdbd2cSJim Jagielski 	sal_Bool					bHasElements;
373*b1cdbd2cSJim Jagielski 	sal_Bool					bForceSubTotal;
374*b1cdbd2cSJim Jagielski 	sal_Bool					bHasHiddenDetails;
375*b1cdbd2cSJim Jagielski 	sal_Bool					bInitialized;
376*b1cdbd2cSJim Jagielski 	sal_Bool                    bAutoHidden;
377*b1cdbd2cSJim Jagielski 	ScDPAggData				aColTotal;				// to store column totals
378*b1cdbd2cSJim Jagielski 
379*b1cdbd2cSJim Jagielski 	sal_uInt16					nMemberStep;			// step to show details
380*b1cdbd2cSJim Jagielski public:
381*b1cdbd2cSJim Jagielski     // Wang Xu Ming -- 2009-8-17
382*b1cdbd2cSJim Jagielski     // DataPilot Migration - Cache&&Performance
383*b1cdbd2cSJim Jagielski     ScDPResultMember(  const ScDPResultData* pData,  const ScDPParentDimData& rParentDimData,
384*b1cdbd2cSJim Jagielski         sal_Bool bForceSub );  //! Ref
385*b1cdbd2cSJim Jagielski     ScDPResultMember(  const ScDPResultData* pData, sal_Bool bForceSub );
386*b1cdbd2cSJim Jagielski     // End Comments
387*b1cdbd2cSJim Jagielski     ~ScDPResultMember();
388*b1cdbd2cSJim Jagielski 
389*b1cdbd2cSJim Jagielski     // Wang Xu Ming -- 2009-8-17
390*b1cdbd2cSJim Jagielski     // DataPilot Migration - Cache&&Performance
391*b1cdbd2cSJim Jagielski     void                InitFrom( const ::std::vector<ScDPDimension*>& ppDim,
392*b1cdbd2cSJim Jagielski                                         const ::std::vector<ScDPLevel*>& ppLev,
393*b1cdbd2cSJim Jagielski                                         size_t nPos,
394*b1cdbd2cSJim Jagielski                                         ScDPInitState& rInitState,
395*b1cdbd2cSJim Jagielski                                         sal_Bool bInitChild = sal_True );
396*b1cdbd2cSJim Jagielski     void               LateInitFrom(
397*b1cdbd2cSJim Jagielski                                         LateInitParams& rParams,
398*b1cdbd2cSJim Jagielski                                         const ::std::vector< SCROW >& pItemData,
399*b1cdbd2cSJim Jagielski                                         size_t nPos,
400*b1cdbd2cSJim Jagielski                                         ScDPInitState& rInitState);
401*b1cdbd2cSJim Jagielski     void              CheckShowEmpty( sal_Bool bShow = sal_False );
402*b1cdbd2cSJim Jagielski     // End Comments
403*b1cdbd2cSJim Jagielski 	String				GetName() const;
404*b1cdbd2cSJim Jagielski     void                FillItemData( ScDPItemData& rData ) const;
405*b1cdbd2cSJim Jagielski 	sal_Bool				IsValid() const;
406*b1cdbd2cSJim Jagielski 	sal_Bool				IsVisible() const;
407*b1cdbd2cSJim Jagielski 	long				GetSize(long nMeasure) const;
408*b1cdbd2cSJim Jagielski 	sal_Bool				HasHiddenDetails() const;
409*b1cdbd2cSJim Jagielski 	sal_Bool                IsSubTotalInTitle(long nMeasure) const;
410*b1cdbd2cSJim Jagielski 
411*b1cdbd2cSJim Jagielski //	sal_Bool				SubTotalEnabled() const;
412*b1cdbd2cSJim Jagielski 	long				GetSubTotalCount( long* pUserSubStart = NULL ) const;
413*b1cdbd2cSJim Jagielski 
414*b1cdbd2cSJim Jagielski     // Wang Xu Ming -- 2009-8-17
415*b1cdbd2cSJim Jagielski     // DataPilot Migration - Cache&&Performance
416*b1cdbd2cSJim Jagielski     sal_Bool              IsNamedItem( SCROW nIndex ) const;
417*b1cdbd2cSJim Jagielski     bool IsValidEntry( const ::std::vector< SCROW >& aMembers ) const;
418*b1cdbd2cSJim Jagielski     // End Comments
419*b1cdbd2cSJim Jagielski 
SetHasElements()420*b1cdbd2cSJim Jagielski 	void				SetHasElements()	{ bHasElements = sal_True; }
SetAutoHidden()421*b1cdbd2cSJim Jagielski 	void                SetAutoHidden()     { bAutoHidden = sal_True; }
422*b1cdbd2cSJim Jagielski 
423*b1cdbd2cSJim Jagielski     // Wang Xu Ming -- 2009-8-17
424*b1cdbd2cSJim Jagielski     // DataPilot Migration - Cache&&Performance
425*b1cdbd2cSJim Jagielski     void                ProcessData( const ::std::vector<SCROW>& aChildMembers,
426*b1cdbd2cSJim Jagielski                                         const ScDPResultDimension* pDataDim,
427*b1cdbd2cSJim Jagielski                                         const ::std::vector<SCROW>& aDataMembers,
428*b1cdbd2cSJim Jagielski                                         const ::std::vector<ScDPValueData>& aValues );
429*b1cdbd2cSJim Jagielski     // End Comments
430*b1cdbd2cSJim Jagielski 	void				FillMemberResults( com::sun::star::uno::Sequence<
431*b1cdbd2cSJim Jagielski 												com::sun::star::sheet::MemberResult>* pSequences,
432*b1cdbd2cSJim Jagielski 											long& rPos, long nMeasure, sal_Bool bRoot,
433*b1cdbd2cSJim Jagielski 											const String* pMemberName,
434*b1cdbd2cSJim Jagielski 											const String* pMemberCaption );
435*b1cdbd2cSJim Jagielski 
436*b1cdbd2cSJim Jagielski 	void				FillDataResults( const ScDPResultMember* pRefMember,
437*b1cdbd2cSJim Jagielski 									com::sun::star::uno::Sequence<
438*b1cdbd2cSJim Jagielski 										com::sun::star::uno::Sequence<
439*b1cdbd2cSJim Jagielski 											com::sun::star::sheet::DataResult> >& rSequence,
440*b1cdbd2cSJim Jagielski 									long& rRow, long nMeasure ) const;
441*b1cdbd2cSJim Jagielski 
442*b1cdbd2cSJim Jagielski 	void				UpdateDataResults( const ScDPResultMember* pRefMember, long nMeasure ) const;
443*b1cdbd2cSJim Jagielski 	void				UpdateRunningTotals( const ScDPResultMember* pRefMember, long nMeasure,
444*b1cdbd2cSJim Jagielski 												ScDPRunningTotalState& rRunning, ScDPRowTotals& rTotals ) const;
445*b1cdbd2cSJim Jagielski 
446*b1cdbd2cSJim Jagielski     void                SortMembers( ScDPResultMember* pRefMember );
447*b1cdbd2cSJim Jagielski     void                DoAutoShow( ScDPResultMember* pRefMember );
448*b1cdbd2cSJim Jagielski 
449*b1cdbd2cSJim Jagielski     void                ResetResults( sal_Bool bRoot );
450*b1cdbd2cSJim Jagielski 
451*b1cdbd2cSJim Jagielski 	void				DumpState( const ScDPResultMember* pRefMember, ScDocument* pDoc, ScAddress& rPos ) const;
452*b1cdbd2cSJim Jagielski 
453*b1cdbd2cSJim Jagielski 						//!	this will be removed!
GetChildDimension() const454*b1cdbd2cSJim Jagielski 	const ScDPResultDimension*	GetChildDimension() const	{ return pChildDimension; }
GetChildDimension()455*b1cdbd2cSJim Jagielski 	ScDPResultDimension*		GetChildDimension()			{ return pChildDimension; }
456*b1cdbd2cSJim Jagielski 
GetDataRoot() const457*b1cdbd2cSJim Jagielski 	ScDPDataMember*			GetDataRoot() const				{ return pDataRoot; }
458*b1cdbd2cSJim Jagielski 
459*b1cdbd2cSJim Jagielski     // Wang Xu Ming -- 2009-8-17
460*b1cdbd2cSJim Jagielski     // DataPilot Migration - Cache&&Performance
GetParentDim() const461*b1cdbd2cSJim Jagielski     const ScDPDimension*  GetParentDim() const               { return aParentDimData.mpParentDim; }     //! Ref
GetParentLevel() const462*b1cdbd2cSJim Jagielski     const ScDPLevel*         GetParentLevel() const         { return aParentDimData.mpParentLevel; }   //! Ref
GetDPMember() const463*b1cdbd2cSJim Jagielski     const ScDPMember*     GetDPMember()const              { return aParentDimData.mpMemberDesc; }    //! Ref
GetOrder() const464*b1cdbd2cSJim Jagielski     inline SCROW               GetOrder() const                           { return aParentDimData.mnOrder; }         //! Ref
IsRoot() const465*b1cdbd2cSJim Jagielski     inline sal_Bool                  IsRoot() const                       { return GetParentLevel() == NULL; }
466*b1cdbd2cSJim Jagielski     SCROW                       GetDataId( ) const ;
467*b1cdbd2cSJim Jagielski     // End Comments
468*b1cdbd2cSJim Jagielski 	ScDPAggData*		GetColTotal( long nMeasure ) const;
469*b1cdbd2cSJim Jagielski 
470*b1cdbd2cSJim Jagielski     void                FillVisibilityData(ScDPResultVisibilityData& rData) const;
471*b1cdbd2cSJim Jagielski };
472*b1cdbd2cSJim Jagielski 
473*b1cdbd2cSJim Jagielski class ScDPDataMember
474*b1cdbd2cSJim Jagielski {
475*b1cdbd2cSJim Jagielski private:
476*b1cdbd2cSJim Jagielski     const ScDPResultData*       pResultData;
477*b1cdbd2cSJim Jagielski 	const ScDPResultMember*		pResultMember;			//! Ref?
478*b1cdbd2cSJim Jagielski 	ScDPDataDimension*		pChildDimension;
479*b1cdbd2cSJim Jagielski 	ScDPAggData				aAggregate;
480*b1cdbd2cSJim Jagielski 
481*b1cdbd2cSJim Jagielski     void                UpdateValues( const ::std::vector<ScDPValueData>& aValues, const ScDPSubTotalState& rSubState );
482*b1cdbd2cSJim Jagielski 
483*b1cdbd2cSJim Jagielski public:
484*b1cdbd2cSJim Jagielski                         ScDPDataMember( const ScDPResultData* pData, const ScDPResultMember* pRes );
485*b1cdbd2cSJim Jagielski 						~ScDPDataMember();
486*b1cdbd2cSJim Jagielski 
487*b1cdbd2cSJim Jagielski 	void				InitFrom( const ScDPResultDimension* pDim );
488*b1cdbd2cSJim Jagielski 
489*b1cdbd2cSJim Jagielski 	String				GetName() const;
490*b1cdbd2cSJim Jagielski 	sal_Bool				IsVisible() const;
491*b1cdbd2cSJim Jagielski 	sal_Bool				HasData( long nMeasure, const ScDPSubTotalState& rSubState ) const;
492*b1cdbd2cSJim Jagielski 
493*b1cdbd2cSJim Jagielski     // Wang Xu Ming -- 2009-8-17
494*b1cdbd2cSJim Jagielski     // DataPilot Migration - Cache&&Performance
495*b1cdbd2cSJim Jagielski     sal_Bool              IsNamedItem(   SCROW r ) const;
496*b1cdbd2cSJim Jagielski     // End Comments
497*b1cdbd2cSJim Jagielski 	sal_Bool				HasHiddenDetails() const;
498*b1cdbd2cSJim Jagielski 
499*b1cdbd2cSJim Jagielski     // Wang Xu Ming -- 2009-8-17
500*b1cdbd2cSJim Jagielski     // DataPilot Migration - Cache&&Performance
501*b1cdbd2cSJim Jagielski     void                ProcessData( const ::std::vector< SCROW >& aChildMembers, const ::std::vector<ScDPValueData>& aValues,
502*b1cdbd2cSJim Jagielski                                        const ScDPSubTotalState& rSubState );
503*b1cdbd2cSJim Jagielski     // End Comments
504*b1cdbd2cSJim Jagielski 	sal_Bool				HasError( long nMeasure, const ScDPSubTotalState& rSubState ) const;
505*b1cdbd2cSJim Jagielski 	double				GetAggregate( long nMeasure, const ScDPSubTotalState& rSubState ) const;
506*b1cdbd2cSJim Jagielski 	const ScDPAggData*	GetConstAggData( long nMeasure, const ScDPSubTotalState& rSubState ) const;
507*b1cdbd2cSJim Jagielski 	ScDPAggData*		GetAggData( long nMeasure, const ScDPSubTotalState& rSubState );
508*b1cdbd2cSJim Jagielski 
509*b1cdbd2cSJim Jagielski 	void				FillDataRow( const ScDPResultMember* pRefMember,
510*b1cdbd2cSJim Jagielski 									com::sun::star::uno::Sequence<com::sun::star::sheet::DataResult>& rSequence,
511*b1cdbd2cSJim Jagielski 									long& rCol, long nMeasure, sal_Bool bIsSubTotalRow,
512*b1cdbd2cSJim Jagielski 									const ScDPSubTotalState& rSubState ) const;
513*b1cdbd2cSJim Jagielski 
514*b1cdbd2cSJim Jagielski 	void				UpdateDataRow( const ScDPResultMember* pRefMember, long nMeasure, sal_Bool bIsSubTotalRow,
515*b1cdbd2cSJim Jagielski 									const ScDPSubTotalState& rSubState );
516*b1cdbd2cSJim Jagielski 	void				UpdateRunningTotals( const ScDPResultMember* pRefMember, long nMeasure, sal_Bool bIsSubTotalRow,
517*b1cdbd2cSJim Jagielski 									const ScDPSubTotalState& rSubState, ScDPRunningTotalState& rRunning,
518*b1cdbd2cSJim Jagielski 									ScDPRowTotals& rTotals, const ScDPResultMember& rRowParent );
519*b1cdbd2cSJim Jagielski 
520*b1cdbd2cSJim Jagielski     void                SortMembers( ScDPResultMember* pRefMember );
521*b1cdbd2cSJim Jagielski     void                DoAutoShow( ScDPResultMember* pRefMember );
522*b1cdbd2cSJim Jagielski 
523*b1cdbd2cSJim Jagielski     void                ResetResults();
524*b1cdbd2cSJim Jagielski 
525*b1cdbd2cSJim Jagielski 	void				DumpState( const ScDPResultMember* pRefMember, ScDocument* pDoc, ScAddress& rPos ) const;
526*b1cdbd2cSJim Jagielski 
527*b1cdbd2cSJim Jagielski 						//!	this will be removed!
GetChildDimension() const528*b1cdbd2cSJim Jagielski 	const ScDPDataDimension*	GetChildDimension() const	{ return pChildDimension; }
GetChildDimension()529*b1cdbd2cSJim Jagielski 	ScDPDataDimension*			GetChildDimension()			{ return pChildDimension; }
530*b1cdbd2cSJim Jagielski };
531*b1cdbd2cSJim Jagielski 
532*b1cdbd2cSJim Jagielski //!	replace PtrArr with 32-bit array ????
533*b1cdbd2cSJim Jagielski 
534*b1cdbd2cSJim Jagielski typedef ScDPDataMember* ScDPDataMemberPtr;
535*b1cdbd2cSJim Jagielski SV_DECL_PTRARR_DEL(ScDPDataMembers, ScDPDataMemberPtr, SC_DP_RES_GROW, SC_DP_RES_GROW)
536*b1cdbd2cSJim Jagielski 
537*b1cdbd2cSJim Jagielski 
538*b1cdbd2cSJim Jagielski //	result dimension contains only members
539*b1cdbd2cSJim Jagielski 
540*b1cdbd2cSJim Jagielski class ScDPResultDimension
541*b1cdbd2cSJim Jagielski {
542*b1cdbd2cSJim Jagielski public :
543*b1cdbd2cSJim Jagielski     // Wang Xu Ming -- 2009-8-17
544*b1cdbd2cSJim Jagielski     // DataPilot Migration - Cache&&Performance
545*b1cdbd2cSJim Jagielski     typedef std::vector <ScDPResultMember *>                           MemberArray;
546*b1cdbd2cSJim Jagielski     typedef std::map < SCROW , ScDPResultMember *> MemberHash;
547*b1cdbd2cSJim Jagielski     // End Comments
548*b1cdbd2cSJim Jagielski private:
549*b1cdbd2cSJim Jagielski     	const ScDPResultData*   pResultData;
550*b1cdbd2cSJim Jagielski 	MemberArray				maMemberArray;
551*b1cdbd2cSJim Jagielski 	MemberHash				maMemberHash;
552*b1cdbd2cSJim Jagielski 	sal_Bool                    bInitialized;
553*b1cdbd2cSJim Jagielski 	String					aDimensionName;		//! or ptr to IntDimension?
554*b1cdbd2cSJim Jagielski 	sal_Bool					bIsDataLayout;		//! or ptr to IntDimension?
555*b1cdbd2cSJim Jagielski 	sal_Bool                    bSortByData;
556*b1cdbd2cSJim Jagielski 	sal_Bool                    bSortAscending;
557*b1cdbd2cSJim Jagielski 	long                    nSortMeasure;
558*b1cdbd2cSJim Jagielski 	ScMemberSortOrder       aMemberOrder;       // used when sorted by measure
559*b1cdbd2cSJim Jagielski 	sal_Bool                    bAutoShow;
560*b1cdbd2cSJim Jagielski 	sal_Bool                    bAutoTopItems;
561*b1cdbd2cSJim Jagielski 	long                    nAutoMeasure;
562*b1cdbd2cSJim Jagielski 	long                    nAutoCount;
563*b1cdbd2cSJim Jagielski 
564*b1cdbd2cSJim Jagielski     // Wang Xu Ming -- 2009-8-17
565*b1cdbd2cSJim Jagielski     // DataPilot Migration - Cache&&Performance
566*b1cdbd2cSJim Jagielski     ScDPResultMember*        FindMember(   SCROW  iData ) const;
567*b1cdbd2cSJim Jagielski     ScDPResultMember*        AddMember( const ScDPParentDimData& aData );
568*b1cdbd2cSJim Jagielski     ScDPResultMember*        InsertMember( ScDPParentDimData* pMemberData );
569*b1cdbd2cSJim Jagielski     ResultMembers*               GetResultMember( ScDPDimension* pDim, ScDPLevel* pLevel );
570*b1cdbd2cSJim Jagielski     void                                  InitWithMembers( LateInitParams& rParams,
571*b1cdbd2cSJim Jagielski                                                             const ::std::vector< SCROW >& pItemData,
572*b1cdbd2cSJim Jagielski                                                             size_t  nPos,
573*b1cdbd2cSJim Jagielski                                                             ScDPInitState& rInitState  );
574*b1cdbd2cSJim Jagielski     // End Comments
575*b1cdbd2cSJim Jagielski public:
576*b1cdbd2cSJim Jagielski        ScDPResultDimension( const ScDPResultData* pData );
577*b1cdbd2cSJim Jagielski 	~ScDPResultDimension();
578*b1cdbd2cSJim Jagielski 
579*b1cdbd2cSJim Jagielski                         //	allocates new members
580*b1cdbd2cSJim Jagielski     // Wang Xu Ming -- 2009-8-17
581*b1cdbd2cSJim Jagielski     // DataPilot Migration - Cache&&Performance
582*b1cdbd2cSJim Jagielski     void                InitFrom( const ::std::vector<ScDPDimension*>& ppDim,
583*b1cdbd2cSJim Jagielski                                         const ::std::vector<ScDPLevel*>& ppLev,
584*b1cdbd2cSJim Jagielski                                         size_t nPos,
585*b1cdbd2cSJim Jagielski                                         ScDPInitState& rInitState ,  sal_Bool bInitChild = sal_True );
586*b1cdbd2cSJim Jagielski     void                LateInitFrom(  LateInitParams& rParams,
587*b1cdbd2cSJim Jagielski                                         const ::std::vector< SCROW >& pItemData,
588*b1cdbd2cSJim Jagielski                                         size_t nPos,
589*b1cdbd2cSJim Jagielski                                         ScDPInitState& rInitState );
590*b1cdbd2cSJim Jagielski     void               CheckShowEmpty( sal_Bool bShow = sal_False );
591*b1cdbd2cSJim Jagielski 
592*b1cdbd2cSJim Jagielski     // End Comments
593*b1cdbd2cSJim Jagielski     long				GetSize(long nMeasure) const;
594*b1cdbd2cSJim Jagielski 
595*b1cdbd2cSJim Jagielski     // Wang Xu Ming -- 2009-8-17
596*b1cdbd2cSJim Jagielski     // DataPilot Migration - Cache&&Performance
597*b1cdbd2cSJim Jagielski     bool                IsValidEntry( const ::std::vector<SCROW>& aMembers ) const;
598*b1cdbd2cSJim Jagielski 
599*b1cdbd2cSJim Jagielski     //	modifies existing members, allocates data dimensions
600*b1cdbd2cSJim Jagielski 	void				ProcessData( const ::std::vector<SCROW>& aMembers,
601*b1cdbd2cSJim Jagielski                                      const ScDPResultDimension* pDataDim,
602*b1cdbd2cSJim Jagielski                                      const ::std::vector<SCROW>& aDataMembers,
603*b1cdbd2cSJim Jagielski                                      const ::std::vector<ScDPValueData>& aValues ) const;	//! Test
604*b1cdbd2cSJim Jagielski  // End Comments
605*b1cdbd2cSJim Jagielski 	void				FillMemberResults( com::sun::star::uno::Sequence<
606*b1cdbd2cSJim Jagielski 												com::sun::star::sheet::MemberResult>* pSequences,
607*b1cdbd2cSJim Jagielski 											long nStart, long nMeasure );
608*b1cdbd2cSJim Jagielski 
609*b1cdbd2cSJim Jagielski 	void				FillDataResults( const ScDPResultMember* pRefMember,
610*b1cdbd2cSJim Jagielski 									com::sun::star::uno::Sequence<
611*b1cdbd2cSJim Jagielski 										com::sun::star::uno::Sequence<
612*b1cdbd2cSJim Jagielski 											com::sun::star::sheet::DataResult> >& rSequence,
613*b1cdbd2cSJim Jagielski 									long nRow, long nMeasure ) const;
614*b1cdbd2cSJim Jagielski 
615*b1cdbd2cSJim Jagielski 	void				UpdateDataResults( const ScDPResultMember* pRefMember, long nMeasure ) const;
616*b1cdbd2cSJim Jagielski 	void				UpdateRunningTotals( const ScDPResultMember* pRefMember, long nMeasure,
617*b1cdbd2cSJim Jagielski 											ScDPRunningTotalState& rRunning, ScDPRowTotals& rTotals ) const;
618*b1cdbd2cSJim Jagielski 
619*b1cdbd2cSJim Jagielski     void                SortMembers( ScDPResultMember* pRefMember );
620*b1cdbd2cSJim Jagielski     long                GetSortedIndex( long nUnsorted ) const;
621*b1cdbd2cSJim Jagielski 
622*b1cdbd2cSJim Jagielski     void                DoAutoShow( ScDPResultMember* pRefMember );
623*b1cdbd2cSJim Jagielski 
624*b1cdbd2cSJim Jagielski     void                ResetResults();
625*b1cdbd2cSJim Jagielski 
626*b1cdbd2cSJim Jagielski 						//	called for the reference dimension
627*b1cdbd2cSJim Jagielski 	ScDPDataMember*		GetRowReferenceMember( const ScDPRelativePos* pMemberPos, const String* pName,
628*b1cdbd2cSJim Jagielski 									const long* pRowIndexes, const long* pColIndexes ) const;
629*b1cdbd2cSJim Jagielski 
630*b1cdbd2cSJim Jagielski 						//	uses row root member from ScDPRunningTotalState
631*b1cdbd2cSJim Jagielski 	static ScDPDataMember* GetColReferenceMember( const ScDPRelativePos* pMemberPos, const String* pName,
632*b1cdbd2cSJim Jagielski 									long nRefDimPos, const ScDPRunningTotalState& rRunning );
633*b1cdbd2cSJim Jagielski 
634*b1cdbd2cSJim Jagielski 	void				DumpState( const ScDPResultMember* pRefMember, ScDocument* pDoc, ScAddress& rPos ) const;
635*b1cdbd2cSJim Jagielski 
636*b1cdbd2cSJim Jagielski 						//	for ScDPDataDimension::InitFrom
637*b1cdbd2cSJim Jagielski 	long				GetMemberCount() const;
638*b1cdbd2cSJim Jagielski 	const ScDPResultMember*	GetMember(long n) const;
639*b1cdbd2cSJim Jagielski 	ScDPResultMember*		GetMember(long n);
640*b1cdbd2cSJim Jagielski 
GetMemberOrder() const641*b1cdbd2cSJim Jagielski 	const ScMemberSortOrder& GetMemberOrder() const     { return aMemberOrder; }
GetMemberOrder()642*b1cdbd2cSJim Jagielski 	ScMemberSortOrder&  GetMemberOrder()                { return aMemberOrder; }
643*b1cdbd2cSJim Jagielski 
IsDataLayout() const644*b1cdbd2cSJim Jagielski 	sal_Bool				IsDataLayout() const	{ return bIsDataLayout; }
GetName() const645*b1cdbd2cSJim Jagielski 	String				GetName() const			{ return aDimensionName; }
646*b1cdbd2cSJim Jagielski 
IsSortByData() const647*b1cdbd2cSJim Jagielski 	sal_Bool                IsSortByData() const    { return bSortByData; }
IsSortAscending() const648*b1cdbd2cSJim Jagielski 	sal_Bool                IsSortAscending() const { return bSortAscending; }
GetSortMeasure() const649*b1cdbd2cSJim Jagielski 	long                GetSortMeasure() const  { return nSortMeasure; }
650*b1cdbd2cSJim Jagielski 
IsAutoShow() const651*b1cdbd2cSJim Jagielski 	sal_Bool                IsAutoShow() const      { return bAutoShow; }
IsAutoTopItems() const652*b1cdbd2cSJim Jagielski 	sal_Bool                IsAutoTopItems() const  { return bAutoTopItems; }
GetAutoMeasure() const653*b1cdbd2cSJim Jagielski 	long                GetAutoMeasure() const  { return nAutoMeasure; }
GetAutoCount() const654*b1cdbd2cSJim Jagielski 	long                GetAutoCount() const    { return nAutoCount; }
655*b1cdbd2cSJim Jagielski 
656*b1cdbd2cSJim Jagielski 	ScDPResultDimension* GetFirstChildDimension() const;
657*b1cdbd2cSJim Jagielski 
658*b1cdbd2cSJim Jagielski     void                FillVisibilityData(ScDPResultVisibilityData& rData) const;
659*b1cdbd2cSJim Jagielski };
660*b1cdbd2cSJim Jagielski 
661*b1cdbd2cSJim Jagielski class ScDPDataDimension
662*b1cdbd2cSJim Jagielski {
663*b1cdbd2cSJim Jagielski private:
664*b1cdbd2cSJim Jagielski     const ScDPResultData*		pResultData;
665*b1cdbd2cSJim Jagielski 	const ScDPResultDimension* pResultDimension;  // column
666*b1cdbd2cSJim Jagielski 	ScDPDataMembers		aMembers;
667*b1cdbd2cSJim Jagielski 	sal_Bool				bIsDataLayout;		//! or ptr to IntDimension?
668*b1cdbd2cSJim Jagielski 
669*b1cdbd2cSJim Jagielski public:
670*b1cdbd2cSJim Jagielski                         ScDPDataDimension( const ScDPResultData* pData );
671*b1cdbd2cSJim Jagielski 						~ScDPDataDimension();
672*b1cdbd2cSJim Jagielski 
673*b1cdbd2cSJim Jagielski 	void				InitFrom( const ScDPResultDimension* pDim );		// recursive
674*b1cdbd2cSJim Jagielski     // Wang Xu Ming -- 2009-8-17
675*b1cdbd2cSJim Jagielski     // DataPilot Migration - Cache&&Performance
676*b1cdbd2cSJim Jagielski     void                ProcessData( const ::std::vector< SCROW >& aDataMembers, const ::std::vector<ScDPValueData>& aValues,
677*b1cdbd2cSJim Jagielski                                        const ScDPSubTotalState& rSubState );
678*b1cdbd2cSJim Jagielski     // End Comments
679*b1cdbd2cSJim Jagielski 	void				FillDataRow( const ScDPResultDimension* pRefDim,
680*b1cdbd2cSJim Jagielski 									com::sun::star::uno::Sequence<com::sun::star::sheet::DataResult>& rSequence,
681*b1cdbd2cSJim Jagielski 									long nCol, long nMeasure, sal_Bool bIsSubTotalRow,
682*b1cdbd2cSJim Jagielski 									const ScDPSubTotalState& rSubState ) const;
683*b1cdbd2cSJim Jagielski 
684*b1cdbd2cSJim Jagielski 	void				UpdateDataRow( const ScDPResultDimension* pRefDim, long nMeasure, sal_Bool bIsSubTotalRow,
685*b1cdbd2cSJim Jagielski 									const ScDPSubTotalState& rSubState ) const;
686*b1cdbd2cSJim Jagielski 	void				UpdateRunningTotals( const ScDPResultDimension* pRefDim, long nMeasure, sal_Bool bIsSubTotalRow,
687*b1cdbd2cSJim Jagielski 									const ScDPSubTotalState& rSubState, ScDPRunningTotalState& rRunning,
688*b1cdbd2cSJim Jagielski 									ScDPRowTotals& rTotals, const ScDPResultMember& rRowParent ) const;
689*b1cdbd2cSJim Jagielski 
690*b1cdbd2cSJim Jagielski     void                SortMembers( ScDPResultDimension* pRefDim );
691*b1cdbd2cSJim Jagielski     long                GetSortedIndex( long nUnsorted ) const;
692*b1cdbd2cSJim Jagielski 
693*b1cdbd2cSJim Jagielski     void                DoAutoShow( ScDPResultDimension* pRefDim );
694*b1cdbd2cSJim Jagielski 
695*b1cdbd2cSJim Jagielski     void                ResetResults();
696*b1cdbd2cSJim Jagielski 
697*b1cdbd2cSJim Jagielski 	void				DumpState( const ScDPResultDimension* pRefDim, ScDocument* pDoc, ScAddress& rPos ) const;
698*b1cdbd2cSJim Jagielski 
699*b1cdbd2cSJim Jagielski 	long				GetMemberCount() const;
700*b1cdbd2cSJim Jagielski 	ScDPDataMember*		GetMember(long n) const;
701*b1cdbd2cSJim Jagielski };
702*b1cdbd2cSJim Jagielski 
703*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------
704*b1cdbd2cSJim Jagielski 
705*b1cdbd2cSJim Jagielski /**
706*b1cdbd2cSJim Jagielski  * This class collects visible members of each dimension and uses that
707*b1cdbd2cSJim Jagielski  * information to create filtering criteria (e.g. for drill-down data).
708*b1cdbd2cSJim Jagielski  */
709*b1cdbd2cSJim Jagielski class ScDPResultVisibilityData
710*b1cdbd2cSJim Jagielski {
711*b1cdbd2cSJim Jagielski public:
712*b1cdbd2cSJim Jagielski     // Wang Xu Ming -- 2009-8-17
713*b1cdbd2cSJim Jagielski     // DataPilot Migration - Cache&&Performance
714*b1cdbd2cSJim Jagielski     ScDPResultVisibilityData( ScDPSource* pSource);
715*b1cdbd2cSJim Jagielski     // End Comments
716*b1cdbd2cSJim Jagielski     ~ScDPResultVisibilityData();
717*b1cdbd2cSJim Jagielski 
718*b1cdbd2cSJim Jagielski     void addVisibleMember(const String& rDimName, const ScDPItemData& rMemberItem);
719*b1cdbd2cSJim Jagielski     void fillFieldFilters(::std::vector<ScDPCacheTable::Criterion>& rFilters) const;
720*b1cdbd2cSJim Jagielski 
721*b1cdbd2cSJim Jagielski private:
722*b1cdbd2cSJim Jagielski     struct MemberHash
723*b1cdbd2cSJim Jagielski     {
724*b1cdbd2cSJim Jagielski         size_t operator()(const ScDPItemData& r) const;
725*b1cdbd2cSJim Jagielski     };
726*b1cdbd2cSJim Jagielski     typedef ::std::hash_set<ScDPItemData, MemberHash> VisibleMemberType;
727*b1cdbd2cSJim Jagielski     typedef ::std::hash_map<String, VisibleMemberType, ScStringHashCode> DimMemberType;
728*b1cdbd2cSJim Jagielski     DimMemberType maDimensions;
729*b1cdbd2cSJim Jagielski 
730*b1cdbd2cSJim Jagielski     ScDPSource* mpSource;
731*b1cdbd2cSJim Jagielski };
732*b1cdbd2cSJim Jagielski 
733*b1cdbd2cSJim Jagielski #endif
734*b1cdbd2cSJim Jagielski 
735