/usr/include/xapian-1.3/xapian/matchspy.h is in libxapian-1.3-dev 1.3.4-0ubuntu6.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 | /** @file matchspy.h
* @brief MatchSpy implementation.
*/
/* Copyright (C) 2007,2008,2009,2010,2011,2012,2013,2014,2015 Olly Betts
* Copyright (C) 2007,2009 Lemur Consulting Ltd
* Copyright (C) 2010 Richard Boulton
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef XAPIAN_INCLUDED_MATCHSPY_H
#define XAPIAN_INCLUDED_MATCHSPY_H
#if !defined XAPIAN_IN_XAPIAN_H && !defined XAPIAN_LIB_BUILD
# error "Never use <xapian/matchspy.h> directly; include <xapian.h> instead."
#endif
#include <xapian/attributes.h>
#include <xapian/intrusive_ptr.h>
#include <xapian/termiterator.h>
#include <xapian/visibility.h>
#include <string>
#include <map>
namespace Xapian {
class Document;
class Registry;
/** Abstract base class for match spies.
*
* The subclasses will generally accumulate information seen during the match,
* to calculate aggregate functions, or other profiles of the matching
* documents.
*/
class XAPIAN_VISIBILITY_DEFAULT MatchSpy
: public Xapian::Internal::opt_intrusive_base {
private:
/// Don't allow assignment.
void operator=(const MatchSpy &);
/// Don't allow copying.
MatchSpy(const MatchSpy &);
public:
/// Default constructor, needed by subclass constructors.
XAPIAN_NOTHROW(MatchSpy()) {}
/** Virtual destructor, because we have virtual methods. */
virtual ~MatchSpy();
/** Register a document with the match spy.
*
* This is called by the matcher once with each document seen by the
* matcher during the match process. Note that the matcher will often not
* see all the documents which match the query, due to optimisations which
* allow low-weighted documents to be skipped, and allow the match process
* to be terminated early.
*
* @param doc The document seen by the match spy.
* @param wt The weight of the document.
*/
virtual void operator()(const Xapian::Document &doc,
double wt) = 0;
/** Clone the match spy.
*
* The clone should inherit the configuration of the parent, but need not
* inherit the state. ie, the clone does not need to be passed
* information about the results seen by the parent.
*
* If you don't want to support the remote backend in your match spy, you
* can use the default implementation which simply throws
* Xapian::UnimplementedError.
*
* Note that the returned object will be deallocated by Xapian after use
* with "delete". If you want to handle the deletion in a special way
* (for example when wrapping the Xapian API for use from another
* language) then you can define a static <code>operator delete</code>
* method in your subclass as shown here:
* http://trac.xapian.org/ticket/554#comment:1
*/
virtual MatchSpy * clone() const;
/** Return the name of this match spy.
*
* This name is used by the remote backend. It is passed with the
* serialised parameters to the remote server so that it knows which class
* to create.
*
* Return the full namespace-qualified name of your class here - if your
* class is called MyApp::FooMatchSpy, return "MyApp::FooMatchSpy" from
* this method.
*
* If you don't want to support the remote backend in your match spy, you
* can use the default implementation which simply throws
* Xapian::UnimplementedError.
*/
virtual std::string name() const;
/** Return this object's parameters serialised as a single string.
*
* If you don't want to support the remote backend in your match spy, you
* can use the default implementation which simply throws
* Xapian::UnimplementedError.
*/
virtual std::string serialise() const;
/** Unserialise parameters.
*
* This method unserialises parameters serialised by the @a serialise()
* method and allocates and returns a new object initialised with them.
*
* If you don't want to support the remote backend in your match spy, you
* can use the default implementation which simply throws
* Xapian::UnimplementedError.
*
* Note that the returned object will be deallocated by Xapian after use
* with "delete". If you want to handle the deletion in a special way
* (for example when wrapping the Xapian API for use from another
* language) then you can define a static <code>operator delete</code>
* method in your subclass as shown here:
* http://trac.xapian.org/ticket/554#comment:1
*
* @param serialised A string containing the serialised results.
* @param context Registry object to use for unserialisation to permit
* MatchSpy subclasses with sub-MatchSpy objects to be
* implemented.
*/
virtual MatchSpy * unserialise(const std::string & serialised,
const Registry & context) const;
/** Serialise the results of this match spy.
*
* If you don't want to support the remote backend in your match spy, you
* can use the default implementation which simply throws
* Xapian::UnimplementedError.
*/
virtual std::string serialise_results() const;
/** Unserialise some results, and merge them into this matchspy.
*
* The order in which results are merged should not be significant, since
* this order is not specified (and will vary depending on the speed of
* the search in each sub-database).
*
* If you don't want to support the remote backend in your match spy, you
* can use the default implementation which simply throws
* Xapian::UnimplementedError.
*
* @param serialised A string containing the serialised results.
*/
virtual void merge_results(const std::string & serialised);
/** Return a string describing this object.
*
* This default implementation returns a generic answer, to avoid forcing
* those deriving their own MatchSpy subclasses from having to implement
* this (they may not care what get_description() gives for their
* subclass).
*/
virtual std::string get_description() const;
MatchSpy * release() {
opt_intrusive_base::release();
return this;
}
const MatchSpy * release() const {
opt_intrusive_base::release();
return this;
}
};
/** Class for counting the frequencies of values in the matching documents.
*/
class XAPIAN_VISIBILITY_DEFAULT ValueCountMatchSpy : public MatchSpy {
public:
struct Internal;
#ifndef SWIG // SWIG doesn't need to know about the internal class
struct XAPIAN_VISIBILITY_DEFAULT Internal
: public Xapian::Internal::intrusive_base
{
/// The slot to count.
Xapian::valueno slot;
/// Total number of documents seen by the match spy.
Xapian::doccount total;
/// The values seen so far, together with their frequency.
std::map<std::string, Xapian::doccount> values;
Internal() : slot(Xapian::BAD_VALUENO), total(0) {}
explicit Internal(Xapian::valueno slot_) : slot(slot_), total(0) {}
};
#endif
protected:
Xapian::Internal::intrusive_ptr<Internal> internal;
public:
/// Construct an empty ValueCountMatchSpy.
ValueCountMatchSpy() : internal() {}
/// Construct a MatchSpy which counts the values in a particular slot.
explicit ValueCountMatchSpy(Xapian::valueno slot_)
: internal(new Internal(slot_)) {}
/** Return the total number of documents tallied. */
size_t XAPIAN_NOTHROW(get_total() const) {
return internal.get() ? internal->total : 0;
}
/** Get an iterator over the values seen in the slot.
*
* Items will be returned in ascending alphabetical order.
*
* During the iteration, the frequency of the current value can be
* obtained with the get_termfreq() method on the iterator.
*/
TermIterator values_begin() const;
/** End iterator corresponding to values_begin() */
TermIterator XAPIAN_NOTHROW(values_end() const) {
return TermIterator();
}
/** Get an iterator over the most frequent values seen in the slot.
*
* Items will be returned in descending order of frequency. Values with
* the same frequency will be returned in ascending alphabetical order.
*
* During the iteration, the frequency of the current value can be
* obtained with the get_termfreq() method on the iterator.
*
* @param maxvalues The maximum number of values to return.
*/
TermIterator top_values_begin(size_t maxvalues) const;
/** End iterator corresponding to top_values_begin() */
TermIterator XAPIAN_NOTHROW(top_values_end(size_t) const) {
return TermIterator();
}
/** Implementation of virtual operator().
*
* This implementation tallies values for a matching document.
*
* @param doc The document to tally values for.
* @param wt The weight of the document (ignored by this class).
*/
void operator()(const Xapian::Document &doc, double wt);
virtual MatchSpy * clone() const;
virtual std::string name() const;
virtual std::string serialise() const;
virtual MatchSpy * unserialise(const std::string & serialised,
const Registry & context) const;
virtual std::string serialise_results() const;
virtual void merge_results(const std::string & serialised);
virtual std::string get_description() const;
};
}
#endif // XAPIAN_INCLUDED_MATCHSPY_H
|