summaryrefslogtreecommitdiffstats
path: root/sc/inc/dpfilteredcache.hxx
diff options
context:
space:
mode:
authorKohei Yoshida <kohei.yoshida@gmail.com>2012-10-31 22:12:07 -0400
committerKohei Yoshida <kohei.yoshida@gmail.com>2012-10-31 22:12:46 -0400
commit507cf0c4ddfac44a43caf4405e220bdd00dca438 (patch)
tree59dc5f0fa8468b605086d2824a9e3f302ba1a04c /sc/inc/dpfilteredcache.hxx
parentRename ScDPCacheTable to ScDPFilteredCache. (diff)
downloadcore-507cf0c4ddfac44a43caf4405e220bdd00dca438.tar.gz
core-507cf0c4ddfac44a43caf4405e220bdd00dca438.zip
Rename the files to reflect the class name change.
Change-Id: I6223cd12ab539cd19555c0b23f2bce73f519a31f
Diffstat (limited to 'sc/inc/dpfilteredcache.hxx')
-rw-r--r--sc/inc/dpfilteredcache.hxx185
1 files changed, 185 insertions, 0 deletions
diff --git a/sc/inc/dpfilteredcache.hxx b/sc/inc/dpfilteredcache.hxx
new file mode 100644
index 000000000000..f72bbdfe7065
--- /dev/null
+++ b/sc/inc/dpfilteredcache.hxx
@@ -0,0 +1,185 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * 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 "dpitemdata.hxx"
+#include "dpmacros.hxx"
+
+#include <vector>
+#include <boost/unordered_set.hpp>
+#include <boost/shared_ptr.hpp>
+
+#include <mdds/flat_segment_tree.hpp>
+
+class ScDPItemData;
+class ScDPCache;
+class ScDocument;
+class ScRange;
+struct ScDPValueData;
+struct ScQueryParam;
+
+/**
+ * This class is only a wrapper to the actual cache, to provide filtering on
+ * the raw data based on the query filter and/or page field filters.
+ */
+class SC_DLLPUBLIC ScDPFilteredCache
+{
+ typedef mdds::flat_segment_tree<SCROW, bool> RowFlagType;
+
+public:
+ /** interface class used for filtering of rows. */
+ class FilterBase
+ {
+ public:
+ virtual ~FilterBase() {}
+ /** returns true if the matching condition is met for a single cell
+ value, or false otherwise. */
+ virtual bool match( const ScDPItemData& rCellData ) const = 0;
+ };
+
+ /** ordinary single-item filter. */
+ class SingleFilter : public FilterBase
+ {
+ public:
+ explicit SingleFilter(const ScDPItemData &rItem);
+ virtual ~SingleFilter() {}
+
+ virtual bool match(const ScDPItemData& rCellData) const;
+
+ const ScDPItemData& getMatchValue() const;
+
+ private:
+ explicit SingleFilter();
+
+ ScDPItemData maItem;
+ };
+
+ /** multi-item (group) filter. */
+ class GroupFilter : public FilterBase
+ {
+ public:
+ GroupFilter();
+ virtual ~GroupFilter() {}
+ virtual bool match(const ScDPItemData& rCellData) const;
+ void addMatchItem(const ScDPItemData& rItem);
+ size_t getMatchItemCount() const;
+
+ private:
+ ::std::vector<ScDPItemData> maItems;
+ };
+
+ /** single filtering criterion. */
+ struct Criterion
+ {
+ sal_Int32 mnFieldIndex;
+ ::boost::shared_ptr<FilterBase> mpFilter;
+
+ Criterion();
+ };
+
+ ScDPFilteredCache(const ScDPCache& rCache);
+ ~ScDPFilteredCache();
+
+ sal_Int32 getRowSize() const;
+ sal_Int32 getColSize() const;
+
+ const ScDPCache* getCache() const;
+
+ void fillTable(const ScQueryParam& rQuery, bool bIgnoreEmptyRows, bool bRepeatIfEmpty);
+
+ void fillTable();
+
+ /** 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, sal_Int32* pLastRow = NULL) 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 ::boost::unordered_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;
+ rtl::OUString getFieldName(SCCOL nIndex) const;
+
+ /** 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;
+
+ /** 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 ::boost::unordered_set<sal_Int32>& rRepeatIfEmptyDims);
+
+ SCROW getOrder(long nDim, SCROW nIndex) const;
+ void clear();
+ bool empty() const;
+
+#if DEBUG_PIVOT_TABLE
+ void dumpRowFlag(const RowFlagType& rFlag) const;
+ void dump() const;
+#endif
+
+private:
+ ScDPFilteredCache();
+ ScDPFilteredCache(const ScDPFilteredCache&);
+
+ /**
+ * 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 ::boost::unordered_set<sal_Int32>& rRepeatIfEmptyDims) const;
+
+private:
+
+ /** unique field entires for each field (column). */
+ ::std::vector< ::std::vector<SCROW> > maFieldEntries;
+
+ /** Rows visible by standard filter query. */
+ RowFlagType maShowByFilter;
+ /** Rows visible by page dimension filtering. */
+ RowFlagType maShowByPage;
+
+ const ScDPCache& mrCache;
+};
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */