summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2023-06-13 18:13:51 +0000
committerHenning Baldersheim <balder@yahoo-inc.com>2023-06-13 18:13:51 +0000
commitd9b9a3589f7f0403badb393dd0586b7d406ef02b (patch)
treec42a5611b3dd7598bb0da4a769b8f31aa445bb9e
parent9a483e577acdd5cb5a36e94ec3c8ab08a8b43d17 (diff)
Add CurrentIndex to GroupingLevel
-rw-r--r--searchlib/src/vespa/searchlib/aggregation/groupinglevel.cpp4
-rw-r--r--searchlib/src/vespa/searchlib/aggregation/groupinglevel.h9
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;