summaryrefslogtreecommitdiffstats
path: root/searchsummary
diff options
context:
space:
mode:
authorArne Juul <arnej@verizonmedia.com>2020-05-19 08:40:18 +0000
committerArne Juul <arnej@verizonmedia.com>2020-05-19 09:54:59 +0000
commit2979729f9003c9ba67670ae787433ee0958508ec (patch)
treeae801d59991e6ae61eafda0fe5e0dd53f281c626 /searchsummary
parent89e26b2fe42a1fd88957ec76c5e1d1532d03b380 (diff)
add a writer that never skips empty or missing strings
Diffstat (limited to 'searchsummary')
-rw-r--r--searchsummary/src/vespa/searchsummary/docsummary/attribute_field_writer.cpp28
-rw-r--r--searchsummary/src/vespa/searchsummary/docsummary/attribute_field_writer.h2
2 files changed, 27 insertions, 3 deletions
diff --git a/searchsummary/src/vespa/searchsummary/docsummary/attribute_field_writer.cpp b/searchsummary/src/vespa/searchsummary/docsummary/attribute_field_writer.cpp
index 99c5d8b7f30..cf07d887328 100644
--- a/searchsummary/src/vespa/searchsummary/docsummary/attribute_field_writer.cpp
+++ b/searchsummary/src/vespa/searchsummary/docsummary/attribute_field_writer.cpp
@@ -46,6 +46,15 @@ public:
void print(uint32_t idx, Cursor &cursor) override;
};
+class WriteStringFieldNeverSkip : public WriteField<search::attribute::ConstCharContent>
+{
+public:
+ WriteStringFieldNeverSkip(vespalib::Memory fieldName,
+ const IAttributeVector &attr)
+ : WriteField(fieldName, attr) {}
+ ~WriteStringFieldNeverSkip() override {}
+ void print(uint32_t idx, Cursor &cursor) override;
+};
class WriteFloatField : public WriteField<search::attribute::FloatContent>
{
@@ -104,6 +113,17 @@ WriteStringField::print(uint32_t idx, Cursor &cursor)
}
}
+void
+WriteStringFieldNeverSkip::print(uint32_t idx, Cursor &cursor)
+{
+ if (idx < _size) {
+ const char *s = _content[idx];
+ cursor.setString(_fieldName, vespalib::Memory(s));
+ } else {
+ cursor.setString(_fieldName, vespalib::Memory(""));
+ }
+}
+
WriteFloatField::WriteFloatField(vespalib::Memory fieldName,
const IAttributeVector &attr)
: WriteField(fieldName, attr)
@@ -147,7 +167,7 @@ WriteIntField::print(uint32_t idx, Cursor &cursor)
}
std::unique_ptr<AttributeFieldWriter>
-AttributeFieldWriter::create(vespalib::Memory fieldName, const IAttributeVector &attr)
+AttributeFieldWriter::create(vespalib::Memory fieldName, const IAttributeVector &attr, bool no_empty_strings)
{
switch (attr.getBasicType()) {
case BasicType::INT8:
@@ -162,7 +182,11 @@ AttributeFieldWriter::create(vespalib::Memory fieldName, const IAttributeVector
case BasicType::DOUBLE:
return std::make_unique<WriteFloatField>(fieldName, attr);
case BasicType::STRING:
- return std::make_unique<WriteStringField>(fieldName, attr);
+ if (no_empty_strings) {
+ return std::make_unique<WriteStringFieldNeverSkip>(fieldName, attr);
+ } else {
+ return std::make_unique<WriteStringField>(fieldName, attr);
+ }
default:
assert(false);
abort();
diff --git a/searchsummary/src/vespa/searchsummary/docsummary/attribute_field_writer.h b/searchsummary/src/vespa/searchsummary/docsummary/attribute_field_writer.h
index 3fed6edb1b5..d0f1487b76a 100644
--- a/searchsummary/src/vespa/searchsummary/docsummary/attribute_field_writer.h
+++ b/searchsummary/src/vespa/searchsummary/docsummary/attribute_field_writer.h
@@ -27,7 +27,7 @@ public:
virtual ~AttributeFieldWriter();
virtual void fetch(uint32_t docId) = 0;
virtual void print(uint32_t idx, vespalib::slime::Cursor &cursor) = 0;
- static std::unique_ptr<AttributeFieldWriter> create(vespalib::Memory fieldName, const search::attribute::IAttributeVector &attr);
+ static std::unique_ptr<AttributeFieldWriter> create(vespalib::Memory fieldName, const search::attribute::IAttributeVector &attr, bool no_empty_strings = false);
uint32_t size() const { return _size; }
};