diff options
Diffstat (limited to 'common/datastorequery.cpp')
-rw-r--r-- | common/datastorequery.cpp | 37 |
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 |