diff options
author | Arne Juul <arnej@verizonmedia.com> | 2020-05-19 08:40:18 +0000 |
---|---|---|
committer | Arne Juul <arnej@verizonmedia.com> | 2020-05-19 09:54:59 +0000 |
commit | 2979729f9003c9ba67670ae787433ee0958508ec (patch) | |
tree | ae801d59991e6ae61eafda0fe5e0dd53f281c626 /searchsummary/src | |
parent | 89e26b2fe42a1fd88957ec76c5e1d1532d03b380 (diff) |
add a writer that never skips empty or missing strings
Diffstat (limited to 'searchsummary/src')
-rw-r--r-- | searchsummary/src/vespa/searchsummary/docsummary/attribute_field_writer.cpp | 28 | ||||
-rw-r--r-- | searchsummary/src/vespa/searchsummary/docsummary/attribute_field_writer.h | 2 |
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; } }; |