xref: /aoo41x/main/sc/inc/dpcachetable.hxx (revision cdf0e10c)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 #ifndef SC_DPCACHETABLE_HXX
29 #define SC_DPCACHETABLE_HXX
30 
31 #include "sal/types.h"
32 #include "osl/mutex.hxx"
33 #include "global.hxx"
34 #include "collect.hxx"
35 
36 #include <vector>
37 #include <hash_map>
38 #include <hash_set>
39 #include <boost/shared_ptr.hpp>
40 #include <com/sun/star/uno/Reference.hxx>
41 
42 namespace com { namespace sun { namespace star {
43     namespace sdbc {
44         class XRowSet;
45     }
46     namespace sheet {
47         struct DataPilotFieldFilter;
48     }
49 }}}
50 
51 class Date;
52 
53 class ScDocument;
54 class ScRange;
55 class ScDPDimension;
56 class ScDPCollection;
57 struct ScDPCacheCell;
58 struct ScQueryParam;
59 // Wang Xu Ming -- 2009-8-17
60 // DataPilot Migration - Cache&&Performance
61 class ScDPItemData;
62 // End Comments
63 class Date;
64 
65 // Wang Xu Ming -- 2009-8-17
66 // DataPilot Migration - Cache&&Performance
67 class ScDPTableDataCache;
68 struct ScDPValueData;
69 // End Comments
70 // ----------------------------------------------------------------------------
71 
72 class SC_DLLPUBLIC ScDPCacheTable
73 {
74 public:
75     /** individual filter item used in SingleFilter and GroupFilter. */
76     struct FilterItem
77     {
78         // Wang Xu Ming -- 2009-8-17
79         // DataPilot Migration - Cache&&Performance
80         String       maString;
81         // End Comments
82         double      mfValue;
83         bool        mbHasValue;
84 
85         FilterItem();
86 // Wang Xu Ming -- 2009-8-17
87 // DataPilot Migration - Cache&&Performance
88     bool  match( const  ScDPItemData& rCellData ) const;
89 // End Comments
90     };
91 
92     /** interface class used for filtering of rows. */
93     class FilterBase
94     {
95     public:
96         /** returns true if the matching condition is met for a single cell
97             value, or false otherwise. */
98 // Wang Xu Ming -- 2009-8-17
99 // DataPilot Migration - Cache&&Performance
100         virtual bool match( const  ScDPItemData& rCellData ) const = 0;
101 // End Comments
102     };
103 
104     /** ordinary single-item filter. */
105     class SingleFilter : public FilterBase
106     {
107     public:
108         // Wang Xu Ming -- 2009-8-17
109         // DataPilot Migration - Cache&&Performance
110         explicit SingleFilter(String aString, double fValue, bool bHasValue);
111         // End Comments
112         virtual ~SingleFilter(){}
113 
114        // Wang Xu Ming -- 2009-8-17
115         // DataPilot Migration - Cache&&Performance
116          virtual bool match(const ScDPItemData& rCellData) const;
117          // End Comments
118         const String    getMatchString();
119         double          getMatchValue() const;
120         bool            hasValue() const;
121 
122     private:
123         explicit SingleFilter();
124 
125         FilterItem  maItem;
126     };
127 
128     /** multi-item (group) filter. */
129     class GroupFilter : public FilterBase
130     {
131     public:
132         // Wang Xu Ming -- 2009-8-17
133         // DataPilot Migration - Cache&&Performance
134         GroupFilter();
135         // End Comments
136         virtual ~GroupFilter(){}
137         // Wang Xu Ming -- 2009-8-17
138         // DataPilot Migration - Cache&&Performance
139         virtual bool match(  const  ScDPItemData& rCellData ) const;
140         // End Comments
141         void addMatchItem(const String& rStr, double fVal, bool bHasValue);
142         size_t getMatchItemCount() const;
143 
144     private:
145 
146         ::std::vector<FilterItem> maItems;
147     };
148 
149     /** single filtering criterion. */
150     struct Criterion
151     {
152         sal_Int32 mnFieldIndex;
153         ::boost::shared_ptr<FilterBase> mpFilter;
154 
155         Criterion();
156     };
157     // Wang Xu Ming -- 2009-8-17
158     // DataPilot Migration - Cache&&Performance
159     ScDPCacheTable( ScDocument* pDoc,long nId );
160     // End Comments
161     ~ScDPCacheTable();
162 
163     sal_Int32 getRowSize() const;
164     sal_Int32 getColSize() const;
165 
166     // Wang Xu Ming -- 2009-8-17
167     // DataPilot Migration - Cache&&Performance
168     ScDPTableDataCache* GetCache() const;
169     /** Fill the internal table from the cell range provided.  This function
170     assumes that the first row is the column header. */
171     void fillTable( const ScQueryParam& rQuery, sal_Bool* pSpecial,
172         bool bIgnoreEmptyRows, bool bRepeatIfEmpty );
173     /** Fill the internal table from database connection object.  This function
174         assumes that the first row is the column header. */
175     void fillTable();
176     // End Comments
177 
178     /** Check whether a specified row is active or not.  When a row is active,
179         it is used in calculation of the results data.  A row becomes inactive
180         when it is filtered out by page field. */
181     bool isRowActive(sal_Int32 nRow) const;
182 
183     /** Set filter on/off flag to each row to control visibility.  The caller
184         must ensure that the table is filled before calling this function. */
185     void filterByPageDimension(const ::std::vector<Criterion>& rCriteria, const ::std::hash_set<sal_Int32>& rRepeatIfEmptyDims);
186 
187     /** Get the cell instance at specified location within the data grid. Note
188         that the data grid doesn't include the header row.  Don't delete the
189         returned object! */
190 	const ScDPItemData* getCell(SCCOL nCol, SCROW nRow, bool bRepeatIfEmpty) const;
191 	void  getValue( ScDPValueData& rVal, SCCOL nCol, SCROW nRow, bool bRepeatIfEmpty) const;
192     String getFieldName( SCCOL  nIndex) const;
193 	//End Comments
194 
195     /** Get the field index (i.e. column ID in the original data source) based
196         on the string value that corresponds with the column title.  It returns
197         -1 if no field matching the string value exists. */
198     sal_Int32 getFieldIndex(const String& rStr) const;
199 
200   // Wang Xu Ming -- 2009-8-17
201   // DataPilot Migration - Cache&&Performance
202    /** Get the unique entries for a field specified by index.  The caller must
203         make sure that the table is filled before calling function, or it will
204         get an empty collection. */
205     const ::std::vector<SCROW>& getFieldEntries( sal_Int32 nColumn ) const;
206     // End Comments
207     /** Filter the table based on the specified criteria, and copy the
208         result to rTabData.  This method is used, for example, to generate
209         a drill-down data table. */
210     void filterTable(const ::std::vector<Criterion>& rCriteria,
211                      ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any > >& rTabData,
212                      const ::std::hash_set<sal_Int32>& rRepeatIfEmptyDims);
213 
214     void clear();
215     void swap(ScDPCacheTable& rOther);
216     bool empty() const;
217 
218 private:
219     ScDPCacheTable();
220     ScDPCacheTable(const ScDPCacheTable&);
221 
222     /**
223      * Check if a given row meets all specified criteria.
224      *
225      * @param nRow index of row to be tested.
226      * @param rCriteria a list of criteria
227      */
228     bool isRowQualified(sal_Int32 nRow, const ::std::vector<Criterion>& rCriteria, const ::std::hash_set<sal_Int32>& rRepeatIfEmptyDims) const;
229     void getValueData(ScDocument* pDoc, const ScAddress& rPos, ScDPCacheCell& rCell);
230    // Wang Xu Ming -- 2009-8-17
231     // DataPilot Migration - Cache&&Performance
232    void InitNoneCache( ScDocument* pDoc );
233     // End Comments
234 private:
235     // Wang Xu Ming -- 2009-8-17
236     // DataPilot Migration - Cache&&Performance
237     /** unique field entires for each field (column). */
238     ::std::vector< ::std::vector<SCROW> > maFieldEntries;
239     // End Comments
240     /** used to track visibility of rows.  The first row below the header row
241         has the index of 0. */
242     ::std::vector<bool> maRowsVisible;
243     // Wang Xu Ming -- 2009-8-17
244     // DataPilot Migration - Cache&&Performance
245     ScDPTableDataCache* mpCache;
246     ScDPTableDataCache* mpNoneCache;
247     // End Comments
248 };
249 #endif
250