* mu-msg-field, mu-query: refactor, make queries use boolean only for maildir,

path; this enables wildcard searching for other fields
This commit is contained in:
Dirk-Jan C. Binnema 2011-05-20 21:30:04 +03:00
parent ce7c354f74
commit 3aa034f0f2
3 changed files with 274 additions and 199 deletions

View File

@ -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 <djcb@djcbsoftware.nl> ** Copyright (C) 2008-2011 Dirk-Jan C. Binnema <djcb@djcbsoftware.nl>
** **
@ -29,22 +31,27 @@
* must be in the value (at least when using MuMsgIter) * must be in the value (at least when using MuMsgIter)
*/ */
enum _FieldFlags { enum _FieldFlags {
FLAG_GMIME = 1 << 0, /* field retrieved through FLAG_GMIME = 1 << 0, /* field retrieved through
* gmime */ * gmime */
FLAG_XAPIAN_INDEX = 1 << 1, /* field is indexed in FLAG_XAPIAN_INDEX = 1 << 1, /* field is indexed in
* xapian */ * xapian */
FLAG_XAPIAN_TERM = 1 << 2, /* field stored as term in FLAG_XAPIAN_TERM = 1 << 2, /* field stored as term in
* xapian */ * xapian */
FLAG_XAPIAN_VALUE = 1 << 3, /* field stored as value in FLAG_XAPIAN_VALUE = 1 << 3, /* field stored as value in
* xapian */ * xapian */
FLAG_XAPIAN_CONTACT = 1 << 4, /* field contains one or more FLAG_XAPIAN_CONTACT = 1 << 4, /* field contains one or more
* e-mail-addresses */ * e-mail-addresses */
FLAG_XAPIAN_ESCAPE = 1 << 5, /* field needs escaping for FLAG_XAPIAN_ESCAPE = 1 << 5, /* field needs escaping for
* xapian */ * xapian */
FLAG_NORMALIZE = 1 << 6, /* field needs flattening for FLAG_XAPIAN_BOOLEAN = 1 << 6, /* use 'add_boolean_prefix'
* case/accents */ * for Xapian queries */
FLAG_DONT_CACHE = 1 << 7 /* don't cache this field in FLAG_XAPIAN_PREFIX_ONLY = 1 << 7, /* whether this fields
* the MuMsg cache */ * 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; typedef enum _FieldFlags FieldFlags;
@ -52,14 +59,14 @@ typedef enum _FieldFlags FieldFlags;
* this struct describes the fields of an e-mail * this struct describes the fields of an e-mail
/*/ /*/
struct _MuMsgField { struct _MuMsgField {
MuMsgFieldId _id; /* the id of the field */ MuMsgFieldId _id; /* the id of the field */
MuMsgFieldType _type; /* the type of the field */ MuMsgFieldType _type; /* the type of the field */
const char *_name; /* the name of the field */ const char *_name; /* the name of the field */
const char _shortcut; /* the shortcut for use in const char _shortcut; /* the shortcut for use in
* --fields and sorting */ * --fields and sorting */
const char _xprefix; /* the Xapian-prefix */ const char _xprefix; /* the Xapian-prefix */
FieldFlags _flags; /* the flags that tells us FieldFlags _flags; /* the flags that tells us
* what to do */ * what to do */
}; };
typedef struct _MuMsgField MuMsgField; typedef struct _MuMsgField MuMsgField;
@ -68,121 +75,129 @@ typedef struct _MuMsgField MuMsgField;
* lowercase */ * lowercase */
static const MuMsgField FIELD_DATA[] = { static const MuMsgField FIELD_DATA[] = {
{ {
MU_MSG_FIELD_ID_BCC, MU_MSG_FIELD_ID_BCC,
MU_MSG_FIELD_TYPE_STRING, MU_MSG_FIELD_TYPE_STRING,
"bcc" , 'h', 'H', /* 'hidden */ "bcc" , 'h', 'H', /* 'hidden */
FLAG_GMIME | FLAG_XAPIAN_CONTACT | FLAG_XAPIAN_VALUE FLAG_GMIME | FLAG_XAPIAN_CONTACT |
}, FLAG_XAPIAN_VALUE
},
{ {
MU_MSG_FIELD_ID_BODY_TEXT, MU_MSG_FIELD_ID_BODY_TEXT,
MU_MSG_FIELD_TYPE_STRING, MU_MSG_FIELD_TYPE_STRING,
"body", 'b', 'B', "body", 'b', 'B',
FLAG_GMIME | FLAG_XAPIAN_INDEX | FLAG_NORMALIZE | FLAG_GMIME | FLAG_XAPIAN_INDEX | FLAG_NORMALIZE |
FLAG_DONT_CACHE FLAG_DONT_CACHE
}, },
{ {
MU_MSG_FIELD_ID_BODY_HTML, MU_MSG_FIELD_ID_BODY_HTML,
MU_MSG_FIELD_TYPE_STRING, MU_MSG_FIELD_TYPE_STRING,
"bodyhtml", 'h', 0, "bodyhtml", 'h', 0,
FLAG_GMIME | FLAG_DONT_CACHE FLAG_GMIME | FLAG_DONT_CACHE
}, },
{ {
MU_MSG_FIELD_ID_CC, MU_MSG_FIELD_ID_CC,
MU_MSG_FIELD_TYPE_STRING, MU_MSG_FIELD_TYPE_STRING,
"cc", 'c', 'C', "cc", 'c', 'C',
FLAG_GMIME | FLAG_XAPIAN_CONTACT | FLAG_XAPIAN_VALUE FLAG_GMIME | FLAG_XAPIAN_CONTACT | FLAG_XAPIAN_VALUE
}, },
{ {
MU_MSG_FIELD_ID_DATE, MU_MSG_FIELD_ID_DATE,
MU_MSG_FIELD_TYPE_TIME_T, MU_MSG_FIELD_TYPE_TIME_T,
"date", 'd', 'D', "date", 'd', 'D',
FLAG_GMIME | FLAG_XAPIAN_TERM | FLAG_XAPIAN_VALUE FLAG_GMIME | FLAG_XAPIAN_TERM | FLAG_XAPIAN_VALUE |
}, FLAG_XAPIAN_BOOLEAN | FLAG_XAPIAN_PREFIX_ONLY
},
{ {
MU_MSG_FIELD_ID_FLAGS, MU_MSG_FIELD_ID_FLAGS,
MU_MSG_FIELD_TYPE_INT, MU_MSG_FIELD_TYPE_INT,
"flag", 'g', 'G', /* flaGs */ "flag", 'g', 'G', /* flaGs */
FLAG_GMIME | FLAG_XAPIAN_TERM | FLAG_XAPIAN_VALUE FLAG_GMIME | FLAG_XAPIAN_TERM | FLAG_XAPIAN_VALUE |
}, FLAG_XAPIAN_PREFIX_ONLY
},
{ {
MU_MSG_FIELD_ID_FROM, MU_MSG_FIELD_ID_FROM,
MU_MSG_FIELD_TYPE_STRING, MU_MSG_FIELD_TYPE_STRING,
"from", 'f', 'F', "from", 'f', 'F',
FLAG_GMIME | FLAG_XAPIAN_CONTACT | FLAG_XAPIAN_VALUE FLAG_GMIME | FLAG_XAPIAN_CONTACT | FLAG_XAPIAN_VALUE
}, },
{ {
MU_MSG_FIELD_ID_PATH, MU_MSG_FIELD_ID_PATH,
MU_MSG_FIELD_TYPE_STRING, MU_MSG_FIELD_TYPE_STRING,
"path", 'l', 'L', /* 'l' for location */ "path", 'l', 'L', /* 'l' for location */
FLAG_GMIME | FLAG_XAPIAN_VALUE FLAG_GMIME | FLAG_XAPIAN_VALUE |
}, FLAG_XAPIAN_BOOLEAN | FLAG_XAPIAN_PREFIX_ONLY
},
{ {
MU_MSG_FIELD_ID_MAILDIR, MU_MSG_FIELD_ID_MAILDIR,
MU_MSG_FIELD_TYPE_STRING, MU_MSG_FIELD_TYPE_STRING,
"maildir", 'm', 'M', "maildir", 'm', 'M',
FLAG_GMIME | FLAG_XAPIAN_TERM | FLAG_XAPIAN_VALUE | FLAG_GMIME | FLAG_XAPIAN_TERM | FLAG_XAPIAN_VALUE |
FLAG_NORMALIZE | FLAG_XAPIAN_ESCAPE FLAG_NORMALIZE | FLAG_XAPIAN_ESCAPE |
}, FLAG_XAPIAN_BOOLEAN | FLAG_XAPIAN_PREFIX_ONLY
},
{ {
MU_MSG_FIELD_ID_PRIO, MU_MSG_FIELD_ID_PRIO,
MU_MSG_FIELD_TYPE_INT, MU_MSG_FIELD_TYPE_INT,
"prio", 'p', 'P', "prio", 'p', 'P',
FLAG_GMIME | FLAG_XAPIAN_TERM | FLAG_XAPIAN_VALUE FLAG_GMIME | FLAG_XAPIAN_TERM | FLAG_XAPIAN_VALUE |
}, FLAG_XAPIAN_PREFIX_ONLY
},
{ {
MU_MSG_FIELD_ID_SIZE, MU_MSG_FIELD_ID_SIZE,
MU_MSG_FIELD_TYPE_BYTESIZE, MU_MSG_FIELD_TYPE_BYTESIZE,
"size", 'z', 'Z', /* siZe */ "size", 'z', 'Z', /* siZe */
FLAG_GMIME | FLAG_XAPIAN_TERM | FLAG_XAPIAN_VALUE FLAG_GMIME | FLAG_XAPIAN_TERM | FLAG_XAPIAN_VALUE |
}, FLAG_XAPIAN_PREFIX_ONLY
},
{ {
MU_MSG_FIELD_ID_SUBJECT, MU_MSG_FIELD_ID_SUBJECT,
MU_MSG_FIELD_TYPE_STRING, MU_MSG_FIELD_TYPE_STRING,
"subject", 's', 'S', "subject", 's', 'S',
FLAG_GMIME | FLAG_XAPIAN_INDEX | FLAG_XAPIAN_VALUE | FLAG_GMIME | FLAG_XAPIAN_INDEX | FLAG_XAPIAN_VALUE |
FLAG_NORMALIZE FLAG_NORMALIZE
}, },
{ {
MU_MSG_FIELD_ID_TO, MU_MSG_FIELD_ID_TO,
MU_MSG_FIELD_TYPE_STRING, MU_MSG_FIELD_TYPE_STRING,
"to", 't', 'T', "to", 't', 'T',
FLAG_GMIME | FLAG_XAPIAN_CONTACT | FLAG_XAPIAN_VALUE FLAG_GMIME | FLAG_XAPIAN_CONTACT | FLAG_XAPIAN_VALUE
}, },
{ {
MU_MSG_FIELD_ID_MSGID, MU_MSG_FIELD_ID_MSGID,
MU_MSG_FIELD_TYPE_STRING, MU_MSG_FIELD_TYPE_STRING,
"msgid", 'i', 'I', /* 'i' for Id */ "msgid", 'i', 'I', /* 'i' for Id */
FLAG_GMIME | FLAG_XAPIAN_TERM | FLAG_XAPIAN_VALUE | FLAG_GMIME | FLAG_XAPIAN_TERM | FLAG_XAPIAN_VALUE |
FLAG_XAPIAN_ESCAPE FLAG_XAPIAN_ESCAPE | FLAG_XAPIAN_PREFIX_ONLY
}, },
{ {
MU_MSG_FIELD_ID_TIMESTAMP, MU_MSG_FIELD_ID_TIMESTAMP,
MU_MSG_FIELD_TYPE_TIME_T, MU_MSG_FIELD_TYPE_TIME_T,
"timestamp", 'x', 0, "timestamp", 'x', 0,
FLAG_GMIME FLAG_GMIME
}, },
{ {
MU_MSG_FIELD_ID_REFS, MU_MSG_FIELD_ID_REFS,
MU_MSG_FIELD_TYPE_STRING, MU_MSG_FIELD_TYPE_STRING,
"refs", 'r', 'R', "refs", 'r', 'R',
FLAG_GMIME | FLAG_XAPIAN_VALUE FLAG_GMIME | FLAG_XAPIAN_VALUE |
} FLAG_XAPIAN_PREFIX_ONLY
}
}; };
/* the MsgField data in an array, indexed by the MsgFieldId; /* 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 MuMsgField* _msg_field_data[MU_MSG_FIELD_ID_NUM];
static const MuMsgField* mu_msg_field (MuMsgFieldId id) static const MuMsgField* mu_msg_field (MuMsgFieldId id)
{ {
static gboolean _initialized = FALSE; static gboolean _initialized = FALSE;
/* initialize the array, but only once... */ /* initialize the array, but only once... */
if (G_UNLIKELY(!_initialized)) { if (G_UNLIKELY(!_initialized)) {
int i; int i;
for (i = 0; i != G_N_ELEMENTS(FIELD_DATA); ++i) for (i = 0; i != G_N_ELEMENTS(FIELD_DATA); ++i)
_msg_field_data[FIELD_DATA[i]._id] = _msg_field_data[FIELD_DATA[i]._id] =
(MuMsgField*)&FIELD_DATA[i]; (MuMsgField*)&FIELD_DATA[i];
_initialized = TRUE; _initialized = TRUE;
} }
return _msg_field_data[id]; return _msg_field_data[id];
} }
void void
mu_msg_field_foreach (MuMsgFieldForEachFunc func, gconstpointer data) mu_msg_field_foreach (MuMsgFieldForEachFunc func, gconstpointer data)
{ {
int i; int i;
for (i = 0; i != MU_MSG_FIELD_ID_NUM; ++i) for (i = 0; i != MU_MSG_FIELD_ID_NUM; ++i)
func (i, data); func (i, data);
} }
MuMsgFieldId MuMsgFieldId
mu_msg_field_id_from_name (const char* str, gboolean err) 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) for (i = 0; i != G_N_ELEMENTS(FIELD_DATA); ++i)
if (g_strcmp0(str, FIELD_DATA[i]._name) == 0) if (g_strcmp0(str, FIELD_DATA[i]._name) == 0)
return FIELD_DATA[i]._id; return FIELD_DATA[i]._id;
if (err) if (err)
g_return_val_if_reached (MU_MSG_FIELD_ID_NONE); g_return_val_if_reached (MU_MSG_FIELD_ID_NONE);
return MU_MSG_FIELD_ID_NONE; return MU_MSG_FIELD_ID_NONE;
} }
MuMsgFieldId MuMsgFieldId
mu_msg_field_id_from_shortcut (char kar, gboolean err) mu_msg_field_id_from_shortcut (char kar, gboolean err)
{ {
int i; int i;
for (i = 0; i != G_N_ELEMENTS(FIELD_DATA); ++i) for (i = 0; i != G_N_ELEMENTS(FIELD_DATA); ++i)
if (kar == FIELD_DATA[i]._shortcut) if (kar == FIELD_DATA[i]._shortcut)
return FIELD_DATA[i]._id; return FIELD_DATA[i]._id;
if (err) if (err)
g_return_val_if_reached (MU_MSG_FIELD_ID_NONE); g_return_val_if_reached (MU_MSG_FIELD_ID_NONE);
return MU_MSG_FIELD_ID_NONE; return MU_MSG_FIELD_ID_NONE;
} }
gboolean gboolean
mu_msg_field_gmime (MuMsgFieldId id) mu_msg_field_gmime (MuMsgFieldId id)
{ {
g_return_val_if_fail (mu_msg_field_id_is_valid(id),FALSE); g_return_val_if_fail (mu_msg_field_id_is_valid(id),FALSE);
return mu_msg_field(id)->_flags & FLAG_GMIME; return mu_msg_field(id)->_flags & FLAG_GMIME ? TRUE: FALSE;
} }
gboolean gboolean
mu_msg_field_xapian_index (MuMsgFieldId id) mu_msg_field_xapian_index (MuMsgFieldId id)
{ {
g_return_val_if_fail (mu_msg_field_id_is_valid(id),FALSE); g_return_val_if_fail (mu_msg_field_id_is_valid(id),FALSE);
return mu_msg_field(id)->_flags & FLAG_XAPIAN_INDEX; return mu_msg_field(id)->_flags & FLAG_XAPIAN_INDEX ? TRUE: FALSE;
} }
gboolean gboolean
mu_msg_field_xapian_value (MuMsgFieldId id) mu_msg_field_xapian_value (MuMsgFieldId id)
{ {
g_return_val_if_fail (mu_msg_field_id_is_valid(id),FALSE); g_return_val_if_fail (mu_msg_field_id_is_valid(id),FALSE);
return mu_msg_field(id)->_flags & FLAG_XAPIAN_VALUE; return mu_msg_field(id)->_flags & FLAG_XAPIAN_VALUE ? TRUE: FALSE;
} }
gboolean gboolean
mu_msg_field_xapian_term (MuMsgFieldId id) mu_msg_field_xapian_term (MuMsgFieldId id)
{ {
g_return_val_if_fail (mu_msg_field_id_is_valid(id),FALSE); g_return_val_if_fail (mu_msg_field_id_is_valid(id),FALSE);
return mu_msg_field(id)->_flags & FLAG_XAPIAN_TERM; 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 gboolean
mu_msg_field_is_cacheable (MuMsgFieldId id) mu_msg_field_is_cacheable (MuMsgFieldId id)
{ {
g_return_val_if_fail (mu_msg_field_id_is_valid(id),FALSE); g_return_val_if_fail (mu_msg_field_id_is_valid(id),FALSE);
return mu_msg_field(id)->_flags & FLAG_DONT_CACHE ? FALSE : TRUE; /* note the FALSE: TRUE */
return mu_msg_field(id)->_flags & FLAG_DONT_CACHE ? FALSE : TRUE;
} }
gboolean gboolean
mu_msg_field_xapian_contact (MuMsgFieldId id) mu_msg_field_xapian_contact (MuMsgFieldId id)
{ {
g_return_val_if_fail (mu_msg_field_id_is_valid(id),FALSE); g_return_val_if_fail (mu_msg_field_id_is_valid(id),FALSE);
return mu_msg_field(id)->_flags & FLAG_XAPIAN_CONTACT; return mu_msg_field(id)->_flags & FLAG_XAPIAN_CONTACT ? TRUE: FALSE;
} }
gboolean gboolean
mu_msg_field_normalize (MuMsgFieldId id) mu_msg_field_normalize (MuMsgFieldId id)
{ {
g_return_val_if_fail (mu_msg_field_id_is_valid(id),FALSE); g_return_val_if_fail (mu_msg_field_id_is_valid(id),FALSE);
return mu_msg_field(id)->_flags & FLAG_NORMALIZE; return mu_msg_field(id)->_flags & FLAG_NORMALIZE ? TRUE: FALSE;
} }
gboolean gboolean
mu_msg_field_xapian_escape (MuMsgFieldId id) mu_msg_field_xapian_escape (MuMsgFieldId id)
{ {
g_return_val_if_fail (mu_msg_field_id_is_valid(id),FALSE); g_return_val_if_fail (mu_msg_field_id_is_valid(id),FALSE);
return mu_msg_field(id)->_flags & FLAG_XAPIAN_ESCAPE; return mu_msg_field(id)->_flags & FLAG_XAPIAN_ESCAPE ? TRUE: FALSE;
} }
gboolean gboolean
mu_msg_field_is_numeric (MuMsgFieldId mfid) 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 || return type == MU_MSG_FIELD_TYPE_BYTESIZE ||
type == MU_MSG_FIELD_TYPE_TIME_T || type == MU_MSG_FIELD_TYPE_TIME_T ||
type == MU_MSG_FIELD_TYPE_INT; type == MU_MSG_FIELD_TYPE_INT;
} }
const char* const char*
mu_msg_field_name (MuMsgFieldId id) mu_msg_field_name (MuMsgFieldId id)
{ {
g_return_val_if_fail (mu_msg_field_id_is_valid(id),NULL); g_return_val_if_fail (mu_msg_field_id_is_valid(id),NULL);
return mu_msg_field(id)->_name; return mu_msg_field(id)->_name;
} }
char char
mu_msg_field_shortcut (MuMsgFieldId id) mu_msg_field_shortcut (MuMsgFieldId id)
{ {
g_return_val_if_fail (mu_msg_field_id_is_valid(id),0); g_return_val_if_fail (mu_msg_field_id_is_valid(id),0);
return mu_msg_field(id)->_shortcut; return mu_msg_field(id)->_shortcut;
} }
char char
mu_msg_field_xapian_prefix (MuMsgFieldId id) mu_msg_field_xapian_prefix (MuMsgFieldId id)
{ {
g_return_val_if_fail (mu_msg_field_id_is_valid(id),0); g_return_val_if_fail (mu_msg_field_id_is_valid(id),0);
return mu_msg_field(id)->_xprefix; return mu_msg_field(id)->_xprefix;
} }
@ -351,7 +382,7 @@ mu_msg_field_xapian_prefix (MuMsgFieldId id)
MuMsgFieldType MuMsgFieldType
mu_msg_field_type (MuMsgFieldId id) mu_msg_field_type (MuMsgFieldId id)
{ {
g_return_val_if_fail (mu_msg_field_id_is_valid(id), g_return_val_if_fail (mu_msg_field_id_is_valid(id),
MU_MSG_FIELD_TYPE_NONE); MU_MSG_FIELD_TYPE_NONE);
return mu_msg_field(id)->_type; return mu_msg_field(id)->_type;
} }

