From 1319b45f5f389c94877ef58458bb60795042129e Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Mon, 10 Apr 2017 12:17:32 +0200 Subject: Fixed readAllUids and readAll --- common/storage/entitystore.cpp | 24 ++++++------ tests/CMakeLists.txt | 1 + tests/entitystoretest.cpp | 83 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 95 insertions(+), 13 deletions(-) create mode 100644 tests/entitystoretest.cpp diff --git a/common/storage/entitystore.cpp b/common/storage/entitystore.cpp index 7f065f9..bb7c33c 100644 --- a/common/storage/entitystore.cpp +++ b/common/storage/entitystore.cpp @@ -520,15 +520,9 @@ ApplicationDomain::ApplicationDomainType EntityStore::readEntity(const QByteArra void EntityStore::readAll(const QByteArray &type, const std::function &callback) { - auto db = DataStore::mainDatabase(d->getTransaction(), type); - db.scan("", - [=](const QByteArray &key, const QByteArray &value) -> bool { - auto uid = DataStore::uidFromKey(key); - auto buffer = Sink::EntityBuffer{value.data(), value.size()}; - callback(d->createApplicationDomainType(type, uid, DataStore::maxRevision(d->getTransaction()), buffer)); - return true; - }, - [&](const DataStore::Error &error) { SinkWarningCtx(d->logCtx) << "Error during query: " << error.message; }); + readAllUids(type, [&] (const QByteArray &uid) { + readLatest(type, uid, callback); + }); } void EntityStore::readRevisions(qint64 baseRevision, const QByteArray &expectedType, const std::function &callback) @@ -587,12 +581,16 @@ ApplicationDomain::ApplicationDomainType EntityStore::readPrevious(const QByteAr void EntityStore::readAllUids(const QByteArray &type, const std::function callback) { - //TODO use uid index instead - //FIXME we currently report each uid for every revision with the same uid + //TODO use a uid index instead auto db = DataStore::mainDatabase(d->getTransaction(), type); + QByteArray lastUid; db.scan("", - [callback](const QByteArray &key, const QByteArray &) -> bool { - callback(Sink::Storage::DataStore::uidFromKey(key)); + [&](const QByteArray &key, const QByteArray &) -> bool { + const auto uid = Sink::Storage::DataStore::uidFromKey(key); + if (uid != lastUid) { + lastUid = uid; + callback(uid); + } return true; }, [&](const Sink::Storage::DataStore::Error &error) { SinkWarningCtx(d->logCtx) << "Failed to read current value from storage: " << error.message; }); diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index fef76bd..c77a736 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -45,6 +45,7 @@ auto_tests ( dummyresourcemailtest interresourcemovetest notificationtest + entitystoretest ) generate_flatbuffers(dummyresourcetest calendar) target_link_libraries(dummyresourcetest sink_resource_dummy) diff --git a/tests/entitystoretest.cpp b/tests/entitystoretest.cpp new file mode 100644 index 0000000..0faf500 --- /dev/null +++ b/tests/entitystoretest.cpp @@ -0,0 +1,83 @@ +#include + +#include +#include + +#include "common/storage/entitystore.h" +#include "common/adaptorfactoryregistry.h" +#include "common/definitions.h" +#include "testimplementations.h" + +class EntityStoreTest : public QObject +{ + Q_OBJECT +private: + QString resourceInstanceIdentifier{"resourceId"}; + +private slots: + void initTestCase() + { + Sink::AdaptorFactoryRegistry::instance().registerFactory("test"); + } + + void cleanup() + { + Sink::Storage::DataStore storage(Sink::storageLocation(), resourceInstanceIdentifier); + storage.removeFromDisk(); + } + + void testCleanup() + { + } + + void readAll() + { + using namespace Sink; + ResourceContext resourceContext{resourceInstanceIdentifier.toUtf8(), "dummy", AdaptorFactoryRegistry::instance().getFactories("test")}; + Storage::EntityStore store(resourceContext, {}); + + auto mail = ApplicationDomain::ApplicationDomainType::createEntity("res1"); + mail.setExtractedMessageId("messageid"); + mail.setExtractedSubject("boo"); + + auto mail2 = ApplicationDomain::ApplicationDomainType::createEntity("res1"); + mail2.setExtractedMessageId("messageid2"); + mail2.setExtractedSubject("foo"); + + store.startTransaction(Storage::DataStore::ReadWrite); + store.add("mail", mail, false, [] (const ApplicationDomain::ApplicationDomainType &) {}); + store.add("mail", mail2, false, [] (const ApplicationDomain::ApplicationDomainType &) {}); + + mail.setExtractedSubject("foo"); + + store.modify("mail", mail, {}, false, [] (const ApplicationDomain::ApplicationDomainType &, ApplicationDomain::ApplicationDomainType &) {}); + store.commitTransaction(); + + store.startTransaction(Storage::DataStore::ReadOnly); + { + //We get every uid once + QList uids; + store.readAllUids("mail", [&] (const QByteArray &uid) { + uids << uid; + }); + QCOMPARE(uids.size(), 2); + } + + { + //We get the latest version of every entity once + QList uids; + store.readAll("mail", [&] (const ApplicationDomain::ApplicationDomainType &entity) { + //The first revision should be superseeded by the modification + QCOMPARE(entity.getProperty(ApplicationDomain::Mail::Subject::name).toString(), QString::fromLatin1("foo")); + uids << entity.identifier(); + }); + QCOMPARE(uids.size(), 2); + } + + store.abortTransaction(); + + } +}; + +QTEST_MAIN(EntityStoreTest) +#include "entitystoretest.moc" -- cgit v1.2.3