File indexing completed on 2024-05-12 05:11:21

0001 /*
0002  * SPDX-FileCopyrightText: 2014 Vishesh Handa <me@vhanda.in>
0003  *
0004  * SPDX-License-Identifier: LGPL-2.1-or-later
0005  *
0006  */
0007 
0008 #include "xapiandocument.h"
0009 
0010 using namespace Akonadi::Search;
0011 
0012 XapianDocument::XapianDocument()
0013     : m_termGen(&m_doc)
0014 {
0015 }
0016 
0017 XapianDocument::XapianDocument(const Xapian::Document &doc)
0018     : m_doc(doc)
0019     , m_termGen(&m_doc)
0020 {
0021 }
0022 
0023 void XapianDocument::addTerm(const QString &term, const QString &prefix)
0024 {
0025     const QByteArray arr = prefix.toUtf8() + term.toUtf8();
0026 
0027     m_doc.add_term(arr.constData());
0028 }
0029 
0030 void XapianDocument::addBoolTerm(int term, const QString &prefix)
0031 {
0032     addBoolTerm(QString::number(term), prefix);
0033 }
0034 
0035 void XapianDocument::addBoolTerm(const QString &term, const QString &prefix)
0036 {
0037     const QByteArray arr = prefix.toUtf8() + term.toUtf8();
0038 
0039     m_doc.add_boolean_term(arr.constData());
0040 }
0041 
0042 void XapianDocument::indexText(const QString &text, const QString &prefix, int wdfInc)
0043 {
0044     m_termGen.indexText(text, prefix, wdfInc);
0045 }
0046 
0047 void XapianDocument::indexText(const QString &text, int wdfInc)
0048 {
0049     indexText(text, QString(), wdfInc);
0050 }
0051 
0052 Xapian::Document XapianDocument::doc() const
0053 {
0054     return m_doc;
0055 }
0056 
0057 void XapianDocument::addValue(int pos, const QString &value)
0058 {
0059     m_doc.add_value(pos, value.toStdString());
0060 }
0061 
0062 QString XapianDocument::fetchTermStartsWith(const QByteArray &term)
0063 {
0064     try {
0065         Xapian::TermIterator it = m_doc.termlist_begin();
0066         it.skip_to(term.constData());
0067 
0068         if (it == m_doc.termlist_end()) {
0069             return {};
0070         }
0071         std::string str = *it;
0072         return QString::fromUtf8(str.c_str(), str.length());
0073     } catch (const Xapian::Error &) {
0074         return {};
0075     }
0076 }
0077 
0078 bool XapianDocument::removeTermStartsWith(const QByteArray &prefix)
0079 {
0080     bool modified = false;
0081 
0082     Xapian::TermIterator it = m_doc.termlist_begin();
0083     it.skip_to(prefix.constData());
0084     while (it != m_doc.termlist_end()) {
0085         const std::string t = *it;
0086         const QByteArray term = QByteArray::fromRawData(t.c_str(), t.size());
0087         if (!term.startsWith(prefix)) {
0088             break;
0089         }
0090 
0091         // The term should not just be the prefix
0092         if (term.size() <= prefix.size()) {
0093             break;
0094         }
0095 
0096         // The term should not contain any more upper case letters
0097         if (isupper(term.at(prefix.size()))) {
0098             ++it;
0099             continue;
0100         }
0101 
0102         ++it;
0103         m_doc.remove_term(t);
0104         modified = true;
0105     }
0106 
0107     return modified;
0108 }