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