diff --git a/src/rcldb/searchdata.cpp b/src/rcldb/searchdata.cpp index 7b7e254f..5e6ad7d7 100644 --- a/src/rcldb/searchdata.cpp +++ b/src/rcldb/searchdata.cpp @@ -64,9 +64,8 @@ SearchData::~SearchData() bool SearchData::maybeAddAutoPhrase(Rcl::Db& db, double freqThreshold) { LOGDEB0("SearchData::maybeAddAutoPhrase()\n"); - // cerr << "BEFORE SIMPLIFY\n"; dump(cerr); + simplify(); - // cerr << "AFTER SIMPLIFY\n"; dump(cerr); if (m_query.empty()) { LOGDEB2("SearchData::maybeAddAutoPhrase: empty query\n"); @@ -176,6 +175,7 @@ bool SearchData::fileNameOnly() void SearchData::simplify() { LOGDEB0("SearchData::simplify()\n"); + //std::cerr << "SIMPLIFY BEFORE: "; dump(std::cerr); for (unsigned int i = 0; i < m_query.size(); i++) { if (m_query[i]->m_tp != SCLT_SUB) continue; @@ -201,8 +201,10 @@ void SearchData::simplify() clsubp->getSub()->m_maxSize != -1 || clsubp->getSub()->m_minSize != -1 || clsubp->getSub()->m_haveWildCards) { - if (!clsubp->getSub()->m_query.empty()) + if (!clsubp->getSub()->m_query.empty()) { + LOGDEB0("Not simplifying because sub has special attributes and non-empty query\n"); continue; + } m_filetypes.insert(m_filetypes.end(), clsubp->getSub()->m_filetypes.begin(), clsubp->getSub()->m_filetypes.end()); @@ -221,21 +223,15 @@ void SearchData::simplify() // none anyway, we will just delete the subquery. } - // Delete the clause_sub, and insert the queries from its searchdata in its place m_query.erase(m_query.begin() + i); - m_query.insert(m_query.begin() + i, clsubp->getSub()->m_query.begin(), - clsubp->getSub()->m_query.end()); - for (unsigned int j = i; j < i + clsubp->getSub()->m_query.size(); j++) { - m_query[j]->setParent(this); + for (unsigned int j = 0; j < clsubp->getSub()->m_query.size(); j++) { + m_query.insert(m_query.begin() + i + j, clsubp->getSub()->m_query[j]->clone()); + m_query[i+j]->setParent(this); } i += int(clsubp->getSub()->m_query.size()) - 1; - - // We don't want the clauses to be deleted when the parent is, as we - // know own them. - clsubp->getSub()->m_query.clear(); - delete clsubp; } + //std::cerr << "SIMPLIFY AFTER: "; dump(std::cerr); } // Extract terms and groups for highlighting diff --git a/src/rcldb/searchdata.h b/src/rcldb/searchdata.h index d3c908e9..0368cf8e 100644 --- a/src/rcldb/searchdata.h +++ b/src/rcldb/searchdata.h @@ -100,7 +100,7 @@ public: bool toNativeQuery(Rcl::Db &db, void *); /** We become the owner of cl and will delete it */ - bool addClause(SearchDataClause* cl); + bool addClause(SearchDataClause *cl); /** If this is a simple query (one field only, no distance clauses), * add phrase made of query terms to query, so that docs containing the @@ -246,10 +246,11 @@ public: : m_tp(tp), m_parentSearch(0), m_haveWildCards(0), m_modifiers(SDCM_NONE), m_weight(1.0), m_exclude(false), m_rel(REL_CONTAINS) {} - virtual ~SearchDataClause() {} + virtual ~SearchDataClause() = default; SearchDataClause(const SearchDataClause &) = default; SearchDataClause& operator=(const SearchDataClause&) = default; - + virtual SearchDataClause* clone() = 0; + virtual bool toNativeQuery(Rcl::Db &db, void *) = 0; bool isFileName() const {return m_tp == SCLT_FILENAME ? true: false;} virtual std::string getReason() const {return m_reason;} @@ -336,8 +337,10 @@ public: m_haveWildCards = (txt.find_first_of(cstr_minwilds) != std::string::npos); } - - virtual ~SearchDataClauseSimple() {} + virtual ~SearchDataClauseSimple() = default; + virtual SearchDataClauseSimple *clone() override{ + return new SearchDataClauseSimple(*this); + } /** Translate to Xapian query */ virtual bool toNativeQuery(Rcl::Db &, void *) override; @@ -394,7 +397,10 @@ public: m_text = t1; m_t2 = t2; } - virtual ~SearchDataClauseRange() {} + virtual ~SearchDataClauseRange() = default; + virtual SearchDataClauseRange *clone() override { + return new SearchDataClauseRange(*this); + } virtual void dump(std::ostream& o) const override; virtual const std::string& gettext2() const { @@ -423,7 +429,10 @@ public: addModifier(SDCM_FILTER); } - virtual ~SearchDataClauseFilename() {} + virtual ~SearchDataClauseFilename() = default; + virtual SearchDataClauseFilename *clone() override { + return new SearchDataClauseFilename(*this); + } virtual bool toNativeQuery(Rcl::Db &, void *) override; virtual void dump(std::ostream& o) const override; @@ -458,8 +467,10 @@ public: m_haveWildCards = false; addModifier(SDCM_FILTER); } - - virtual ~SearchDataClausePath() {} + virtual ~SearchDataClausePath() = default; + virtual SearchDataClausePath *clone() override { + return new SearchDataClausePath(*this); + } virtual bool toNativeQuery(Rcl::Db &, void *) override; virtual void dump(std::ostream& o) const override; @@ -475,8 +486,10 @@ public: const std::string& fld = std::string()) : SearchDataClauseSimple(tp, txt, fld), m_slack(slack) {} - virtual ~SearchDataClauseDist() {} - + virtual ~SearchDataClauseDist() = default; + virtual SearchDataClauseDist *clone() override { + return new SearchDataClauseDist(*this); + } virtual bool toNativeQuery(Rcl::Db &, void *) override; virtual int getslack() const { return m_slack; @@ -494,6 +507,12 @@ class SearchDataClauseSub : public SearchDataClause { public: SearchDataClauseSub(std::shared_ptr sub) : SearchDataClause(SCLT_SUB), m_sub(sub) {} + virtual ~SearchDataClauseSub() = default; + + virtual SearchDataClauseSub *clone() override { + return new SearchDataClauseSub(*this); + } + virtual bool toNativeQuery(Rcl::Db &db, void *p) override { bool ret = m_sub->toNativeQuery(db, p); if (!ret)