try to use sql to display label names

This commit is contained in:
Martin Rotter 2023-06-14 10:24:30 +02:00
parent d866378dfd
commit 4c238d2e05
3 changed files with 35 additions and 11 deletions

View File

@ -12,7 +12,7 @@ MessagesModelSqlLayer::MessagesModelSqlLayer()
m_db = qApp->database()->driver()->connection(QSL("MessagesModel"));
// Used in <x>: SELECT <x1>, <x2> FROM ....;
m_fieldNames = DatabaseQueries::messageTableAttributes(false);
m_fieldNames = DatabaseQueries::messageTableAttributes(false, m_db.driverName() == QSL(APP_DB_SQLITE_DRIVER));
// Used in <x>: SELECT ... FROM ... ORDER BY <x1> DESC, <x2> ASC;
m_orderByNames[MSG_DB_ID_INDEX] = QSL("Messages.id");

View File

@ -13,7 +13,7 @@
#include <QUrl>
#include <QVariant>
QMap<int, QString> DatabaseQueries::messageTableAttributes(bool only_msg_table) {
QMap<int, QString> DatabaseQueries::messageTableAttributes(bool only_msg_table, bool is_sqlite) {
QMap<int, QString> field_names;
field_names[MSG_DB_ID_INDEX] = QSL("Messages.id");
@ -38,7 +38,17 @@ QMap<int, QString> DatabaseQueries::messageTableAttributes(bool only_msg_table)
"ELSE 'false' "
"END AS has_enclosures");
field_names[MSG_DB_LABELS] = QSL("1 as msg_labels");
if (is_sqlite) {
field_names[MSG_DB_LABELS] =
QSL("(SELECT GROUP_CONCAT(Labels.name) FROM Labels WHERE Messages.labels LIKE \"%.\" || "
"Labels.custom_id || \".%\") as msg_labels");
}
else {
field_names[MSG_DB_LABELS] =
QSL("(SELECT GROUP_CONCAT(Labels.name) FROM Labels WHERE Messages.labels LIKE CONCAT(\"%.\", "
"Labels.custom_id, \".%\")) as msg_labels");
}
field_names[MSG_DB_LABELS_IDS] = QSL("Messages.labels");
// TODO: zpomaluje zobrazení seznamu zpráv
@ -877,7 +887,9 @@ QList<Message> DatabaseQueries::getUndeletedMessagesWithLabel(const QSqlDatabase
" Messages.is_pdeleted = 0 AND "
" Messages.account_id = :account_id AND "
" Messages.labels LIKE :label;")
.arg(messageTableAttributes(true).values().join(QSL(", "))));
.arg(messageTableAttributes(true, db.driverName() == QSL(APP_DB_SQLITE_DRIVER))
.values()
.join(QSL(", "))));
q.bindValue(QSL(":account_id"), label->getParentServiceRoot()->accountId());
q.bindValue(QSL(":label"), QSL("%.%1.%").arg(label->customId()));
@ -917,7 +929,9 @@ QList<Message> DatabaseQueries::getUndeletedLabelledMessages(const QSqlDatabase&
" Messages.is_pdeleted = 0 AND "
" Messages.account_id = :account_id AND "
" LENGTH(Messages.labels) > 2;")
.arg(messageTableAttributes(true).values().join(QSL(", "))));
.arg(messageTableAttributes(true, db.driverName() == QSL(APP_DB_SQLITE_DRIVER))
.values()
.join(QSL(", "))));
q.bindValue(QSL(":account_id"), account_id);
if (q.exec()) {
@ -954,7 +968,9 @@ QList<Message> DatabaseQueries::getUndeletedImportantMessages(const QSqlDatabase
"FROM Messages "
"WHERE is_important = 1 AND is_deleted = 0 AND "
" is_pdeleted = 0 AND account_id = :account_id;")
.arg(messageTableAttributes(true).values().join(QSL(", "))));
.arg(messageTableAttributes(true, db.driverName() == QSL(APP_DB_SQLITE_DRIVER))
.values()
.join(QSL(", "))));
q.bindValue(QSL(":account_id"), account_id);
if (q.exec()) {
@ -989,7 +1005,9 @@ QList<Message> DatabaseQueries::getUndeletedUnreadMessages(const QSqlDatabase& d
"FROM Messages "
"WHERE is_read = 0 AND is_deleted = 0 AND "
" is_pdeleted = 0 AND account_id = :account_id;")
.arg(messageTableAttributes(true).values().join(QSL(", "))));
.arg(messageTableAttributes(true, db.driverName() == QSL(APP_DB_SQLITE_DRIVER))
.values()
.join(QSL(", "))));
q.bindValue(QSL(":account_id"), account_id);
if (q.exec()) {
@ -1027,7 +1045,9 @@ QList<Message> DatabaseQueries::getUndeletedMessagesForFeed(const QSqlDatabase&
"FROM Messages "
"WHERE is_deleted = 0 AND is_pdeleted = 0 AND "
" feed = :feed AND account_id = :account_id;")
.arg(messageTableAttributes(true).values().join(QSL(", "))));
.arg(messageTableAttributes(true, db.driverName() == QSL(APP_DB_SQLITE_DRIVER))
.values()
.join(QSL(", "))));
q.bindValue(QSL(":feed"), feed_custom_id);
q.bindValue(QSL(":account_id"), account_id);
@ -1062,7 +1082,9 @@ QList<Message> DatabaseQueries::getUndeletedMessagesForBin(const QSqlDatabase& d
q.prepare(QSL("SELECT %1 "
"FROM Messages "
"WHERE is_deleted = 1 AND is_pdeleted = 0 AND account_id = :account_id;")
.arg(messageTableAttributes(true).values().join(QSL(", "))));
.arg(messageTableAttributes(true, db.driverName() == QSL(APP_DB_SQLITE_DRIVER))
.values()
.join(QSL(", "))));
q.bindValue(QSL(":account_id"), account_id);
if (q.exec()) {
@ -1096,7 +1118,9 @@ QList<Message> DatabaseQueries::getUndeletedMessagesForAccount(const QSqlDatabas
q.prepare(QSL("SELECT %1 "
"FROM Messages "
"WHERE is_deleted = 0 AND is_pdeleted = 0 AND account_id = :account_id;")
.arg(messageTableAttributes(true).values().join(QSL(", "))));
.arg(messageTableAttributes(true, db.driverName() == QSL(APP_DB_SQLITE_DRIVER))
.values()
.join(QSL(", "))));
q.bindValue(QSL(":account_id"), account_id);
if (q.exec()) {

View File

@ -27,7 +27,7 @@ struct ArticleCounts {
class DatabaseQueries {
public:
static QMap<int, QString> messageTableAttributes(bool only_msg_table);
static QMap<int, QString> messageTableAttributes(bool only_msg_table, bool is_sqlite);
// Custom data serializers.
static QString serializeCustomData(const QVariantHash& data);