diff options
Diffstat (limited to 'searchsummary/src')
-rw-r--r-- | searchsummary/src/vespa/searchsummary/docsummary/docsumwriter.cpp | 203 | ||||
-rw-r--r-- | searchsummary/src/vespa/searchsummary/docsummary/docsumwriter.h | 9 |
2 files changed, 8 insertions, 204 deletions
diff --git a/searchsummary/src/vespa/searchsummary/docsummary/docsumwriter.cpp b/searchsummary/src/vespa/searchsummary/docsummary/docsumwriter.cpp index 01ebf333fe2..c4e70e452cf 100644 --- a/searchsummary/src/vespa/searchsummary/docsummary/docsumwriter.cpp +++ b/searchsummary/src/vespa/searchsummary/docsummary/docsumwriter.cpp @@ -28,151 +28,6 @@ IDocsumWriter::slime2RawBuf(const Slime & slime, RawBuf & buf) return (buf.GetUsedLen() - preUsed); } -uint32_t -DynamicDocsumWriter::WriteClassID(uint32_t classID, search::RawBuf *target) -{ - uint32_t written = 0; - - target->append(&classID, sizeof(classID)); - written = sizeof(classID); - - return written; -} - - -uint32_t -DynamicDocsumWriter::GenerateDocsum(uint32_t docid, - GetDocsumsState *state, - const ResultClass *outputClass, - search::RawBuf *target) -{ - uint32_t written = 0; - - written += WriteClassID(outputClass->GetClassID(), target); - - for (uint32_t i = 0; i < outputClass->GetNumEntries(); i++) { - - const ResConfigEntry *outCfg = outputClass->GetEntry(i); - IDocsumFieldWriter *writer = _overrideTable[outCfg->_enumValue]; - LOG_ASSERT(writer != NULL); - - written += writer->WriteField(docid, NULL, state, outCfg->_type, target); - } - - return written; -} - - -uint32_t -DynamicDocsumWriter::RepackDocsum(GeneralResult *gres, - GetDocsumsState *state, - const ResultClass *outputClass, - search::RawBuf *target) -{ - uint32_t written = 0; - - written += WriteClassID(outputClass->GetClassID(), target); - - DocsumFormat::Appender appender(*target); - - for (uint32_t i = 0; i < outputClass->GetNumEntries(); i++) { - - const ResConfigEntry *outCfg = outputClass->GetEntry(i); - IDocsumFieldWriter *writer = _overrideTable[outCfg->_enumValue]; - - if (writer != NULL) { - - written += writer->WriteField(gres->GetDocID(), gres, state, - outCfg->_type, target); - - } else { - - int inIdx = gres->GetClass()->GetIndexFromEnumValue(outCfg->_enumValue); - const ResConfigEntry *inCfg = gres->GetClass()->GetEntry(inIdx); - - if (inCfg != NULL && inCfg->_type == outCfg->_type) { - - // copy field - - const ResEntry *entry = gres->GetEntry(inIdx); - LOG_ASSERT(entry != NULL); - - switch (outCfg->_type) { - - case RES_INT: { - written += appender.addInt32(entry->_intval); - break; } - - case RES_SHORT: { - written += appender.addShort(entry->_intval); - break; } - - case RES_BYTE: { - written += appender.addByte(entry->_intval); - break; } - - case RES_FLOAT: { - written += appender.addFloat(entry->_doubleval); - break; } - - case RES_DOUBLE: { - written += appender.addDouble(entry->_doubleval); - break; } - - case RES_INT64: { - written += appender.addInt64(entry->_int64val); - break; } - - case RES_STRING: { - uint32_t slen = entry->_stringlen; - const char *sval = entry->_stringval; - written += appender.addShortData(sval, slen); - break; } - - case RES_DATA: { - uint32_t dlen = entry->_datalen; - const char *dval = entry->_dataval; - written += appender.addShortData(dval, dlen); - break; } - - case RES_XMLSTRING: - case RES_JSONSTRING: - case RES_FEATUREDATA: - case RES_LONG_STRING: { - uint32_t flen = entry->_len; - uint32_t slen = entry->_get_length(); - - // preserve compression flag - target->append(&flen, sizeof(flen)); - written += sizeof(flen); - target->append(entry->_stringval, slen); - written += slen; - break; } - - case RES_TENSOR: - case RES_LONG_DATA: { - uint32_t flen = entry->_len; - uint32_t dlen = entry->_get_length(); - - // preserve compression flag - target->append(&flen, sizeof(flen)); - written += sizeof(flen); - target->append(entry->_dataval, dlen); - written += dlen; - break; } - } - - } else { - // insert empty field - written += appender.addEmpty(outCfg->_type); - } - } - } // END for loop - - return written; -} - - DynamicDocsumWriter::ResolveClassInfo DynamicDocsumWriter::resolveClassInfo(vespalib::stringref outputClassName, uint32_t inputClassId) const { @@ -223,51 +78,6 @@ DynamicDocsumWriter::resolveInputClass(ResolveClassInfo &rci, uint32_t id) const rci.outputClass = rci.inputClass; rci.outputClassInfo = rci.inputClass->getDynamicInfo(); } - if ((rci.inputClass == rci.outputClass) && (rci.outputClassInfo->_overrideCnt == 0)) { - rci.mustRepack = false; - } -} - -void -DynamicDocsumWriter::resolveInputClass(ResolveClassInfo &rci, DocsumStoreValue blob) const -{ - uint32_t id = _resultConfig->GetClassID(blob.pt(), blob.len()); - resolveInputClass(rci, id); -} - - -uint32_t -DynamicDocsumWriter::oldWriteDocsum(uint32_t docid, - GetDocsumsState *state, - IDocsumStore *docinfos, - search::RawBuf *target) -{ - ResolveClassInfo rci = resolveOutputClass(state->_args.getResultClassName()); - if (rci.mustSkip) { - return 0; - } else if (rci.allGenerated) { - // generate docsum entry on-the-fly - return GenerateDocsum(docid, state, rci.outputClass, target); - } - // look up docsum entry - DocsumStoreValue value = docinfos->getMappedDocsum(docid, false); - resolveInputClass(rci, value); - if (rci.mustSkip) { - return 0; - } else if (rci.mustRepack) { - // re-pack docsum blob - GeneralResult gres(rci.inputClass, 0, docid, 0); - if (gres.inplaceUnpack(value)) { - return RepackDocsum(&gres, state, rci.outputClass, target); - } else { // unpack failed - LOG(error, "Unpack failed: illegal docsum entry for document %d", docid); - } - } else { - // pass-through docsum blob - target->append(value.pt(), value.len()); - return value.len(); - } - return 0; } @@ -500,13 +310,12 @@ DynamicDocsumWriter::WriteDocsum(uint32_t docid, IDocsumStore *docinfos, search::RawBuf *target) { - if ((state->_args.getFlags() & ::search::fs4transport::GDFLAG_ALLOW_SLIME) != 0) { - vespalib::Slime slime; - vespalib::slime::SlimeInserter inserter(slime); - insertDocsum(resolveClassInfo(state->_args.getResultClassName(), docinfos->getSummaryClassId()), docid, state, docinfos, slime, inserter); - return slime2RawBuf(slime, *target); - } - return oldWriteDocsum(docid, state, docinfos, target); + vespalib::Slime slime; + vespalib::slime::SlimeInserter inserter(slime); + ResolveClassInfo rci = resolveClassInfo(state->_args.getResultClassName(), + docinfos->getSummaryClassId()); + insertDocsum(rci, docid, state, docinfos, slime, inserter); + return slime2RawBuf(slime, *target); } diff --git a/searchsummary/src/vespa/searchsummary/docsummary/docsumwriter.h b/searchsummary/src/vespa/searchsummary/docsummary/docsumwriter.h index 66e64bc7d10..a773c704536 100644 --- a/searchsummary/src/vespa/searchsummary/docsummary/docsumwriter.h +++ b/searchsummary/src/vespa/searchsummary/docsummary/docsumwriter.h @@ -25,13 +25,12 @@ public: struct ResolveClassInfo { bool mustSkip; bool allGenerated; - bool mustRepack; uint32_t outputClassId; const ResultClass *outputClass; const ResultClass::DynamicInfo *outputClassInfo; const ResultClass *inputClass; ResolveClassInfo() - : mustSkip(false), allGenerated(false), mustRepack(true), + : mustSkip(false), allGenerated(false), outputClassId(ResultConfig::NoClassID()), outputClass(NULL), outputClassInfo(NULL), inputClass(NULL) { } @@ -85,12 +84,8 @@ private: search::RawBuf *target); void resolveInputClass(ResolveClassInfo &rci, uint32_t id) const; - void resolveInputClass(ResolveClassInfo &rci, DocsumStoreValue blob) const; - ResolveClassInfo resolveOutputClass(vespalib::stringref outputClassName) const; - uint32_t oldWriteDocsum(uint32_t docid, GetDocsumsState *state, - IDocsumStore *docinfos, - search::RawBuf *target); + ResolveClassInfo resolveOutputClass(vespalib::stringref outputClassName) const; public: DynamicDocsumWriter(ResultConfig *config, KeywordExtractor *extractor); |