diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2023-06-13 18:13:51 +0000 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2023-06-13 18:13:51 +0000 |
commit | d9b9a3589f7f0403badb393dd0586b7d406ef02b (patch) | |
tree | c42a5611b3dd7598bb0da4a769b8f31aa445bb9e | |
parent | 9a483e577acdd5cb5a36e94ec3c8ab08a8b43d17 (diff) |
Add CurrentIndex to GroupingLevel
-rw-r--r-- | searchlib/src/vespa/searchlib/aggregation/groupinglevel.cpp | 4 | ||||
-rw-r--r-- | searchlib/src/vespa/searchlib/aggregation/groupinglevel.h | 9 |
2 files changed, 11 insertions, 2 deletions
diff --git a/searchlib/src/vespa/searchlib/aggregation/groupinglevel.cpp b/searchlib/src/vespa/searchlib/aggregation/groupinglevel.cpp index f9b6f8c9d95..cd014360cb6 100644 --- a/searchlib/src/vespa/searchlib/aggregation/groupinglevel.cpp +++ b/searchlib/src/vespa/searchlib/aggregation/groupinglevel.cpp @@ -17,6 +17,7 @@ GroupingLevel::GroupingLevel() noexcept _precision(-1), _isOrdered(false), _frozen(false), + _currentIndex(), _classify(), _collect(), _grouper(nullptr) @@ -87,6 +88,7 @@ GroupingLevel::MultiValueGrouper::groupDoc(Group & g, const ResultNode & result, const ResultNodeVector & rv(static_cast<const ResultNodeVector &>(result)); for (size_t i(0), m(rv.size()); i < m; i++) { const ResultNode & sr(rv.get(i)); + _currentIndex->set(i); SingleValueGrouper::groupDoc(g, sr, doc, rank); } } @@ -97,7 +99,7 @@ GroupingLevel::prepare(const Grouping * grouping, uint32_t level, bool isOrdered _isOrdered = isOrdered_; _frozen = level < grouping->getFirstLevel(); if (_classify.getResult()->inherits(ResultNodeVector::classId)) { - _grouper.reset(new MultiValueGrouper(grouping, level)); + _grouper.reset(new MultiValueGrouper(&_currentIndex, grouping, level)); } else { _grouper.reset(new SingleValueGrouper(grouping, level)); } diff --git a/searchlib/src/vespa/searchlib/aggregation/groupinglevel.h b/searchlib/src/vespa/searchlib/aggregation/groupinglevel.h index f284153b685..df446cc2019 100644 --- a/searchlib/src/vespa/searchlib/aggregation/groupinglevel.h +++ b/searchlib/src/vespa/searchlib/aggregation/groupinglevel.h @@ -3,6 +3,7 @@ #include "group.h" #include <vespa/searchlib/expression/aggregationrefnode.h> +#include <vespa/searchlib/expression/currentindex.h> namespace search::aggregation { @@ -20,6 +21,7 @@ private: using ResultNode = expression::ResultNode; using ExpressionNode = expression::ExpressionNode; using ExpressionTree = expression::ExpressionTree; + using CurrentIndex = expression::CurrentIndex; class Grouper { public: virtual ~Grouper() = default; @@ -53,7 +55,10 @@ private: }; class MultiValueGrouper : public SingleValueGrouper { public: - MultiValueGrouper(const Grouping * grouping, uint32_t level) noexcept : SingleValueGrouper(grouping, level) { } + MultiValueGrouper(CurrentIndex * currentIndex, const Grouping * grouping, uint32_t level) noexcept + : SingleValueGrouper(grouping, level), + _currentIndex(currentIndex) + { } private: template<typename Doc> void groupDoc(Group & group, const ResultNode & result, const Doc & doc, HitRank rank) const; @@ -64,11 +69,13 @@ private: groupDoc(g, result, doc, rank); } MultiValueGrouper * clone() const override { return new MultiValueGrouper(*this); } + CurrentIndex *_currentIndex; }; int64_t _maxGroups; int64_t _precision; bool _isOrdered; bool _frozen; + CurrentIndex _currentIndex; ExpressionTree _classify; Group _collect; |