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 }