coherence/util/filter/LimitFilter.hpp

00001 /*
00002 * LimitFilter.hpp
00003 *
00004 * Copyright (c) 2000, 2009, Oracle and/or its affiliates. All rights reserved.
00005 *
00006 * Oracle is a registered trademarks of Oracle Corporation and/or its
00007 * affiliates.
00008 *
00009 * This software is the confidential and proprietary information of Oracle
00010 * Corporation. You shall not disclose such confidential and proprietary
00011 * information and shall use it only in accordance with the terms of the
00012 * license agreement you entered into with Oracle.
00013 *
00014 * This notice may not be removed or altered.
00015 */
00016 #ifndef COH_LIMIT_FILTER_HPP
00017 #define COH_LIMIT_FILTER_HPP
00018 
00019 #include "coherence/lang.ns"
00020 
00021 #include "coherence/io/pof/PortableObject.hpp"
00022 #include "coherence/io/pof/PofReader.hpp"
00023 #include "coherence/io/pof/PofWriter.hpp"
00024 #include "coherence/util/Comparator.hpp"
00025 #include "coherence/util/Filter.hpp"
00026 #include "coherence/util/Map.hpp"
00027 #include "coherence/util/Set.hpp"
00028 #include "coherence/util/filter/EntryFilter.hpp"
00029 #include "coherence/util/filter/IndexAwareFilter.hpp"
00030 
00031 COH_OPEN_NAMESPACE3(coherence,util,filter)
00032 
00033 using coherence::io::pof::PortableObject;
00034 using coherence::io::pof::PofReader;
00035 using coherence::io::pof::PofWriter;
00036 
00037 /**
00038 * Filter which truncates the results of another filter. This filter is a
00039 * mutable object that is modified by the query processor. Clients are
00040 * supposed to hold a reference to this filter and repetitively pass it to
00041 * query methods after setting a desired page context calling
00042 * #setPage, #nextPage(), or #previousPage.
00043 *
00044 * @author djl  2008.04.14
00045 */
00046 class COH_EXPORT LimitFilter
00047     : public cloneable_spec<LimitFilter,
00048         extends<Object>,
00049         implements<IndexAwareFilter, PortableObject> >
00050     {
00051     friend class factory<LimitFilter>;
00052 
00053     // ----- constructors ---------------------------------------------------
00054 
00055     protected:
00056         /**
00057         * Default constructor (necessary for the PortableObject interface).
00058         */
00059         LimitFilter();
00060 
00061         /**
00062         * Construct a LimitFilter filter.
00063         *
00064         * @param vFilter    the filter whose results this Filter truncates
00065         * @param cPageSize  the sie of the page
00066         */
00067         LimitFilter(Filter::View vFilter, int32_t cPageSize);
00068 
00069         /**
00070         * Copy constructor.
00071         */
00072         LimitFilter(const LimitFilter& that);
00073 
00074 
00075     // ----- Entry Filter interface -----------------------------------------
00076 
00077     public:
00078         /**
00079         * {@inheritDoc}
00080         */
00081         virtual bool evaluateEntry(Map::Entry::View vEntry) const;
00082 
00083 
00084     // ----- Filter interface -----------------------------------------------
00085 
00086     public:
00087         /**
00088         * {@inheritDoc}
00089         */
00090         virtual bool evaluate(Object::View v) const;
00091 
00092 
00093     // ----- IndexAwareFilter interface -------------------------------------
00094 
00095     public:
00096         /**
00097         * {@inheritDoc}
00098         */
00099         virtual size32_t calculateEffectiveness(Map::View vMapIndexes,
00100                 Set::View vSetKeys) const;
00101 
00102         /**
00103         * {@inheritDoc}
00104         */
00105         virtual Filter::View applyIndex(Map::View vMapIndexes,
00106                 Set::Handle hSetKeys) const;
00107 
00108 
00109     // ----- PortableObject interface ---------------------------------------
00110 
00111     public:
00112         /**
00113         * {@inheritDoc}
00114         */
00115         virtual void readExternal(PofReader::Handle hIn);
00116 
00117         /**
00118         * {@inheritDoc}
00119         */
00120         virtual void writeExternal(PofWriter::Handle hOut) const;
00121 
00122 
00123     // ----- Object interface -----------------------------------------------
00124 
00125     public:
00126         /**
00127         * Output a human-readable description of this Object to the given
00128         * stream.
00129         *
00130         * @param out  the stream used to output the description
00131         */
00132         virtual void toStream(std::ostream& out) const;
00133 
00134 
00135     // ----- data member accessors ------------------------------------------
00136 
00137     public:
00138         /**
00139         * Obtain the Filter whose results are truncated by this filter.
00140         *
00141         * @return the filter whose results are truncated by this filter
00142         */
00143         virtual Filter::View getFilter() const;
00144 
00145         /**
00146         * Obtain the page size (expressed as a number of entries per page).
00147         *
00148         * @return the page size
00149         */
00150         virtual int32_t getPageSize() const;
00151 
00152         /**
00153         * Set the page size (expressed as a number of entries per page).
00154         *
00155         * @param cPageSize  the page size
00156         */
00157         virtual void setPageSize(int32_t cPageSize);
00158 
00159         /**
00160         * Obtain a current page number (zero-based).
00161         *
00162         * @return the page number
00163         */
00164         virtual int32_t getPage() const;
00165 
00166         /**
00167         * Set the page number (zero-based). Setting the page number to zero
00168         * will reset the filter's state.
00169         *
00170         * @param nPage  the page number
00171         */
00172         virtual void setPage(int32_t nPage);
00173 
00174         /**
00175         * Obtain the Comparator used to partition the entry values into
00176         * pages.
00177         * <p>
00178         * This method is intended to be used only by query processors.
00179         * Clients should not modify the content of this property.
00180         *
00181         * @return the Comparator object
00182         */
00183         virtual Comparator::View getComparator() const;
00184 
00185         /**
00186         * Set the Comparator used to partition the values into pages.
00187         * <p>
00188         * This method is intended to be used only by query processors.
00189         * Clients should not modify the content of this property.
00190         *
00191         * @param vComparator  Comparator object
00192         */
00193         virtual void setComparator(Comparator::View vComparator);
00194 
00195         /**
00196         * Obtain the top anchor object, which is the last value object
00197         * on a previous page.
00198         * <p>
00199         * This method is intended to be used only by query processors.
00200         * Clients
00201         * should not modify the content of this property.
00202         *
00203         * @return top anchor object
00204         */
00205         virtual Object::View getTopAnchor() const;
00206 
00207         /**
00208         * Set the top anchor object.
00209         * <p>
00210         * This method is intended to be used only by query processors.
00211         * Clients should not modify the content of this property.
00212         *
00213         * @param vAnchor the top anchor object
00214         */
00215         virtual void setTopAnchor(Object::View vAnchor);
00216 
00217         /**
00218         * Obtain the bottom anchor object, which is the last value object
00219         * on the current page.
00220         * <p>
00221         * This method is intended to be used only by query processors.
00222         * Clients should not modify the content of this property.
00223         *
00224         * @return bottom anchor object
00225         */
00226         virtual Object::View getBottomAnchor() const;
00227 
00228         /**
00229         * Set the bottom anchor object.
00230         * <p>
00231         * This method is intended to be used only by query processors.
00232         * Clients
00233         * should not modify the content of this property.
00234         *
00235         * @param vAnchor  the bottom anchor object
00236         */
00237         virtual void setBottomAnchor(Object::View vAnchor);
00238 
00239         /**
00240         * Obtain the cookie object.
00241         * <p>
00242         * This method is intended to be used only by query processors.
00243         * Clients should not modify the content of this property.
00244         *
00245         * @return cookie object
00246         */
00247         virtual Object::View getCookie() const;
00248 
00249         /**
00250         * Set the cookie object.
00251         *
00252         * This method is intended to be used only by query processors.
00253         * Clients should not modify the content of this property.
00254         *
00255         * @param vCookie  the cookie object
00256         */
00257         virtual void setCookie(Object::View vCookie);
00258 
00259 
00260     // ----- helpers --------------------------------------------------------
00261 
00262     public:
00263         /**
00264         * Switch to the next page.
00265         */
00266         virtual void nextPage();
00267 
00268         /**
00269         * Switch to the previous page.
00270         */
00271         virtual void previousPage();
00272 
00273 
00274     // ----- data members ---------------------------------------------------
00275 
00276     private:
00277         /**
00278         * The Filter whose results are truncated by this filter.
00279         */
00280         MemberView<Filter> m_vFilter;
00281 
00282         /**
00283         * The number of entries per page.
00284         */
00285         int32_t m_cPageSize;
00286 
00287         /**
00288         * The page number.
00289         */
00290         int32_t m_nPage;
00291 
00292         /**
00293         * The comparator used to partition the entry values into pages.
00294         */
00295         MemberView<Comparator> m_vComparator;
00296 
00297         /**
00298         * The top anchor object (the last object on a previous page).
00299         */
00300         MemberView<Object> m_vAnchorTop;
00301 
00302         /**
00303         * The bottom anchor object (the last object on the current page).
00304         */
00305         MemberView<Object> m_vAnchorBottom;
00306 
00307         /**
00308         * The cookie object used by the query processors to store a transient
00309         * state of the request (on a client side).
00310         */
00311         MemberView<Object> m_vCookie;
00312     };
00313 
00314 COH_CLOSE_NAMESPACE3
00315 
00316 #endif // COH_LIMIT_FILTER_HPP
00317 
Copyright (c) 2000, 2009, Oracle and/or its affiliates. All rights reserved.