summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2024-06-26 08:35:07 +0200
committerGitHub <noreply@github.com>2024-06-26 08:35:07 +0200
commit28928d915eeaddc4cd1de7a94a285e467d473d74 (patch)
treedf19795ecf14fe17a0de2509f16f912a41c0f003
parentb66f6d91e47ddce1d2213b663d522a3521049abc (diff)
parented17df033524055a4b4c9c5c8ed2e7b473440d44 (diff)
Merge pull request #31724 from vespa-engine/balder/bring-document-type-along-in-grouping
Wire in document type along to grouping code.
-rw-r--r--searchcore/src/tests/grouping/grouping_test.cpp119
-rw-r--r--searchcore/src/vespa/searchcore/grouping/groupingmanager.cpp4
-rw-r--r--searchcore/src/vespa/searchcore/grouping/groupingmanager.h7
-rw-r--r--searchcore/src/vespa/searchcore/grouping/groupingsession.cpp15
-rw-r--r--searchcore/src/vespa/searchcore/grouping/groupingsession.h9
-rw-r--r--searchcore/src/vespa/searchcore/proton/matching/result_processor.cpp4
6 files changed, 87 insertions, 71 deletions
diff --git a/searchcore/src/tests/grouping/grouping_test.cpp b/searchcore/src/tests/grouping/grouping_test.cpp
index e77bc4e9e22..4bc4ee7755f 100644
--- a/searchcore/src/tests/grouping/grouping_test.cpp
+++ b/searchcore/src/tests/grouping/grouping_test.cpp
@@ -12,6 +12,7 @@
#include <vespa/searchcore/proton/matching/sessionmanager.h>
#include <vespa/searchlib/common/allocatedbitvector.h>
#include <vespa/searchlib/test/mock_attribute_context.h>
+#include <vespa/document/datatype/documenttype.h>
#include <vespa/vespalib/util/testclock.h>
#include <iostream>
#include <vespa/vespalib/testkit/test_kit.h>
@@ -36,57 +37,64 @@ const uint32_t NUM_DOCS = 1000;
struct MyWorld {
MockAttributeContext attributeContext;
+ document::DocumentType documentType;
search::AllocatedBitVector bv;
- MyWorld()
- : attributeContext(),
- bv(NUM_DOCS+1)
+ MyWorld();
+ ~MyWorld();
+};
+
+MyWorld::~MyWorld() = default;
+
+MyWorld::MyWorld()
+ : attributeContext(),
+ documentType("test"),
+ bv(NUM_DOCS+1)
+{
+ bv.setInterval(0, NUM_DOCS);
+ // attribute context
{
- bv.setInterval(0, NUM_DOCS);
- // attribute context
- {
- auto attr = std::make_shared<SingleInt32ExtAttribute>("attr0");
- AttributeVector::DocId docid;
- for (uint32_t i = 0; i < NUM_DOCS; ++i) {
- attr->addDoc(docid);
- attr->add(i, docid); // value = docid
- }
- assert(docid + 1 == NUM_DOCS);
- attributeContext.add(attr);
+ auto attr = std::make_shared<SingleInt32ExtAttribute>("attr0");
+ AttributeVector::DocId docid;
+ for (uint32_t i = 0; i < NUM_DOCS; ++i) {
+ attr->addDoc(docid);
+ attr->add(i, docid); // value = docid
}
- {
- auto attr = std::make_shared<SingleInt32ExtAttribute>("attr1");
- AttributeVector::DocId docid;
- for (uint32_t i = 0; i < NUM_DOCS; ++i) {
- attr->addDoc(docid);
- attr->add(i * 2, docid); // value = docid * 2
- }
- assert(docid + 1 == NUM_DOCS);
- attributeContext.add(attr);
+ assert(docid + 1 == NUM_DOCS);
+ attributeContext.add(attr);
+ }
+ {
+ auto attr = std::make_shared<SingleInt32ExtAttribute>("attr1");
+ AttributeVector::DocId docid;
+ for (uint32_t i = 0; i < NUM_DOCS; ++i) {
+ attr->addDoc(docid);
+ attr->add(i * 2, docid); // value = docid * 2
}
- {
- auto attr = std::make_shared<SingleInt32ExtAttribute>("attr2");
- AttributeVector::DocId docid;
- for (uint32_t i = 0; i < NUM_DOCS; ++i) {
- attr->addDoc(docid);
- attr->add(i * 3, docid); // value = docid * 3
- }
- assert(docid + 1 == NUM_DOCS);
- attributeContext.add(attr);
+ assert(docid + 1 == NUM_DOCS);
+ attributeContext.add(attr);
+ }
+ {
+ auto attr = std::make_shared<SingleInt32ExtAttribute>("attr2");
+ AttributeVector::DocId docid;
+ for (uint32_t i = 0; i < NUM_DOCS; ++i) {
+ attr->addDoc(docid);
+ attr->add(i * 3, docid); // value = docid * 3
}
- {
- auto attr = std::make_shared<SingleInt32ExtAttribute>("attr3");
- AttributeVector::DocId docid;
- for (uint32_t i = 0; i < NUM_DOCS; ++i) {
- attr->addDoc(docid);
- attr->add(i * 4, docid); // value = docid * 4
- }
- assert(docid + 1 == NUM_DOCS);
- attributeContext.add(attr);
+ assert(docid + 1 == NUM_DOCS);
+ attributeContext.add(attr);
+ }
+ {
+ auto attr = std::make_shared<SingleInt32ExtAttribute>("attr3");
+ AttributeVector::DocId docid;
+ for (uint32_t i = 0; i < NUM_DOCS; ++i) {
+ attr->addDoc(docid);
+ attr->add(i * 4, docid); // value = docid * 4
}
-
+ assert(docid + 1 == NUM_DOCS);
+ attributeContext.add(attr);
}
-};
+
+}
//-----------------------------------------------------------------------------
@@ -291,7 +299,7 @@ TEST_F("testGroupingSession", DoomFixture()) {
SessionId id("foo");
// Test initialization phase
- GroupingSession session(id, initContext, world.attributeContext);
+ GroupingSession session(id, initContext, world.attributeContext, &world.documentType);
CheckAttributeReferences attrCheck2;
EXPECT_EQUAL(2u, initContext.getGroupingList().size());
for (const auto & g : initContext.getGroupingList()) {
@@ -356,7 +364,7 @@ TEST_F("testEmptySessionId", DoomFixture()) {
SessionId id;
// Test initialization phase
- GroupingSession session(id, initContext, world.attributeContext);
+ GroupingSession session(id, initContext, world.attributeContext, &world.documentType);
RankedHit hit;
hit._docId = 0;
GroupingManager &manager(session.getGroupingManager());
@@ -390,9 +398,9 @@ TEST_F("testSessionManager", DoomFixture()) {
SessionId id1("foo");
SessionId id2("bar");
SessionId id3("baz");
- auto s1 = std::make_unique<GroupingSession>(id1, initContext, world.attributeContext);
- auto s2 = std::make_unique<GroupingSession>(id2, initContext, world.attributeContext);
- auto s3 = std::make_unique<GroupingSession>(id3, initContext, world.attributeContext);
+ auto s1 = std::make_unique<GroupingSession>(id1, initContext, world.attributeContext, &world.documentType);
+ auto s2 = std::make_unique<GroupingSession>(id2, initContext, world.attributeContext, &world.documentType);
+ auto s3 = std::make_unique<GroupingSession>(id3, initContext, world.attributeContext, &world.documentType);
ASSERT_EQUAL(f1.timeOfDoom, s1->getTimeOfDoom());
mgr.insert(std::move(s1));
@@ -442,13 +450,12 @@ TEST_F("test grouping fork/join", DoomFixture()) {
auto g1 = std::make_shared<Grouping>(request);
GroupingContext context(world.bv, f1.clock.nowRef(), f1.timeOfDoom);
context.addGrouping(g1);
- GroupingSession session(SessionId(), context, world.attributeContext);
+ GroupingSession session(SessionId(), context, world.attributeContext, &world.documentType);
session.prepareThreadContextCreation(4);
-
- GroupingContext::UP ctx0 = session.createThreadContext(0, world.attributeContext);
- GroupingContext::UP ctx1 = session.createThreadContext(1, world.attributeContext);
- GroupingContext::UP ctx2 = session.createThreadContext(2, world.attributeContext);
- GroupingContext::UP ctx3 = session.createThreadContext(3, world.attributeContext);
+ GroupingContext::UP ctx0 = session.createThreadContext(0, world.attributeContext, &world.documentType);
+ GroupingContext::UP ctx1 = session.createThreadContext(1, world.attributeContext, &world.documentType);
+ GroupingContext::UP ctx2 = session.createThreadContext(2, world.attributeContext, &world.documentType);
+ GroupingContext::UP ctx3 = session.createThreadContext(3, world.attributeContext, &world.documentType);
doGrouping(*ctx0, 12, 30.0, 11, 20.0, 10, 10.0);
doGrouping(*ctx1, 22, 150.0, 21, 40.0, 20, 25.0);
doGrouping(*ctx2, 32, 100.0, 31, 15.0, 30, 5.0);
@@ -483,8 +490,8 @@ TEST_F("test session timeout", DoomFixture()) {
GroupingContext initContext1(world.bv, f1.clock.nowRef(), steady_time(duration(10)));
GroupingContext initContext2(world.bv, f1.clock.nowRef(), steady_time(duration(20)));
- auto s1 = std::make_unique<GroupingSession>(id1, initContext1, world.attributeContext);
- auto s2 = std::make_unique<GroupingSession>(id2, initContext2, world.attributeContext);
+ auto s1 = std::make_unique<GroupingSession>(id1, initContext1, world.attributeContext, &world.documentType);
+ auto s2 = std::make_unique<GroupingSession>(id2, initContext2, world.attributeContext, &world.documentType);
mgr.insert(std::move(s1));
mgr.insert(std::move(s2));
mgr.pruneTimedOutSessions(steady_time(5ns));
diff --git a/searchcore/src/vespa/searchcore/grouping/groupingmanager.cpp b/searchcore/src/vespa/searchcore/grouping/groupingmanager.cpp
index 9b393b6e6d8..18c942b80a0 100644
--- a/searchcore/src/vespa/searchcore/grouping/groupingmanager.cpp
+++ b/searchcore/src/vespa/searchcore/grouping/groupingmanager.cpp
@@ -31,7 +31,7 @@ bool GroupingManager::empty() const {
}
void
-GroupingManager::init(const IAttributeContext &attrCtx)
+GroupingManager::init(const IAttributeContext &attrCtx, const document::DocumentType * documentType)
{
GroupingContext::GroupingList list;
GroupingContext::GroupingList &groupingList(_groupingContext.getGroupingList());
@@ -50,7 +50,7 @@ GroupingManager::init(const IAttributeContext &attrCtx)
}
}
aggregation::NonAttribute2DocumentAccessor nonAttributes2DocumentAccess(attrCtx);
- ConfigureStaticParams stuff(&attrCtx, nullptr);
+ ConfigureStaticParams stuff(&attrCtx, documentType);
grouping.configureStaticStuff(stuff);
list.push_back(groupingList[i]);
} catch (const std::exception & e) {
diff --git a/searchcore/src/vespa/searchcore/grouping/groupingmanager.h b/searchcore/src/vespa/searchcore/grouping/groupingmanager.h
index b0856ae7189..05f0e1886aa 100644
--- a/searchcore/src/vespa/searchcore/grouping/groupingmanager.h
+++ b/searchcore/src/vespa/searchcore/grouping/groupingmanager.h
@@ -8,6 +8,7 @@ namespace search {
struct RankedHit;
class BitVector;
}
+namespace document { class DocumentType; }
namespace search::grouping {
@@ -21,6 +22,7 @@ class GroupingManager
{
private:
GroupingContext &_groupingContext;
+ const document::DocumentType *_documentType;
public:
GroupingManager(const GroupingManager &) = delete;
GroupingManager &operator=(const GroupingManager &) = delete;
@@ -30,7 +32,8 @@ public:
* @param groupingContext Context to use for grouping
**/
GroupingManager(GroupingContext & groupingContext) noexcept
- : _groupingContext(groupingContext)
+ : _groupingContext(groupingContext),
+ _documentType(nullptr)
{}
/**
@@ -43,7 +46,7 @@ public:
*
* @param attrCtx attribute context
**/
- void init(const attribute::IAttributeContext &attrCtx);
+ void init(const attribute::IAttributeContext &attrCtx, const document::DocumentType * documentType);
/**
* Perform actual grouping on the given results.
diff --git a/searchcore/src/vespa/searchcore/grouping/groupingsession.cpp b/searchcore/src/vespa/searchcore/grouping/groupingsession.cpp
index e3f8919e747..8d845766966 100644
--- a/searchcore/src/vespa/searchcore/grouping/groupingsession.cpp
+++ b/searchcore/src/vespa/searchcore/grouping/groupingsession.cpp
@@ -16,19 +16,21 @@ using search::attribute::IAttributeContext;
GroupingSession::GroupingSession(const SessionId &sessionId,
GroupingContext & groupingContext,
- const IAttributeContext &attrCtx)
+ const IAttributeContext &attrCtx,
+ const document::DocumentType * documentType)
: _sessionId(sessionId),
_mgrContext(std::make_unique<GroupingContext>(groupingContext)),
_groupingManager(std::make_unique<GroupingManager>(*_mgrContext)),
_timeOfDoom(groupingContext.getTimeOfDoom())
{
- init(groupingContext, attrCtx);
+ init(groupingContext, attrCtx, documentType);
}
GroupingSession::~GroupingSession() = default;
void
-GroupingSession::init(GroupingContext & groupingContext, const IAttributeContext &attrCtx)
+GroupingSession::init(GroupingContext & groupingContext, const IAttributeContext &attrCtx,
+ const document::DocumentType * documentType)
{
GroupingList & sessionList(groupingContext.getGroupingList());
for (auto g : sessionList) {
@@ -41,7 +43,7 @@ GroupingSession::init(GroupingContext & groupingContext, const IAttributeContext
}
_mgrContext->addGrouping(std::move(g));
}
- _groupingManager->init(attrCtx);
+ _groupingManager->init(attrCtx, documentType);
}
void
@@ -53,7 +55,8 @@ GroupingSession::prepareThreadContextCreation(size_t num_threads)
}
GroupingContext::UP
-GroupingSession::createThreadContext(size_t thread_id, const IAttributeContext &attrCtx)
+GroupingSession::createThreadContext(size_t thread_id, const IAttributeContext &attrCtx,
+ const document::DocumentType * documentType)
{
auto ctx = std::make_unique<GroupingContext>(*_mgrContext);
if (thread_id == 0) {
@@ -63,7 +66,7 @@ GroupingSession::createThreadContext(size_t thread_id, const IAttributeContext &
} else {
ctx->deserialize(_mgrContext->getResult().peek(), _mgrContext->getResult().size());
GroupingManager man(*ctx);
- man.init(attrCtx);
+ man.init(attrCtx, documentType);
}
return ctx;
}
diff --git a/searchcore/src/vespa/searchcore/grouping/groupingsession.h b/searchcore/src/vespa/searchcore/grouping/groupingsession.h
index e3e600161d0..d24f0b4ef3d 100644
--- a/searchcore/src/vespa/searchcore/grouping/groupingsession.h
+++ b/searchcore/src/vespa/searchcore/grouping/groupingsession.h
@@ -7,6 +7,7 @@
#include <vector>
#include <map>
+namespace document { class DocumentType; }
namespace search::aggregation { class Grouping; }
namespace search::grouping {
@@ -44,7 +45,8 @@ public:
**/
GroupingSession(const SessionId & sessionId,
GroupingContext & groupingContext,
- const attribute::IAttributeContext &attrCtx);
+ const attribute::IAttributeContext &attrCtx,
+ const document::DocumentType * documentType);
GroupingSession(const GroupingSession &) = delete;
GroupingSession &operator=(const GroupingSession &) = delete;
@@ -63,7 +65,7 @@ public:
* @param groupingContext The current grouping context.
* @param attrCtx attribute context.
**/
- void init(GroupingContext & groupingContext, const attribute::IAttributeContext &attrCtx);
+ void init(GroupingContext & groupingContext, const attribute::IAttributeContext &attrCtx, const document::DocumentType * documentType);
/**
* This function is called to prepare for creation of individual
@@ -85,7 +87,8 @@ public:
* @param thread_id thread id
* @param attrCtx attribute context.
**/
- std::unique_ptr<GroupingContext> createThreadContext(size_t thread_id, const attribute::IAttributeContext &attrCtx);
+ std::unique_ptr<GroupingContext> createThreadContext(size_t thread_id, const attribute::IAttributeContext &attrCtx,
+ const document::DocumentType * documentType);
/**
* Return the GroupingManager to use when performing grouping.
diff --git a/searchcore/src/vespa/searchcore/proton/matching/result_processor.cpp b/searchcore/src/vespa/searchcore/proton/matching/result_processor.cpp
index e96e231d46a..623a17b89f4 100644
--- a/searchcore/src/vespa/searchcore/proton/matching/result_processor.cpp
+++ b/searchcore/src/vespa/searchcore/proton/matching/result_processor.cpp
@@ -74,7 +74,7 @@ ResultProcessor::ResultProcessor(IAttributeContext &attrContext,
_wasMerged(false)
{
if (!_groupingContext.empty()) {
- _groupingSession = std::make_unique<GroupingSession>(sessionId, _groupingContext, attrContext);
+ _groupingSession = std::make_unique<GroupingSession>(sessionId, _groupingContext, attrContext, nullptr);
}
}
@@ -98,7 +98,7 @@ ResultProcessor::createThreadContext(const vespalib::Doom & hardDoom, size_t thr
auto result = std::make_unique<PartialResult>((_offset + _hits), sort->hasSortData());
search::grouping::GroupingContext::UP groupingContext;
if (_groupingSession) {
- groupingContext = _groupingSession->createThreadContext(thread_id, _attrContext);
+ groupingContext = _groupingSession->createThreadContext(thread_id, _attrContext, nullptr);
}
return std::make_unique<Context>(_metaStore.getValidLids(), std::move(sort), std::move(result), std::move(groupingContext));
}