From dd42a9f51e377580d012a12f30192d927a01c937 Mon Sep 17 00:00:00 2001 From: Jean-Francois Dockes Date: Mon, 1 Apr 2013 16:01:21 +0200 Subject: [PATCH] allow wild chars in dir clauses --- src/rcldb/rcldb.cpp | 4 ++++ src/rcldb/searchdata.cpp | 35 +++++++++++++++++++++++++++++------ src/rcldb/searchdata.h | 10 ++-------- src/sampleconf/fields | 26 ++++++++++++-------------- 4 files changed, 47 insertions(+), 28 deletions(-) diff --git a/src/rcldb/rcldb.cpp b/src/rcldb/rcldb.cpp index 2d5804b5..b97d3ce7 100644 --- a/src/rcldb/rcldb.cpp +++ b/src/rcldb/rcldb.cpp @@ -917,6 +917,10 @@ bool Db::addOrUpdate(const string &udi, const string &parent_udi, Doc &doc) string path = url_gpath(doc.url); vector vpath; stringToTokens(path, vpath, "/"); + // If vpath is not /, the last elt is the file/dir name, not a + // part of the path. + if (vpath.size()) + vpath.resize(vpath.size()-1); splitter.curpos = 0; newdocument.add_posting(wrap_prefix(pathelt_prefix), splitter.basepos + splitter.curpos++); diff --git a/src/rcldb/searchdata.cpp b/src/rcldb/searchdata.cpp index 7581fb19..18c084b4 100644 --- a/src/rcldb/searchdata.cpp +++ b/src/rcldb/searchdata.cpp @@ -517,7 +517,7 @@ static void listVector(const string& what, const vector&l) for (vector::const_iterator it = l.begin(); it != l.end(); it++) { a = a + *it + " "; } - LOGDEB(("%s: %s\n", what.c_str(), a.c_str())); + LOGDEB0(("%s: %s\n", what.c_str(), a.c_str())); } #endif @@ -1056,19 +1056,42 @@ bool SearchDataClausePath::toNativeQuery(Rcl::Db &db, void *p) if (m_text.empty()) { LOGERR(("SearchDataClausePath: empty path??\n")); + m_reason = "Empty path ?"; return false; } + + vector orqueries; + + if (m_text[0] == '/') + orqueries.push_back(Xapian::Query(wrap_prefix(pathelt_prefix))); + vector vpath; stringToTokens(m_text, vpath, "/"); - vector pvpath; - if (m_text[0] == '/') - pvpath.push_back(wrap_prefix(pathelt_prefix)); + for (vector::const_iterator pit = vpath.begin(); pit != vpath.end(); pit++){ - pvpath.push_back(wrap_prefix(pathelt_prefix) + *pit); + + string sterm; + vector exp; + if (!expandTerm(db, m_reason, + SDCM_NOSTEMMING|SDCM_CASESENS|SDCM_DIACSENS, + *pit, exp, sterm, wrap_prefix(pathelt_prefix))) { + return false; + } + LOGDEB0(("SDataPath::toNative: exp size %d\n", exp.size())); + listVector("", exp); + if (exp.size() == 1) + orqueries.push_back(Xapian::Query(exp[0])); + else + orqueries.push_back(Xapian::Query(Xapian::Query::OP_OR, + exp.begin(), exp.end())); + m_curcl += exp.size(); + if (m_curcl >= getMaxCl()) + return false; } + *qp = Xapian::Query(Xapian::Query::OP_PHRASE, - pvpath.begin(), pvpath.end()); + orqueries.begin(), orqueries.end()); if (m_weight != 1.0) { *qp = Xapian::Query(Xapian::Query::OP_SCALE_WEIGHT, *qp, m_weight); diff --git a/src/rcldb/searchdata.h b/src/rcldb/searchdata.h index 24fd38a3..4c10f3d0 100644 --- a/src/rcldb/searchdata.h +++ b/src/rcldb/searchdata.h @@ -409,10 +409,10 @@ protected: * change but is no important enough to warrant it, this has to wait for * the next format change. */ -class SearchDataClausePath : public SearchDataClause { +class SearchDataClausePath : public SearchDataClauseSimple { public: SearchDataClausePath(const std::string& txt, bool excl = false) - : SearchDataClause(SCLT_PATH), m_text(txt) + : SearchDataClauseSimple(SCLT_PATH, txt, "dir") { m_exclude = excl; m_haveWildCards = false; @@ -427,13 +427,7 @@ public: } virtual bool toNativeQuery(Rcl::Db &, void *); - virtual const std::string& gettext() const - { - return m_text; - } -protected: - std::string m_text; }; /** diff --git a/src/sampleconf/fields b/src/sampleconf/fields index 8b154fa0..2d013b87 100644 --- a/src/sampleconf/fields +++ b/src/sampleconf/fields @@ -33,20 +33,18 @@ # The following ones are probably hard-coded in the c code, can't change at # all. # Also reserved: F(parentid), Q(uniqueid) -title = S ; wdfinc = 10 author = A -abstract = XS -caption = S -title = S -subject = S -keywords= K -xapyear = Y -xapyearmon = M xapdate = D +keywords= K +xapyearmon = M +title = S ; wdfinc = 10 mtype = T -rclUnsplitFN = XSFS -filename = XSFN ext = XE +dir = XP +abstract = XS +filename = XSFN +rclUnsplitFN = XSFS +xapyear = Y # Extension examples. These are actually used by default by Recoll, you can # add your own to search for fields produced by the filters and not handled @@ -72,13 +70,13 @@ recipient = XTO # "rclaptg" is used for viewer specialization (depending on local config) # "rclbes" defines the backend type (ie normal fs, firefox cache). Should # probably be hardcoded, don't remove it +abstract= author= -recipient= -rclaptg= -rclbes= filename= keywords= -abstract= +rclaptg= +rclbes= +recipient= [aliases] ##########################