summaryrefslogtreecommitdiff
path: root/sc/inc/dpcachetable.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'sc/inc/dpcachetable.hxx')
-rw-r--r--sc/inc/dpcachetable.hxx249
1 files changed, 249 insertions, 0 deletions
diff --git a/sc/inc/dpcachetable.hxx b/sc/inc/dpcachetable.hxx
new file mode 100644
index 000000000000..eab01d078081
--- /dev/null
+++ b/sc/inc/dpcachetable.hxx
@@ -0,0 +1,249 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef SC_DPCACHETABLE_HXX
+#define SC_DPCACHETABLE_HXX
+
+#include "sal/types.h"
+#include "osl/mutex.hxx"
+#include "global.hxx"
+#include "collect.hxx"
+
+#include <vector>
+#include <hash_map>
+#include <hash_set>
+#include <boost/shared_ptr.hpp>
+#include <com/sun/star/uno/Reference.hxx>
+
+namespace com { namespace sun { namespace star {
+ namespace sdbc {
+ class XRowSet;
+ }
+ namespace sheet {
+ struct DataPilotFieldFilter;
+ }
+}}}
+
+class Date;
+
+class ScDocument;
+class ScRange;
+class ScDPDimension;
+class ScDPCollection;
+struct ScDPCacheCell;
+struct ScQueryParam;
+// Wang Xu Ming -- 2009-8-17
+// DataPilot Migration - Cache&&Performance
+class ScDPItemData;
+// End Comments
+class Date;
+
+// Wang Xu Ming -- 2009-8-17
+// DataPilot Migration - Cache&&Performance
+class ScDPTableDataCache;
+struct ScDPValueData;
+// End Comments
+// ----------------------------------------------------------------------------
+
+class SC_DLLPUBLIC ScDPCacheTable
+{
+public:
+ /** individual filter item used in SingleFilter and GroupFilter. */
+ struct FilterItem
+ {
+ // Wang Xu Ming -- 2009-8-17
+ // DataPilot Migration - Cache&&Performance
+ String maString;
+ // End Comments
+ double mfValue;
+ bool mbHasValue;
+
+ FilterItem();
+// Wang Xu Ming -- 2009-8-17
+// DataPilot Migration - Cache&&Performance
+ bool match( const ScDPItemData& rCellData ) const;
+// End Comments
+ };
+
+ /** interface class used for filtering of rows. */
+ class FilterBase
+ {
+ public:
+ /** returns true if the matching condition is met for a single cell
+ value, or false otherwise. */
+// Wang Xu Ming -- 2009-8-17
+// DataPilot Migration - Cache&&Performance
+ virtual bool match( const ScDPItemData& rCellData ) const = 0;
+// End Comments
+ };
+
+ /** ordinary single-item filter. */
+ class SingleFilter : public FilterBase
+ {
+ public:
+ // Wang Xu Ming -- 2009-8-17
+ // DataPilot Migration - Cache&&Performance
+ explicit SingleFilter(String aString, double fValue, bool bHasValue);
+ // End Comments
+ virtual ~SingleFilter(){}
+
+ // Wang Xu Ming -- 2009-8-17
+ // DataPilot Migration - Cache&&Performance
+ virtual bool match(const ScDPItemData& rCellData) const;
+ // End Comments
+ const String getMatchString();
+ double getMatchValue() const;
+ bool hasValue() const;
+
+ private:
+ explicit SingleFilter();
+
+ FilterItem maItem;
+ };
+
+ /** multi-item (group) filter. */
+ class GroupFilter : public FilterBase
+ {
+ public:
+ // Wang Xu Ming -- 2009-8-17
+ // DataPilot Migration - Cache&&Performance
+ GroupFilter();
+ // End Comments
+ virtual ~GroupFilter(){}
+ // Wang Xu Ming -- 2009-8-17
+ // DataPilot Migration - Cache&&Performance
+ virtual bool match( const ScDPItemData& rCellData ) const;
+ // End Comments
+ void addMatchItem(const String& rStr, double fVal, bool bHasValue);
+ size_t getMatchItemCount() const;
+
+ private:
+
+ ::std::vector<FilterItem> maItems;
+ };
+
+ /** single filtering criterion. */
+ struct Criterion
+ {
+ sal_Int32 mnFieldIndex;
+ ::boost::shared_ptr<FilterBase> mpFilter;
+
+ Criterion();
+ };
+ // Wang Xu Ming -- 2009-8-17
+ // DataPilot Migration - Cache&&Performance
+ ScDPCacheTable( ScDocument* pDoc,long nId );
+ // End Comments
+ ~ScDPCacheTable();
+
+ sal_Int32 getRowSize() const;
+ sal_Int32 getColSize() const;
+
+ // Wang Xu Ming -- 2009-8-17
+ // DataPilot Migration - Cache&&Performance
+ ScDPTableDataCache* GetCache() const;
+ /** Fill the internal table from the cell range provided. This function
+ assumes that the first row is the column header. */
+ void fillTable( const ScQueryParam& rQuery, BOOL* pSpecial,
+ bool bIgnoreEmptyRows, bool bRepeatIfEmpty );
+ /** Fill the internal table from database connection object. This function
+ assumes that the first row is the column header. */
+ void fillTable();
+ // End Comments
+
+ /** Check whether a specified row is active or not. When a row is active,
+ it is used in calculation of the results data. A row becomes inactive
+ when it is filtered out by page field. */
+ bool isRowActive(sal_Int32 nRow) const;
+
+ /** Set filter on/off flag to each row to control visibility. The caller
+ must ensure that the table is filled before calling this function. */
+ void filterByPageDimension(const ::std::vector<Criterion>& rCriteria, const ::std::hash_set<sal_Int32>& rRepeatIfEmptyDims);
+
+ /** Get the cell instance at specified location within the data grid. Note
+ that the data grid doesn't include the header row. Don't delete the
+ returned object! */
+ const ScDPItemData* getCell(SCCOL nCol, SCROW nRow, bool bRepeatIfEmpty) const;
+ void getValue( ScDPValueData& rVal, SCCOL nCol, SCROW nRow, bool bRepeatIfEmpty) const;
+ String getFieldName( SCCOL nIndex) const;
+ //End Comments
+
+ /** Get the field index (i.e. column ID in the original data source) based
+ on the string value that corresponds with the column title. It returns
+ -1 if no field matching the string value exists. */
+ sal_Int32 getFieldIndex(const String& rStr) const;
+
+ // Wang Xu Ming -- 2009-8-17
+ // DataPilot Migration - Cache&&Performance
+ /** Get the unique entries for a field specified by index. The caller must
+ make sure that the table is filled before calling function, or it will
+ get an empty collection. */
+ const ::std::vector<SCROW>& getFieldEntries( sal_Int32 nColumn ) const;
+ // End Comments
+ /** Filter the table based on the specified criteria, and copy the
+ result to rTabData. This method is used, for example, to generate
+ a drill-down data table. */
+ void filterTable(const ::std::vector<Criterion>& rCriteria,
+ ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any > >& rTabData,
+ const ::std::hash_set<sal_Int32>& rRepeatIfEmptyDims);
+
+ void clear();
+ void swap(ScDPCacheTable& rOther);
+ bool empty() const;
+
+private:
+ ScDPCacheTable();
+ ScDPCacheTable(const ScDPCacheTable&);
+
+ /**
+ * Check if a given row meets all specified criteria.
+ *
+ * @param nRow index of row to be tested.
+ * @param rCriteria a list of criteria
+ */
+ bool isRowQualified(sal_Int32 nRow, const ::std::vector<Criterion>& rCriteria, const ::std::hash_set<sal_Int32>& rRepeatIfEmptyDims) const;
+ void getValueData(ScDocument* pDoc, const ScAddress& rPos, ScDPCacheCell& rCell);
+ // Wang Xu Ming -- 2009-8-17
+ // DataPilot Migration - Cache&&Performance
+ void InitNoneCache( ScDocument* pDoc );
+ // End Comments
+private:
+ // Wang Xu Ming -- 2009-8-17
+ // DataPilot Migration - Cache&&Performance
+ /** unique field entires for each field (column). */
+ ::std::vector< ::std::vector<SCROW> > maFieldEntries;
+ // End Comments
+ /** used to track visibility of rows. The first row below the header row
+ has the index of 0. */
+ ::std::vector<bool> maRowsVisible;
+ // Wang Xu Ming -- 2009-8-17
+ // DataPilot Migration - Cache&&Performance
+ ScDPTableDataCache* mpCache;
+ ScDPTableDataCache* mpNoneCache;
+ // End Comments
+};
+#endif