From baa0464324dbbffb9f3c0f2948ba33784d773018 Mon Sep 17 00:00:00 2001 From: Arne Juul Date: Tue, 23 Oct 2018 08:00:38 +0000 Subject: skip fields which are empty or only have the default value --- .../searchsummary/docsummary/docsumwriter.cpp | 29 ++++++++++++++++------ 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/searchsummary/src/vespa/searchsummary/docsummary/docsumwriter.cpp b/searchsummary/src/vespa/searchsummary/docsummary/docsumwriter.cpp index 8ff45202a40..6679c88e166 100644 --- a/searchsummary/src/vespa/searchsummary/docsummary/docsumwriter.cpp +++ b/searchsummary/src/vespa/searchsummary/docsummary/docsumwriter.cpp @@ -78,6 +78,9 @@ DynamicDocsumWriter::resolveInputClass(ResolveClassInfo &rci, uint32_t id) const } } +constexpr uint32_t default_32bits_int = (uint32_t)std::numeric_limits::min(); +constexpr uint64_t default_64bits_int = (uint64_t)std::numeric_limits::min(); + static void convertEntry(GetDocsumsState *state, const ResConfigEntry *resCfg, const ResEntry *entry, @@ -93,30 +96,40 @@ static void convertEntry(GetDocsumsState *state, 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); @@ -165,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 { -- cgit v1.2.3