View File

@ -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; 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:<some-message-id>' 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 * should this field be escaped for xapian? in practice, should
* word-breaking chars be replaced with '_'? * word-breaking chars be replaced with '_'?

View File

@ -106,9 +106,9 @@ private:
char k = date[i]; char k = date[i];
if (std::isdigit(k)) if (std::isdigit(k))
cleanup += date[i]; cleanup += date[i];
else if (k != ':' && k != '-' && k != '/' && k != '.' && // else if (k != ':' && k != '-' && k != '/' && k != '.' &&
k != ',') // k != ',' && k != '_')
throw std::runtime_error ("error in date str"); // throw std::runtime_error ("error in date str");
} }
date = cleanup; date = cleanup;
} }
@ -239,22 +239,39 @@ add_prefix (MuMsgFieldId mfid, Xapian::QueryParser* qparser)
(1, mu_msg_field_xapian_prefix (mfid)); (1, mu_msg_field_xapian_prefix (mfid));
const std::string shortcut const std::string shortcut
(1, mu_msg_field_shortcut (mfid)); (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 qparser->add_prefix
(mu_msg_field_name(mfid), pfx); (mu_msg_field_name(mfid), pfx);
qparser->add_prefix (shortcut, 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);
} }
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; } MU_XAPIAN_CATCH_BLOCK;
} }