diff options
Diffstat (limited to 'common/queryrunner.cpp')
-rw-r--r-- | common/queryrunner.cpp | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/common/queryrunner.cpp b/common/queryrunner.cpp index 2f627bf..5ac1344 100644 --- a/common/queryrunner.cpp +++ b/common/queryrunner.cpp | |||
@@ -79,9 +79,12 @@ QueryRunner<DomainType>::QueryRunner(const Sink::Query &query, const Sink::Resou | |||
79 | mBatchSize(query.limit) | 79 | mBatchSize(query.limit) |
80 | { | 80 | { |
81 | Trace() << "Starting query"; | 81 | Trace() << "Starting query"; |
82 | if (query.limit && query.sortProperty.isEmpty()) { | ||
83 | Warning() << "A limited query without sorting is typically a bad idea."; | ||
84 | } | ||
82 | //We delegate loading of initial data to the result provider, os it can decide for itself what it needs to load. | 85 | //We delegate loading of initial data to the result provider, os it can decide for itself what it needs to load. |
83 | mResultProvider->setFetcher([=](const typename DomainType::Ptr &parent) { | 86 | mResultProvider->setFetcher([=](const typename DomainType::Ptr &parent) { |
84 | Trace() << "Running fetcher"; | 87 | Trace() << "Running fetcher. Offset: " << mOffset << " Batchsize: " << mBatchSize; |
85 | auto resultProvider = mResultProvider; | 88 | auto resultProvider = mResultProvider; |
86 | async::run<qint64>([=]() -> qint64 { | 89 | async::run<qint64>([=]() -> qint64 { |
87 | QueryWorker<DomainType> worker(query, instanceIdentifier, factory, bufferType, mResultTransformation); | 90 | QueryWorker<DomainType> worker(query, instanceIdentifier, factory, bufferType, mResultTransformation); |
@@ -89,6 +92,7 @@ QueryRunner<DomainType>::QueryRunner(const Sink::Query &query, const Sink::Resou | |||
89 | return newRevision; | 92 | return newRevision; |
90 | }) | 93 | }) |
91 | .template then<void, qint64>([query, this](qint64 newRevision) { | 94 | .template then<void, qint64>([query, this](qint64 newRevision) { |
95 | mOffset += mBatchSize; | ||
92 | //Only send the revision replayed information if we're connected to the resource, there's no need to start the resource otherwise. | 96 | //Only send the revision replayed information if we're connected to the resource, there's no need to start the resource otherwise. |
93 | if (query.liveQuery) { | 97 | if (query.liveQuery) { |
94 | mResourceAccess->sendRevisionReplayedCommand(newRevision); | 98 | mResourceAccess->sendRevisionReplayedCommand(newRevision); |
@@ -325,7 +329,9 @@ ResultSet QueryWorker<DomainType>::filterAndSortSet(ResultSet &resultSet, const | |||
325 | }; | 329 | }; |
326 | 330 | ||
327 | auto skip = [iterator]() { | 331 | auto skip = [iterator]() { |
328 | iterator->next(); | 332 | if (iterator->hasNext()) { |
333 | iterator->next(); | ||
334 | } | ||
329 | }; | 335 | }; |
330 | return ResultSet(generator, skip); | 336 | return ResultSet(generator, skip); |
331 | } else { | 337 | } else { |
@@ -339,8 +345,7 @@ ResultSet QueryWorker<DomainType>::filterAndSortSet(ResultSet &resultSet, const | |||
339 | if ((operation != Sink::Operation_Removal) && filter(domainObject)) { | 345 | if ((operation != Sink::Operation_Removal) && filter(domainObject)) { |
340 | //In the initial set every entity is new | 346 | //In the initial set every entity is new |
341 | callback(domainObject, Sink::Operation_Creation); | 347 | callback(domainObject, Sink::Operation_Creation); |
342 | } | 348 | } } else { |
343 | } else { | ||
344 | //Always remove removals, they probably don't match due to non-available properties | 349 | //Always remove removals, they probably don't match due to non-available properties |
345 | if ((operation == Sink::Operation_Removal) || filter(domainObject)) { | 350 | if ((operation == Sink::Operation_Removal) || filter(domainObject)) { |
346 | //TODO only replay if this is in the currently visible set (or just always replay, worst case we have a couple to many results) | 351 | //TODO only replay if this is in the currently visible set (or just always replay, worst case we have a couple to many results) |