diff options
Diffstat (limited to 'tests/mailquerybenchmark.cpp')
-rw-r--r-- | tests/mailquerybenchmark.cpp | 67 |
1 files changed, 41 insertions, 26 deletions
diff --git a/tests/mailquerybenchmark.cpp b/tests/mailquerybenchmark.cpp index d68151a..022d21d 100644 --- a/tests/mailquerybenchmark.cpp +++ b/tests/mailquerybenchmark.cpp | |||
@@ -23,16 +23,10 @@ | |||
23 | 23 | ||
24 | #include "testimplementations.h" | 24 | #include "testimplementations.h" |
25 | 25 | ||
26 | #include <common/facade.h> | ||
27 | #include <common/domainadaptor.h> | ||
28 | #include <common/resultprovider.h> | 26 | #include <common/resultprovider.h> |
29 | #include <common/synclistresult.h> | ||
30 | #include <common/definitions.h> | 27 | #include <common/definitions.h> |
31 | #include <common/query.h> | 28 | #include <common/query.h> |
32 | #include <common/store.h> | 29 | #include <common/storage/entitystore.h> |
33 | #include <common/pipeline.h> | ||
34 | #include <common/index.h> | ||
35 | #include <common/adaptorfactoryregistry.h> | ||
36 | 30 | ||
37 | #include "hawd/dataset.h" | 31 | #include "hawd/dataset.h" |
38 | #include "hawd/formatter.h" | 32 | #include "hawd/formatter.h" |
@@ -57,30 +51,34 @@ class MailQueryBenchmark : public QObject | |||
57 | QByteArray resourceIdentifier; | 51 | QByteArray resourceIdentifier; |
58 | HAWD::State mHawdState; | 52 | HAWD::State mHawdState; |
59 | 53 | ||
60 | void populateDatabase(int count) | 54 | void populateDatabase(int count, int folderSpreadFactor = 0) |
61 | { | 55 | { |
62 | TestResource::removeFromDisk(resourceIdentifier); | 56 | TestResource::removeFromDisk(resourceIdentifier); |
63 | 57 | ||
64 | auto pipeline = QSharedPointer<Sink::Pipeline>::create(Sink::ResourceContext{resourceIdentifier, "test"}, "test"); | 58 | Sink::ResourceContext resourceContext{resourceIdentifier, "test", {{"mail", QSharedPointer<TestMailAdaptorFactory>::create()}}}; |
59 | Sink::Storage::EntityStore entityStore{resourceContext, {}}; | ||
60 | entityStore.startTransaction(Sink::Storage::DataStore::ReadWrite); | ||
65 | 61 | ||
66 | auto domainTypeAdaptorFactory = QSharedPointer<TestMailAdaptorFactory>::create(); | ||
67 | |||
68 | pipeline->startTransaction(); | ||
69 | const auto date = QDateTime::currentDateTimeUtc(); | 62 | const auto date = QDateTime::currentDateTimeUtc(); |
70 | for (int i = 0; i < count; i++) { | 63 | for (int i = 0; i < count; i++) { |
71 | auto domainObject = Mail::Ptr::create(); | 64 | auto domainObject = Mail::createEntity<Mail>(resourceIdentifier); |
72 | domainObject->setExtractedMessageId("uid"); | 65 | domainObject.setExtractedMessageId("uid"); |
73 | domainObject->setExtractedSubject(QString("subject%1").arg(i)); | 66 | domainObject.setExtractedParentMessageId("parentuid"); |
74 | domainObject->setExtractedDate(date.addSecs(count)); | 67 | domainObject.setExtractedSubject(QString("subject%1").arg(i)); |
75 | domainObject->setFolder("folder1"); | 68 | domainObject.setExtractedDate(date.addSecs(count)); |
76 | // domainObject->setAttachment(attachment); | 69 | if (folderSpreadFactor == 0) { |
77 | const auto command = createCommand<Mail>(*domainObject, *domainTypeAdaptorFactory); | 70 | domainObject.setFolder("folder1"); |
78 | pipeline->newEntity(command.data(), command.size()); | 71 | } else { |
72 | domainObject.setFolder(QByteArray("folder") + QByteArray::number(i % folderSpreadFactor)); | ||
73 | } | ||
74 | |||
75 | entityStore.add("mail", domainObject, false, [] (const Mail &) {}); | ||
79 | } | 76 | } |
80 | pipeline->commit(); | 77 | |
78 | entityStore.commitTransaction(); | ||
81 | } | 79 | } |
82 | 80 | ||
83 | void testLoad(const Sink::Query &query, int count) | 81 | void testLoad(const Sink::Query &query, int count, int expectedSize) |
84 | { | 82 | { |
85 | const auto startingRss = getCurrentRSS(); | 83 | const auto startingRss = getCurrentRSS(); |
86 | 84 | ||
@@ -88,7 +86,10 @@ class MailQueryBenchmark : public QObject | |||
88 | QTime time; | 86 | QTime time; |
89 | time.start(); | 87 | time.start(); |
90 | auto resultSet = QSharedPointer<Sink::ResultProvider<Mail::Ptr>>::create(); | 88 | auto resultSet = QSharedPointer<Sink::ResultProvider<Mail::Ptr>>::create(); |
91 | Sink::ResourceContext context{resourceIdentifier, "test"}; | 89 | |
90 | //FIXME why do we need this here? | ||
91 | auto domainTypeAdaptorFactory = QSharedPointer<TestMailAdaptorFactory>::create(); | ||
92 | Sink::ResourceContext context{resourceIdentifier, "test", {{"mail", domainTypeAdaptorFactory}}}; | ||
92 | context.mResourceAccess = QSharedPointer<TestResourceAccess>::create(); | 93 | context.mResourceAccess = QSharedPointer<TestResourceAccess>::create(); |
93 | TestMailResourceFacade facade(context); | 94 | TestMailResourceFacade facade(context); |
94 | 95 | ||
@@ -101,7 +102,7 @@ class MailQueryBenchmark : public QObject | |||
101 | emitter->onInitialResultSetComplete([&done](const Mail::Ptr &mail, bool) { done = true; }); | 102 | emitter->onInitialResultSetComplete([&done](const Mail::Ptr &mail, bool) { done = true; }); |
102 | emitter->fetch(Mail::Ptr()); | 103 | emitter->fetch(Mail::Ptr()); |
103 | QTRY_VERIFY(done); | 104 | QTRY_VERIFY(done); |
104 | QCOMPARE(list.size(), query.limit()); | 105 | QCOMPARE(list.size(), expectedSize); |
105 | 106 | ||
106 | const auto elapsed = time.elapsed(); | 107 | const auto elapsed = time.elapsed(); |
107 | 108 | ||
@@ -145,7 +146,6 @@ private slots: | |||
145 | void init() | 146 | void init() |
146 | { | 147 | { |
147 | resourceIdentifier = "sink.test.instance1"; | 148 | resourceIdentifier = "sink.test.instance1"; |
148 | Sink::AdaptorFactoryRegistry::instance().registerFactory<Mail, TestMailAdaptorFactory>("test"); | ||
149 | } | 149 | } |
150 | 150 | ||
151 | void test50k() | 151 | void test50k() |
@@ -159,7 +159,22 @@ private slots: | |||
159 | query.limit(1000); | 159 | query.limit(1000); |
160 | 160 | ||
161 | populateDatabase(50000); | 161 | populateDatabase(50000); |
162 | testLoad(query, 50000); | 162 | testLoad(query, 50000, query.limit()); |
163 | } | ||
164 | |||
165 | void test50kThreadleader() | ||
166 | { | ||
167 | Sink::Query query; | ||
168 | query.request<Mail::MessageId>() | ||
169 | .request<Mail::Subject>() | ||
170 | .request<Mail::Date>(); | ||
171 | // query.filter<ApplicationDomain::Mail::Trash>(false); | ||
172 | query.reduce<ApplicationDomain::Mail::Folder>(Query::Reduce::Selector::max<ApplicationDomain::Mail::Date>()); | ||
173 | query.limit(1000); | ||
174 | |||
175 | int mailsPerFolder = 100; | ||
176 | populateDatabase(50000, mailsPerFolder); | ||
177 | testLoad(query, 50000, mailsPerFolder); | ||
163 | } | 178 | } |
164 | }; | 179 | }; |
165 | 180 | ||