notmuch/lib/regexp-fields.h
David Bremner 55524bb063 lib: regexp matching in 'subject' and 'from'
the idea is that you can run

% notmuch search subject:/<your-favourite-regexp>/
% notmuch search from:/<your-favourite-regexp>/

or

% notmuch search subject:"your usual phrase search"
% notmuch search from:"usual phrase search"

This feature is only available with recent Xapian, specifically
support for field processors is needed.

It should work with bindings, since it extends the query parser.

This is easy to extend for other value slots, but currently the only
value slots are date, message_id, from, subject, and last_mod. Date is
already searchable;  message_id is left for a followup commit.

This was originally written by Austin Clements, and ported to Xapian
field processors (from Austin's custom query parser) by yours truly.
2017-03-03 17:46:48 -04:00

77 lines
2.4 KiB
C++

/* regex-fields.h - xapian glue for semi-bruteforce regexp search
*
* This file is part of notmuch.
*
* Copyright © 2015 Austin Clements
* Copyright © 2016 David Bremner
*
* 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 3 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, see https://www.gnu.org/licenses/ .
*
* Author: Austin Clements <aclements@csail.mit.edu>
* David Bremner <david@tethera.net>
*/
#ifndef NOTMUCH_REGEXP_FIELDS_H
#define NOTMUCH_REGEXP_FIELDS_H
#if HAVE_XAPIAN_FIELD_PROCESSOR
#include <sys/types.h>
#include <regex.h>
#include "database-private.h"
#include "notmuch-private.h"
/* A posting source that returns documents where a value matches a
* regexp.
*/
class RegexpPostingSource : public Xapian::PostingSource
{
protected:
const Xapian::valueno slot_;
regex_t regexp_;
Xapian::Database db_;
bool started_;
Xapian::ValueIterator it_, end_;
/* No copying */
RegexpPostingSource (const RegexpPostingSource &);
RegexpPostingSource &operator= (const RegexpPostingSource &);
public:
RegexpPostingSource (Xapian::valueno slot, const std::string &regexp);
~RegexpPostingSource ();
void init (const Xapian::Database &db);
Xapian::doccount get_termfreq_min () const;
Xapian::doccount get_termfreq_est () const;
Xapian::doccount get_termfreq_max () const;
Xapian::docid get_docid () const;
bool at_end () const;
void next (unused (double min_wt));
};
class RegexpFieldProcessor : public Xapian::FieldProcessor {
protected:
Xapian::valueno slot;
std::string term_prefix;
Xapian::QueryParser &parser;
notmuch_database_t *notmuch;
public:
RegexpFieldProcessor (std::string prefix, Xapian::QueryParser &parser_, notmuch_database_t *notmuch_);
~RegexpFieldProcessor () { };
Xapian::Query operator()(const std::string & str);
};
#endif
#endif /* NOTMUCH_REGEXP_FIELDS_H */