Branch data Line data Source code
1 : : /** @file brass_spelling.h
2 : : * @brief Spelling correction data for a brass database.
3 : : */
4 : : /* Copyright (C) 2007,2008,2009,2010 Olly Betts
5 : : *
6 : : * This program is free software; you can redistribute it and/or modify
7 : : * it under the terms of the GNU General Public License as published by
8 : : * the Free Software Foundation; either version 2 of the License, or
9 : : * (at your option) any later version.
10 : : *
11 : : * This program is distributed in the hope that it will be useful,
12 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 : : * GNU General Public License for more details.
15 : : *
16 : : * You should have received a copy of the GNU General Public License
17 : : * along with this program; if not, write to the Free Software
18 : : * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19 : : */
20 : :
21 : : #ifndef XAPIAN_INCLUDED_BRASS_SPELLING_H
22 : : #define XAPIAN_INCLUDED_BRASS_SPELLING_H
23 : :
24 : : #include <xapian/types.h>
25 : :
26 : : #include "brass_lazytable.h"
27 : : #include "termlist.h"
28 : :
29 : : #include <map>
30 : : #include <set>
31 : : #include <string>
32 : : #include <cstring> // For memcpy() and memcmp().
33 : :
34 : : namespace Brass {
35 : :
36 : : struct fragment {
37 : : char data[4];
38 : :
39 : : // Default constructor.
40 : 114 : fragment() { }
41 : :
42 : : // Allow implicit conversion.
43 : : fragment(char data_[4]) { std::memcpy(data, data_, 4); }
44 : :
45 : 1155 : char & operator[] (unsigned i) { return data[i]; }
46 : : const char & operator[] (unsigned i) const { return data[i]; }
47 : :
48 : 583 : operator std::string () const {
49 [ + + ]: 583 : return std::string(data, data[0] == 'M' ? 4 : 3);
50 : : }
51 : :
52 : 1198 : bool operator<(const fragment &b) const {
53 : 1198 : return std::memcmp(data, b.data, 4) < 0;
54 : : }
55 : : };
56 : :
57 : : }
58 : :
59 : 2208 : class BrassSpellingTable : public BrassLazyTable {
60 : : void toggle_fragment(Brass::fragment frag, const std::string & word);
61 : :
62 : : std::map<std::string, Xapian::termcount> wordfreq_changes;
63 : : std::map<Brass::fragment, std::set<std::string> > termlist_deltas;
64 : :
65 : : public:
66 : : /** Create a new BrassSpellingTable object.
67 : : *
68 : : * This method does not create or open the table on disk - you
69 : : * must call the create() or open() methods respectively!
70 : : *
71 : : * @param dbdir The directory the brass database is stored in.
72 : : * @param readonly true if we're opening read-only, else false.
73 : : */
74 : 2208 : BrassSpellingTable(const std::string & dbdir, bool readonly)
75 : : : BrassLazyTable("spelling", dbdir + "/spelling.", readonly,
76 : 2208 : Z_DEFAULT_STRATEGY) { }
77 : :
78 : : // Merge in batched-up changes.
79 : : void merge_changes();
80 : :
81 : : void add_word(const std::string & word, Xapian::termcount freqinc);
82 : : void remove_word(const std::string & word, Xapian::termcount freqdec);
83 : :
84 : : TermList * open_termlist(const std::string & word);
85 : :
86 : : Xapian::doccount get_word_frequency(const std::string & word) const;
87 : :
88 : : /** Override methods of BrassTable.
89 : : *
90 : : * NB: these aren't virtual, but we always call them on the subclass in
91 : : * cases where it matters.
92 : : * @{
93 : : */
94 : :
95 : 686 : bool is_modified() const {
96 [ + + ][ + + ]: 686 : return !wordfreq_changes.empty() || BrassTable::is_modified();
97 : : }
98 : :
99 : 473 : void flush_db() {
100 : 473 : merge_changes();
101 : 473 : BrassTable::flush_db();
102 : 473 : }
103 : :
104 : 152 : void cancel() {
105 : : // Discard batched-up changes.
106 : 152 : wordfreq_changes.clear();
107 : 152 : termlist_deltas.clear();
108 : :
109 : 152 : BrassTable::cancel();
110 : 152 : }
111 : :
112 : : // @}
113 : : };
114 : :
115 : : /** The list of words containing a particular trigram. */
116 [ + - ][ # # ]: 163 : class BrassSpellingTermList : public TermList {
117 : : /// The encoded data.
118 : : std::string data;
119 : :
120 : : /// Position in the data.
121 : : unsigned p;
122 : :
123 : : /// The current term.
124 : : std::string current_term;
125 : :
126 : : /// Copying is not allowed.
127 : : BrassSpellingTermList(const BrassSpellingTermList &);
128 : :
129 : : /// Assignment is not allowed.
130 : : void operator=(const BrassSpellingTermList &);
131 : :
132 : : public:
133 : : /// Constructor.
134 : 163 : BrassSpellingTermList(const std::string & data_)
135 : 163 : : data(data_), p(0) { }
136 : :
137 : : Xapian::termcount get_approx_size() const;
138 : :
139 : : std::string get_termname() const;
140 : :
141 : : Xapian::termcount get_wdf() const;
142 : :
143 : : Xapian::doccount get_termfreq() const;
144 : :
145 : : Xapian::termcount get_collection_freq() const;
146 : :
147 : : TermList * next();
148 : :
149 : : TermList * skip_to(const std::string & term);
150 : :
151 : : bool at_end() const;
152 : :
153 : : Xapian::termcount positionlist_count() const;
154 : :
155 : : Xapian::PositionIterator positionlist_begin() const;
156 : : };
157 : :
158 : : #endif // XAPIAN_INCLUDED_BRASS_SPELLING_H
|