Branch data Line data Source code
1 : : /** @file chert_spelling.h
2 : : * @brief Spelling correction data for a chert 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_CHERT_SPELLING_H
22 : : #define XAPIAN_INCLUDED_CHERT_SPELLING_H
23 : :
24 : : #include <xapian/types.h>
25 : :
26 : : #include "chert_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 : : struct fragment {
35 : : char data[4];
36 : :
37 : : // Default constructor.
38 : 277 : fragment() { }
39 : :
40 : : // Allow implicit conversion.
41 : : fragment(char data_[4]) { std::memcpy(data, data_, 4); }
42 : :
43 : 2466 : char & operator[] (unsigned i) { return data[i]; }
44 : : const char & operator[] (unsigned i) const { return data[i]; }
45 : :
46 : 1697 : operator std::string () const {
47 [ + + ]: 1697 : return std::string(data, data[0] == 'M' ? 4 : 3);
48 : : }
49 : : };
50 : :
51 : 3039 : inline bool operator<(const fragment &a, const fragment &b) {
52 : 3039 : return std::memcmp(a.data, b.data, 4) < 0;
53 : : }
54 : :
55 : 2289 : class ChertSpellingTable : public ChertLazyTable {
56 : : void toggle_fragment(fragment frag, const std::string & word);
57 : :
58 : : std::map<std::string, Xapian::termcount> wordfreq_changes;
59 : : std::map<fragment, std::set<std::string> > termlist_deltas;
60 : :
61 : : public:
62 : : /** Create a new ChertSpellingTable object.
63 : : *
64 : : * This method does not create or open the table on disk - you
65 : : * must call the create() or open() methods respectively!
66 : : *
67 : : * @param dbdir The directory the chert database is stored in.
68 : : * @param readonly true if we're opening read-only, else false.
69 : : */
70 : 2289 : ChertSpellingTable(const std::string & dbdir, bool readonly)
71 : : : ChertLazyTable("spelling", dbdir + "/spelling.", readonly,
72 : 2289 : Z_DEFAULT_STRATEGY) { }
73 : :
74 : : // Merge in batched-up changes.
75 : : void merge_changes();
76 : :
77 : : void add_word(const std::string & word, Xapian::termcount freqinc);
78 : : void remove_word(const std::string & word, Xapian::termcount freqdec);
79 : :
80 : : TermList * open_termlist(const std::string & word);
81 : :
82 : : Xapian::doccount get_word_frequency(const std::string & word) const;
83 : :
84 : : /** Override methods of ChertTable.
85 : : *
86 : : * NB: these aren't virtual, but we always call them on the subclass in
87 : : * cases where it matters.
88 : : * @{
89 : : */
90 : :
91 : 719 : bool is_modified() const {
92 [ + + ][ + + ]: 719 : return !wordfreq_changes.empty() || ChertTable::is_modified();
93 : : }
94 : :
95 : 486 : void flush_db() {
96 : 486 : merge_changes();
97 : 486 : ChertTable::flush_db();
98 : 486 : }
99 : :
100 : 152 : void cancel() {
101 : : // Discard batched-up changes.
102 : 152 : wordfreq_changes.clear();
103 : 152 : termlist_deltas.clear();
104 : :
105 : 152 : ChertTable::cancel();
106 : 152 : }
107 : :
108 : : // @}
109 : : };
110 : :
111 : : /** The list of words containing a particular trigram. */
112 [ + - ][ # # ]: 560 : class ChertSpellingTermList : public TermList {
113 : : /// The encoded data.
114 : : std::string data;
115 : :
116 : : /// Position in the data.
117 : : unsigned p;
118 : :
119 : : /// The current term.
120 : : std::string current_term;
121 : :
122 : : /// Copying is not allowed.
123 : : ChertSpellingTermList(const ChertSpellingTermList &);
124 : :
125 : : /// Assignment is not allowed.
126 : : void operator=(const ChertSpellingTermList &);
127 : :
128 : : public:
129 : : /// Constructor.
130 : 560 : ChertSpellingTermList(const std::string & data_)
131 : 560 : : data(data_), p(0) { }
132 : :
133 : : Xapian::termcount get_approx_size() const;
134 : :
135 : : std::string get_termname() const;
136 : :
137 : : Xapian::termcount get_wdf() const;
138 : :
139 : : Xapian::doccount get_termfreq() const;
140 : :
141 : : Xapian::termcount get_collection_freq() const;
142 : :
143 : : TermList * next();
144 : :
145 : : TermList * skip_to(const std::string & term);
146 : :
147 : : bool at_end() const;
148 : :
149 : : Xapian::termcount positionlist_count() const;
150 : :
151 : : Xapian::PositionIterator positionlist_begin() const;
152 : : };
153 : :
154 : : #endif // XAPIAN_INCLUDED_CHERT_SPELLING_H
|