summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--container-search/src/main/java/com/yahoo/search/dispatch/rpc/ProtobufSerialization.java5
-rw-r--r--container-search/src/main/java/com/yahoo/search/dispatch/rpc/RpcProtobufFillInvoker.java2
-rw-r--r--container-search/src/test/java/com/yahoo/search/dispatch/rpc/ProtobufSerializationTest.java5
-rw-r--r--searchlib/src/protobuf/search_protocol.proto1
-rw-r--r--searchlib/src/vespa/searchlib/engine/docsumrequest.cpp4
-rw-r--r--searchlib/src/vespa/searchlib/engine/docsumrequest.h7
-rw-r--r--searchsummary/src/vespa/searchsummary/docsummary/docsumwriter.cpp3
-rw-r--r--searchsummary/src/vespa/searchsummary/docsummary/getdocsumargs.cpp10
-rw-r--r--searchsummary/src/vespa/searchsummary/docsummary/getdocsumargs.h8
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;
};
}