summaryrefslogtreecommitdiffstats
path: root/common/datastorequery.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'common/datastorequery.cpp')
-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