* 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:
@ -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>
|
||||||
**
|
**
|
||||||
@ -41,9 +43,14 @@ enum _FieldFlags {
|
|||||||
* 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'
|
||||||
|
* 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 */
|
* case/accents */
|
||||||
FLAG_DONT_CACHE = 1 << 7 /* don't cache this field in
|
FLAG_DONT_CACHE = 1 << 9 /* don't cache this field in
|
||||||
* the MuMsg cache */
|
* the MuMsg cache */
|
||||||
};
|
};
|
||||||
typedef enum _FieldFlags FieldFlags;
|
typedef enum _FieldFlags FieldFlags;
|
||||||
@ -72,7 +79,8 @@ 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
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
@ -101,14 +109,16 @@ static const MuMsgField FIELD_DATA[] = {
|
|||||||
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
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
@ -122,7 +132,8 @@ static const MuMsgField FIELD_DATA[] = {
|
|||||||
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
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
@ -130,21 +141,24 @@ static const MuMsgField FIELD_DATA[] = {
|
|||||||
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
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
@ -167,7 +181,7 @@ static const MuMsgField FIELD_DATA[] = {
|
|||||||
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
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
@ -181,7 +195,8 @@ static const MuMsgField FIELD_DATA[] = {
|
|||||||
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
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -252,7 +267,7 @@ 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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -260,29 +275,45 @@ 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);
|
||||||
|
/* note the FALSE: TRUE */
|
||||||
return mu_msg_field(id)->_flags & FLAG_DONT_CACHE ? FALSE : TRUE;
|
return mu_msg_field(id)->_flags & FLAG_DONT_CACHE ? FALSE : TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -290,7 +321,7 @@ 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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -298,14 +329,14 @@ 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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -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 '_'?
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
@ -240,21 +240,38 @@ add_prefix (MuMsgFieldId mfid, Xapian::QueryParser* qparser)
|
|||||||
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_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
|
qparser->add_boolean_prefix
|
||||||
(mu_msg_field_name(mfid), pfx);
|
(mu_msg_field_name(mfid), pfx);
|
||||||
qparser->add_boolean_prefix (shortcut, pfx);
|
qparser->add_boolean_prefix (shortcut, pfx);
|
||||||
} else {
|
} else {
|
||||||
qparser->add_boolean_prefix
|
qparser->add_prefix
|
||||||
(mu_msg_field_name(mfid), pfx);
|
(mu_msg_field_name(mfid), pfx);
|
||||||
qparser->add_boolean_prefix (shortcut, pfx);
|
qparser->add_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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user