From 3aa034f0f2d5a5e94d1827ebec07e929e8b5fbc5 Mon Sep 17 00:00:00 2001 From: "Dirk-Jan C. Binnema" Date: Fri, 20 May 2011 21:30:04 +0300 Subject: [PATCH] * mu-msg-field, mu-query: refactor, make queries use boolean only for maildir, path; this enables wildcard searching for other fields --- src/mu-msg-fields.c | 397 ++++++++++++++++++++++++-------------------- src/mu-msg-fields.h | 27 +++ src/mu-query.cc | 49 ++++-- 3 files changed, 274 insertions(+), 199 deletions(-) diff --git a/src/mu-msg-fields.c b/src/mu-msg-fields.c index d76e0937..2a5a8916 100644 --- a/src/mu-msg-fields.c +++ b/src/mu-msg-fields.c @@ -1,3 +1,5 @@ +/* -*-mode: c; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-*/ + /* ** Copyright (C) 2008-2011 Dirk-Jan C. Binnema ** @@ -29,22 +31,27 @@ * must be in the value (at least when using MuMsgIter) */ enum _FieldFlags { - FLAG_GMIME = 1 << 0, /* field retrieved through - * gmime */ - FLAG_XAPIAN_INDEX = 1 << 1, /* field is indexed in - * xapian */ - FLAG_XAPIAN_TERM = 1 << 2, /* field stored as term in - * xapian */ - FLAG_XAPIAN_VALUE = 1 << 3, /* field stored as value in - * xapian */ - FLAG_XAPIAN_CONTACT = 1 << 4, /* field contains one or more - * e-mail-addresses */ - FLAG_XAPIAN_ESCAPE = 1 << 5, /* field needs escaping for - * xapian */ - FLAG_NORMALIZE = 1 << 6, /* field needs flattening for - * case/accents */ - FLAG_DONT_CACHE = 1 << 7 /* don't cache this field in - * the MuMsg cache */ + FLAG_GMIME = 1 << 0, /* field retrieved through + * gmime */ + FLAG_XAPIAN_INDEX = 1 << 1, /* field is indexed in + * xapian */ + FLAG_XAPIAN_TERM = 1 << 2, /* field stored as term in + * xapian */ + FLAG_XAPIAN_VALUE = 1 << 3, /* field stored as value in + * xapian */ + FLAG_XAPIAN_CONTACT = 1 << 4, /* field contains one or more + * e-mail-addresses */ + FLAG_XAPIAN_ESCAPE = 1 << 5, /* field needs escaping for + * xapian */ + FLAG_XAPIAN_BOOLEAN = 1 << 6, /* use 'add_boolean_prefix' + * for Xapian queries */ + FLAG_XAPIAN_PREFIX_ONLY = 1 << 7, /* whether this fields + * matches only in queries + * when a prefix is used */ + FLAG_NORMALIZE = 1 << 8, /* field needs flattening for + * case/accents */ + FLAG_DONT_CACHE = 1 << 9 /* don't cache this field in + * the MuMsg cache */ }; typedef enum _FieldFlags FieldFlags; @@ -52,14 +59,14 @@ typedef enum _FieldFlags FieldFlags; * this struct describes the fields of an e-mail /*/ struct _MuMsgField { - MuMsgFieldId _id; /* the id of the field */ - MuMsgFieldType _type; /* the type of the field */ - const char *_name; /* the name of the field */ - const char _shortcut; /* the shortcut for use in - * --fields and sorting */ - const char _xprefix; /* the Xapian-prefix */ - FieldFlags _flags; /* the flags that tells us - * what to do */ + MuMsgFieldId _id; /* the id of the field */ + MuMsgFieldType _type; /* the type of the field */ + const char *_name; /* the name of the field */ + const char _shortcut; /* the shortcut for use in + * --fields and sorting */ + const char _xprefix; /* the Xapian-prefix */ + FieldFlags _flags; /* the flags that tells us + * what to do */ }; typedef struct _MuMsgField MuMsgField; @@ -68,121 +75,129 @@ typedef struct _MuMsgField MuMsgField; * lowercase */ static const MuMsgField FIELD_DATA[] = { - { - MU_MSG_FIELD_ID_BCC, - MU_MSG_FIELD_TYPE_STRING, - "bcc" , 'h', 'H', /* 'hidden */ - FLAG_GMIME | FLAG_XAPIAN_CONTACT | FLAG_XAPIAN_VALUE - }, + { + MU_MSG_FIELD_ID_BCC, + MU_MSG_FIELD_TYPE_STRING, + "bcc" , 'h', 'H', /* 'hidden */ + FLAG_GMIME | FLAG_XAPIAN_CONTACT | + FLAG_XAPIAN_VALUE + }, - { - MU_MSG_FIELD_ID_BODY_TEXT, - MU_MSG_FIELD_TYPE_STRING, - "body", 'b', 'B', - FLAG_GMIME | FLAG_XAPIAN_INDEX | FLAG_NORMALIZE | - FLAG_DONT_CACHE - }, + { + MU_MSG_FIELD_ID_BODY_TEXT, + MU_MSG_FIELD_TYPE_STRING, + "body", 'b', 'B', + FLAG_GMIME | FLAG_XAPIAN_INDEX | FLAG_NORMALIZE | + FLAG_DONT_CACHE + }, - { - MU_MSG_FIELD_ID_BODY_HTML, - MU_MSG_FIELD_TYPE_STRING, - "bodyhtml", 'h', 0, - FLAG_GMIME | FLAG_DONT_CACHE - }, + { + MU_MSG_FIELD_ID_BODY_HTML, + MU_MSG_FIELD_TYPE_STRING, + "bodyhtml", 'h', 0, + FLAG_GMIME | FLAG_DONT_CACHE + }, - { - MU_MSG_FIELD_ID_CC, - MU_MSG_FIELD_TYPE_STRING, - "cc", 'c', 'C', - FLAG_GMIME | FLAG_XAPIAN_CONTACT | FLAG_XAPIAN_VALUE - }, + { + MU_MSG_FIELD_ID_CC, + MU_MSG_FIELD_TYPE_STRING, + "cc", 'c', 'C', + FLAG_GMIME | FLAG_XAPIAN_CONTACT | FLAG_XAPIAN_VALUE + }, - { - MU_MSG_FIELD_ID_DATE, - MU_MSG_FIELD_TYPE_TIME_T, - "date", 'd', 'D', - FLAG_GMIME | FLAG_XAPIAN_TERM | FLAG_XAPIAN_VALUE - }, + { + MU_MSG_FIELD_ID_DATE, + MU_MSG_FIELD_TYPE_TIME_T, + "date", 'd', 'D', + FLAG_GMIME | FLAG_XAPIAN_TERM | FLAG_XAPIAN_VALUE | + FLAG_XAPIAN_BOOLEAN | FLAG_XAPIAN_PREFIX_ONLY + }, - { - MU_MSG_FIELD_ID_FLAGS, - MU_MSG_FIELD_TYPE_INT, - "flag", 'g', 'G', /* flaGs */ - FLAG_GMIME | FLAG_XAPIAN_TERM | FLAG_XAPIAN_VALUE - }, + { + MU_MSG_FIELD_ID_FLAGS, + MU_MSG_FIELD_TYPE_INT, + "flag", 'g', 'G', /* flaGs */ + FLAG_GMIME | FLAG_XAPIAN_TERM | FLAG_XAPIAN_VALUE | + FLAG_XAPIAN_PREFIX_ONLY + }, - { - MU_MSG_FIELD_ID_FROM, - MU_MSG_FIELD_TYPE_STRING, - "from", 'f', 'F', - FLAG_GMIME | FLAG_XAPIAN_CONTACT | FLAG_XAPIAN_VALUE - }, + { + MU_MSG_FIELD_ID_FROM, + MU_MSG_FIELD_TYPE_STRING, + "from", 'f', 'F', + FLAG_GMIME | FLAG_XAPIAN_CONTACT | FLAG_XAPIAN_VALUE + }, - { - MU_MSG_FIELD_ID_PATH, - MU_MSG_FIELD_TYPE_STRING, - "path", 'l', 'L', /* 'l' for location */ - FLAG_GMIME | FLAG_XAPIAN_VALUE - }, + { + MU_MSG_FIELD_ID_PATH, + MU_MSG_FIELD_TYPE_STRING, + "path", 'l', 'L', /* 'l' for location */ + FLAG_GMIME | FLAG_XAPIAN_VALUE | + FLAG_XAPIAN_BOOLEAN | FLAG_XAPIAN_PREFIX_ONLY + }, - { - MU_MSG_FIELD_ID_MAILDIR, - MU_MSG_FIELD_TYPE_STRING, - "maildir", 'm', 'M', - FLAG_GMIME | FLAG_XAPIAN_TERM | FLAG_XAPIAN_VALUE | - FLAG_NORMALIZE | FLAG_XAPIAN_ESCAPE - }, + { + MU_MSG_FIELD_ID_MAILDIR, + MU_MSG_FIELD_TYPE_STRING, + "maildir", 'm', 'M', + FLAG_GMIME | FLAG_XAPIAN_TERM | FLAG_XAPIAN_VALUE | + FLAG_NORMALIZE | FLAG_XAPIAN_ESCAPE | + FLAG_XAPIAN_BOOLEAN | FLAG_XAPIAN_PREFIX_ONLY + }, - { - MU_MSG_FIELD_ID_PRIO, - MU_MSG_FIELD_TYPE_INT, - "prio", 'p', 'P', - FLAG_GMIME | FLAG_XAPIAN_TERM | FLAG_XAPIAN_VALUE - }, + { + MU_MSG_FIELD_ID_PRIO, + MU_MSG_FIELD_TYPE_INT, + "prio", 'p', 'P', + FLAG_GMIME | FLAG_XAPIAN_TERM | FLAG_XAPIAN_VALUE | + FLAG_XAPIAN_PREFIX_ONLY + }, - { - MU_MSG_FIELD_ID_SIZE, - MU_MSG_FIELD_TYPE_BYTESIZE, - "size", 'z', 'Z', /* siZe */ - FLAG_GMIME | FLAG_XAPIAN_TERM | FLAG_XAPIAN_VALUE - }, + { + MU_MSG_FIELD_ID_SIZE, + MU_MSG_FIELD_TYPE_BYTESIZE, + "size", 'z', 'Z', /* siZe */ + FLAG_GMIME | FLAG_XAPIAN_TERM | FLAG_XAPIAN_VALUE | + FLAG_XAPIAN_PREFIX_ONLY + }, - { - MU_MSG_FIELD_ID_SUBJECT, - MU_MSG_FIELD_TYPE_STRING, - "subject", 's', 'S', - FLAG_GMIME | FLAG_XAPIAN_INDEX | FLAG_XAPIAN_VALUE | - FLAG_NORMALIZE - }, + { + MU_MSG_FIELD_ID_SUBJECT, + MU_MSG_FIELD_TYPE_STRING, + "subject", 's', 'S', + FLAG_GMIME | FLAG_XAPIAN_INDEX | FLAG_XAPIAN_VALUE | + FLAG_NORMALIZE + }, - { - MU_MSG_FIELD_ID_TO, - MU_MSG_FIELD_TYPE_STRING, - "to", 't', 'T', - FLAG_GMIME | FLAG_XAPIAN_CONTACT | FLAG_XAPIAN_VALUE - }, + { + MU_MSG_FIELD_ID_TO, + MU_MSG_FIELD_TYPE_STRING, + "to", 't', 'T', + FLAG_GMIME | FLAG_XAPIAN_CONTACT | FLAG_XAPIAN_VALUE + }, - { - MU_MSG_FIELD_ID_MSGID, - MU_MSG_FIELD_TYPE_STRING, - "msgid", 'i', 'I', /* 'i' for Id */ - FLAG_GMIME | FLAG_XAPIAN_TERM | FLAG_XAPIAN_VALUE | - FLAG_XAPIAN_ESCAPE - }, + { + MU_MSG_FIELD_ID_MSGID, + MU_MSG_FIELD_TYPE_STRING, + "msgid", 'i', 'I', /* 'i' for Id */ + FLAG_GMIME | FLAG_XAPIAN_TERM | FLAG_XAPIAN_VALUE | + FLAG_XAPIAN_ESCAPE | FLAG_XAPIAN_PREFIX_ONLY + }, - { - MU_MSG_FIELD_ID_TIMESTAMP, - MU_MSG_FIELD_TYPE_TIME_T, - "timestamp", 'x', 0, - FLAG_GMIME - }, + { + MU_MSG_FIELD_ID_TIMESTAMP, + MU_MSG_FIELD_TYPE_TIME_T, + "timestamp", 'x', 0, + FLAG_GMIME + }, - { - MU_MSG_FIELD_ID_REFS, - MU_MSG_FIELD_TYPE_STRING, - "refs", 'r', 'R', - FLAG_GMIME | FLAG_XAPIAN_VALUE - } + { + MU_MSG_FIELD_ID_REFS, + MU_MSG_FIELD_TYPE_STRING, + "refs", 'r', 'R', + FLAG_GMIME | FLAG_XAPIAN_VALUE | + FLAG_XAPIAN_PREFIX_ONLY + } }; /* the MsgField data in an array, indexed by the MsgFieldId; @@ -191,158 +206,174 @@ static const MuMsgField FIELD_DATA[] = { static MuMsgField* _msg_field_data[MU_MSG_FIELD_ID_NUM]; static const MuMsgField* mu_msg_field (MuMsgFieldId id) { - static gboolean _initialized = FALSE; + static gboolean _initialized = FALSE; - /* initialize the array, but only once... */ - if (G_UNLIKELY(!_initialized)) { - int i; - for (i = 0; i != G_N_ELEMENTS(FIELD_DATA); ++i) - _msg_field_data[FIELD_DATA[i]._id] = - (MuMsgField*)&FIELD_DATA[i]; - _initialized = TRUE; - } + /* initialize the array, but only once... */ + if (G_UNLIKELY(!_initialized)) { + int i; + for (i = 0; i != G_N_ELEMENTS(FIELD_DATA); ++i) + _msg_field_data[FIELD_DATA[i]._id] = + (MuMsgField*)&FIELD_DATA[i]; + _initialized = TRUE; + } - return _msg_field_data[id]; + return _msg_field_data[id]; } void mu_msg_field_foreach (MuMsgFieldForEachFunc func, gconstpointer data) { - int i; - for (i = 0; i != MU_MSG_FIELD_ID_NUM; ++i) - func (i, data); + int i; + for (i = 0; i != MU_MSG_FIELD_ID_NUM; ++i) + func (i, data); } MuMsgFieldId mu_msg_field_id_from_name (const char* str, gboolean err) { - int i; + int i; - g_return_val_if_fail (str, MU_MSG_FIELD_ID_NONE); + g_return_val_if_fail (str, MU_MSG_FIELD_ID_NONE); - for (i = 0; i != G_N_ELEMENTS(FIELD_DATA); ++i) - if (g_strcmp0(str, FIELD_DATA[i]._name) == 0) - return FIELD_DATA[i]._id; + for (i = 0; i != G_N_ELEMENTS(FIELD_DATA); ++i) + if (g_strcmp0(str, FIELD_DATA[i]._name) == 0) + return FIELD_DATA[i]._id; - if (err) - g_return_val_if_reached (MU_MSG_FIELD_ID_NONE); + if (err) + g_return_val_if_reached (MU_MSG_FIELD_ID_NONE); - return MU_MSG_FIELD_ID_NONE; + return MU_MSG_FIELD_ID_NONE; } MuMsgFieldId mu_msg_field_id_from_shortcut (char kar, gboolean err) { - int i; - for (i = 0; i != G_N_ELEMENTS(FIELD_DATA); ++i) - if (kar == FIELD_DATA[i]._shortcut) - return FIELD_DATA[i]._id; + int i; + for (i = 0; i != G_N_ELEMENTS(FIELD_DATA); ++i) + if (kar == FIELD_DATA[i]._shortcut) + return FIELD_DATA[i]._id; - if (err) - g_return_val_if_reached (MU_MSG_FIELD_ID_NONE); + if (err) + g_return_val_if_reached (MU_MSG_FIELD_ID_NONE); - return MU_MSG_FIELD_ID_NONE; + return MU_MSG_FIELD_ID_NONE; } gboolean mu_msg_field_gmime (MuMsgFieldId id) { - g_return_val_if_fail (mu_msg_field_id_is_valid(id),FALSE); - return mu_msg_field(id)->_flags & FLAG_GMIME; + g_return_val_if_fail (mu_msg_field_id_is_valid(id),FALSE); + return mu_msg_field(id)->_flags & FLAG_GMIME ? TRUE: FALSE; } gboolean mu_msg_field_xapian_index (MuMsgFieldId id) { - g_return_val_if_fail (mu_msg_field_id_is_valid(id),FALSE); - return mu_msg_field(id)->_flags & FLAG_XAPIAN_INDEX; + g_return_val_if_fail (mu_msg_field_id_is_valid(id),FALSE); + return mu_msg_field(id)->_flags & FLAG_XAPIAN_INDEX ? TRUE: FALSE; } gboolean mu_msg_field_xapian_value (MuMsgFieldId id) { - g_return_val_if_fail (mu_msg_field_id_is_valid(id),FALSE); - return mu_msg_field(id)->_flags & FLAG_XAPIAN_VALUE; + g_return_val_if_fail (mu_msg_field_id_is_valid(id),FALSE); + return mu_msg_field(id)->_flags & FLAG_XAPIAN_VALUE ? TRUE: FALSE; } gboolean mu_msg_field_xapian_term (MuMsgFieldId id) { - g_return_val_if_fail (mu_msg_field_id_is_valid(id),FALSE); - return mu_msg_field(id)->_flags & FLAG_XAPIAN_TERM; + g_return_val_if_fail (mu_msg_field_id_is_valid(id),FALSE); + return mu_msg_field(id)->_flags & FLAG_XAPIAN_TERM ? TRUE: FALSE; } +gboolean +mu_msg_field_uses_boolean_prefix (MuMsgFieldId id) +{ + g_return_val_if_fail (mu_msg_field_id_is_valid(id),FALSE); + return mu_msg_field(id)->_flags & FLAG_XAPIAN_BOOLEAN?TRUE:FALSE; +} + + +gboolean +mu_msg_field_needs_prefix (MuMsgFieldId id) +{ + g_return_val_if_fail (mu_msg_field_id_is_valid(id),FALSE); + return mu_msg_field(id)->_flags & FLAG_XAPIAN_PREFIX_ONLY?TRUE:FALSE; +} + gboolean mu_msg_field_is_cacheable (MuMsgFieldId id) { - g_return_val_if_fail (mu_msg_field_id_is_valid(id),FALSE); - return mu_msg_field(id)->_flags & FLAG_DONT_CACHE ? FALSE : TRUE; + g_return_val_if_fail (mu_msg_field_id_is_valid(id),FALSE); + /* note the FALSE: TRUE */ + return mu_msg_field(id)->_flags & FLAG_DONT_CACHE ? FALSE : TRUE; } gboolean mu_msg_field_xapian_contact (MuMsgFieldId id) { - g_return_val_if_fail (mu_msg_field_id_is_valid(id),FALSE); - return mu_msg_field(id)->_flags & FLAG_XAPIAN_CONTACT; + g_return_val_if_fail (mu_msg_field_id_is_valid(id),FALSE); + return mu_msg_field(id)->_flags & FLAG_XAPIAN_CONTACT ? TRUE: FALSE; } gboolean mu_msg_field_normalize (MuMsgFieldId id) { - g_return_val_if_fail (mu_msg_field_id_is_valid(id),FALSE); - return mu_msg_field(id)->_flags & FLAG_NORMALIZE; + g_return_val_if_fail (mu_msg_field_id_is_valid(id),FALSE); + return mu_msg_field(id)->_flags & FLAG_NORMALIZE ? TRUE: FALSE; } gboolean mu_msg_field_xapian_escape (MuMsgFieldId id) { - g_return_val_if_fail (mu_msg_field_id_is_valid(id),FALSE); - return mu_msg_field(id)->_flags & FLAG_XAPIAN_ESCAPE; + g_return_val_if_fail (mu_msg_field_id_is_valid(id),FALSE); + return mu_msg_field(id)->_flags & FLAG_XAPIAN_ESCAPE ? TRUE: FALSE; } gboolean mu_msg_field_is_numeric (MuMsgFieldId mfid) { - MuMsgFieldType type; + MuMsgFieldType type; - g_return_val_if_fail (mu_msg_field_id_is_valid(mfid),FALSE); + g_return_val_if_fail (mu_msg_field_id_is_valid(mfid),FALSE); - type = mu_msg_field_type (mfid); + type = mu_msg_field_type (mfid); - return type == MU_MSG_FIELD_TYPE_BYTESIZE || - type == MU_MSG_FIELD_TYPE_TIME_T || - type == MU_MSG_FIELD_TYPE_INT; + return type == MU_MSG_FIELD_TYPE_BYTESIZE || + type == MU_MSG_FIELD_TYPE_TIME_T || + type == MU_MSG_FIELD_TYPE_INT; } const char* mu_msg_field_name (MuMsgFieldId id) { - g_return_val_if_fail (mu_msg_field_id_is_valid(id),NULL); - return mu_msg_field(id)->_name; + g_return_val_if_fail (mu_msg_field_id_is_valid(id),NULL); + return mu_msg_field(id)->_name; } char mu_msg_field_shortcut (MuMsgFieldId id) { - g_return_val_if_fail (mu_msg_field_id_is_valid(id),0); - return mu_msg_field(id)->_shortcut; + g_return_val_if_fail (mu_msg_field_id_is_valid(id),0); + return mu_msg_field(id)->_shortcut; } char mu_msg_field_xapian_prefix (MuMsgFieldId id) { - g_return_val_if_fail (mu_msg_field_id_is_valid(id),0); - return mu_msg_field(id)->_xprefix; + g_return_val_if_fail (mu_msg_field_id_is_valid(id),0); + return mu_msg_field(id)->_xprefix; } @@ -351,7 +382,7 @@ mu_msg_field_xapian_prefix (MuMsgFieldId id) MuMsgFieldType mu_msg_field_type (MuMsgFieldId id) { - g_return_val_if_fail (mu_msg_field_id_is_valid(id), - MU_MSG_FIELD_TYPE_NONE); - return mu_msg_field(id)->_type; + g_return_val_if_fail (mu_msg_field_id_is_valid(id), + MU_MSG_FIELD_TYPE_NONE); + return mu_msg_field(id)->_type; } diff --git a/src/mu-msg-fields.h b/src/mu-msg-fields.h index 0f7949e5..1b27b980 100644 --- a/src/mu-msg-fields.h +++ b/src/mu-msg-fields.h @@ -194,6 +194,33 @@ gboolean mu_msg_field_xapian_term (MuMsgFieldId id) G_GNUC_PURE; gboolean mu_msg_field_xapian_value (MuMsgFieldId id) G_GNUC_PURE; +/** + * whether we should use add_boolean_prefix (see Xapian documentation) + * for this field in queries. Used in mu-query.cc + * + * @param id a MuMsgFieldId + * + * @return TRUE if this field wants add_boolean_prefix, FALSE + * otherwise + */ +gboolean mu_msg_field_uses_boolean_prefix (MuMsgFieldId id) G_GNUC_PURE; + + + +/** + * wether this fields needs a prefix in queries -- ie, + * 'msgid:' will only match with the explicit prefix, + * while 'subject:foo' will also match as just 'foo'. Used in + * mu-query.cc + * + * @param id a MuMsgFieldId + * + * @return TRUE if this field only matches with a prefix, FALSE + * otherwise + */ +gboolean mu_msg_field_needs_prefix (MuMsgFieldId id) G_GNUC_PURE; + + /** * should this field be escaped for xapian? in practice, should * word-breaking chars be replaced with '_'? diff --git a/src/mu-query.cc b/src/mu-query.cc index 199ef99f..8ff23225 100644 --- a/src/mu-query.cc +++ b/src/mu-query.cc @@ -106,9 +106,9 @@ private: char k = date[i]; if (std::isdigit(k)) cleanup += date[i]; - else if (k != ':' && k != '-' && k != '/' && k != '.' && - k != ',') - throw std::runtime_error ("error in date str"); + // else if (k != ':' && k != '-' && k != '/' && k != '.' && + // k != ',' && k != '_') + // throw std::runtime_error ("error in date str"); } date = cleanup; } @@ -239,22 +239,39 @@ add_prefix (MuMsgFieldId mfid, Xapian::QueryParser* qparser) (1, mu_msg_field_xapian_prefix (mfid)); const std::string shortcut (1, mu_msg_field_shortcut (mfid)); - - if (mfid == MU_MSG_FIELD_ID_FLAGS || mfid == MU_MSG_FIELD_ID_PRIO) { + + if (mu_msg_field_uses_boolean_prefix (mfid)) { + qparser->add_boolean_prefix + (mu_msg_field_name(mfid), pfx); + qparser->add_boolean_prefix (shortcut, pfx); + } else { qparser->add_prefix (mu_msg_field_name(mfid), pfx); - qparser->add_prefix (shortcut, pfx); - } else if (mfid == MU_MSG_FIELD_ID_MAILDIR || - mfid == MU_MSG_FIELD_ID_MSGID) { - qparser->add_boolean_prefix - (mu_msg_field_name(mfid), pfx); - qparser->add_boolean_prefix (shortcut, pfx); - } else { - qparser->add_boolean_prefix - (mu_msg_field_name(mfid), pfx); - qparser->add_boolean_prefix (shortcut, pfx); - qparser->add_prefix ("", pfx); + qparser->add_prefix (shortcut, pfx); } + + if (!mu_msg_field_needs_prefix(mfid)) + qparser->add_prefix ("", pfx); + + + // if (mfid == MU_MSG_FIELD_ID_FLAGS || mfid == MU_MSG_FIELD_ID_PRIO) { + // qparser->add_prefix + // (mu_msg_field_name(mfid), pfx); + // qparser->add_prefix (shortcut, pfx); + + // } else if (mfid == MU_MSG_FIELD_ID_MAILDIR || + // mfid == MU_MSG_FIELD_ID_MSGID) { + // qparser->add_boolean_prefix + // (mu_msg_field_name(mfid), pfx); + // qparser->add_boolean_prefix (shortcut, pfx); + + // } else { + // qparser->add_boolean_prefix + // (mu_msg_field_name(mfid), pfx); + // qparser->add_boolean_prefix (shortcut, pfx); + + // qparser->add_prefix ("", pfx); + // } } MU_XAPIAN_CATCH_BLOCK; }