diff options
author | Arne Juul <arnej@yahoo-inc.com> | 2018-10-23 07:42:51 +0000 |
---|---|---|
committer | gjoranv <gv@oath.com> | 2019-01-21 15:09:24 +0100 |
commit | 8e1b5c809fd961e422fef8092c254cecf7281ff4 (patch) | |
tree | a56bc307bcc07dc55f92d53c34f3d63a32698d8f /searchsummary | |
parent | b18b240ddf60ce154fc622a6c4d57c99e7f4bdc7 (diff) |
skip fields which are empty or only have the default value
Diffstat (limited to 'searchsummary')
-rw-r--r-- | searchsummary/src/vespa/searchsummary/docsummary/docsumwriter.cpp | 36 |
1 files changed, 26 insertions, 10 deletions
diff --git a/searchsummary/src/vespa/searchsummary/docsummary/docsumwriter.cpp b/searchsummary/src/vespa/searchsummary/docsummary/docsumwriter.cpp index a188ab6e60a..6679c88e166 100644 --- a/searchsummary/src/vespa/searchsummary/docsummary/docsumwriter.cpp +++ b/searchsummary/src/vespa/searchsummary/docsummary/docsumwriter.cpp @@ -78,8 +78,14 @@ DynamicDocsumWriter::resolveInputClass(ResolveClassInfo &rci, uint32_t id) const } } -static void convertEntry(GetDocsumsState *state, const ResConfigEntry *resCfg, const ResEntry *entry, - Inserter &inserter, Slime &slime) +constexpr uint32_t default_32bits_int = (uint32_t)std::numeric_limits<int32_t>::min(); +constexpr uint64_t default_64bits_int = (uint64_t)std::numeric_limits<int64_t>::min(); + +static void convertEntry(GetDocsumsState *state, + const ResConfigEntry *resCfg, + const ResEntry *entry, + Inserter &inserter, + Slime &slime) { using vespalib::slime::BinaryFormat; const char *ptr; @@ -90,30 +96,40 @@ static void convertEntry(GetDocsumsState *state, const ResConfigEntry *resCfg, c case RES_INT: case RES_SHORT: case RES_BYTE: - inserter.insertLong(entry->_intval); + if (entry->_intval != default_32bits_int) { + inserter.insertLong(entry->_intval); + } break; case RES_BOOL: inserter.insertBool(entry->_intval != 0); break; case RES_FLOAT: case RES_DOUBLE: - inserter.insertDouble(entry->_doubleval); + if (! std::isnan(entry->_doubleval)) { + inserter.insertDouble(entry->_doubleval); + } break; case RES_INT64: - inserter.insertLong(entry->_int64val); + if (entry->_int64val != default_64bits_int) { + inserter.insertLong(entry->_int64val); + } break; case RES_STRING: case RES_LONG_STRING: case RES_FEATUREDATA: case RES_XMLSTRING: entry->_resolve_field(&ptr, &len, &state->_docSumFieldSpace); - inserter.insertString(Memory(ptr, len)); + if (len != 0) { + inserter.insertString(Memory(ptr, len)); + } break; case RES_DATA: case RES_TENSOR: case RES_LONG_DATA: entry->_resolve_field(&ptr, &len, &state->_docSumFieldSpace); - inserter.insertData(Memory(ptr, len)); + if (len != 0) { + inserter.insertData(Memory(ptr, len)); + } break; case RES_JSONSTRING: entry->_resolve_field(&ptr, &len, &state->_docSumFieldSpace); @@ -162,10 +178,10 @@ DynamicDocsumWriter::insertDocsum(const ResolveClassInfo & rci, uint32_t docid, const Memory field_name(outCfg->_bindname.data(), outCfg->_bindname.size()); ObjectInserter inserter(docsum, field_name); if (writer != nullptr) { - //TODO: Need to add test for writer->isDefaultValue - writer->insertField(docid, &gres, state, outCfg->_type, inserter); + if (! writer->isDefaultValue(docid, state)) { + writer->insertField(docid, &gres, state, outCfg->_type, inserter); + } } else { - //TODO: Need to add similar test as writer->isDefaultValue if (rci.inputClass == rci.outputClass) { convertEntry(state, outCfg, gres.GetEntry(i), inserter, slime); } else { |