1 /* brass_alltermslist.h: A termlist containing all terms in a brass database.
2  *
3  * Copyright (C) 2005,2007,2008,2009,2010 Olly Betts
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License as
7  * published by the Free Software Foundation; either version 2 of the
8  * License, or (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301
18  * USA
19  */
20 
21 #ifndef XAPIAN_INCLUDED_BRASS_ALLTERMSLIST_H
22 #define XAPIAN_INCLUDED_BRASS_ALLTERMSLIST_H
23 
24 #include "alltermslist.h"
25 #include "brass_database.h"
26 #include "brass_postlist.h"
27 
28 class BrassCursor;
29 
30 class BrassAllTermsList : public AllTermsList {
31     /// Copying is not allowed.
32     BrassAllTermsList(const BrassAllTermsList &);
33 
34     /// Assignment is not allowed.
35     void operator=(const BrassAllTermsList &);
36 
37     /// Keep a reference to our database to stop it being deleted.
38     Xapian::Internal::RefCntPtr<const BrassDatabase> database;
39 
40     /** A cursor which runs through the postlist table reading termnames from
41      *  the keys.
42      */
43     BrassCursor * cursor;
44 
45     /// The termname at the current position.
46     std::string current_term;
47 
48     /// The prefix to restrict the terms to.
49     std::string prefix;
50 
51     /** The term frequency of the term at the current position.
52      *
53      *  If this value is zero, then we haven't read the term frequency or
54      *  collection frequency for the current term yet.  We need to call
55      *  read_termfreq_and_collfreq() to read these.
56      */
57     mutable Xapian::doccount termfreq;
58 
59     /// The collection frequency of the term at the current position.
60     mutable Xapian::termcount collfreq;
61 
62     /// Read and cache the term frequency and collection frequency.
63     void read_termfreq_and_collfreq() const;
64 
65   public:
BrassAllTermsList(Xapian::Internal::RefCntPtr<const BrassDatabase> database_,const std::string & prefix_)66     BrassAllTermsList(Xapian::Internal::RefCntPtr<const BrassDatabase> database_,
67 		      const std::string & prefix_)
68 	: database(database_), cursor(NULL), prefix(prefix_), termfreq(0) { }
69 
70     /// Destructor.
71     ~BrassAllTermsList();
72 
73     /** Returns the current termname.
74      *
75      *  Either next() or skip_to() must have been called before this
76      *  method can be called.
77      */
78     std::string get_termname() const;
79 
80     /** Returns the term frequency of the current term.
81      *
82      *  Either next() or skip_to() must have been called before this
83      *  method can be called.
84      */
85     Xapian::doccount get_termfreq() const;
86 
87     /** Returns the collection frequency of the current term.
88      *
89      *  Either next() or skip_to() must have been called before this
90      *  method can be called.
91      */
92     Xapian::termcount get_collection_freq() const;
93 
94     /// Advance to the next term in the list.
95     TermList * next();
96 
97     /// Advance to the first term which is >= tname.
98     TermList * skip_to(const std::string &tname);
99 
100     /// True if we're off the end of the list
101     bool at_end() const;
102 };
103 
104 #endif /* XAPIAN_INCLUDED_BRASS_ALLTERMSLIST_H */
105