include/xapian/query.h

Go to the documentation of this file.
00001 
00004 /* ----START-LICENCE----
00005  * Copyright 1999,2000,2001 BrightStation PLC
00006  * Copyright 2002 Ananova Ltd
00007  * Copyright 2003,2004,2005 Olly Betts
00008  *
00009  * This program is free software; you can redistribute it and/or
00010  * modify it under the terms of the GNU General Public License as
00011  * published by the Free Software Foundation; either version 2 of the
00012  * License, or (at your option) any later version.
00013  *
00014  * This program is distributed in the hope that it will be useful,
00015  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00016  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00017  * GNU General Public License for more details.
00018  *
00019  * You should have received a copy of the GNU General Public License
00020  * along with this program; if not, write to the Free Software
00021  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
00022  * USA
00023  * -----END-LICENCE-----
00024  */
00025 
00026 #ifndef XAPIAN_INCLUDED_QUERY_H
00027 #define XAPIAN_INCLUDED_QUERY_H
00028 
00029 #include <string>
00030 #include <vector>
00031 
00032 #include <xapian/base.h>
00033 #include <xapian/types.h>
00034 #include <xapian/termiterator.h>
00035 
00036 // FIXME: sort this out so we avoid exposing Xapian::Query::Internal
00037 // - we need to at present so that the Xapian::Query's template ctors
00038 // compile.
00039 class MultiMatch;
00040 class LocalSubMatch;
00041 class SortPosName;
00042 
00043 namespace Xapian {
00044 
00049 class Query {
00050     public:
00052         class Internal;
00054         Xapian::Internal::RefCntPtr<Internal> internal;
00055 
00057         typedef enum {
00059             OP_AND,
00060 
00062             OP_OR,
00063 
00065             OP_AND_NOT,
00066 
00068             OP_XOR,
00069 
00071             OP_AND_MAYBE,
00072 
00074             OP_FILTER,
00075 
00084             OP_NEAR,
00085 
00094             OP_PHRASE,
00095 
00099             OP_ELITE_SET = 10
00100         } op;
00101 
00103         Query(const Query & copyme);
00104 
00106         Query & operator=(const Query & copyme);
00107 
00116         Query();
00117 
00119         ~Query();
00120 
00122         Query(const std::string & tname_, Xapian::termcount wqf_ = 1,
00123               Xapian::termpos pos_ = 0);
00124 
00126         Query(Query::op op_, const Query & left, const Query & right);
00127 
00129         Query(Query::op op_,
00130               const std::string & left, const std::string & right);
00131 
00147         template <class Iterator>
00148         Query(Query::op op_, Iterator qbegin, Iterator qend,
00149               Xapian::termcount parameter = 0);
00150 
00152         Query(Query::op op_, Xapian::Query q);
00153 
00158         Xapian::termcount get_length() const;
00159 
00165         TermIterator get_terms_begin() const;
00166 
00170         TermIterator get_terms_end() const {
00171             return TermIterator(NULL);
00172         }
00173 
00177         bool empty() const;
00178 
00180         bool is_empty() const { return empty(); }
00181 
00185         std::string get_description() const;
00186 
00187     private:
00188         void add_subquery(const Query & subq);
00189         void add_subquery(const Query * subq);
00190         void add_subquery(const std::string & tname);
00191         void start_construction(Query::op op_, Xapian::termcount parameter);
00192         void end_construction();
00193         void abort_construction();
00194 };
00195 
00196 template <class Iterator>
00197 Query::Query(Query::op op_, Iterator qbegin, Iterator qend, termcount parameter)
00198     : internal(0)
00199 {
00200     try {
00201         start_construction(op_, parameter);
00202 
00203         /* Add all the elements */
00204         while (qbegin != qend) {
00205             add_subquery(*qbegin);
00206             ++qbegin;
00207         }
00208 
00209         end_construction();
00210     } catch (...) {
00211         abort_construction();
00212         throw;
00213     }
00214 }
00215 
00217 class Query::Internal : public Xapian::Internal::RefCntBase {
00218     friend class ::MultiMatch;
00219     friend class ::LocalSubMatch;
00220     friend class ::SortPosName;
00221     public:
00222         static const int OP_LEAF = -1;
00223 
00225         typedef std::vector<Internal *> subquery_list;
00226 
00228         typedef int op_t;
00229 
00230     private:
00232         op_t op;
00233 
00235         subquery_list subqs;
00236         
00242         Xapian::termcount parameter;
00243 
00245         std::string tname;
00246 
00248         Xapian::termpos term_pos;
00249 
00251         Xapian::termcount wqf;
00252 
00260         void swap(Query::Internal &other);
00261 
00263         void initialise_from_copy(const Query::Internal & copyme);
00264 
00265         void accumulate_terms(
00266             std::vector<std::pair<std::string, Xapian::termpos> > &terms) const;
00267 
00272         Internal * simplify_query();
00273 
00278         void prevalidate_query() const;
00279 
00287         void validate_query() const;
00288 
00291         static std::string get_op_name(Xapian::Query::Internal::op_t op);
00292 
00295         void collapse_subqs();
00296 
00300         void flatten_subqs();
00301 
00302     public:
00304         Internal(const Query::Internal & copyme);
00305 
00307         void operator=(const Query::Internal & copyme);
00308 
00310         Internal(const std::string & tname_, Xapian::termcount wqf_ = 1,
00311                  Xapian::termpos term_pos_ = 0);
00312 
00314         Internal(op_t op_, Xapian::termcount parameter);
00315 
00317         ~Internal();
00318 
00319         static Xapian::Query::Internal * unserialise(const std::string &s);
00320 
00323         void add_subquery(const Query::Internal & subq);
00324 
00327         Query::Internal * end_construction();
00328 
00332         std::string serialise() const;
00333 
00337         std::string get_description() const;
00338 
00343         Xapian::termcount get_length() const;
00344 
00350         TermIterator get_terms() const;
00351 };
00352 
00353 }
00354 
00355 #endif /* XAPIAN_INCLUDED_QUERY_H */

Documentation for Xapian (version 0.9.3).
Generated on 16 Feb 2006 by Doxygen 1.4.6.