diff options
9 files changed, 34 insertions, 11 deletions
diff --git a/container-search/src/main/java/com/yahoo/search/dispatch/rpc/ProtobufSerialization.java b/container-search/src/main/java/com/yahoo/search/dispatch/rpc/ProtobufSerialization.java index e5fa37e7a65..09a101e3bff 100644 --- a/container-search/src/main/java/com/yahoo/search/dispatch/rpc/ProtobufSerialization.java +++ b/container-search/src/main/java/com/yahoo/search/dispatch/rpc/ProtobufSerialization.java @@ -33,6 +33,7 @@ import com.yahoo.vespa.objects.BufferSerializer; import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.List; +import java.util.Set; import java.util.function.Consumer; public class ProtobufSerialization { @@ -130,6 +131,7 @@ public class ProtobufSerialization { static SearchProtocol.DocsumRequest.Builder createDocsumRequestBuilder(Query query, String serverId, String summaryClass, + Set<String> fields, boolean includeQueryData, double requestTimeout) { var builder = SearchProtocol.DocsumRequest.newBuilder() @@ -139,6 +141,9 @@ public class ProtobufSerialization { if (summaryClass != null) { builder.setSummaryClass(summaryClass); } + if (fields != null) { + builder.addAllFields(fields); + } var documentDb = query.getModel().getDocumentDb(); if (documentDb != null) { diff --git a/container-search/src/main/java/com/yahoo/search/dispatch/rpc/RpcProtobufFillInvoker.java b/container-search/src/main/java/com/yahoo/search/dispatch/rpc/RpcProtobufFillInvoker.java index 9e426cfe164..c84795352f5 100644 --- a/container-search/src/main/java/com/yahoo/search/dispatch/rpc/RpcProtobufFillInvoker.java +++ b/container-search/src/main/java/com/yahoo/search/dispatch/rpc/RpcProtobufFillInvoker.java @@ -88,7 +88,7 @@ public class RpcProtobufFillInvoker extends FillInvoker { return; } var builder = ProtobufSerialization.createDocsumRequestBuilder( - result.getQuery(), serverId, summaryClass, summaryNeedsQuery, timeout.request()); + result.getQuery(), serverId, summaryClass, result.getQuery().getPresentation().getSummaryFields(), summaryNeedsQuery, timeout.request()); hitsByNode.forEach((nodeId, hits) -> { var payload = ProtobufSerialization.serializeDocsumRequest(builder, hits); sendDocsumsRequest(nodeId, hits, payload, result, timeout.client()); diff --git a/container-search/src/test/java/com/yahoo/search/dispatch/rpc/ProtobufSerializationTest.java b/container-search/src/test/java/com/yahoo/search/dispatch/rpc/ProtobufSerializationTest.java index 72b3095b2f9..6f7a1f3bd8b 100644 --- a/container-search/src/test/java/com/yahoo/search/dispatch/rpc/ProtobufSerializationTest.java +++ b/container-search/src/test/java/com/yahoo/search/dispatch/rpc/ProtobufSerializationTest.java @@ -16,6 +16,7 @@ import org.junit.jupiter.api.Test; import java.util.Collections; import java.util.List; +import java.util.Set; import static org.junit.jupiter.api.Assertions.*; @@ -60,13 +61,13 @@ public class ProtobufSerializationTest { @Test void testDocsumSerialization() { Query q = new Query("search/?query=test&hits=10&offset=3"); - var builder = ProtobufSerialization.createDocsumRequestBuilder(q, "server", "summary", true, 0.5); + var builder = ProtobufSerialization.createDocsumRequestBuilder(q, "server", "summary", Set.of("f1", "f2"),true, 0.5); builder.setTimeout(0); var hit = new FastHit(); hit.setGlobalId(new GlobalId(IdString.createIdString("id:ns:type::id")).getRawId()); var bytes = ProtobufSerialization.serializeDocsumRequest(builder, Collections.singletonList(hit)); - assertEquals(46, bytes.length); + assertEquals(56, bytes.length); } private String contentsOf(ByteString property) { diff --git a/searchlib/src/protobuf/search_protocol.proto b/searchlib/src/protobuf/search_protocol.proto index b46287d8d71..3cf2f01a7a8 100644 --- a/searchlib/src/protobuf/search_protocol.proto +++ b/searchlib/src/protobuf/search_protocol.proto @@ -88,6 +88,7 @@ message DocsumRequest { string geo_location = 13; // to be moved into query_tree bytes query_tree_blob = 14; // serialized opaquely like now, to be changed later repeated bytes global_ids = 15; + repeated string fields = 16; } message DocsumReply { diff --git a/searchlib/src/vespa/searchlib/engine/docsumrequest.cpp b/searchlib/src/vespa/searchlib/engine/docsumrequest.cpp index 8b3325fbdd5..143f4586313 100644 --- a/searchlib/src/vespa/searchlib/engine/docsumrequest.cpp +++ b/searchlib/src/vespa/searchlib/engine/docsumrequest.cpp @@ -12,7 +12,9 @@ DocsumRequest::DocsumRequest() DocsumRequest::DocsumRequest(RelativeTime relativeTime) : Request(std::move(relativeTime)), resultClassName(), - hits() + hits(), + sessionId(), + _fields() { } diff --git a/searchlib/src/vespa/searchlib/engine/docsumrequest.h b/searchlib/src/vespa/searchlib/engine/docsumrequest.h index d4f3a1ec340..b53bac42cd3 100644 --- a/searchlib/src/vespa/searchlib/engine/docsumrequest.h +++ b/searchlib/src/vespa/searchlib/engine/docsumrequest.h @@ -15,6 +15,7 @@ public: using UP = std::unique_ptr<DocsumRequest>; using SP = std::shared_ptr<DocsumRequest>; using Source = LazySource<DocsumRequest>; + using FieldList = std::vector<vespalib::string>; class Hit { public: @@ -25,15 +26,17 @@ public: mutable uint32_t docid; // converted in backend }; -public: vespalib::string resultClassName; -public: std::vector<Hit> hits; std::vector<char> sessionId; DocsumRequest(); DocsumRequest(RelativeTime relativeTime); ~DocsumRequest() override; + const FieldList & getFields() const { return _fields; } + void setFields(FieldList fields) { _fields = std::move(fields); } +private: + FieldList _fields; }; } diff --git a/searchsummary/src/vespa/searchsummary/docsummary/docsumwriter.cpp b/searchsummary/src/vespa/searchsummary/docsummary/docsumwriter.cpp index 18371970722..7e97116a62d 100644 --- a/searchsummary/src/vespa/searchsummary/docsummary/docsumwriter.cpp +++ b/searchsummary/src/vespa/searchsummary/docsummary/docsumwriter.cpp @@ -61,7 +61,7 @@ DynamicDocsumWriter::insertDocsum(const ResolveClassInfo & rci, uint32_t docid, for (uint32_t i = 0; i < rci.outputClass->GetNumEntries(); ++i) { const ResConfigEntry *resCfg = rci.outputClass->GetEntry(i); const DocsumFieldWriter *writer = _overrideTable[resCfg->_enumValue].get(); - if (! writer->isDefaultValue(docid, state)) { + if (state->_args.needField(resCfg->_bindname) && ! writer->isDefaultValue(docid, state)) { const Memory field_name(resCfg->_bindname.data(), resCfg->_bindname.size()); ObjectInserter inserter(docsum, field_name); writer->insertField(docid, nullptr, state, resCfg->_type, inserter); @@ -77,6 +77,7 @@ DynamicDocsumWriter::insertDocsum(const ResolveClassInfo & rci, uint32_t docid, vespalib::slime::Cursor & docsum = topInserter.insertObject(); for (uint32_t i = 0; i < rci.outputClass->GetNumEntries(); ++i) { const ResConfigEntry *outCfg = rci.outputClass->GetEntry(i); + if ( ! state->_args.needField(outCfg->_bindname)) continue; const DocsumFieldWriter *writer = _overrideTable[outCfg->_enumValue].get(); const Memory field_name(outCfg->_bindname.data(), outCfg->_bindname.size()); ObjectInserter inserter(docsum, field_name); diff --git a/searchsummary/src/vespa/searchsummary/docsummary/getdocsumargs.cpp b/searchsummary/src/vespa/searchsummary/docsummary/getdocsumargs.cpp index af0bd5fd884..dc9de0c6f35 100644 --- a/searchsummary/src/vespa/searchsummary/docsummary/getdocsumargs.cpp +++ b/searchsummary/src/vespa/searchsummary/docsummary/getdocsumargs.cpp @@ -1,6 +1,7 @@ // Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. #include "getdocsumargs.h" +#include <vespa/vespalib/stllike/hash_set_insert.hpp> namespace search::docsummary { @@ -11,7 +12,8 @@ GetDocsumArgs::GetDocsumArgs() _stackDump(), _location(), _timeout(30s), - _highlightTerms() + _highlightTerms(), + _fields() { } @@ -27,6 +29,7 @@ GetDocsumArgs::initFromDocsumRequest(const engine::DocsumRequest &req) _locations_possible = true; _timeout = req.getTimeLeft(); _highlightTerms = req.propertiesMap.highlightTerms(); + _fields = FieldSet(req.getFields().begin(), req.getFields().end()); } void @@ -36,4 +39,9 @@ GetDocsumArgs::SetStackDump(uint32_t stackDumpLen, const char *stackDump) memcpy(&_stackDump[0], stackDump, _stackDump.size()); } +bool +GetDocsumArgs::needField(vespalib::stringref field) const { + return _fields.empty() || _fields.contains(field); +} + } diff --git a/searchsummary/src/vespa/searchsummary/docsummary/getdocsumargs.h b/searchsummary/src/vespa/searchsummary/docsummary/getdocsumargs.h index 7c346a4b9bb..e973c76253d 100644 --- a/searchsummary/src/vespa/searchsummary/docsummary/getdocsumargs.h +++ b/searchsummary/src/vespa/searchsummary/docsummary/getdocsumargs.h @@ -4,12 +4,14 @@ #include <vespa/searchlib/fef/properties.h> #include <vespa/searchlib/engine/docsumrequest.h> +#include <vespa/vespalib/stllike/hash_set.h> namespace search::docsummary { class GetDocsumArgs { private: + using FieldSet = vespalib::hash_set<vespalib::string>; vespalib::string _resultClassName; bool _dumpFeatures; bool _locations_possible; @@ -17,6 +19,7 @@ private: vespalib::string _location; vespalib::duration _timeout; fef::Properties _highlightTerms; + FieldSet _fields; public: GetDocsumArgs(); ~GetDocsumArgs(); @@ -40,9 +43,8 @@ public: void dumpFeatures(bool v) { _dumpFeatures = v; } bool dumpFeatures() const { return _dumpFeatures; } - const fef::Properties &highlightTerms() const { - return _highlightTerms; - } + const fef::Properties &highlightTerms() const { return _highlightTerms; } + bool needField(vespalib::stringref field) const; }; } |