* for email address foo@bar.com, also save "foo" and "bar.com" so you can

search for them
This commit is contained in:
djcb
2013-01-13 22:49:49 +02:00
parent f5f8d6de70
commit bb2b65220a

View File

@ -593,6 +593,31 @@ xapian_pfx (MuMsgContact *contact)
}
static void
add_address_subfields (Xapian::Document& doc, const char *addr,
const std::string& pfx, GStringChunk *strchunk)
{
const char *at;
char *p1, *p2;
/* add "foo" and "bar.com" as terms as well for
* "foo@bar.com" */
if (G_UNLIKELY(!(at = (g_strstr_len (addr, -1, "@")))))
return;
p1 = g_strndup(addr, at - addr); // foo
p2 = g_strdup (at + 1);
p1 = mu_str_xapian_escape_in_place_try (p1, TRUE, strchunk);
p2 = mu_str_xapian_escape_in_place_try (p2, TRUE, strchunk);
doc.add_term (pfx + p1);
doc.add_term (pfx + p2);
g_free (p1);
g_free (p2);
}
static void
each_contact_info (MuMsgContact *contact, MsgDoc *msgdoc)
{
@ -615,15 +640,14 @@ each_contact_info (MuMsgContact *contact, MsgDoc *msgdoc)
/* don't normalize e-mail address, but do lowercase it */
if (!mu_str_is_empty(contact->address)) {
char *escaped;
/* note: escaped is added to stringchunk, no need for
* freeing */
escaped = mu_str_xapian_escape (contact->address,
FALSE /*dont esc space*/,
escaped = mu_str_xapian_escape (contact->address, FALSE,
msgdoc->_strchunk);
msgdoc->_doc->add_term (pfx + escaped);
add_address_subfields (*msgdoc->_doc, contact->address, pfx,
msgdoc->_strchunk);
msgdoc->_doc->add_term
(std::string (pfx + escaped, 0, MuStore::MAX_TERM_LENGTH));
/* store it also in our contacts cache */
if (msgdoc->_store->contacts())