mirror of https://github.com/djcb/mu.git
* 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:
parent
ce7c354f74
commit
3aa034f0f2
|
@ -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>
|
||||
**
|
||||
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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:<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
|
||||
* word-breaking chars be replaced with '_'?
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue