Hello community, here is the log from the commit of package akonadi-server for openSUSE:Factory checked in at 2015-11-15 12:27:47 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/akonadi-server (Old) and /work/SRC/openSUSE:Factory/.akonadi-server.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "akonadi-server" Changes: -------- --- /work/SRC/openSUSE:Factory/akonadi-server/akonadi-server.changes 2015-10-19 22:30:27.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.akonadi-server.new/akonadi-server.changes 2015-11-15 12:27:48.000000000 +0100 @@ -1,0 +2,9 @@ +Tue Nov 10 19:51:55 UTC 2015 - [email protected] + +- Update to KDE Applications 15.08.3 + * KDE Applications 15.08.3 + * https://www.kde.org/announcements/announce-applications-15.08.3.php + * boo#954531 + + +------------------------------------------------------------------- Old: ---- akonadi-15.08.2.tar.xz New: ---- akonadi-15.08.3.tar.xz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ akonadi-server.spec ++++++ --- /var/tmp/diff_new_pack.Rfqy0t/_old 2015-11-15 12:27:49.000000000 +0100 +++ /var/tmp/diff_new_pack.Rfqy0t/_new 2015-11-15 12:27:49.000000000 +0100 @@ -17,7 +17,7 @@ Name: akonadi-server -Version: 15.08.2 +Version: 15.08.3 Release: 0 %define rname akonadi Summary: PIM Storage Service ++++++ akonadi-15.08.2.tar.xz -> akonadi-15.08.3.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/akonadi-15.08.2/autotests/server/fetchhandlertest.cpp new/akonadi-15.08.3/autotests/server/fetchhandlertest.cpp --- old/akonadi-15.08.2/autotests/server/fetchhandlertest.cpp 2015-09-11 12:54:49.000000000 +0200 +++ new/akonadi-15.08.3/autotests/server/fetchhandlertest.cpp 2015-10-27 17:54:02.000000000 +0100 @@ -232,7 +232,7 @@ timer.start(); QList<PimItem> items; - for (int i = 0; i < 10000; i++) { + for (int i = 0; i < 1000; i++) { items.append(initializer->createItem(QString::number(i).toLatin1().constData(),col1)); } qDebug() << timer.nsecsElapsed()/1.0e6 << "ms"; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/akonadi-15.08.2/src/server/storage/collectionstatistics.cpp new/akonadi-15.08.3/src/server/storage/collectionstatistics.cpp --- old/akonadi-15.08.2/src/server/storage/collectionstatistics.cpp 2015-09-11 12:54:49.000000000 +0200 +++ new/akonadi-15.08.3/src/server/storage/collectionstatistics.cpp 2015-10-27 17:54:02.000000000 +0100 @@ -57,11 +57,18 @@ CollectionStatistics::Statistics CollectionStatistics::getCollectionStatistics(const Collection &col) { + static const QString SeenFlagsTableName = QStringLiteral("SeenFlags"); + static const QString IgnoredFlagsTableName = QStringLiteral("IgnoredFlags"); + +#define FLAGS_COLUMN(table, column) \ + QStringLiteral("%1.%2").arg(table##TableName, PimItemFlagRelation::column()) + // COUNT(DISTINCT PimItemTable.id) CountQueryBuilder qb(PimItem::tableName(), PimItem::idFullColumnName(), CountQueryBuilder::Distinct); // SUM(PimItemTable.size) - qb.addAggregation(PimItem::sizeFullColumnName(), QLatin1String("sum")); - // SUM(CASE WHEN FlagTable.name IN ('\SEEN', '$IGNORED') THEN 1 ELSE 0 END) + qb.addAggregation(PimItem::sizeFullColumnName(), QStringLiteral("sum")); + + // SUM(CASE WHEN SeenFlags.flag_id IS NOT NULL OR IgnoredFlags.flag_id IS NOT NULL THEN 1 ELSE 0 END) // This allows us to get read messages count in a single query with the other // statistics. It is much than doing two queries, because the database // only has to calculate the JOINs once. @@ -69,17 +76,36 @@ // Flag::retrieveByName() will hit the Entity cache, which allows us to avoid // a second JOIN with FlagTable, which PostgreSQL seems to struggle to optimize. Query::Condition cond(Query::Or); - cond.addValueCondition(PimItemFlagRelation::rightFullColumnName(), - Query::Equals, - Flag::retrieveByName(QLatin1String(AKONADI_FLAG_SEEN)).id()); - cond.addValueCondition(PimItemFlagRelation::rightFullColumnName(), - Query::Equals, - Flag::retrieveByName(QLatin1String(AKONADI_FLAG_IGNORED)).id()); - Query::Case caseStmt(cond, QLatin1String("1"), QLatin1String("0")); - qb.addAggregation(caseStmt, QLatin1String("sum")); + cond.addValueCondition(FLAGS_COLUMN(SeenFlags, rightColumn), Query::IsNot, QVariant()); + cond.addValueCondition(FLAGS_COLUMN(IgnoredFlags, rightColumn), Query::IsNot, QVariant()); + + Query::Case caseStmt(cond, QStringLiteral("1"), QStringLiteral("0")); + qb.addAggregation(caseStmt, QStringLiteral("sum")); + + // We need to join PimItemFlagRelation table twice - once for \SEEN flag and once + // for $IGNORED flag, otherwise entries from PimItemTable get duplicated when an + // item has both flags and the SUM(CASE ...) above returns bogus values + { + Query::Condition seenCondition(Query::And); + seenCondition.addColumnCondition(PimItem::idFullColumnName(), Query::Equals, FLAGS_COLUMN(SeenFlags, leftColumn)); + seenCondition.addValueCondition(FLAGS_COLUMN(SeenFlags, rightColumn), Query::Equals, + Flag::retrieveByName(QStringLiteral(AKONADI_FLAG_SEEN)).id()); + qb.addJoin(QueryBuilder::LeftJoin, + QStringLiteral("%1 AS %2").arg(PimItemFlagRelation::tableName(), SeenFlagsTableName), + seenCondition); + } + { + Query::Condition ignoredCondition(Query::And); + ignoredCondition.addColumnCondition(PimItem::idFullColumnName(), Query::Equals, FLAGS_COLUMN(IgnoredFlags, leftColumn)); + ignoredCondition.addValueCondition(FLAGS_COLUMN(IgnoredFlags, rightColumn), Query::Equals, + Flag::retrieveByName(QStringLiteral(AKONADI_FLAG_IGNORED)).id()); + qb.addJoin(QueryBuilder::LeftJoin, + QStringLiteral("%1 AS %2").arg(PimItemFlagRelation::tableName(), IgnoredFlagsTableName), + ignoredCondition); + } + +#undef FLAGS_COLUMN - qb.addJoin(QueryBuilder::LeftJoin, PimItemFlagRelation::tableName(), - PimItem::idFullColumnName(), PimItemFlagRelation::leftFullColumnName()); if (col.isVirtual()) { qb.addJoin(QueryBuilder::InnerJoin, CollectionPimItemRelation::tableName(), CollectionPimItemRelation::rightFullColumnName(), PimItem::idFullColumnName());
