From 684ee4d2b1d2f672588ebff6261199be691f9103 Mon Sep 17 00:00:00 2001 From: Martin Rotter Date: Sat, 24 Oct 2020 20:32:35 +0200 Subject: [PATCH] Work on labels, it is starting to look good. --- src/librssguard/core/messagesmodel.cpp | 4 + .../core/messagesmodelsqllayer.cpp | 5 -- .../miscellaneous/databasequeries.cpp | 79 ++++++++++++++++++- .../miscellaneous/databasequeries.h | 12 ++- src/librssguard/services/abstract/feed.h | 21 +++-- src/librssguard/services/abstract/label.cpp | 6 ++ src/librssguard/services/abstract/label.h | 1 + .../services/abstract/labelsnode.cpp | 6 ++ .../services/abstract/labelsnode.h | 1 + .../services/abstract/rootitem.cpp | 2 +- .../inoreader/inoreaderserviceroot.cpp | 2 - 11 files changed, 110 insertions(+), 29 deletions(-) diff --git a/src/librssguard/core/messagesmodel.cpp b/src/librssguard/core/messagesmodel.cpp index 7329b5906..3ca8efe8f 100644 --- a/src/librssguard/core/messagesmodel.cpp +++ b/src/librssguard/core/messagesmodel.cpp @@ -53,6 +53,10 @@ void MessagesModel::repopulate() { while (canFetchMore()) { fetchMore(); } + + qDebugNN << LOGSEC_MESSAGEMODEL + << "Repopulated model, SQL statement is now:\n" + << QUOTE_W_SPACE_DOT(selectStatement()); } bool MessagesModel::setData(const QModelIndex& index, const QVariant& value, int role) { diff --git a/src/librssguard/core/messagesmodelsqllayer.cpp b/src/librssguard/core/messagesmodelsqllayer.cpp index 1179157f4..42a2edb37 100644 --- a/src/librssguard/core/messagesmodelsqllayer.cpp +++ b/src/librssguard/core/messagesmodelsqllayer.cpp @@ -72,11 +72,6 @@ void MessagesModelSqlLayer::addSortState(int column, Qt::SortOrder order) { m_sortColumns.prepend(column); m_sortOrders.prepend(order); } - - qDebugNN << LOGSEC_MESSAGEMODEL - << "Added sort state, select statement is now:\n'" - << selectStatement() - << "'"; } void MessagesModelSqlLayer::setFilter(const QString& filter) { diff --git a/src/librssguard/miscellaneous/databasequeries.cpp b/src/librssguard/miscellaneous/databasequeries.cpp index 966a73618..b00ca5ff7 100755 --- a/src/librssguard/miscellaneous/databasequeries.cpp +++ b/src/librssguard/miscellaneous/databasequeries.cpp @@ -604,6 +604,81 @@ int DatabaseQueries::getMessageCountsForBin(const QSqlDatabase& db, int account_ } } +QList DatabaseQueries::getUndeletedMessagesWithLabel(const QSqlDatabase& db, const Label* label, bool* ok) { + QList messages; + QSqlQuery q(db); + + q.prepare(QSL( + "SELECT Messages.id, Messages.is_read, Messages.is_deleted, Messages.is_important, Feeds.title, Messages.title, Messages.url, Messages.author, Messages.date_created, Messages.contents, Messages.is_pdeleted, Messages.enclosures, Messages.account_id, Messages.custom_id, Messages.custom_hash, Messages.feed, CASE WHEN length(Messages.enclosures) > 10 THEN 'true' ELSE 'false' END AS has_enclosures " + "FROM Messages " + "INNER JOIN Feeds " + "ON Messages.feed = Feeds.custom_id AND Messages.account_id = :account_id AND Messages.account_id = Feeds.account_id " + "INNER JOIN LabelsInMessages " + "ON " + " Messages.is_pdeleted = 0 AND Messages.is_deleted = 0 AND " + " LabelsInMessages.account_id = :account_id AND LabelsInMessages.account_id = Messages.account_id AND " + " LabelsInMessages.label = :label AND LabelsInMessages.message = Messages.custom_id;")); + q.bindValue(QSL(":account_id"), label->getParentServiceRoot()->accountId()); + q.bindValue(QSL(":label"), label->customId()); + + if (q.exec()) { + while (q.next()) { + bool decoded; + Message message = Message::fromSqlRecord(q.record(), &decoded); + + if (decoded) { + messages.append(message); + } + } + + if (ok != nullptr) { + *ok = true; + } + } + else { + if (ok != nullptr) { + *ok = false; + } + } + + return messages; +} + +QList DatabaseQueries::getUndeletedLabelledMessages(const QSqlDatabase& db, int account_id, bool* ok) { + QList messages; + QSqlQuery q(db); + + q.prepare(QSL( + "SELECT Messages.id, Messages.is_read, Messages.is_deleted, Messages.is_important, Feeds.title, Messages.title, Messages.url, Messages.author, Messages.date_created, Messages.contents, Messages.is_pdeleted, Messages.enclosures, Messages.account_id, Messages.custom_id, Messages.custom_hash, Messages.feed, CASE WHEN length(Messages.enclosures) > 10 THEN 'true' ELSE 'false' END AS has_enclosures " + "FROM Messages " + "LEFT JOIN Feeds " + "ON Messages.feed = Feeds.custom_id AND Messages.account_id = Feeds.account_id " + "WHERE Messages.is_deleted = 0 AND Messages.is_pdeleted = 0 AND Messages.account_id = :account_id AND (SELECT COUNT(*) FROM LabelsInMessages WHERE account_id = :account_id AND message = Messages.custom_id) > 0;")); + q.bindValue(QSL(":account_id"), account_id); + + if (q.exec()) { + while (q.next()) { + bool decoded; + Message message = Message::fromSqlRecord(q.record(), &decoded); + + if (decoded) { + messages.append(message); + } + } + + if (ok != nullptr) { + *ok = true; + } + } + else { + if (ok != nullptr) { + *ok = false; + } + } + + return messages; +} + QList DatabaseQueries::getUndeletedImportantMessages(const QSqlDatabase& db, int account_id, bool* ok) { QList messages; QSqlQuery q(db); @@ -637,8 +712,8 @@ QList DatabaseQueries::getUndeletedImportantMessages(const QSqlDatabase return messages; } -QList DatabaseQueries::getUndeletedMessagesForFeed(const QSqlDatabase& db, const QString& feed_custom_id, int account_id, - bool* ok) { +QList DatabaseQueries::getUndeletedMessagesForFeed(const QSqlDatabase& db, const QString& feed_custom_id, + int account_id, bool* ok) { QList messages; QSqlQuery q(db); diff --git a/src/librssguard/miscellaneous/databasequeries.h b/src/librssguard/miscellaneous/databasequeries.h index 729507a0d..f9ca50afa 100644 --- a/src/librssguard/miscellaneous/databasequeries.h +++ b/src/librssguard/miscellaneous/databasequeries.h @@ -69,13 +69,11 @@ class DatabaseQueries { static int getMessageCountsForBin(const QSqlDatabase& db, int account_id, bool including_total_counts, bool* ok = nullptr); // Get messages (for newspaper view for example). - static QList getUndeletedImportantMessages(const QSqlDatabase& db, - int account_id, - bool* ok = nullptr); - static QList getUndeletedMessagesForFeed(const QSqlDatabase& db, - const QString& feed_custom_id, - int account_id, - bool* ok = nullptr); + static QList getUndeletedMessagesWithLabel(const QSqlDatabase& db, const Label* label, bool* ok = nullptr); + static QList getUndeletedLabelledMessages(const QSqlDatabase& db, int account_id, bool* ok = nullptr); + static QList getUndeletedImportantMessages(const QSqlDatabase& db, int account_id, bool* ok = nullptr); + static QList getUndeletedMessagesForFeed(const QSqlDatabase& db, const QString& feed_custom_id, + int account_id, bool* ok = nullptr); static QList getUndeletedMessagesForBin(const QSqlDatabase& db, int account_id, bool* ok = nullptr); static QList getUndeletedMessagesForAccount(const QSqlDatabase& db, int account_id, bool* ok = nullptr); diff --git a/src/librssguard/services/abstract/feed.h b/src/librssguard/services/abstract/feed.h index 1014ef85c..c4e46e9d8 100644 --- a/src/librssguard/services/abstract/feed.h +++ b/src/librssguard/services/abstract/feed.h @@ -42,12 +42,13 @@ class Feed : public RootItem { explicit Feed(const Feed& other); virtual ~Feed(); - QList undeletedMessages() const; - - QString additionalTooltip() const; - - int countOfAllMessages() const; - int countOfUnreadMessages() const; + virtual QList undeletedMessages() const; + virtual QString additionalTooltip() const; + virtual bool markAsReadUnread(ReadStatus status); + virtual bool cleanMessages(bool clean_read_only); + virtual QList obtainNewMessages(bool* error_during_obtaining) = 0; + virtual int countOfAllMessages() const; + virtual int countOfUnreadMessages() const; void setCountOfAllMessages(int count_all_messages); void setCountOfUnreadMessages(int count_unread_messages); @@ -74,14 +75,10 @@ class Feed : public RootItem { void setMessageFilters(const QList>& messageFilters); void removeMessageFilter(MessageFilter* filter); - bool markAsReadUnread(ReadStatus status); - bool cleanMessages(bool clean_read_only); - - virtual QList obtainNewMessages(bool* error_during_obtaining) = 0; + int updateMessages(const QList& messages, bool error_during_obtaining); public slots: - void updateCounts(bool including_total_count); - int updateMessages(const QList& messages, bool error_during_obtaining); + virtual void updateCounts(bool including_total_count); protected: QString getAutoUpdateStatusDescription() const; diff --git a/src/librssguard/services/abstract/label.cpp b/src/librssguard/services/abstract/label.cpp index ead4ea3d1..24dc591e6 100755 --- a/src/librssguard/services/abstract/label.cpp +++ b/src/librssguard/services/abstract/label.cpp @@ -87,6 +87,12 @@ void Label::updateCounts(bool including_total_count) { setCountOfUnreadMessages(DatabaseQueries::getMessageCountsForLabel(database, this, account_id, false)); } +QList Label::undeletedMessages() const { + QSqlDatabase database = qApp->database()->connection(metaObject()->className()); + + return DatabaseQueries::getUndeletedMessagesWithLabel(database, this); +} + QIcon Label::generateIcon(const QColor& color) { QPixmap pxm(64, 64); diff --git a/src/librssguard/services/abstract/label.h b/src/librssguard/services/abstract/label.h index efe3543f4..777a48b0a 100755 --- a/src/librssguard/services/abstract/label.h +++ b/src/librssguard/services/abstract/label.h @@ -29,6 +29,7 @@ class Label : public RootItem { virtual bool canBeDeleted() const; virtual bool deleteViaGui(); virtual void updateCounts(bool including_total_count); + virtual QList undeletedMessages() const; static QIcon generateIcon(const QColor& color); public slots: diff --git a/src/librssguard/services/abstract/labelsnode.cpp b/src/librssguard/services/abstract/labelsnode.cpp index b6ed94dcd..057704d87 100755 --- a/src/librssguard/services/abstract/labelsnode.cpp +++ b/src/librssguard/services/abstract/labelsnode.cpp @@ -26,6 +26,12 @@ void LabelsNode::loadLabels(const QList& labels) { } } +QList LabelsNode::undeletedMessages() const { + QSqlDatabase database = qApp->database()->connection(metaObject()->className()); + + return DatabaseQueries::getUndeletedLabelledMessages(database, getParentServiceRoot()->accountId()); +} + QList LabelsNode::labels() const { auto list = boolinq::from(childItems()).select([](RootItem* it) { return static_cast(it); diff --git a/src/librssguard/services/abstract/labelsnode.h b/src/librssguard/services/abstract/labelsnode.h index b21c2bf45..f06dd2420 100755 --- a/src/librssguard/services/abstract/labelsnode.h +++ b/src/librssguard/services/abstract/labelsnode.h @@ -16,6 +16,7 @@ class LabelsNode : public RootItem { QList labels() const; void loadLabels(const QList& labels); + virtual QList undeletedMessages() const; virtual QList contextMenuFeedsList(); public slots: diff --git a/src/librssguard/services/abstract/rootitem.cpp b/src/librssguard/services/abstract/rootitem.cpp index 49bcdfaff..76a7ec6a8 100644 --- a/src/librssguard/services/abstract/rootitem.cpp +++ b/src/librssguard/services/abstract/rootitem.cpp @@ -84,7 +84,7 @@ QList RootItem::undeletedMessages() const { QList messages; for (RootItem* child : m_childItems) { - if (child->kind() != RootItem::Kind::Bin) { + if (child->kind() != Kind::Bin && child->kind() != Kind::Labels && child->kind() != Kind::Label) { messages.append(child->undeletedMessages()); } } diff --git a/src/librssguard/services/inoreader/inoreaderserviceroot.cpp b/src/librssguard/services/inoreader/inoreaderserviceroot.cpp index ea29145f9..3ff341c9d 100644 --- a/src/librssguard/services/inoreader/inoreaderserviceroot.cpp +++ b/src/librssguard/services/inoreader/inoreaderserviceroot.cpp @@ -144,8 +144,6 @@ RootItem* InoreaderServiceRoot::obtainNewTreeForSyncIn() const { else { return nullptr; } - - return tree; } void InoreaderServiceRoot::saveAllCachedData(bool async) {