From 778b01181604dc2eae2013f2dc37db6d647b526a Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Mon, 8 May 2017 14:27:25 +0200 Subject: Gather required databases from index definitions. --- common/mail/threadindexer.cpp | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'common/mail/threadindexer.cpp') diff --git a/common/mail/threadindexer.cpp b/common/mail/threadindexer.cpp index d91ab5f..af96b94 100644 --- a/common/mail/threadindexer.cpp +++ b/common/mail/threadindexer.cpp @@ -145,3 +145,10 @@ void ThreadIndexer::remove(const ApplicationDomain::ApplicationDomainType &entit } +QMap ThreadIndexer::databases() +{ + return {{"mail.index.messageIdthreadId", 1}, + {"mail.index.subjectthreadId", 1}, + {"mail.index.threadIdmessageId", 1}}; +} + -- cgit v1.2.3 From 41f8f9bc05c059cafa780ac8aec27a56cba2c278 Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Fri, 12 May 2017 08:20:43 +0200 Subject: No more SINK_DEBUG_AREA --- common/mail/threadindexer.cpp | 2 -- 1 file changed, 2 deletions(-) (limited to 'common/mail/threadindexer.cpp') diff --git a/common/mail/threadindexer.cpp b/common/mail/threadindexer.cpp index af96b94..473f28e 100644 --- a/common/mail/threadindexer.cpp +++ b/common/mail/threadindexer.cpp @@ -21,8 +21,6 @@ #include "typeindex.h" #include "log.h" -SINK_DEBUG_AREA("threadindex") - using namespace Sink; using namespace Sink::ApplicationDomain; -- cgit v1.2.3 From 192cb00abb964a07df2403513f527598b6791df2 Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Thu, 15 Jun 2017 10:06:28 +0200 Subject: No more threading by subject It seems to do more harm than good, creating huge threads, and the webclient doesn't do it either. --- common/mail/threadindexer.cpp | 74 ++----------------------------------------- 1 file changed, 2 insertions(+), 72 deletions(-) (limited to 'common/mail/threadindexer.cpp') diff --git a/common/mail/threadindexer.cpp b/common/mail/threadindexer.cpp index 473f28e..ea2cf71 100644 --- a/common/mail/threadindexer.cpp +++ b/common/mail/threadindexer.cpp @@ -24,69 +24,12 @@ using namespace Sink; using namespace Sink::ApplicationDomain; -static QString stripOffPrefixes(const QString &subject) -{ - //TODO this hardcoded list is probably not good enough (especially regarding internationalization) - //TODO this whole routine, including internationalized re/fwd ... should go into some library. - //We'll require the same for generating reply/forward subjects in kube - static QStringList defaultReplyPrefixes = QStringList() << QLatin1String("Re\\s*:") - << QLatin1String("Re\\[\\d+\\]:") - << QLatin1String("Re\\d+:"); - - static QStringList defaultForwardPrefixes = QStringList() << QLatin1String("Fwd:") - << QLatin1String("FW:"); - - QStringList replyPrefixes; // = GlobalSettings::self()->replyPrefixes(); - if (replyPrefixes.isEmpty()) { - replyPrefixes = defaultReplyPrefixes; - } - - QStringList forwardPrefixes; // = GlobalSettings::self()->forwardPrefixes(); - if (forwardPrefixes.isEmpty()) { - forwardPrefixes = defaultReplyPrefixes; - } - - const QStringList prefixRegExps = replyPrefixes + forwardPrefixes; - - // construct a big regexp that - // 1. is anchored to the beginning of str (sans whitespace) - // 2. matches at least one of the part regexps in prefixRegExps - const QString bigRegExp = QString::fromLatin1("^(?:\\s+|(?:%1))+\\s*").arg(prefixRegExps.join(QLatin1String(")|(?:"))); - - static QString regExpPattern; - static QRegExp regExp; - - regExp.setCaseSensitivity(Qt::CaseInsensitive); - if (regExpPattern != bigRegExp) { - // the prefixes have changed, so update the regexp - regExpPattern = bigRegExp; - regExp.setPattern(regExpPattern); - } - - if(regExp.isValid()) { - QString tmp = subject; - if (regExp.indexIn( tmp ) == 0) { - return tmp.remove(0, regExp.matchedLength()); - } - } else { - SinkWarning() << "bigRegExp = \"" - << bigRegExp << "\"\n" - << "prefix regexp is invalid!"; - } - - return subject; -} - - void ThreadIndexer::updateThreadingIndex(const QByteArray &identifier, const ApplicationDomain::ApplicationDomainType &entity, Sink::Storage::DataStore::Transaction &transaction) { auto messageId = entity.getProperty(Mail::MessageId::name); auto parentMessageId = entity.getProperty(Mail::ParentMessageId::name); - const auto subject = entity.getProperty(Mail::Subject::name); - const auto normalizedSubject = stripOffPrefixes(subject.toString()).toUtf8(); if (messageId.toByteArray().isEmpty()) { SinkWarning() << "Found an email without messageId. This is illegal and threading will break. Entity id: " << identifier; - SinkWarning() << "Subject: " << subject; } QVector thread; @@ -99,18 +42,9 @@ void ThreadIndexer::updateThreadingIndex(const QByteArray &identifier, const App thread = index().secondaryLookup(parentMessageId); SinkTrace() << "Found parent: " << thread; } - if (thread.isEmpty()) { - //Try to lookup the thread by subject if not empty - if ( !normalizedSubject.isEmpty()) { - thread = index().secondaryLookup(normalizedSubject); - } - if (thread.isEmpty()) { - thread << QUuid::createUuid().toByteArray(); - SinkTrace() << "Created a new thread: " << thread; - } else { - SinkTrace() << "Found thread by subject: " << thread; - } + thread << QUuid::createUuid().toByteArray(); + SinkTrace() << "Created a new thread: " << thread; } Q_ASSERT(!thread.isEmpty()); @@ -122,9 +56,6 @@ void ThreadIndexer::updateThreadingIndex(const QByteArray &identifier, const App } index().index(messageId, thread.first(), transaction); index().index(thread.first(), messageId, transaction); - if (!normalizedSubject.isEmpty()) { - index().index(normalizedSubject, thread.first(), transaction); - } } @@ -146,7 +77,6 @@ void ThreadIndexer::remove(const ApplicationDomain::ApplicationDomainType &entit QMap ThreadIndexer::databases() { return {{"mail.index.messageIdthreadId", 1}, - {"mail.index.subjectthreadId", 1}, {"mail.index.threadIdmessageId", 1}}; } -- cgit v1.2.3 From 1ef92b9d681e614d65b0ca0a2abdfd81a943e778 Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Wed, 24 May 2017 13:30:34 +0200 Subject: Added threading index cleanup --- common/mail/threadindexer.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'common/mail/threadindexer.cpp') diff --git a/common/mail/threadindexer.cpp b/common/mail/threadindexer.cpp index ea2cf71..4171d85 100644 --- a/common/mail/threadindexer.cpp +++ b/common/mail/threadindexer.cpp @@ -71,7 +71,10 @@ void ThreadIndexer::modify(const ApplicationDomain::ApplicationDomainType &old, void ThreadIndexer::remove(const ApplicationDomain::ApplicationDomainType &entity) { - + auto messageId = entity.getProperty(Mail::MessageId::name); + auto thread = index().secondaryLookup(messageId); + index().unindex(messageId.toByteArray(), thread.first(), transaction()); + index().unindex(thread.first(), messageId.toByteArray(), transaction()); } QMap ThreadIndexer::databases() -- cgit v1.2.3