* make prio: fields now also searchable

This commit is contained in:
Dirk-Jan C. Binnema 2010-11-21 15:42:53 +02:00
parent 79395b11ac
commit 29ed5fbcf3
3 changed files with 34 additions and 10 deletions

View File

@ -87,7 +87,7 @@ static const MuMsgField FIELD_DATA[] = {
{ {
MU_MSG_FIELD_ID_FLAGS, MU_MSG_FIELD_ID_FLAGS,
MU_MSG_FIELD_TYPE_INT, MU_MSG_FIELD_TYPE_INT,
"flags", 'g', 'G', /* flaGs */ "flag", 'g', 'G', /* flaGs */
FLAG_GMIME | FLAG_XAPIAN_TERM | FLAG_XAPIAN_VALUE FLAG_GMIME | FLAG_XAPIAN_TERM | FLAG_XAPIAN_VALUE
}, },
@ -116,7 +116,7 @@ static const MuMsgField FIELD_DATA[] = {
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_VALUE FLAG_GMIME | FLAG_XAPIAN_TERM | FLAG_XAPIAN_VALUE
}, },
{ {

View File

@ -58,7 +58,7 @@ init_mu_query (MuQuery *mqx, const char* dbpath)
mu_msg_field_foreach ((MuMsgFieldForEachFunc)add_prefix, mu_msg_field_foreach ((MuMsgFieldForEachFunc)add_prefix,
(gpointer)mqx->_qparser); (gpointer)mqx->_qparser);
// ////// FIXME // // ////// FIXME
// g_print ("\nsynonyms:\n"); // g_print ("\nsynonyms:\n");
// for (Xapian::TermIterator iter = mqx->_db->synonym_keys_begin(); // for (Xapian::TermIterator iter = mqx->_db->synonym_keys_begin();
// iter != mqx->_db->synonym_keys_end(); ++iter) { // iter != mqx->_db->synonym_keys_end(); ++iter) {
@ -102,8 +102,8 @@ get_query (MuQuery * mqx, const char* searchexpr, int *err = 0) {
try { try {
return mqx->_qparser->parse_query return mqx->_qparser->parse_query
(searchexpr, (searchexpr,
Xapian::QueryParser::FLAG_BOOLEAN | Xapian::QueryParser::FLAG_BOOLEAN |
// Xapian::QueryParser::FLAG_PHRASE | Xapian::QueryParser::FLAG_PURE_NOT |
Xapian::QueryParser::FLAG_AUTO_SYNONYMS | Xapian::QueryParser::FLAG_AUTO_SYNONYMS |
Xapian::QueryParser::FLAG_BOOLEAN_ANY_CASE); Xapian::QueryParser::FLAG_BOOLEAN_ANY_CASE);
@ -129,7 +129,7 @@ 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) { if (mfid == MU_MSG_FIELD_ID_FLAGS || mfid == MU_MSG_FIELD_ID_PRIO) {
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);

View File

@ -55,16 +55,36 @@ add_synonym_for_flag (MuMsgFlags flag, Xapian::WritableDatabase *db)
{ {
std::string pfx (1, mu_msg_field_xapian_prefix std::string pfx (1, mu_msg_field_xapian_prefix
(MU_MSG_FIELD_ID_FLAGS)); (MU_MSG_FIELD_ID_FLAGS));
db->add_synonym (pfx + mu_msg_flag_to_name (flag), db->clear_synonyms (pfx + mu_msg_flag_name (flag));
db->add_synonym (pfx + mu_msg_flag_name (flag),
pfx + (std::string(1, mu_msg_flag_char (flag)))); pfx + (std::string(1, mu_msg_flag_char (flag))));
} }
static void
add_synonym_for_prio (MuMsgPrio prio, Xapian::WritableDatabase *db)
{
std::string pfx (1, mu_msg_field_xapian_prefix
(MU_MSG_FIELD_ID_PRIO));
std::string s1 (pfx + mu_msg_prio_name (prio));
std::string s2 (pfx + (std::string(1, mu_msg_prio_char (prio))));
db->clear_synonyms (s1);
db->clear_synonyms (s2);
db->add_synonym (s1, s2);
}
static void static void
add_synonyms (MuStore *store) add_synonyms (MuStore *store)
{ {
mu_msg_flags_foreach ((MuMsgFlagsForeachFunc)add_synonym_for_flag, mu_msg_flags_foreach ((MuMsgFlagsForeachFunc)add_synonym_for_flag,
store->_db); store->_db);
mu_msg_prio_foreach ((MuMsgPrioForeachFunc)add_synonym_for_prio,
store->_db);
} }
static gboolean static gboolean
@ -258,13 +278,17 @@ add_terms_values_number (Xapian::Document& doc, MuMsg *msg,
if (mfid == MU_MSG_FIELD_ID_FLAGS) { if (mfid == MU_MSG_FIELD_ID_FLAGS) {
const char* flags, *cur; const char* flags, *cur;
cur = flags = mu_msg_flags_to_str_s ((MuMsgFlags)num); cur = flags = mu_msg_flags_str_s ((MuMsgFlags)num);
while (cur && *cur) { while (cur && *cur) {
char kar = tolower (*cur); char kar = tolower (*cur);
doc.add_term (pfx + kar); doc.add_term (pfx + kar);
++cur; ++cur;
} }
} else
} else if (mfid == MU_MSG_FIELD_ID_PRIO) {
doc.add_term (pfx + std::string(1,
mu_msg_prio_char((MuMsgPrio)num)));
} else
doc.add_term (pfx + numstr); doc.add_term (pfx + numstr);
} }