summaryrefslogtreecommitdiffstats
path: root/common
diff options
context:
space:
mode:
authorChristian Mollekopf <chrigi_1@fastmail.fm>2017-09-12 08:48:20 +0200
committerChristian Mollekopf <chrigi_1@fastmail.fm>2017-09-12 08:48:20 +0200
commite9a996fadd625f20382486ff4a2c2408aabbf82e (patch)
tree3e17c42048ecdf2f535c8334f20a5e3cd29869f5 /common
parent0e5ae6a4ec322370e008bcf16fedb46cd04d894d (diff)
downloadsink-e9a996fadd625f20382486ff4a2c2408aabbf82e.tar.gz
sink-e9a996fadd625f20382486ff4a2c2408aabbf82e.zip
Clarified code
Diffstat (limited to 'common')
-rw-r--r--common/datastorequery.cpp37
1 files changed, 21 insertions, 16 deletions
diff --git a/common/datastorequery.cpp b/common/datastorequery.cpp
index 4c95606..a56fb4a 100644
--- a/common/datastorequery.cpp
+++ b/common/datastorequery.cpp
@@ -524,6 +524,7 @@ void DataStoreQuery::setupQuery(const Sink::QueryBase &query_)
524{ 524{
525 auto query = query_; 525 auto query = query_;
526 auto baseFilters = query.getBaseFilters(); 526 auto baseFilters = query.getBaseFilters();
527 //Resolve any subqueries we have
527 for (const auto &k : baseFilters.keys()) { 528 for (const auto &k : baseFilters.keys()) {
528 const auto comparator = baseFilters.value(k); 529 const auto comparator = baseFilters.value(k);
529 if (comparator.value.canConvert<Query>()) { 530 if (comparator.value.canConvert<Query>()) {
@@ -534,26 +535,30 @@ void DataStoreQuery::setupQuery(const Sink::QueryBase &query_)
534 } 535 }
535 query.setBaseFilters(baseFilters); 536 query.setBaseFilters(baseFilters);
536 537
537 FilterBase::Ptr baseSet;
538 QSet<QByteArray> remainingFilters = query.getBaseFilters().keys().toSet(); 538 QSet<QByteArray> remainingFilters = query.getBaseFilters().keys().toSet();
539 QByteArray appliedSorting; 539 QByteArray appliedSorting;
540 if (!query.ids().isEmpty()) { 540
541 mSource = Source::Ptr::create(query.ids().toVector(), this); 541 //Determine initial set
542 baseSet = mSource; 542 mSource = [&]() {
543 } else { 543 if (!query.ids().isEmpty()) {
544 QSet<QByteArray> appliedFilters; 544 //We have a set of ids as a starting point
545 545 return Source::Ptr::create(query.ids().toVector(), this);
546 auto resultSet = mStore.indexLookup(mType, query, appliedFilters, appliedSorting);
547 remainingFilters = remainingFilters - appliedFilters;
548
549 // We do a full scan if there were no indexes available to create the initial set.
550 if (appliedFilters.isEmpty()) {
551 mSource = Source::Ptr::create(mStore.fullScan(mType), this);
552 } else { 546 } else {
553 mSource = Source::Ptr::create(resultSet, this); 547 QSet<QByteArray> appliedFilters;
548
549 auto resultSet = mStore.indexLookup(mType, query, appliedFilters, appliedSorting);
550 remainingFilters = remainingFilters - appliedFilters;
551
552 if (!appliedFilters.isEmpty()) {
553 //We have an index lookup as starting point
554 return Source::Ptr::create(resultSet, this);
555 }
556 // We do a full scan if there were no indexes available to create the initial set (this is going to be expensive for large sets).
557 return Source::Ptr::create(mStore.fullScan(mType), this);
554 } 558 }
555 baseSet = mSource; 559 }();
556 } 560
561 FilterBase::Ptr baseSet = mSource;
557 if (!query.getBaseFilters().isEmpty()) { 562 if (!query.getBaseFilters().isEmpty()) {
558 auto filter = Filter::Ptr::create(baseSet, this); 563 auto filter = Filter::Ptr::create(baseSet, this);
559 //For incremental queries the remaining filters are not sufficient 564 //For incremental queries the remaining filters are not sufficient