Fix searchdata::simplify() ending up erasing the GUI query, which could need to be reused for further filtering changes
This commit is contained in:
parent
21fedc1fb4
commit
394264a165
@ -64,9 +64,8 @@ SearchData::~SearchData()
|
|||||||
bool SearchData::maybeAddAutoPhrase(Rcl::Db& db, double freqThreshold)
|
bool SearchData::maybeAddAutoPhrase(Rcl::Db& db, double freqThreshold)
|
||||||
{
|
{
|
||||||
LOGDEB0("SearchData::maybeAddAutoPhrase()\n");
|
LOGDEB0("SearchData::maybeAddAutoPhrase()\n");
|
||||||
// cerr << "BEFORE SIMPLIFY\n"; dump(cerr);
|
|
||||||
simplify();
|
simplify();
|
||||||
// cerr << "AFTER SIMPLIFY\n"; dump(cerr);
|
|
||||||
|
|
||||||
if (m_query.empty()) {
|
if (m_query.empty()) {
|
||||||
LOGDEB2("SearchData::maybeAddAutoPhrase: empty query\n");
|
LOGDEB2("SearchData::maybeAddAutoPhrase: empty query\n");
|
||||||
@ -176,6 +175,7 @@ bool SearchData::fileNameOnly()
|
|||||||
void SearchData::simplify()
|
void SearchData::simplify()
|
||||||
{
|
{
|
||||||
LOGDEB0("SearchData::simplify()\n");
|
LOGDEB0("SearchData::simplify()\n");
|
||||||
|
//std::cerr << "SIMPLIFY BEFORE: "; dump(std::cerr);
|
||||||
for (unsigned int i = 0; i < m_query.size(); i++) {
|
for (unsigned int i = 0; i < m_query.size(); i++) {
|
||||||
if (m_query[i]->m_tp != SCLT_SUB)
|
if (m_query[i]->m_tp != SCLT_SUB)
|
||||||
continue;
|
continue;
|
||||||
@ -201,8 +201,10 @@ void SearchData::simplify()
|
|||||||
clsubp->getSub()->m_maxSize != -1 ||
|
clsubp->getSub()->m_maxSize != -1 ||
|
||||||
clsubp->getSub()->m_minSize != -1 ||
|
clsubp->getSub()->m_minSize != -1 ||
|
||||||
clsubp->getSub()->m_haveWildCards) {
|
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;
|
continue;
|
||||||
|
}
|
||||||
m_filetypes.insert(m_filetypes.end(),
|
m_filetypes.insert(m_filetypes.end(),
|
||||||
clsubp->getSub()->m_filetypes.begin(),
|
clsubp->getSub()->m_filetypes.begin(),
|
||||||
clsubp->getSub()->m_filetypes.end());
|
clsubp->getSub()->m_filetypes.end());
|
||||||
@ -221,21 +223,15 @@ void SearchData::simplify()
|
|||||||
// none anyway, we will just delete the subquery.
|
// none anyway, we will just delete the subquery.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Delete the clause_sub, and insert the queries from its searchdata in its place
|
// Delete the clause_sub, and insert the queries from its searchdata in its place
|
||||||
m_query.erase(m_query.begin() + i);
|
m_query.erase(m_query.begin() + i);
|
||||||
m_query.insert(m_query.begin() + i, clsubp->getSub()->m_query.begin(),
|
for (unsigned int j = 0; j < clsubp->getSub()->m_query.size(); j++) {
|
||||||
clsubp->getSub()->m_query.end());
|
m_query.insert(m_query.begin() + i + j, clsubp->getSub()->m_query[j]->clone());
|
||||||
for (unsigned int j = i; j < i + clsubp->getSub()->m_query.size(); j++) {
|
m_query[i+j]->setParent(this);
|
||||||
m_query[j]->setParent(this);
|
|
||||||
}
|
}
|
||||||
i += int(clsubp->getSub()->m_query.size()) - 1;
|
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
|
// Extract terms and groups for highlighting
|
||||||
|
|||||||
@ -100,7 +100,7 @@ public:
|
|||||||
bool toNativeQuery(Rcl::Db &db, void *);
|
bool toNativeQuery(Rcl::Db &db, void *);
|
||||||
|
|
||||||
/** We become the owner of cl and will delete it */
|
/** 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),
|
/** 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
|
* 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_tp(tp), m_parentSearch(0), m_haveWildCards(0),
|
||||||
m_modifiers(SDCM_NONE), m_weight(1.0), m_exclude(false),
|
m_modifiers(SDCM_NONE), m_weight(1.0), m_exclude(false),
|
||||||
m_rel(REL_CONTAINS) {}
|
m_rel(REL_CONTAINS) {}
|
||||||
virtual ~SearchDataClause() {}
|
virtual ~SearchDataClause() = default;
|
||||||
SearchDataClause(const SearchDataClause &) = default;
|
SearchDataClause(const SearchDataClause &) = default;
|
||||||
SearchDataClause& operator=(const SearchDataClause&) = default;
|
SearchDataClause& operator=(const SearchDataClause&) = default;
|
||||||
|
virtual SearchDataClause* clone() = 0;
|
||||||
|
|
||||||
virtual bool toNativeQuery(Rcl::Db &db, void *) = 0;
|
virtual bool toNativeQuery(Rcl::Db &db, void *) = 0;
|
||||||
bool isFileName() const {return m_tp == SCLT_FILENAME ? true: false;}
|
bool isFileName() const {return m_tp == SCLT_FILENAME ? true: false;}
|
||||||
virtual std::string getReason() const {return m_reason;}
|
virtual std::string getReason() const {return m_reason;}
|
||||||
@ -336,8 +337,10 @@ public:
|
|||||||
m_haveWildCards =
|
m_haveWildCards =
|
||||||
(txt.find_first_of(cstr_minwilds) != std::string::npos);
|
(txt.find_first_of(cstr_minwilds) != std::string::npos);
|
||||||
}
|
}
|
||||||
|
virtual ~SearchDataClauseSimple() = default;
|
||||||
virtual ~SearchDataClauseSimple() {}
|
virtual SearchDataClauseSimple *clone() override{
|
||||||
|
return new SearchDataClauseSimple(*this);
|
||||||
|
}
|
||||||
|
|
||||||
/** Translate to Xapian query */
|
/** Translate to Xapian query */
|
||||||
virtual bool toNativeQuery(Rcl::Db &, void *) override;
|
virtual bool toNativeQuery(Rcl::Db &, void *) override;
|
||||||
@ -394,7 +397,10 @@ public:
|
|||||||
m_text = t1;
|
m_text = t1;
|
||||||
m_t2 = t2;
|
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 void dump(std::ostream& o) const override;
|
||||||
virtual const std::string& gettext2() const {
|
virtual const std::string& gettext2() const {
|
||||||
@ -423,7 +429,10 @@ public:
|
|||||||
addModifier(SDCM_FILTER);
|
addModifier(SDCM_FILTER);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual ~SearchDataClauseFilename() {}
|
virtual ~SearchDataClauseFilename() = default;
|
||||||
|
virtual SearchDataClauseFilename *clone() override {
|
||||||
|
return new SearchDataClauseFilename(*this);
|
||||||
|
}
|
||||||
|
|
||||||
virtual bool toNativeQuery(Rcl::Db &, void *) override;
|
virtual bool toNativeQuery(Rcl::Db &, void *) override;
|
||||||
virtual void dump(std::ostream& o) const override;
|
virtual void dump(std::ostream& o) const override;
|
||||||
@ -458,8 +467,10 @@ public:
|
|||||||
m_haveWildCards = false;
|
m_haveWildCards = false;
|
||||||
addModifier(SDCM_FILTER);
|
addModifier(SDCM_FILTER);
|
||||||
}
|
}
|
||||||
|
virtual ~SearchDataClausePath() = default;
|
||||||
virtual ~SearchDataClausePath() {}
|
virtual SearchDataClausePath *clone() override {
|
||||||
|
return new SearchDataClausePath(*this);
|
||||||
|
}
|
||||||
|
|
||||||
virtual bool toNativeQuery(Rcl::Db &, void *) override;
|
virtual bool toNativeQuery(Rcl::Db &, void *) override;
|
||||||
virtual void dump(std::ostream& o) const override;
|
virtual void dump(std::ostream& o) const override;
|
||||||
@ -475,8 +486,10 @@ public:
|
|||||||
const std::string& fld = std::string())
|
const std::string& fld = std::string())
|
||||||
: SearchDataClauseSimple(tp, txt, fld), m_slack(slack) {}
|
: 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 bool toNativeQuery(Rcl::Db &, void *) override;
|
||||||
virtual int getslack() const {
|
virtual int getslack() const {
|
||||||
return m_slack;
|
return m_slack;
|
||||||
@ -494,6 +507,12 @@ class SearchDataClauseSub : public SearchDataClause {
|
|||||||
public:
|
public:
|
||||||
SearchDataClauseSub(std::shared_ptr<SearchData> sub)
|
SearchDataClauseSub(std::shared_ptr<SearchData> sub)
|
||||||
: SearchDataClause(SCLT_SUB), m_sub(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 {
|
virtual bool toNativeQuery(Rcl::Db &db, void *p) override {
|
||||||
bool ret = m_sub->toNativeQuery(db, p);
|
bool ret = m_sub->toNativeQuery(db, p);
|
||||||
if (!ret)
|
if (!ret)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user