summaryrefslogtreecommitdiffstats
path: root/common/datastorequery.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'common/datastorequery.cpp')
-rw-r--r--common/datastorequery.cpp35
1 files changed, 18 insertions, 17 deletions
diff --git a/common/datastorequery.cpp b/common/datastorequery.cpp
index 4c95606..ad21910 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,26 @@ 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();
539 QByteArray appliedSorting; 538 QByteArray appliedSorting;
540 if (!query.ids().isEmpty()) { 539
541 mSource = Source::Ptr::create(query.ids().toVector(), this); 540 //Determine initial set
542 baseSet = mSource; 541 mSource = [&]() {
543 } else { 542 if (!query.ids().isEmpty()) {
544 QSet<QByteArray> appliedFilters; 543 //We have a set of ids as a starting point
545 544 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 { 545 } else {
553 mSource = Source::Ptr::create(resultSet, this); 546 QSet<QByteArray> appliedFilters;
547 auto resultSet = mStore.indexLookup(mType, query, appliedFilters, appliedSorting);
548 if (!appliedFilters.isEmpty()) {
549 //We have an index lookup as starting point
550 return Source::Ptr::create(resultSet, this);
551 }
552 // 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).
553 return Source::Ptr::create(mStore.fullScan(mType), this);
554 } 554 }
555 baseSet = mSource; 555 }();
556 } 556
557 FilterBase::Ptr baseSet = mSource;
557 if (!query.getBaseFilters().isEmpty()) { 558 if (!query.getBaseFilters().isEmpty()) {
558 auto filter = Filter::Ptr::create(baseSet, this); 559 auto filter = Filter::Ptr::create(baseSet, this);
559 //For incremental queries the remaining filters are not sufficient 560 //For incremental queries the remaining filters are not sufficient