From 72dec21fe5c31b215e8d273fb0b9a07f6a468169 Mon Sep 17 00:00:00 2001 From: dockes Date: Thu, 27 Apr 2006 06:12:10 +0000 Subject: [PATCH] use getmatchingterms instead of getqueryterms for highlighting etc. in preview --- src/qtgui/preview/preview.ui.h | 2 +- src/qtgui/rclmain.cpp | 7 +++--- src/rcldb/rcldb.cpp | 41 +++++++++++++++++++++++++++++----- src/rcldb/rcldb.h | 3 ++- 4 files changed, 43 insertions(+), 10 deletions(-) diff --git a/src/qtgui/preview/preview.ui.h b/src/qtgui/preview/preview.ui.h index ba09a5c6..5207fd59 100644 --- a/src/qtgui/preview/preview.ui.h +++ b/src/qtgui/preview/preview.ui.h @@ -502,7 +502,7 @@ bool Preview::loadFileInCurrentTab(string fn, size_t sz, const Rcl::Doc &idoc) bool highlightTerms = fdoc.text.length() < 1000 *1024; string firstTerm; list terms; - rcldb->getQueryTerms(terms); + rcldb->getMatchTerms(idoc, terms); if (highlightTerms) { progress.setLabelText(tr("Creating preview text")); ToRichThread rthr(fdoc.text, terms, firstTerm, richTxt); diff --git a/src/qtgui/rclmain.cpp b/src/qtgui/rclmain.cpp index 718b3003..b1fc9a0b 100644 --- a/src/qtgui/rclmain.cpp +++ b/src/qtgui/rclmain.cpp @@ -1,5 +1,5 @@ #ifndef lint -static char rcsid[] = "@(#$Id: rclmain.cpp,v 1.25 2006-04-26 11:29:10 dockes Exp $ (C) 2005 J.F.Dockes"; +static char rcsid[] = "@(#$Id: rclmain.cpp,v 1.26 2006-04-27 06:12:10 dockes Exp $ (C) 2005 J.F.Dockes"; #endif /* * This program is free software; you can redistribute it and/or modify @@ -442,7 +442,7 @@ void RclMain::startPreview(int docnum) // (which is different because it's format is explicit richtext // instead of auto as for preview, needed because it's built by // fragments?). -static const char* punct = " \t()<>\"'[]{}!^*,"; +static const char* punct = " \t()<>\"'[]{}!^*,\n\r"; void RclMain::ssearchAddTerm(QString term) { string t = (const char *)term.utf8(); @@ -542,7 +542,8 @@ void RclMain::docExpand(int docnum) return; list terms; terms = rcldb->expand(doc); - QString text = sSearch->queryText->text(); + // Do we keep the original query. I think we'd better not. + QString text;// = sSearch->queryText->text(); for (list::iterator it = terms.begin(); it != terms.end(); it++) { text += QString::fromLatin1(" \"") + QString::fromUtf8((*it).c_str()) + QString::fromLatin1("\""); diff --git a/src/rcldb/rcldb.cpp b/src/rcldb/rcldb.cpp index 816fd50d..6487ff6f 100644 --- a/src/rcldb/rcldb.cpp +++ b/src/rcldb/rcldb.cpp @@ -1,5 +1,5 @@ #ifndef lint -static char rcsid[] = "@(#$Id: rcldb.cpp,v 1.72 2006-04-25 09:59:12 dockes Exp $ (C) 2004 J.F.Dockes"; +static char rcsid[] = "@(#$Id: rcldb.cpp,v 1.73 2006-04-27 06:12:10 dockes Exp $ (C) 2004 J.F.Dockes"; #endif /* * This program is free software; you can redistribute it and/or modify @@ -1089,9 +1089,34 @@ bool Db::getQueryTerms(list& terms) terms.clear(); Xapian::TermIterator it; - for (it = m_ndb->query.get_terms_begin(); it != m_ndb->query.get_terms_end(); - it++) { - terms.push_back(*it); + try { + for (it = m_ndb->query.get_terms_begin(); + it != m_ndb->query.get_terms_end(); it++) { + terms.push_back(*it); + } + } catch (...) { + return false; + } + return true; +} + +bool Db::getMatchTerms(const Doc& doc, list& terms) +{ + if (!m_ndb || !m_ndb->enquire) { + LOGERR(("Db::getMatchTerms: no query opened\n")); + return -1; + } + + terms.clear(); + Xapian::TermIterator it; + Xapian::docid id = Xapian::docid(doc.xdocid); + try { + for (it=m_ndb->enquire->get_matching_terms_begin(id); + it != m_ndb->enquire->get_matching_terms_end(id); it++) { + terms.push_back(*it); + } + } catch (...) { + return false; } return true; } @@ -1319,11 +1344,17 @@ list Db::expand(const Doc &doc) } Xapian::RSet rset; rset.add_document(Xapian::docid(doc.xdocid)); - Xapian::ESet eset = m_ndb->enquire->get_eset(10, rset); + // We don't exclude the original query terms. + Xapian::ESet eset = m_ndb->enquire->get_eset(20, rset, false); LOGDEB(("ESet terms:\n")); + // We filter out the special terms for (Xapian::ESetIterator it = eset.begin(); it != eset.end(); it++) { LOGDEB((" [%s]\n", (*it).c_str())); + if ((*it).empty() || ((*it).at(0)>='A' && (*it).at(0)<='Z')) + continue; res.push_back(*it); + if (res.size() >= 10) + break; } return res; } diff --git a/src/rcldb/rcldb.h b/src/rcldb/rcldb.h index 3fdb5a0b..ad033d69 100644 --- a/src/rcldb/rcldb.h +++ b/src/rcldb/rcldb.h @@ -16,7 +16,7 @@ */ #ifndef _DB_H_INCLUDED_ #define _DB_H_INCLUDED_ -/* @(#$Id: rcldb.h,v 1.34 2006-04-22 06:27:37 dockes Exp $ (C) 2004 J.F.Dockes */ +/* @(#$Id: rcldb.h,v 1.35 2006-04-27 06:12:10 dockes Exp $ (C) 2004 J.F.Dockes */ #include #include @@ -137,6 +137,7 @@ class Db { bool setQuery(AdvSearchData &q, int opts = QO_NONE, const string& stemlang = "english"); bool getQueryTerms(list& terms); + bool getMatchTerms(const Doc& doc, list& terms); // Return a list of database terms that begin with the input string // Stem expansion is performed if lang is not empty