diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2024-06-26 08:35:07 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-06-26 08:35:07 +0200 |
commit | 28928d915eeaddc4cd1de7a94a285e467d473d74 (patch) | |
tree | df19795ecf14fe17a0de2509f16f912a41c0f003 | |
parent | b66f6d91e47ddce1d2213b663d522a3521049abc (diff) | |
parent | ed17df033524055a4b4c9c5c8ed2e7b473440d44 (diff) |
Merge pull request #31724 from vespa-engine/balder/bring-document-type-along-in-grouping
Wire in document type along to grouping code.
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)); } |