diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2019-01-10 13:18:13 +0000 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2019-01-11 17:19:49 +0000 |
commit | 869336f82c9e9e40fc722e4d32ec8f778a50008a (patch) | |
tree | ff628615e65d19727b8899f67f4afbb137b9b256 | |
parent | 6bdf170a470a6f9519bab9688dfba1fd5b5f4397 (diff) |
GC unused code
25 files changed, 202 insertions, 1062 deletions
diff --git a/searchcore/src/tests/proton/docsummary/docsummary.cpp b/searchcore/src/tests/proton/docsummary/docsummary.cpp index db6116073e6..c0c706383f6 100644 --- a/searchcore/src/tests/proton/docsummary/docsummary.cpp +++ b/searchcore/src/tests/proton/docsummary/docsummary.cpp @@ -106,7 +106,7 @@ public: TuneFileSummary(), _fileHeaderContext, _noTlSyncer, - NULL), + nullptr), _serialNum(1) { } @@ -262,7 +262,7 @@ public: op.setPrevDbDocumentId(prevDbdId); _ddb->getFeedHandler().storeOperation(op, std::make_shared<search::IgnoreCallback>()); SearchView *sv(dynamic_cast<SearchView *>(_ddb->getReadySubDB()->getSearchView().get())); - if (sv != NULL) { + if (sv != nullptr) { // cf. FeedView::putAttributes() DocIdLimit &docIdLimit = sv->getDocIdLimit(); if (docIdLimit.get() <= lid) @@ -278,14 +278,11 @@ private: ResultConfig _resultCfg; std::set<vespalib::string> _markupFields; - const ResultConfig &getResultConfig() const - { + const ResultConfig &getResultConfig() const{ return _resultCfg; } - const std::set<vespalib::string> & - getMarkupFields() const - { + const std::set<vespalib::string> &getMarkupFields() const{ return _markupFields; } @@ -295,31 +292,12 @@ private: GeneralResultPtr getResult(const DocsumReply & reply, uint32_t id, uint32_t resultClassID); - bool - assertString(const std::string & exp, - const std::string & fieldName, - DocumentStoreAdapter &dsa, - uint32_t id); + bool assertString(const std::string & exp, const std::string & fieldName, DocumentStoreAdapter &dsa, uint32_t id); - bool - assertString(const std::string &exp, - const std::string &fieldName, - const DocsumReply &reply, - uint32_t id, - uint32_t resultClassID); + void assertTensor(const Tensor::UP &exp, const std::string &fieldName, const DocsumReply &reply, + uint32_t id, uint32_t resultClassID); - void - assertTensor(const Tensor::UP &exp, - const std::string &fieldName, - const DocsumReply &reply, - uint32_t id, - uint32_t resultClassID); - - bool - assertSlime(const std::string &exp, - const DocsumReply &reply, - uint32_t id, - bool relaxed = false); + bool assertSlime(const std::string &exp, const DocsumReply &reply, uint32_t id,bool relaxed = false); void requireThatAdapterHandlesAllFieldTypes(); void requireThatAdapterHandlesMultipleDocuments(); @@ -346,12 +324,10 @@ GeneralResultPtr Test::getResult(DocumentStoreAdapter & dsa, uint32_t docId) { DocsumStoreValue docsum = dsa.getMappedDocsum(docId); - ASSERT_TRUE(docsum.pt() != NULL); - GeneralResultPtr retval(new GeneralResult(dsa.getResultClass(), - 0, 0, 0)); + ASSERT_TRUE(docsum.pt() != nullptr); + auto retval = std::make_unique<GeneralResult>(dsa.getResultClass()); // skip the 4 byte class id - ASSERT_TRUE(retval->unpack(docsum.pt() + 4, - docsum.len() - 4) == 0); + ASSERT_TRUE(retval->unpack(docsum.pt() + 4, docsum.len() - 4)); return retval; } @@ -359,46 +335,26 @@ Test::getResult(DocumentStoreAdapter & dsa, uint32_t docId) GeneralResultPtr Test::getResult(const DocsumReply & reply, uint32_t id, uint32_t resultClassID) { - GeneralResultPtr retval(new GeneralResult(getResultConfig(). - LookupResultClass(resultClassID), - 0, 0, 0)); + auto retval = std::make_unique<GeneralResult>(getResultConfig().LookupResultClass(resultClassID)); const DocsumReply::Docsum & docsum = reply.docsums[id]; // skip the 4 byte class id - ASSERT_EQUAL(0, retval->unpack(docsum.data.c_str() + 4, docsum.data.size() - 4)); + ASSERT_TRUE(retval->unpack(docsum.data.c_str() + 4, docsum.data.size() - 4)); return retval; } bool Test::assertString(const std::string & exp, const std::string & fieldName, - DocumentStoreAdapter &dsa, - uint32_t id) + DocumentStoreAdapter &dsa, uint32_t id) { GeneralResultPtr res = getResult(dsa, id); - return EXPECT_EQUAL(exp, std::string(res->GetEntry(fieldName.c_str())-> - _stringval, - res->GetEntry(fieldName.c_str())-> - _stringlen)); + return EXPECT_EQUAL(exp, std::string(res->GetEntry(fieldName.c_str())->_stringval, + res->GetEntry(fieldName.c_str())->_stringlen)); } - -bool -Test::assertString(const std::string & exp, const std::string & fieldName, - const DocsumReply & reply, - uint32_t id, uint32_t resultClassID) -{ - GeneralResultPtr res = getResult(reply, id, resultClassID); - return EXPECT_EQUAL(exp, std::string(res->GetEntry(fieldName.c_str())-> - _stringval, - res->GetEntry(fieldName.c_str())-> - _stringlen)); -} - - void Test::assertTensor(const Tensor::UP & exp, const std::string & fieldName, - const DocsumReply & reply, - uint32_t id, uint32_t) + const DocsumReply & reply, uint32_t id, uint32_t) { const DocsumReply::Docsum & docsum = reply.docsums[id]; uint32_t classId; @@ -408,8 +364,7 @@ Test::assertTensor(const Tensor::UP & exp, const std::string & fieldName, vespalib::Slime slime; vespalib::Memory serialized(docsum.data.c_str() + sizeof(classId), docsum.data.size() - sizeof(classId)); - size_t decodeRes = BinaryFormat::decode(serialized, - slime); + size_t decodeRes = BinaryFormat::decode(serialized, slime); ASSERT_EQUAL(decodeRes, serialized.size); EXPECT_EQUAL(exp.get() != nullptr, slime.get()[fieldName].valid()); @@ -547,7 +502,7 @@ Test::requireThatAdapterHandlesMultipleDocuments() } { // doc 2 DocsumStoreValue docsum = dsa.getMappedDocsum(2); - EXPECT_TRUE(docsum.pt() == NULL); + EXPECT_TRUE(docsum.pt() == nullptr); } { // doc 0 (again) GeneralResultPtr res = getResult(dsa, 0); @@ -640,7 +595,7 @@ Test::requireThatDocsumRequestIsProcessed() EXPECT_TRUE(assertSlime("{a:40}", *rep, 1, false)); EXPECT_EQUAL(search::endDocId, rep->docsums[2].docid); EXPECT_EQUAL(gid9, rep->docsums[2].gid); - EXPECT_TRUE(rep->docsums[2].data.get() == NULL); + EXPECT_TRUE(rep->docsums[2].data.get() == nullptr); } @@ -874,11 +829,11 @@ Test::requireThatSummaryAdapterHandlesPutAndRemove() dc._sa->put(1, 1, *exp); IDocumentStore & store = dc._ddb->getReadySubDB()->getSummaryManager()->getBackingStore(); Document::UP act = store.read(1, *bc._repo); - EXPECT_TRUE(act.get() != NULL); + EXPECT_TRUE(act.get() != nullptr); EXPECT_EQUAL(exp->getType(), act->getType()); EXPECT_EQUAL("foo", act->getValue("f1")->toString()); dc._sa->remove(2, 1); - EXPECT_TRUE(store.read(1, *bc._repo).get() == NULL); + EXPECT_TRUE(store.read(1, *bc._repo).get() == nullptr); } @@ -928,7 +883,7 @@ Test::requireThatAnnotationsAreUsed() IDocumentStore & store = dc._ddb->getReadySubDB()->getSummaryManager()->getBackingStore(); Document::UP act = store.read(1, *bc._repo); - EXPECT_TRUE(act.get() != NULL); + EXPECT_TRUE(act.get() != nullptr); EXPECT_EQUAL(exp->getType(), act->getType()); EXPECT_EQUAL("foo bar", act->getValue("g")->getAsString()); EXPECT_EQUAL("foo bar", act->getValue("dynamicstring")->getAsString()); @@ -1082,7 +1037,7 @@ Test::requireThatUrisAreUsed() IDocumentStore & store = dc._ddb->getReadySubDB()->getSummaryManager()->getBackingStore(); Document::UP act = store.read(1, *bc._repo); - EXPECT_TRUE(act.get() != NULL); + EXPECT_TRUE(act.get() != nullptr); EXPECT_EQUAL(exp->getType(), act->getType()); DocumentStoreAdapter dsa(store, *bc._repo, getResultConfig(), "class0", @@ -1140,7 +1095,7 @@ Test::requireThatPositionsAreUsed() IDocumentStore & store = dc._ddb->getReadySubDB()->getSummaryManager()->getBackingStore(); Document::UP act = store.read(1, *bc._repo); - EXPECT_TRUE(act.get() != NULL); + EXPECT_TRUE(act.get() != nullptr); EXPECT_EQUAL(exp->getType(), act->getType()); DocsumRequest req; @@ -1219,7 +1174,7 @@ Test::requireThatRawFieldsWorks() IDocumentStore & store = dc._ddb->getReadySubDB()->getSummaryManager()->getBackingStore(); Document::UP act = store.read(1, *bc._repo); - EXPECT_TRUE(act.get() != NULL); + EXPECT_TRUE(act.get() != nullptr); EXPECT_EQUAL(exp->getType(), act->getType()); DocumentStoreAdapter dsa(store, *bc._repo, getResultConfig(), "class0", diff --git a/searchsummary/src/tests/docsumformat/docsum-pack.cpp b/searchsummary/src/tests/docsumformat/docsum-pack.cpp index 7a9834e3fd8..18b38db3fa1 100644 --- a/searchsummary/src/tests/docsumformat/docsum-pack.cpp +++ b/searchsummary/src/tests/docsumformat/docsum-pack.cpp @@ -10,7 +10,6 @@ LOG_SETUP("docsum-pack"); using namespace search::docsummary; - // needed to resolve external symbol from httpd.h on AIX void FastS_block_usr2() {} @@ -20,8 +19,8 @@ class MyApp : public FastOS_Application private: bool _rc; uint32_t _cnt; - search::docsummary::ResultConfig _config; - search::docsummary::ResultPacker _packer; + ResultConfig _config; + ResultPacker _packer; public: MyApp(); @@ -33,33 +32,18 @@ public: { ReportTestResult(line, rc); return rc; } // compare runtime info (,but ignore result class) - bool Equal(search::docsummary::ResEntry *a, search::docsummary::ResEntry *b); - bool Equal(search::docsummary::GeneralResult *a, search::docsummary::GeneralResult *b); - - void TestFieldIndex(uint32_t line, search::docsummary::GeneralResult *gres, - const char *field, int idx); - - void TestIntValue(uint32_t line, search::docsummary::GeneralResult *gres, - const char *field, uint32_t value); - - void TestDoubleValue(uint32_t line, search::docsummary::GeneralResult *gres, - const char *field, double value); + bool Equal(ResEntry *a, ResEntry *b); + bool Equal(GeneralResult *a, GeneralResult *b); - void TestInt64Value(uint32_t line, search::docsummary::GeneralResult *gres, - const char *field, uint64_t value); + void TestIntValue(uint32_t line, GeneralResult *gres, const char *field, uint32_t value); + void TestDoubleValue(uint32_t line, GeneralResult *gres, const char *field, double value); + void TestInt64Value(uint32_t line, GeneralResult *gres, const char *field, uint64_t value); + void TestStringValue(uint32_t line, GeneralResult *gres, const char *field, const char *value); + void TestDataValue(uint32_t line, GeneralResult *gres, const char *field, const char *value); - void TestStringValue(uint32_t line, search::docsummary::GeneralResult *gres, - const char *field, const char *value); - - void TestDataValue(uint32_t line, search::docsummary::GeneralResult *gres, - const char *field, const char *value); - - void TestBasic(); void TestFailLong(); void TestFailShort(); void TestFailOrder(); - void TestCompress(); - void TestCompat(); void TestBasicInplace(); void TestCompressInplace(); @@ -72,7 +56,8 @@ MyApp::MyApp() _config(), _packer(&_config) {} -MyApp::~MyApp() {} + +MyApp::~MyApp() = default; void MyApp::ReportTestResult(uint32_t line, bool rc) @@ -89,7 +74,7 @@ MyApp::ReportTestResult(uint32_t line, bool rc) bool -MyApp::Equal(search::docsummary::ResEntry *a, search::docsummary::ResEntry *b) +MyApp::Equal(ResEntry *a, ResEntry *b) { if (a->_type != b->_type) return false; @@ -106,7 +91,7 @@ MyApp::Equal(search::docsummary::ResEntry *a, search::docsummary::ResEntry *b) bool -MyApp::Equal(search::docsummary::GeneralResult *a, search::docsummary::GeneralResult *b) +MyApp::Equal(GeneralResult *a, GeneralResult *b) { uint32_t numEntries = a->GetClass()->GetNumEntries(); @@ -125,56 +110,36 @@ MyApp::Equal(search::docsummary::GeneralResult *a, search::docsummary::GeneralRe return true; } - -void -MyApp::TestFieldIndex(uint32_t line, search::docsummary::GeneralResult *gres, - const char *field, int idx) -{ - bool rc = (gres != NULL && - gres->GetClass()->GetIndexFromName(field) == idx); - - RTR(line, rc); -} - - void -MyApp::TestIntValue(uint32_t line, search::docsummary::GeneralResult *gres, - const char *field, uint32_t value) +MyApp::TestIntValue(uint32_t line, GeneralResult *gres, const char *field, uint32_t value) { - search::docsummary::ResEntry *entry - = (gres != NULL) ? gres->GetEntry(field) : NULL; + ResEntry *entry = (gres != nullptr) ? gres->GetEntry(field) : nullptr; - bool rc = (entry != NULL && + bool rc = (entry != nullptr && entry->_type == RES_INT && entry->_intval == value); RTR(line, rc); } - void -MyApp::TestDoubleValue(uint32_t line, search::docsummary::GeneralResult *gres, - const char *field, double value) +MyApp::TestDoubleValue(uint32_t line, GeneralResult *gres, const char *field, double value) { - search::docsummary::ResEntry *entry - = (gres != NULL) ? gres->GetEntry(field) : NULL; + ResEntry *entry = (gres != nullptr) ? gres->GetEntry(field) : nullptr; - bool rc = (entry != NULL && + bool rc = (entry != nullptr && entry->_type == RES_DOUBLE && entry->_doubleval == value); RTR(line, rc); } - void -MyApp::TestInt64Value(uint32_t line, search::docsummary::GeneralResult *gres, - const char *field, uint64_t value) +MyApp::TestInt64Value(uint32_t line, GeneralResult *gres, const char *field, uint64_t value) { - search::docsummary::ResEntry *entry - = (gres != NULL) ? gres->GetEntry(field) : NULL; + ResEntry *entry = (gres != nullptr) ? gres->GetEntry(field) : nullptr; - bool rc = (entry != NULL && + bool rc = (entry != nullptr && entry->_type == RES_INT64 && entry->_int64val == value); @@ -183,36 +148,29 @@ MyApp::TestInt64Value(uint32_t line, search::docsummary::GeneralResult *gres, void -MyApp::TestStringValue(uint32_t line, search::docsummary::GeneralResult *gres, - const char *field, const char *value) +MyApp::TestStringValue(uint32_t line, GeneralResult *gres, const char *field, const char *value) { - search::docsummary::ResEntry *entry - = (gres != NULL) ? gres->GetEntry(field) : NULL; + ResEntry *entry = (gres != nullptr) ? gres->GetEntry(field) : nullptr; - bool rc = (entry != NULL && + bool rc = (entry != nullptr && entry->_type == RES_STRING && entry->_stringlen == strlen(value) && strncmp(entry->_stringval, value, entry->_stringlen) == 0); - if (!rc && entry != NULL) { - LOG(warning, - "string value '%.*s' != '%s'", - (int) entry->_stringlen, - entry->_stringval, value); + if (!rc && entry != nullptr) { + LOG(warning,"string value '%.*s' != '%s'", + (int) entry->_stringlen, entry->_stringval, value); } RTR(line, rc); } - void -MyApp::TestDataValue(uint32_t line, search::docsummary::GeneralResult *gres, - const char *field, const char *value) +MyApp::TestDataValue(uint32_t line, GeneralResult *gres, const char *field, const char *value) { - search::docsummary::ResEntry *entry - = (gres != NULL) ? gres->GetEntry(field) : NULL; + ResEntry *entry = (gres != nullptr) ? gres->GetEntry(field) : nullptr; - bool rc = (entry != NULL && + bool rc = (entry != nullptr && entry->_type == RES_DATA && entry->_datalen == strlen(value) && strncmp(entry->_dataval, value, entry->_datalen) == 0); @@ -220,62 +178,6 @@ MyApp::TestDataValue(uint32_t line, search::docsummary::GeneralResult *gres, RTR(line, rc); } - -void -MyApp::TestBasic() -{ - const char *buf; - uint32_t buflen; - - search::docsummary::urlresult *res; - search::docsummary::GeneralResult *gres; - - uint32_t intval = 4; - uint16_t shortval = 2; - uint8_t byteval = 1; - float floatval = 4.5; - double doubleval = 8.75; - uint64_t int64val = 8; - const char *strval = "This is a string"; - const char *datval = "This is data"; - const char *lstrval = "This is a long string"; - const char *ldatval = "This is long data"; - - RTR(__LINE__, _packer.Init(0)); - RTR(__LINE__, _packer.AddInteger(intval)); - RTR(__LINE__, _packer.AddShort(shortval)); - RTR(__LINE__, _packer.AddByte(byteval)); - RTR(__LINE__, _packer.AddFloat(floatval)); - RTR(__LINE__, _packer.AddDouble(doubleval)); - RTR(__LINE__, _packer.AddInt64(int64val)); - RTR(__LINE__, _packer.AddString(strval, strlen(strval))); - RTR(__LINE__, _packer.AddData(datval, strlen(datval))); - RTR(__LINE__, _packer.AddLongString(lstrval, strlen(lstrval))); - RTR(__LINE__, _packer.AddLongData(ldatval, strlen(ldatval))); - RTR(__LINE__, _packer.GetDocsumBlob(&buf, &buflen)); - - res = _config.Unpack(0, 0, 0, buf, buflen); - gres = res->IsGeneral() ? (search::docsummary::GeneralResult *) res : NULL; - - RTR(__LINE__, gres != NULL); - TestIntValue (__LINE__, gres, "integer", 4); - TestIntValue (__LINE__, gres, "short", 2); - TestIntValue (__LINE__, gres, "byte", 1); - TestDoubleValue(__LINE__, gres, "float", floatval); - TestDoubleValue(__LINE__, gres, "double", doubleval); - TestInt64Value (__LINE__, gres, "int64", int64val); - TestStringValue(__LINE__, gres, "string", strval); - TestDataValue (__LINE__, gres, "data", datval); - TestStringValue(__LINE__, gres, "longstring", lstrval); - TestDataValue (__LINE__, gres, "longdata", ldatval); - RTR(__LINE__, (gres != NULL && - gres->GetClass()->GetNumEntries() == 10)); - RTR(__LINE__, (gres != NULL && - gres->GetClass()->GetClassID() == 0)); - delete res; -} - - void MyApp::TestFailLong() { @@ -308,7 +210,6 @@ MyApp::TestFailLong() RTR(__LINE__, !_packer.GetDocsumBlob(&buf, &buflen)); } - void MyApp::TestFailShort() { @@ -371,95 +272,6 @@ MyApp::TestFailOrder() } -void -MyApp::TestCompress() -{ - const char *buf; - uint32_t buflen; - - search::docsummary::urlresult *res; - search::docsummary::GeneralResult *gres; - - const char *lstrval = "string string string"; - const char *ldatval = "data data data"; - - RTR(__LINE__, _packer.Init(2)); - RTR(__LINE__, _packer.AddLongString(lstrval, strlen(lstrval))); - RTR(__LINE__, _packer.AddLongData(ldatval, strlen(ldatval))); - RTR(__LINE__, _packer.GetDocsumBlob(&buf, &buflen)); - - res = _config.Unpack(0, 0, 0, buf, buflen); - gres = res->IsGeneral() ? (search::docsummary::GeneralResult *) res : NULL; - - RTR(__LINE__, gres != NULL); - TestStringValue(__LINE__, gres, "text", lstrval); - TestDataValue (__LINE__, gres, "data", ldatval); - RTR(__LINE__, (gres != NULL && - gres->GetClass()->GetNumEntries() == 2)); - RTR(__LINE__, (gres != NULL && - gres->GetClass()->GetClassID() == 2)); - delete res; -} - - -void -MyApp::TestCompat() -{ - const char *buf; - uint32_t buflen; - - search::docsummary::urlresult *res1; - search::docsummary::GeneralResult *gres1; - - search::docsummary::urlresult *res2; - search::docsummary::GeneralResult *gres2; - - const char *strval = "string string string string"; - const char *datval = "data data data data"; - - RTR(__LINE__, _packer.Init(1)); - RTR(__LINE__, _packer.AddData(strval, strlen(strval))); - RTR(__LINE__, _packer.AddString(datval, strlen(datval))); - RTR(__LINE__, _packer.GetDocsumBlob(&buf, &buflen)); - res1 = _config.Unpack(0, 0, 0, buf, buflen); - gres1 = res1->IsGeneral() ? (search::docsummary::GeneralResult *) res1 : NULL; - - RTR(__LINE__, _packer.Init(2)); - RTR(__LINE__, _packer.AddLongData(strval, strlen(strval))); - RTR(__LINE__, _packer.AddLongString(datval, strlen(datval))); - RTR(__LINE__, _packer.GetDocsumBlob(&buf, &buflen)); - res2 = _config.Unpack(0, 0, 0, buf, buflen); - gres2 = res2->IsGeneral() ? (search::docsummary::GeneralResult *) res2 : NULL; - - RTR(__LINE__, gres1 != NULL); - RTR(__LINE__, gres2 != NULL); - - TestStringValue(__LINE__, gres1, "text", strval); - TestDataValue (__LINE__, gres1, "data", datval); - TestFieldIndex (__LINE__, gres1, "text", 0); - TestFieldIndex (__LINE__, gres1, "data", 1); - RTR(__LINE__, (gres1 != NULL && - gres1->GetClass()->GetNumEntries() == 2)); - - TestStringValue(__LINE__, gres2, "text", strval); - TestDataValue (__LINE__, gres2, "data", datval); - TestFieldIndex (__LINE__, gres2, "text", 0); - TestFieldIndex (__LINE__, gres2, "data", 1); - RTR(__LINE__, (gres2 != NULL && - gres2->GetClass()->GetNumEntries() == 2)); - - RTR(__LINE__, (gres1 != NULL && - gres1->GetClass()->GetClassID() == 1)); - RTR(__LINE__, (gres2 != NULL && - gres2->GetClass()->GetClassID() == 2)); - - RTR(__LINE__, (gres1 != NULL && gres2 != NULL && - Equal(gres1, gres2))); - - delete res1; - delete res2; -} - void MyApp::TestBasicInplace() @@ -467,8 +279,8 @@ MyApp::TestBasicInplace() const char *buf; uint32_t buflen; - const search::docsummary::ResultClass *resClass; - search::docsummary::GeneralResult *gres; + const ResultClass *resClass; + GeneralResult *gres; uint32_t intval = 4; uint16_t shortval = 2; @@ -495,18 +307,18 @@ MyApp::TestBasicInplace() RTR(__LINE__, _packer.GetDocsumBlob(&buf, &buflen)); resClass = _config.LookupResultClass(_config.GetClassID(buf, buflen)); - if (resClass == NULL) { - gres = NULL; + if (resClass == nullptr) { + gres = nullptr; } else { DocsumStoreValue value(buf, buflen); - gres = new search::docsummary::GeneralResult(resClass, 0, 0, 0); + gres = new GeneralResult(resClass); if (!gres->inplaceUnpack(value)) { delete gres; - gres = NULL; + gres = nullptr; } } - RTR(__LINE__, gres != NULL); + RTR(__LINE__, gres != nullptr); TestIntValue (__LINE__, gres, "integer", 4); TestIntValue (__LINE__, gres, "short", 2); TestIntValue (__LINE__, gres, "byte", 1); @@ -517,9 +329,9 @@ MyApp::TestBasicInplace() TestDataValue (__LINE__, gres, "data", datval); TestStringValue(__LINE__, gres, "longstring", lstrval); TestDataValue (__LINE__, gres, "longdata", ldatval); - RTR(__LINE__, (gres != NULL && + RTR(__LINE__, (gres != nullptr && gres->GetClass()->GetNumEntries() == 10)); - RTR(__LINE__, (gres != NULL && + RTR(__LINE__, (gres != nullptr && gres->GetClass()->GetClassID() == 0)); delete gres; } @@ -533,8 +345,8 @@ MyApp::TestCompressInplace() search::RawBuf field1(32768); search::RawBuf field2(32768); - const search::docsummary::ResultClass *resClass; - search::docsummary::GeneralResult *gres; + const ResultClass *resClass; + GeneralResult *gres; const char *lstrval = "string string string"; const char *ldatval = "data data data"; @@ -545,48 +357,46 @@ MyApp::TestCompressInplace() RTR(__LINE__, _packer.GetDocsumBlob(&buf, &buflen)); resClass = _config.LookupResultClass(_config.GetClassID(buf, buflen)); - if (resClass == NULL) { - gres = NULL; + if (resClass == nullptr) { + gres = nullptr; } else { DocsumStoreValue value(buf, buflen); - gres = new search::docsummary::GeneralResult(resClass, 0, 0, 0); + gres = new GeneralResult(resClass); if (!gres->inplaceUnpack(value)) { delete gres; - gres = NULL; + gres = nullptr; } } - search::docsummary::ResEntry *e1 = (gres == NULL) ? NULL : gres->GetEntry("text"); - search::docsummary::ResEntry *e2 = (gres == NULL) ? NULL : gres->GetEntry("data"); + ResEntry *e1 = (gres == nullptr) ? nullptr : gres->GetEntry("text"); + ResEntry *e2 = (gres == nullptr) ? nullptr : gres->GetEntry("data"); - if (e1 != NULL) + if (e1 != nullptr) e1->_extract_field(&field1); - if (e2 != NULL) + if (e2 != nullptr) e2->_extract_field(&field2); - RTR(__LINE__, gres != NULL); - RTR(__LINE__, e1 != NULL); - RTR(__LINE__, e2 != NULL); + RTR(__LINE__, gres != nullptr); + RTR(__LINE__, e1 != nullptr); + RTR(__LINE__, e2 != nullptr); RTR(__LINE__, strcmp(field1.GetDrainPos(), lstrval) == 0); RTR(__LINE__, strcmp(field2.GetDrainPos(), ldatval) == 0); RTR(__LINE__, strlen(lstrval) == field1.GetUsedLen()); RTR(__LINE__, strlen(ldatval) == field2.GetUsedLen()); - RTR(__LINE__, (gres != NULL && + RTR(__LINE__, (gres != nullptr && gres->GetClass()->GetNumEntries() == 2)); - RTR(__LINE__, (gres != NULL && + RTR(__LINE__, (gres != nullptr && gres->GetClass()->GetClassID() == 2)); delete gres; } - - int MyApp::Main() { _rc = true; _cnt = 0; - search::docsummary::ResultClass *resClass; + ResultClass *resClass; resClass = _config.AddResultClass("c0", 0); resClass->AddConfigEntry("integer", RES_INT); @@ -608,12 +418,9 @@ MyApp::Main() resClass->AddConfigEntry("text", RES_LONG_STRING); resClass->AddConfigEntry("data", RES_LONG_DATA); - TestBasic(); TestFailLong(); TestFailShort(); TestFailOrder(); - TestCompress(); - TestCompat(); TestBasicInplace(); TestCompressInplace(); @@ -621,7 +428,6 @@ MyApp::Main() return (_rc ? 0 : 1); } - int main(int argc, char **argv) { diff --git a/searchsummary/src/tests/docsummary/positionsdfw_test.cpp b/searchsummary/src/tests/docsummary/positionsdfw_test.cpp index 7497a66d138..764ff4723cb 100644 --- a/searchsummary/src/tests/docsummary/positionsdfw_test.cpp +++ b/searchsummary/src/tests/docsummary/positionsdfw_test.cpp @@ -24,8 +24,7 @@ using search::attribute::IAttributeFunctor; using vespalib::string; using std::vector; -namespace search { -namespace docsummary { +namespace search::docsummary { namespace { @@ -136,7 +135,7 @@ void checkWritePositionField(Test &test, AttrType &attr, vespalib::Slime target; vespalib::slime::SlimeInserter inserter(target); - writer->insertField(doc_id, nullptr, &state, res_type, inserter); + writer->insertField(doc_id, &state, res_type, inserter); vespalib::Memory got = target.get().asString(); test.EXPECT_EQUAL(expected.size(), got.size); @@ -154,7 +153,6 @@ void Test::requireThat2DPositionFieldIsWritten() { } } // namespace -} // namespace docsummary -} // namespace search +} TEST_APPHOOK(search::docsummary::Test); diff --git a/searchsummary/src/vespa/searchsummary/docsummary/attribute_combiner_dfw.cpp b/searchsummary/src/vespa/searchsummary/docsummary/attribute_combiner_dfw.cpp index 015eb70c74a..153bcea886f 100644 --- a/searchsummary/src/vespa/searchsummary/docsummary/attribute_combiner_dfw.cpp +++ b/searchsummary/src/vespa/searchsummary/docsummary/attribute_combiner_dfw.cpp @@ -90,7 +90,7 @@ StructFields::~StructFields() = default; } AttributeCombinerDFW::AttributeCombinerDFW(const vespalib::string &fieldName) - : IDocsumFieldWriter(), + : IDocsumFW(), _stateIndex(0), _fieldName(fieldName) { @@ -124,11 +124,7 @@ AttributeCombinerDFW::create(const vespalib::string &fieldName, IAttributeManage } void -AttributeCombinerDFW::insertField(uint32_t docid, - GeneralResult *, - GetDocsumsState *state, - ResType, - vespalib::slime::Inserter &target) +AttributeCombinerDFW::insertField(uint32_t docid, GetDocsumsState *state, ResType, vespalib::slime::Inserter &target) { auto &fieldWriterState = state->_fieldWriterStates[_stateIndex]; if (!fieldWriterState) { diff --git a/searchsummary/src/vespa/searchsummary/docsummary/attribute_combiner_dfw.h b/searchsummary/src/vespa/searchsummary/docsummary/attribute_combiner_dfw.h index ef54522a923..e58b0f740bf 100644 --- a/searchsummary/src/vespa/searchsummary/docsummary/attribute_combiner_dfw.h +++ b/searchsummary/src/vespa/searchsummary/docsummary/attribute_combiner_dfw.h @@ -15,7 +15,7 @@ class DynamicDocsumWriter; * This class reads values from multiple struct field attributes and * inserts them as an array of struct or a map of struct. */ -class AttributeCombinerDFW : public IDocsumFieldWriter +class AttributeCombinerDFW : public IDocsumFW { protected: uint32_t _stateIndex; @@ -28,8 +28,7 @@ public: bool IsGenerated() const override; bool setFieldWriterStateIndex(uint32_t fieldWriterStateIndex) override; static std::unique_ptr<IDocsumFieldWriter> create(const vespalib::string &fieldName, IAttributeManager &attrMgr); - void insertField(uint32_t docid, GeneralResult *gres, GetDocsumsState *state, - ResType type, vespalib::slime::Inserter &target) override; + void insertField(uint32_t docid, GetDocsumsState *state, ResType type, vespalib::slime::Inserter &target) override; }; } diff --git a/searchsummary/src/vespa/searchsummary/docsummary/attributedfw.cpp b/searchsummary/src/vespa/searchsummary/docsummary/attributedfw.cpp index ee2e9d9fa92..19dd096c46c 100644 --- a/searchsummary/src/vespa/searchsummary/docsummary/attributedfw.cpp +++ b/searchsummary/src/vespa/searchsummary/docsummary/attributedfw.cpp @@ -21,6 +21,7 @@ using namespace search; using search::attribute::IAttributeContext; using search::attribute::IAttributeVector; using search::attribute::BasicType; +using vespalib::slime::Inserter; namespace search::docsummary { @@ -42,12 +43,8 @@ public: SingleAttrDFW(const vespalib::string & attrName) : AttrDFW(attrName) { } - virtual void insertField(uint32_t docid, - GeneralResult *gres, - GetDocsumsState *state, - ResType type, - vespalib::slime::Inserter &target) override; - virtual bool isDefaultValue(uint32_t docid, const GetDocsumsState * state) const override; + void insertField(uint32_t docid, GetDocsumsState *state, ResType type, Inserter &target) override; + bool isDefaultValue(uint32_t docid, const GetDocsumsState * state) const override; }; bool SingleAttrDFW::isDefaultValue(uint32_t docid, const GetDocsumsState * state) const @@ -56,11 +53,7 @@ bool SingleAttrDFW::isDefaultValue(uint32_t docid, const GetDocsumsState * state } void -SingleAttrDFW::insertField(uint32_t docid, - GeneralResult *, - GetDocsumsState * state, - ResType type, - vespalib::slime::Inserter &target) +SingleAttrDFW::insertField(uint32_t docid, GetDocsumsState * state, ResType type, Inserter &target) { const char *s=""; const IAttributeVector & v = vec(*state); @@ -80,6 +73,11 @@ SingleAttrDFW::insertField(uint32_t docid, target.insertLong(val); break; } + case RES_BOOL: { + uint8_t val = v.getInt(docid); + target.insertBool(val != 0); + break; + } case RES_FLOAT: { float val = v.getFloat(docid); target.insertDouble(val); @@ -141,20 +139,12 @@ class MultiAttrDFW : public AttrDFW { public: MultiAttrDFW(const vespalib::string & attrName) : AttrDFW(attrName) {} - virtual void insertField(uint32_t docid, - GeneralResult *gres, - GetDocsumsState *state, - ResType type, - vespalib::slime::Inserter &target) override; + void insertField(uint32_t docid, GetDocsumsState *state, ResType type, Inserter &target) override; }; void -MultiAttrDFW::insertField(uint32_t docid, - GeneralResult *, - GetDocsumsState *state, - ResType, - vespalib::slime::Inserter &target) +MultiAttrDFW::insertField(uint32_t docid, GetDocsumsState *state, ResType, Inserter &target) { using vespalib::slime::Cursor; using vespalib::Memory; diff --git a/searchsummary/src/vespa/searchsummary/docsummary/attributedfw.h b/searchsummary/src/vespa/searchsummary/docsummary/attributedfw.h index 643170663b8..d8102734452 100644 --- a/searchsummary/src/vespa/searchsummary/docsummary/attributedfw.h +++ b/searchsummary/src/vespa/searchsummary/docsummary/attributedfw.h @@ -8,7 +8,7 @@ namespace search::attribute { class IAttributeVector; } namespace search::docsummary { -class AttrDFW : public IDocsumFieldWriter +class AttrDFW : public IDocsumFW { private: vespalib::string _attrName; diff --git a/searchsummary/src/vespa/searchsummary/docsummary/docsumfieldwriter.cpp b/searchsummary/src/vespa/searchsummary/docsummary/docsumfieldwriter.cpp index 1eb8399845c..f24f5841bd2 100644 --- a/searchsummary/src/vespa/searchsummary/docsummary/docsumfieldwriter.cpp +++ b/searchsummary/src/vespa/searchsummary/docsummary/docsumfieldwriter.cpp @@ -31,20 +31,14 @@ IDocsumFieldWriter::setFieldWriterStateIndex(uint32_t) EmptyDFW::EmptyDFW() = default; - EmptyDFW::~EmptyDFW() = default; void -EmptyDFW::insertField(uint32_t /*docid*/, - GeneralResult *, - GetDocsumsState *, - ResType, - vespalib::slime::Inserter &target) +EmptyDFW::insertField(uint32_t, GetDocsumsState *, ResType, vespalib::slime::Inserter &target) { // insert explicitly-empty field? // target.insertNix(); (void)target; - return; } //-------------------------------------------------------------------------- @@ -54,10 +48,8 @@ CopyDFW::CopyDFW() { } - CopyDFW::~CopyDFW() = default; - bool CopyDFW::Init(const ResultConfig & config, const char *inputField) { @@ -85,7 +77,6 @@ CopyDFW::Init(const ResultConfig & config, const char *inputField) return true; } - void CopyDFW::insertField(uint32_t /*docid*/, GeneralResult *gres, GetDocsumsState *state, ResType type, vespalib::slime::Inserter &target) diff --git a/searchsummary/src/vespa/searchsummary/docsummary/docsumfieldwriter.h b/searchsummary/src/vespa/searchsummary/docsummary/docsumfieldwriter.h index 51079f7736e..870e4fa8d83 100644 --- a/searchsummary/src/vespa/searchsummary/docsummary/docsumfieldwriter.h +++ b/searchsummary/src/vespa/searchsummary/docsummary/docsumfieldwriter.h @@ -16,7 +16,7 @@ class GetDocsumsState; class IDocsumFieldWriter { public: - typedef std::unique_ptr<IDocsumFieldWriter> UP; + using UP = std::unique_ptr<IDocsumFieldWriter>; IDocsumFieldWriter() : _index(0) { } virtual ~IDocsumFieldWriter() {} @@ -27,10 +27,7 @@ public: { return ResultConfig::IsRuntimeCompatible(a, b); } virtual bool IsGenerated() const = 0; - virtual void insertField(uint32_t docid, - GeneralResult *gres, - GetDocsumsState *state, - ResType type, + virtual void insertField(uint32_t docid, GeneralResult *gres, GetDocsumsState *state, ResType type, vespalib::slime::Inserter &target) = 0; virtual const vespalib::string & getAttributeName() const { return _empty; } virtual bool isDefaultValue(uint32_t docid, const GetDocsumsState * state) const { @@ -46,20 +43,27 @@ private: static const vespalib::string _empty; }; +class IDocsumFW : public IDocsumFieldWriter +{ +public: + virtual void insertField(uint32_t docid, GetDocsumsState *state, ResType type, vespalib::slime::Inserter &target) = 0; + void insertField(uint32_t docid, GeneralResult *, GetDocsumsState *state, ResType type, + vespalib::slime::Inserter &target) override + { + insertField(docid, state, type, target); + } +}; + //-------------------------------------------------------------------------- -class EmptyDFW : public IDocsumFieldWriter +class EmptyDFW : public IDocsumFW { public: EmptyDFW(); - virtual ~EmptyDFW(); - - virtual bool IsGenerated() const override { return true; } - virtual void insertField(uint32_t docid, - GeneralResult *gres, - GetDocsumsState *state, - ResType type, - vespalib::slime::Inserter &target) override; + ~EmptyDFW() override; + + bool IsGenerated() const override { return true; } + void insertField(uint32_t docid, GetDocsumsState *state, ResType type, vespalib::slime::Inserter &target) override; }; //-------------------------------------------------------------------------- @@ -71,16 +75,13 @@ private: public: CopyDFW(); - virtual ~CopyDFW(); + ~CopyDFW() override; bool Init(const ResultConfig & config, const char *inputField); - virtual bool IsGenerated() const override { return false; } - virtual void insertField(uint32_t docid, - GeneralResult *gres, - GetDocsumsState *state, - ResType type, - vespalib::slime::Inserter &target) override; + bool IsGenerated() const override { return false; } + void insertField(uint32_t docid, GeneralResult *gres, GetDocsumsState *state, ResType type, + vespalib::slime::Inserter &target) override; }; //-------------------------------------------------------------------------- diff --git a/searchsummary/src/vespa/searchsummary/docsummary/docsumwriter.cpp b/searchsummary/src/vespa/searchsummary/docsummary/docsumwriter.cpp index 72dbddda0b4..a188ab6e60a 100644 --- a/searchsummary/src/vespa/searchsummary/docsummary/docsumwriter.cpp +++ b/searchsummary/src/vespa/searchsummary/docsummary/docsumwriter.cpp @@ -149,7 +149,7 @@ DynamicDocsumWriter::insertDocsum(const ResolveClassInfo & rci, uint32_t docid, // look up docsum entry DocsumStoreValue value = docinfos->getMappedDocsum(docid); // re-pack docsum blob - GeneralResult gres(rci.inputClass, 0, docid, 0); + GeneralResult gres(rci.inputClass); if (! gres.inplaceUnpack(value)) { LOG(debug, "Unpack failed: illegal docsum entry for document %d. This is expected during lidspace compaction.", docid); topInserter.insertNix(); diff --git a/searchsummary/src/vespa/searchsummary/docsummary/dynamicteaserdfw.cpp b/searchsummary/src/vespa/searchsummary/docsummary/dynamicteaserdfw.cpp index 4112afc1895..b9177ac8782 100644 --- a/searchsummary/src/vespa/searchsummary/docsummary/dynamicteaserdfw.cpp +++ b/searchsummary/src/vespa/searchsummary/docsummary/dynamicteaserdfw.cpp @@ -23,7 +23,7 @@ struct ExplicitItemData uint32_t _weight; ExplicitItemData() - : _index(NULL), _indexlen(0), _term(NULL), _termlen(0), _weight(0) + : _index(nullptr), _indexlen(0), _term(nullptr), _termlen(0), _weight(0) {} ExplicitItemData(const char *index, uint32_t indexlen, const char* term, @@ -43,19 +43,16 @@ struct QueryItem { search::SimpleQueryStackDumpIterator *_si; const ExplicitItemData *_data; - QueryItem() : _si(NULL), _data(NULL) {} - QueryItem(search::SimpleQueryStackDumpIterator *si) : _si(si), _data(NULL) {} - QueryItem(ExplicitItemData *data) : _si(NULL), _data(data) {} + QueryItem() : _si(nullptr), _data(nullptr) {} + QueryItem(search::SimpleQueryStackDumpIterator *si) : _si(si), _data(nullptr) {} + QueryItem(ExplicitItemData *data) : _si(nullptr), _data(data) {} private: QueryItem(const QueryItem&); QueryItem& operator= (const QueryItem&); }; -}; - -namespace search { -class Property; +} -namespace fef { +namespace search::fef { class TermVisitor : public IPropertiesVisitor { public: @@ -104,24 +101,22 @@ TermVisitor::visitProperty(const Property::Value &key, const Property &values) } -namespace docsummary { +namespace search::docsummary { class JuniperQueryAdapter : public juniper::IQuery { private: - JuniperQueryAdapter(const JuniperQueryAdapter&); - JuniperQueryAdapter operator= (const JuniperQueryAdapter&); - KeywordExtractor *_kwExtractor; const vespalib::stringref _buf; const search::fef::Properties *_highlightTerms; juniper::IQueryVisitor *_visitor; public: - JuniperQueryAdapter(KeywordExtractor *kwExtractor, - vespalib::stringref buf, - const search::fef::Properties *highlightTerms = NULL) - : _kwExtractor(kwExtractor), _buf(buf), _highlightTerms(highlightTerms), _visitor(NULL) {} + JuniperQueryAdapter(const JuniperQueryAdapter&) = delete; + JuniperQueryAdapter operator= (const JuniperQueryAdapter&) = delete; + JuniperQueryAdapter(KeywordExtractor *kwExtractor, vespalib::stringref buf, + const search::fef::Properties *highlightTerms = nullptr) + : _kwExtractor(kwExtractor), _buf(buf), _highlightTerms(highlightTerms), _visitor(nullptr) {} // TODO: put this functionality into the stack dump iterator bool SkipItem(search::SimpleQueryStackDumpIterator *iterator) const @@ -136,28 +131,28 @@ public: return true; } - virtual bool Traverse(juniper::IQueryVisitor *v) const override; + bool Traverse(juniper::IQueryVisitor *v) const override; - virtual int Weight(const juniper::QueryItem* item) const override + int Weight(const juniper::QueryItem* item) const override { - if (item->_si != NULL) { + if (item->_si != nullptr) { return item->_si->GetWeight().percent(); } else { return item->_data->_weight; } } - virtual juniper::ItemCreator Creator(const juniper::QueryItem* item) const override + juniper::ItemCreator Creator(const juniper::QueryItem* item) const override { // cast master: Knut Omang - if (item->_si != NULL) { + if (item->_si != nullptr) { return (juniper::ItemCreator) item->_si->getCreator(); } else { return juniper::CREA_ORIG; } } - virtual const char *Index(const juniper::QueryItem* item, size_t *len) const override + const char *Index(const juniper::QueryItem* item, size_t *len) const override { - if (item->_si != NULL) { + if (item->_si != nullptr) { *len = item->_si->getIndexName().size(); return item->_si->getIndexName().data(); } else { @@ -166,14 +161,14 @@ public: } } - virtual bool UsefulIndex(const juniper::QueryItem* item) const override + bool UsefulIndex(const juniper::QueryItem* item) const override { vespalib::stringref index; - if (_kwExtractor == NULL) + if (_kwExtractor == nullptr) return true; - if (item->_si != NULL) { + if (item->_si != nullptr) { index = item->_si->getIndexName(); } else { index = vespalib::stringref(item->_data->_index, item->_data->_indexlen); @@ -182,8 +177,6 @@ public: } }; - - bool JuniperQueryAdapter::Traverse(juniper::IQueryVisitor *v) const { @@ -308,7 +301,7 @@ JuniperDFW::JuniperDFW(juniper::Juniper * juniper) } -JuniperDFW::~JuniperDFW() { } +JuniperDFW::~JuniperDFW() = default; bool JuniperDFW::Init( @@ -319,10 +312,10 @@ JuniperDFW::Init( { bool rc = true; const util::StringEnum & enums(config.GetFieldNameEnum()); - if (langFieldName != NULL) + if (langFieldName != nullptr) _langFieldEnumValue = enums.Lookup(langFieldName); _juniperConfig = _juniper->CreateConfig(fieldName); - if (_juniperConfig.get() == NULL) { + if (_juniperConfig.get() == nullptr) { LOG(warning, "could not create juniper config for field '%s'", fieldName); rc = false; } @@ -350,7 +343,7 @@ JuniperTeaserDFW::Init( const ResConfigEntry *entry = it->GetEntry(it->GetIndexFromEnumValue(_inputFieldEnumValue)); - if (entry != NULL && + if (entry != nullptr && !IsRuntimeCompatible(entry->_type, RES_STRING) && !IsRuntimeCompatible(entry->_type, RES_DATA)) { @@ -363,15 +356,13 @@ JuniperTeaserDFW::Init( } vespalib::string -DynamicTeaserDFW::makeDynamicTeaser(uint32_t docid, - GeneralResult *gres, - GetDocsumsState *state) +DynamicTeaserDFW::makeDynamicTeaser(uint32_t docid, GeneralResult *gres, GetDocsumsState *state) { - if (state->_dynteaser._query == NULL) { + if (state->_dynteaser._query == nullptr) { JuniperQueryAdapter iq(state->_kwExtractor, state->_args.getStackDump(), &state->_args.highlightTerms()); - state->_dynteaser._query = _juniper->CreateQueryHandle(iq, NULL); + state->_dynteaser._query = _juniper->CreateQueryHandle(iq, nullptr); } if (docid != state->_dynteaser._docid || @@ -384,34 +375,31 @@ DynamicTeaserDFW::makeDynamicTeaser(uint32_t docid, _langFieldEnumValue, state->_dynteaser._lang, (juniper::AnalyseCompatible(_juniperConfig.get(), state->_dynteaser._config) ? "no" : "yes")); - if (state->_dynteaser._result != NULL) + if (state->_dynteaser._result != nullptr) juniper::ReleaseResult(state->_dynteaser._result); state->_dynteaser._docid = docid; state->_dynteaser._input = _inputFieldEnumValue; state->_dynteaser._lang = _langFieldEnumValue; state->_dynteaser._config = _juniperConfig.get(); - state->_dynteaser._result = NULL; + state->_dynteaser._result = nullptr; int idx = gres->GetClass()->GetIndexFromEnumValue(_inputFieldEnumValue); ResEntry *entry = gres->GetEntry(idx); - if (entry != NULL && - state->_dynteaser._query != NULL) { + if (entry != nullptr && state->_dynteaser._query != nullptr) { // obtain Juniper input const char *buf; uint32_t buflen; - entry->_resolve_field(&buf, &buflen, - &state->_docSumFieldSpace); + entry->_resolve_field(&buf, &buflen, &state->_docSumFieldSpace); if (LOG_WOULD_LOG(spam)) { std::ostringstream hexDump; hexDump << vespalib::HexDump(buf, buflen); LOG(spam, "makeDynamicTeaser: docid=%d, input='%s', hexdump:\n%s", - docid, std::string(buf, buflen).c_str(), - hexDump.str().c_str()); + docid, std::string(buf, buflen).c_str(), hexDump.str().c_str()); } uint32_t langid = static_cast<uint32_t>(-1); @@ -422,33 +410,29 @@ DynamicTeaserDFW::makeDynamicTeaser(uint32_t docid, } } - juniper::Summary *teaser = (state->_dynteaser._result != NULL) + juniper::Summary *teaser = (state->_dynteaser._result != nullptr) ? juniper::GetTeaser(state->_dynteaser._result, _juniperConfig.get()) - : NULL; + : nullptr; if (LOG_WOULD_LOG(debug)) { std::ostringstream hexDump; - if (teaser != NULL) { + if (teaser != nullptr) { hexDump << vespalib::HexDump(teaser->Text(), teaser->Length()); } LOG(debug, "makeDynamicTeaser: docid=%d, teaser='%s', hexdump:\n%s", - docid, (teaser != NULL ? std::string(teaser->Text(), teaser->Length()).c_str() : "NULL"), + docid, (teaser != nullptr ? std::string(teaser->Text(), teaser->Length()).c_str() : "nullptr"), hexDump.str().c_str()); } - if (teaser != NULL) { - return vespalib::string(teaser->Text(), - teaser->Length()); + if (teaser != nullptr) { + return vespalib::string(teaser->Text(), teaser->Length()); } else { return vespalib::string(); } } void -DynamicTeaserDFW::insertField(uint32_t docid, - GeneralResult *gres, - GetDocsumsState *state, - ResType, +DynamicTeaserDFW::insertField(uint32_t docid, GeneralResult *gres, GetDocsumsState *state, ResType, vespalib::slime::Inserter &target) { vespalib::string teaser = makeDynamicTeaser(docid, gres, state); @@ -456,6 +440,4 @@ DynamicTeaserDFW::insertField(uint32_t docid, target.insertString(value); } -} // namespace docsummary -} // namespace search - +} diff --git a/searchsummary/src/vespa/searchsummary/docsummary/geoposdfw.cpp b/searchsummary/src/vespa/searchsummary/docsummary/geoposdfw.cpp index bf010172fa9..ae3d6acde43 100644 --- a/searchsummary/src/vespa/searchsummary/docsummary/geoposdfw.cpp +++ b/searchsummary/src/vespa/searchsummary/docsummary/geoposdfw.cpp @@ -40,8 +40,7 @@ void fmtZcurve(int64_t zval, vespalib::slime::Inserter &target) } void -GeoPositionDFW::insertField(uint32_t docid, GeneralResult *, GetDocsumsState * dsState, - ResType, vespalib::slime::Inserter &target) +GeoPositionDFW::insertField(uint32_t docid, GetDocsumsState * dsState, ResType, vespalib::slime::Inserter &target) { using vespalib::slime::Cursor; using vespalib::slime::ObjectSymbolInserter; diff --git a/searchsummary/src/vespa/searchsummary/docsummary/geoposdfw.h b/searchsummary/src/vespa/searchsummary/docsummary/geoposdfw.h index 8f630cde3af..9bd85abaf17 100644 --- a/searchsummary/src/vespa/searchsummary/docsummary/geoposdfw.h +++ b/searchsummary/src/vespa/searchsummary/docsummary/geoposdfw.h @@ -14,8 +14,7 @@ class GeoPositionDFW : public AttrDFW public: typedef std::unique_ptr<GeoPositionDFW> UP; GeoPositionDFW(const vespalib::string & attrName); - void insertField(uint32_t docid, GeneralResult *gres, GetDocsumsState *state, - ResType type, vespalib::slime::Inserter &target) override; + void insertField(uint32_t docid, GetDocsumsState *state, ResType type, vespalib::slime::Inserter &target) override; static UP create(const char *attribute_name, IAttributeManager *attribute_manager); }; diff --git a/searchsummary/src/vespa/searchsummary/docsummary/positionsdfw.cpp b/searchsummary/src/vespa/searchsummary/docsummary/positionsdfw.cpp index 48e79a5e34c..9c82c00c3ef 100644 --- a/searchsummary/src/vespa/searchsummary/docsummary/positionsdfw.cpp +++ b/searchsummary/src/vespa/searchsummary/docsummary/positionsdfw.cpp @@ -66,8 +66,7 @@ AbsDistanceDFW::findMinDistance(uint32_t docid, GetDocsumsState *state) } void -AbsDistanceDFW::insertField(uint32_t docid, GeneralResult *, GetDocsumsState *state, - ResType type, vespalib::slime::Inserter &target) +AbsDistanceDFW::insertField(uint32_t docid, GetDocsumsState *state, ResType type, vespalib::slime::Inserter &target) { bool forceEmpty = true; @@ -166,8 +165,7 @@ formatField(const attribute::IAttributeVector &attribute, uint32_t docid, ResTyp } void -PositionsDFW::insertField(uint32_t docid, GeneralResult *, GetDocsumsState * dsState, - ResType type, vespalib::slime::Inserter &target) +PositionsDFW::insertField(uint32_t docid, GetDocsumsState * dsState, ResType type, vespalib::slime::Inserter &target) { vespalib::asciistream val(formatField(vec(*dsState), docid, type)); target.insertString(vespalib::Memory(val.c_str(), val.size())); @@ -175,8 +173,7 @@ PositionsDFW::insertField(uint32_t docid, GeneralResult *, GetDocsumsState * dsS //-------------------------------------------------------------------------- -PositionsDFW::UP createPositionsDFW(const char *attribute_name, - IAttributeManager *attribute_manager) +PositionsDFW::UP createPositionsDFW(const char *attribute_name, IAttributeManager *attribute_manager) { PositionsDFW::UP ret; if (attribute_manager != nullptr) { @@ -195,12 +192,10 @@ PositionsDFW::UP createPositionsDFW(const char *attribute_name, return ret; } } - ret.reset(new PositionsDFW(attribute_name)); - return ret; + return std::make_unique<PositionsDFW>(attribute_name); } -AbsDistanceDFW::UP createAbsDistanceDFW(const char *attribute_name, - IAttributeManager *attribute_manager) +AbsDistanceDFW::UP createAbsDistanceDFW(const char *attribute_name, IAttributeManager *attribute_manager) { AbsDistanceDFW::UP ret; if (attribute_manager != nullptr) { @@ -219,8 +214,7 @@ AbsDistanceDFW::UP createAbsDistanceDFW(const char *attribute_name, return ret; } } - ret.reset(new AbsDistanceDFW(attribute_name)); - return ret; + return std::make_unique<AbsDistanceDFW>(attribute_name); } } diff --git a/searchsummary/src/vespa/searchsummary/docsummary/positionsdfw.h b/searchsummary/src/vespa/searchsummary/docsummary/positionsdfw.h index 69a7ba3f58f..999da6f1860 100644 --- a/searchsummary/src/vespa/searchsummary/docsummary/positionsdfw.h +++ b/searchsummary/src/vespa/searchsummary/docsummary/positionsdfw.h @@ -14,7 +14,7 @@ public: AbsDistanceDFW(const vespalib::string & attrName); bool IsGenerated() const override { return true; } - void insertField(uint32_t docid, GeneralResult *gres, GetDocsumsState *state, + void insertField(uint32_t docid, GetDocsumsState *state, ResType type, vespalib::slime::Inserter &target) override; }; @@ -28,8 +28,7 @@ public: PositionsDFW(const vespalib::string & attrName); bool IsGenerated() const override { return true; } - void insertField(uint32_t docid, GeneralResult *gres, GetDocsumsState *state, - ResType type, vespalib::slime::Inserter &target) override ; + void insertField(uint32_t docid, GetDocsumsState *state, ResType type, vespalib::slime::Inserter &target) override; }; PositionsDFW::UP createPositionsDFW(const char *attribute_name, IAttributeManager *index_man); diff --git a/searchsummary/src/vespa/searchsummary/docsummary/rankfeaturesdfw.cpp b/searchsummary/src/vespa/searchsummary/docsummary/rankfeaturesdfw.cpp index 9748bdac3b3..a1c96bb3e5b 100644 --- a/searchsummary/src/vespa/searchsummary/docsummary/rankfeaturesdfw.cpp +++ b/searchsummary/src/vespa/searchsummary/docsummary/rankfeaturesdfw.cpp @@ -20,7 +20,7 @@ RankFeaturesDFW::init(IDocsumEnvironment * env) } void -RankFeaturesDFW::insertField(uint32_t docid, GeneralResult *, GetDocsumsState *state, +RankFeaturesDFW::insertField(uint32_t docid, GetDocsumsState *state, ResType type, vespalib::slime::Inserter &target) { if (state->_rankFeatures.get() == nullptr) { diff --git a/searchsummary/src/vespa/searchsummary/docsummary/rankfeaturesdfw.h b/searchsummary/src/vespa/searchsummary/docsummary/rankfeaturesdfw.h index 04ee14c79ca..37790d2f9b8 100644 --- a/searchsummary/src/vespa/searchsummary/docsummary/rankfeaturesdfw.h +++ b/searchsummary/src/vespa/searchsummary/docsummary/rankfeaturesdfw.h @@ -19,8 +19,7 @@ public: ~RankFeaturesDFW(); void init(IDocsumEnvironment * env); bool IsGenerated() const override { return true; } - void insertField(uint32_t docid, GeneralResult *gres, GetDocsumsState *state, - ResType type, vespalib::slime::Inserter &target) override; + void insertField(uint32_t docid, GetDocsumsState *state, ResType type, vespalib::slime::Inserter &target) override; }; } diff --git a/searchsummary/src/vespa/searchsummary/docsummary/resultconfig.cpp b/searchsummary/src/vespa/searchsummary/docsummary/resultconfig.cpp index 3758ca27adf..f3834ef4a12 100644 --- a/searchsummary/src/vespa/searchsummary/docsummary/resultconfig.cpp +++ b/searchsummary/src/vespa/searchsummary/docsummary/resultconfig.cpp @@ -208,30 +208,5 @@ ResultConfig::GetClassID(const char *buf, uint32_t buflen) return ret; } -urlresult* -ResultConfig::Unpack(uint32_t partition, uint32_t docid, HitRank metric, - const char *buf, uint32_t buflen) const -{ - urlresult *ret = nullptr; - const ResultClass *resClass = nullptr; - uint32_t tmp32; - - if (buflen >= sizeof(tmp32)) { - memcpy(&tmp32, buf, sizeof(tmp32)); - buf += sizeof(tmp32); - buflen -= sizeof(tmp32); - resClass = LookupResultClass(tmp32); - } - - if (resClass != nullptr && (buflen > 0)) { - ret = new GeneralResult(resClass, partition, docid, metric); - if (ret->unpack(buf, buflen) != 0) { // FAIL: unpack - delete ret; - ret = nullptr; - } - } - - return (ret != nullptr) ? ret : new badurlresult(partition, docid, metric); -} } diff --git a/searchsummary/src/vespa/searchsummary/docsummary/resultconfig.h b/searchsummary/src/vespa/searchsummary/docsummary/resultconfig.h index f9c8ccbaa40..31218d94e93 100644 --- a/searchsummary/src/vespa/searchsummary/docsummary/resultconfig.h +++ b/searchsummary/src/vespa/searchsummary/docsummary/resultconfig.h @@ -273,25 +273,6 @@ public: * @param buflen length of docsum blob. **/ uint32_t GetClassID(const char *buf, uint32_t buflen); - - /** - * Unpack docsum blob. The first n (0/8/16/32) bits are read from - * the data given and used to look up the appropriate result - * class. A GeneralResult object is created based on that - * class and told to unpack the rest of the docsum blob. If this - * operation succeeds, the GeneralResult object is - * returned. It if fails, a badurlresult object is returned - * instead. - * - * @return object representing the unpacked result. - * @param partition partition path for current hit. - * @param docid docid for current hit. - * @param metric relevance estimate for current hit. - * @param buf docsum blob. - * @param buflen length of docsum blob. - **/ - urlresult * - Unpack(uint32_t partition, uint32_t docid, HitRank metric, const char *buf, uint32_t buflen) const; }; } diff --git a/searchsummary/src/vespa/searchsummary/docsummary/summaryfeaturesdfw.cpp b/searchsummary/src/vespa/searchsummary/docsummary/summaryfeaturesdfw.cpp index 7cf1e65fbc0..9992d782d6e 100644 --- a/searchsummary/src/vespa/searchsummary/docsummary/summaryfeaturesdfw.cpp +++ b/searchsummary/src/vespa/searchsummary/docsummary/summaryfeaturesdfw.cpp @@ -12,13 +12,11 @@ namespace search::docsummary { SummaryFeaturesDFW::SummaryFeaturesDFW() : - _env(NULL) + _env(nullptr) { } -SummaryFeaturesDFW::~SummaryFeaturesDFW() -{ -} +SummaryFeaturesDFW::~SummaryFeaturesDFW() = default; void SummaryFeaturesDFW::init(IDocsumEnvironment * env) @@ -30,8 +28,7 @@ static vespalib::string _G_cached("vespa.summaryFeatures.cached"); static vespalib::Memory _M_cached("vespa.summaryFeatures.cached"); void -SummaryFeaturesDFW::insertField(uint32_t docid, GeneralResult *, GetDocsumsState *state, - ResType type, vespalib::slime::Inserter &target) +SummaryFeaturesDFW::insertField(uint32_t docid, GetDocsumsState *state, ResType type, vespalib::slime::Inserter &target) { if ( ! state->_summaryFeatures) { state->_callback.FillSummaryFeatures(state, _env); @@ -41,7 +38,7 @@ SummaryFeaturesDFW::insertField(uint32_t docid, GeneralResult *, GetDocsumsState } const FeatureSet::StringVector &names = state->_summaryFeatures->getNames(); const feature_t *values = state->_summaryFeatures->getFeaturesByDocId(docid); - if (type == RES_FEATUREDATA && values != NULL) { + if (type == RES_FEATUREDATA && values != nullptr) { vespalib::slime::Cursor& obj = target.insertObject(); for (uint32_t i = 0; i < names.size(); ++i) { vespalib::Memory name(names[i].c_str(), names[i].size()); @@ -55,7 +52,7 @@ SummaryFeaturesDFW::insertField(uint32_t docid, GeneralResult *, GetDocsumsState return; } vespalib::JSONStringer & json(state->_jsonStringer); - if (values != NULL) { + if (values != nullptr) { json.clear(); json.beginObject(); for (uint32_t i = 0; i < names.size(); ++i) { diff --git a/searchsummary/src/vespa/searchsummary/docsummary/summaryfeaturesdfw.h b/searchsummary/src/vespa/searchsummary/docsummary/summaryfeaturesdfw.h index e417e89cf04..f1452d4c0a9 100644 --- a/searchsummary/src/vespa/searchsummary/docsummary/summaryfeaturesdfw.h +++ b/searchsummary/src/vespa/searchsummary/docsummary/summaryfeaturesdfw.h @@ -10,7 +10,7 @@ namespace search::docsummary { class IDocsumEnvironment; -class FeaturesDFW : public IDocsumFieldWriter +class FeaturesDFW : public IDocsumFW { protected: void featureDump(vespalib::JSONStringer & json, vespalib::stringref name, double feature); @@ -29,7 +29,7 @@ public: ~SummaryFeaturesDFW() override; void init(IDocsumEnvironment * env); bool IsGenerated() const override { return true; } - void insertField(uint32_t docid, GeneralResult *gres, GetDocsumsState *state, + void insertField(uint32_t docid, GetDocsumsState *state, ResType type, vespalib::slime::Inserter &target) override; }; diff --git a/searchsummary/src/vespa/searchsummary/docsummary/textextractordfw.cpp b/searchsummary/src/vespa/searchsummary/docsummary/textextractordfw.cpp index 121520c4d03..a0efda07f04 100644 --- a/searchsummary/src/vespa/searchsummary/docsummary/textextractordfw.cpp +++ b/searchsummary/src/vespa/searchsummary/docsummary/textextractordfw.cpp @@ -27,16 +27,13 @@ TextExtractorDFW::init(const vespalib::string & fieldName, const vespalib::strin } void -TextExtractorDFW::insertField(uint32_t, - GeneralResult *gres, - GetDocsumsState *state, - ResType, +TextExtractorDFW::insertField(uint32_t, GeneralResult *gres, GetDocsumsState *state, ResType, vespalib::slime::Inserter &target) { vespalib::string extracted; ResEntry * entry = gres->GetEntryFromEnumValue(_inputFieldEnum); - if (entry != NULL) { - const char * buf = NULL; + if (entry != nullptr) { + const char * buf = nullptr; uint32_t buflen = 0; entry->_resolve_field(&buf, &buflen, &state->_docSumFieldSpace); // extract the text diff --git a/searchsummary/src/vespa/searchsummary/docsummary/urlresult.cpp b/searchsummary/src/vespa/searchsummary/docsummary/urlresult.cpp index 646a167b5a8..074cc1cadf1 100644 --- a/searchsummary/src/vespa/searchsummary/docsummary/urlresult.cpp +++ b/searchsummary/src/vespa/searchsummary/docsummary/urlresult.cpp @@ -10,43 +10,6 @@ LOG_SETUP(".searchlib.docsummary.urlresult"); namespace search::docsummary { -urlresult::urlresult(uint32_t partition, uint32_t docid, HitRank metric) - : _partition(partition), - _docid(docid), - _metric(metric) -{ } - - -urlresult::~urlresult() = default; - - -/*===============================================================*/ - - -badurlresult::badurlresult() - : urlresult(0, 0, 0) -{ } - - -badurlresult::badurlresult(uint32_t partition, uint32_t docid, HitRank metric) - : urlresult(partition, docid, metric) -{ } - - -badurlresult::~badurlresult() = default; - - -int -badurlresult::unpack(const char *, const size_t ) -{ - LOG(warning, "badurlresult::unpack"); - return 0; -} - - -/*===============================================================*/ - - void GeneralResult::AllocEntries(uint32_t buflen, bool inplace) { @@ -75,7 +38,6 @@ GeneralResult::AllocEntries(uint32_t buflen, bool inplace) } } - void GeneralResult::FreeEntries() { @@ -92,11 +54,8 @@ GeneralResult::FreeEntries() free(_entries); // free '_entries'/'_buf' chunk } - - -GeneralResult::GeneralResult(const ResultClass *resClass, uint32_t partition, uint32_t docid, HitRank metric) - : urlresult(partition, docid, metric), - _resClass(resClass), +GeneralResult::GeneralResult(const ResultClass *resClass) + : _resClass(resClass), _entrycnt(0), _entries(nullptr), _buf(nullptr), @@ -104,27 +63,23 @@ GeneralResult::GeneralResult(const ResultClass *resClass, uint32_t partition, ui { } - GeneralResult::~GeneralResult() { FreeEntries(); } - ResEntry * GeneralResult::GetEntry(uint32_t idx) { return (idx < _entrycnt) ? &_entries[idx] : nullptr; } - ResEntry * GeneralResult::GetEntry(const char *name) { int idx = _resClass->GetIndexFromName(name); - return (idx >= 0 && (uint32_t)idx < _entrycnt) ? - &_entries[idx] : nullptr; + return (idx >= 0 && (uint32_t)idx < _entrycnt) ? &_entries[idx] : nullptr; } @@ -132,393 +87,11 @@ ResEntry * GeneralResult::GetEntryFromEnumValue(uint32_t value) { int idx = _resClass->GetIndexFromEnumValue(value); - - return (idx >= 0 && (uint32_t)idx < _entrycnt) ? - &_entries[idx] : nullptr; + return (idx >= 0 && (uint32_t)idx < _entrycnt) ? &_entries[idx] : nullptr; } - -int -GeneralResult::unpack(const char *buf, const size_t buflen) -{ - bool rc = true; - const char *ebuf = buf + buflen; // Ref to first after buffer - const char *p = buf; // current position in buffer - - if (_entries != nullptr) - FreeEntries(); - - AllocEntries(buflen); - - for (uint32_t i = 0; rc && i < _entrycnt; i++) { - const ResConfigEntry *entry = _resClass->GetEntry(i); - - switch (entry->_type) { - - case RES_INT: { - - if (p + sizeof(_entries[i]._intval) <= ebuf) { - - memcpy(&_entries[i]._intval, p, sizeof(_entries[i]._intval)); - _entries[i]._type = RES_INT; - p += sizeof(_entries[i]._intval); - - } else { - - LOG(debug, "GeneralResult::unpack: p + sizeof(..._intval) > ebuf"); - LOG(error, "Document summary too short, couldn't unpack"); - rc = false; - } - break; - } - - case RES_SHORT: { - - uint16_t shortval; - if (p + sizeof(shortval) <= ebuf) { - - memcpy(&shortval, p, sizeof(shortval)); - _entries[i]._intval = (uint32_t)shortval; - _entries[i]._type = RES_INT; // type promotion - p += sizeof(shortval); - - } else { - - LOG(debug, "GeneralResult::unpack: p + sizeof(shortval) > ebuf"); - LOG(error, "Document summary too short, couldn't unpack"); - rc = false; - } - break; - } - - case RES_BOOL: - case RES_BYTE: { - - uint8_t byteval; - if (p + sizeof(byteval) <= ebuf) { - - memcpy(&byteval, p, sizeof(byteval)); - _entries[i]._intval = (uint32_t)byteval; - _entries[i]._type = RES_INT; // type promotion - p += sizeof(byteval); - - } else { - - LOG(debug, "GeneralResult::unpack: p + sizeof(byteval) > ebuf"); - LOG(error, "Document summary too short, couldn't unpack"); - rc = false; - } - break; - } - - case RES_FLOAT: { - - float floatval; - if (p + sizeof(floatval) <= ebuf) { - - memcpy(&floatval, p, sizeof(floatval)); - _entries[i]._doubleval = (double)floatval; - _entries[i]._type = RES_DOUBLE; // type promotion - p += sizeof(floatval); - - } else { - - LOG(debug, "GeneralResult::unpack: p + sizeof(floatval) > ebuf"); - LOG(error, "Document summary too short, couldn't unpack"); - rc = false; - } - break; - } - - case RES_DOUBLE: { - - if (p + sizeof(_entries[i]._doubleval) <= ebuf) { - - memcpy(&_entries[i]._doubleval, p, sizeof(_entries[i]._doubleval)); - _entries[i]._type = RES_DOUBLE; - p += sizeof(_entries[i]._doubleval); - - } else { - - LOG(debug, "GeneralResult::unpack: p + sizeof(..._doubleval) > ebuf"); - LOG(error, "Document summary too short, couldn't unpack"); - rc = false; - } - break; - } - - case RES_INT64: { - - if (p + sizeof(_entries[i]._int64val) <= ebuf) { - - memcpy(&_entries[i]._int64val, p, sizeof(_entries[i]._int64val)); - _entries[i]._type = RES_INT64; - p += sizeof(_entries[i]._int64val); - - } else { - - LOG(debug, "GeneralResult::unpack: p + sizeof(..._int64val) > ebuf"); - LOG(error, "Document summary too short, couldn't unpack"); - rc = false; - } - break; - } - - case RES_STRING: { - - uint16_t slen; - if (p + sizeof(slen) <= ebuf) { - - memcpy(&slen, p, sizeof(slen)); - p += sizeof(slen); - - if (p + slen <= ebuf) { - - _entries[i]._stringval = _buf + (p - buf); - memcpy(_entries[i]._stringval, p, slen); - _entries[i]._stringval[slen] = '\0'; - _entries[i]._stringlen = slen; - _entries[i]._type = RES_STRING; - p += slen; - - } else { - - LOG(debug, "GeneralResult::unpack: p + slen > ebuf"); - LOG(error, "Document summary too short, couldn't unpack"); - rc = false; - } - - } else { - - LOG(debug, "GeneralResult::unpack: p + sizeof(slen) > ebuf"); - LOG(error, "Document summary too short, couldn't unpack"); - rc = false; - } - break; - } - - case RES_DATA: { - - uint16_t dlen; - if (p + sizeof(dlen) <= ebuf) { - - memcpy(&dlen, p, sizeof(dlen)); - p += sizeof(dlen); - - if (p + dlen <= ebuf) { - - _entries[i]._dataval = _buf + (p - buf); - memcpy(_entries[i]._dataval, p, dlen); - _entries[i]._dataval[dlen] = '\0'; // just in case. - _entries[i]._datalen = dlen; - _entries[i]._type = RES_DATA; - p += dlen; - - } else { - - LOG(debug, "GeneralResult::unpack: p + dlen > ebuf"); - LOG(error, "Document summary too short, couldn't unpack"); - rc = false; - } - - } else { - - LOG(debug, "GeneralResult::unpack: p + sizeof(dlen) > ebuf"); - LOG(error, "Document summary too short, couldn't unpack"); - rc = false; - } - break; - } - - case RES_XMLSTRING: - case RES_JSONSTRING: - case RES_FEATUREDATA: - case RES_LONG_STRING: { - - uint32_t lslen; - bool compressed; - if (p + sizeof(lslen) <= ebuf) { - - memcpy(&lslen, p, sizeof(lslen)); - p += sizeof(lslen); - - compressed = ((lslen & 0x80000000) != 0); - lslen &= 0x7fffffff; - - if (p + lslen <= ebuf) { - - if (compressed) { // COMPRESSED - uint32_t realLen = 0; - if (lslen >= sizeof(realLen)) - memcpy(&realLen, p, sizeof(realLen)); - else - LOG(warning, "Cannot uncompress docsum field %s; docsum field meta-data incomplete", - entry->_bindname.c_str()); - if (realLen > 0) { - _entries[i]._stringval = new char[realLen + 1]; - } - if (_entries[i]._stringval != nullptr) { - uLongf rlen = realLen; - if ((uncompress((Bytef *)_entries[i]._stringval, &rlen, - (const Bytef *)(p + sizeof(realLen)), - lslen - sizeof(realLen)) == Z_OK) && - rlen == realLen) { - assert(rlen == realLen); - - // COMPRESSED LONG STRING FIELD OK - _entries[i]._stringval[realLen] = '\0'; - _entries[i]._stringlen = realLen; - - } else { - LOG(warning, "Cannot uncompress docsum field %s; decompression error", - entry->_bindname.c_str()); - delete [] _entries[i]._stringval; - _entries[i]._stringval = nullptr; - } - } - // insert empty field if decompress failed - if (_entries[i]._stringval == nullptr) { - _entries[i]._stringval = _buf + (p - buf); - _entries[i]._stringval[0] = '\0'; - _entries[i]._stringlen = 0; - } - - } else { // UNCOMPRESSED - - _entries[i]._stringval = _buf + (p - buf); - memcpy(_entries[i]._stringval, p, lslen); - _entries[i]._stringval[lslen] = '\0'; - _entries[i]._stringlen = lslen; - - } - _entries[i]._type = RES_STRING; // type normalization - p += lslen; - - } else { - - LOG(debug, "GeneralResult::unpack: p + lslen > ebuf"); - LOG(error, "Document summary too short, couldn't unpack"); - rc = false; - } - - } else { - - LOG(debug, "GeneralResult::unpack: p + sizeof(lslen) > ebuf"); - LOG(error, "Document summary too short, couldn't unpack"); - rc = false; - } - break; - } - - case RES_TENSOR: - case RES_LONG_DATA: { - - uint32_t ldlen; - bool compressed; - if (p + sizeof(ldlen) <= ebuf) { - - memcpy(&ldlen, p, sizeof(ldlen)); - p += sizeof(ldlen); - - compressed = ((ldlen & 0x80000000) != 0); - ldlen &= 0x7fffffff; - - if (p + ldlen <= ebuf) { - - if (compressed) { // COMPRESSED - uint32_t realLen = 0; - if (ldlen >= sizeof(realLen)) - memcpy(&realLen, p, sizeof(realLen)); - else - LOG(warning, "Cannot uncompress docsum field %s; docsum field meta-data incomplete", - entry->_bindname.c_str()); - if (realLen > 0) { - _entries[i]._dataval = new char [realLen + 1]; - } - if (_entries[i]._dataval != nullptr) { - uLongf rlen = realLen; - if ((uncompress((Bytef *)_entries[i]._dataval, &rlen, - (const Bytef *)(p + sizeof(realLen)), - ldlen - sizeof(realLen)) == Z_OK) && - rlen == realLen) { - assert(rlen == realLen); - - // COMPRESSED LONG DATA FIELD OK - _entries[i]._dataval[realLen] = '\0'; - _entries[i]._datalen = realLen; - - } else { - LOG(warning, "Cannot uncompress docsum field %s; decompression error", - entry->_bindname.c_str()); - delete [] _entries[i]._dataval; - _entries[i]._dataval = nullptr; - } - } - - // insert empty field if decompress failed - if (_entries[i]._dataval == nullptr) { - _entries[i]._dataval = _buf + (p - buf); - _entries[i]._dataval[0] = '\0'; - _entries[i]._datalen = 0; - } - - } else { // UNCOMPRESSED - - _entries[i]._dataval = _buf + (p - buf); - memcpy(_entries[i]._dataval, p, ldlen); - _entries[i]._dataval[ldlen] = '\0'; // just in case - _entries[i]._datalen = ldlen; - - } - _entries[i]._type = RES_DATA; // type normalization - p += ldlen; - - } else { - - LOG(debug, "GeneralResult::unpack: p + ldlen > ebuf"); - LOG(error, "Document summary too short, couldn't unpack"); - rc = false; - } - - } else { - - LOG(debug, "GeneralResult::unpack: p + sizeof(ldlen) > ebuf"); - LOG(error, "Document summary too short, couldn't unpack"); - rc = false; - } - break; - } - - default: - LOG(warning, "GeneralResult::unpack: no such type:%d", entry->_type); - LOG(error, "Incorrect type in document summary, couldn't unpack"); - rc = false; - break; - } // END -- switch (entry->_type) { - } // END -- for (uint32_t i = 0; rc && i < _entrycnt; i++) { - - if (rc && p != ebuf) { - LOG(debug, "GeneralResult::unpack: p:%p != ebuf:%p", p, ebuf); - LOG(error, "Document summary too long, couldn't unpack."); - rc = false; - } - - if (rc) - return 0; // SUCCESS - - // clean up on failure - FreeEntries(); - _entrycnt = 0; - _entries = nullptr; - _buf = nullptr; - _bufEnd = nullptr; - - return -1; // FAIL -} - - bool -GeneralResult::_inplace_unpack(const char *buf, const size_t buflen) +GeneralResult::unpack(const char *buf, const size_t buflen) { bool rc = true; const char *ebuf = buf + buflen; // Ref to first after buffer @@ -535,15 +108,11 @@ GeneralResult::_inplace_unpack(const char *buf, const size_t buflen) switch (entry->_type) { case RES_INT: { - if (p + sizeof(_entries[i]._intval) <= ebuf) { - memcpy(&_entries[i]._intval, p, sizeof(_entries[i]._intval)); _entries[i]._type = RES_INT; p += sizeof(_entries[i]._intval); - } else { - LOG(debug, "GeneralResult::_inplace_unpack: p + sizeof(..._intval) > ebuf"); LOG(error, "Document summary too short, couldn't unpack"); rc = false; @@ -552,17 +121,13 @@ GeneralResult::_inplace_unpack(const char *buf, const size_t buflen) } case RES_SHORT: { - uint16_t shortval; if (p + sizeof(shortval) <= ebuf) { - memcpy(&shortval, p, sizeof(shortval)); _entries[i]._intval = (uint32_t)shortval; _entries[i]._type = RES_INT; // type promotion p += sizeof(shortval); - } else { - LOG(debug, "GeneralResult::_inplace_unpack: p + sizeof(shortval) > ebuf"); LOG(error, "Document summary too short, couldn't unpack"); rc = false; @@ -571,17 +136,13 @@ GeneralResult::_inplace_unpack(const char *buf, const size_t buflen) } case RES_BOOL: case RES_BYTE: { - uint8_t byteval; if (p + sizeof(byteval) <= ebuf) { - memcpy(&byteval, p, sizeof(byteval)); _entries[i]._intval = (uint32_t)byteval; _entries[i]._type = RES_INT; // type promotion p += sizeof(byteval); - } else { - LOG(debug, "GeneralResult::_inplace_unpack: p + sizeof(byteval) > ebuf"); LOG(error, "Document summary too short, couldn't unpack"); rc = false; @@ -590,17 +151,13 @@ GeneralResult::_inplace_unpack(const char *buf, const size_t buflen) } case RES_FLOAT: { - float floatval; if (p + sizeof(floatval) <= ebuf) { - memcpy(&floatval, p, sizeof(floatval)); _entries[i]._doubleval = (double)floatval; _entries[i]._type = RES_DOUBLE; // type promotion p += sizeof(floatval); - } else { - LOG(debug, "GeneralResult::unpack: p + sizeof(floatval) > ebuf"); LOG(error, "Document summary too short, couldn't unpack"); rc = false; @@ -609,15 +166,11 @@ GeneralResult::_inplace_unpack(const char *buf, const size_t buflen) } case RES_DOUBLE: { - if (p + sizeof(_entries[i]._doubleval) <= ebuf) { - memcpy(&_entries[i]._doubleval, p, sizeof(_entries[i]._doubleval)); _entries[i]._type = RES_DOUBLE; p += sizeof(_entries[i]._doubleval); - } else { - LOG(debug, "GeneralResult::unpack: p + sizeof(..._doubleval) > ebuf"); LOG(error, "Document summary too short, couldn't unpack"); rc = false; @@ -626,15 +179,11 @@ GeneralResult::_inplace_unpack(const char *buf, const size_t buflen) } case RES_INT64: { - if (p + sizeof(_entries[i]._int64val) <= ebuf) { - memcpy(&_entries[i]._int64val, p, sizeof(_entries[i]._int64val)); _entries[i]._type = RES_INT64; p += sizeof(_entries[i]._int64val); - } else { - LOG(debug, "GeneralResult::unpack: p + sizeof(..._int64val) > ebuf"); LOG(error, "Document summary too short, couldn't unpack"); rc = false; @@ -643,29 +192,21 @@ GeneralResult::_inplace_unpack(const char *buf, const size_t buflen) } case RES_STRING: { - uint16_t slen; if (p + sizeof(slen) <= ebuf) { - memcpy(&slen, p, sizeof(slen)); p += sizeof(slen); - if (p + slen <= ebuf) { - _entries[i]._stringval = const_cast<char *>(p); _entries[i]._stringlen = slen; _entries[i]._type = RES_STRING; p += slen; - } else { - LOG(debug, "GeneralResult::_inplace_unpack: p + slen > ebuf"); LOG(error, "Document summary too short, couldn't unpack"); rc = false; } - } else { - LOG(debug, "GeneralResult::_inplace_unpack: p + sizeof(slen) > ebuf"); LOG(error, "Document summary too short, couldn't unpack"); rc = false; @@ -674,29 +215,21 @@ GeneralResult::_inplace_unpack(const char *buf, const size_t buflen) } case RES_DATA: { - uint16_t dlen; if (p + sizeof(dlen) <= ebuf) { - memcpy(&dlen, p, sizeof(dlen)); p += sizeof(dlen); - if (p + dlen <= ebuf) { - _entries[i]._dataval = const_cast<char *>(p); _entries[i]._datalen = dlen; _entries[i]._type = RES_DATA; p += dlen; - } else { - LOG(debug, "GeneralResult::_inplace_unpack: p + dlen > ebuf"); LOG(error, "Document summary too short, couldn't unpack"); rc = false; } - } else { - LOG(debug, "GeneralResult::_inplace_unpack: p + sizeof(dlen) > ebuf"); LOG(error, "Document summary too short, couldn't unpack"); rc = false; @@ -708,32 +241,23 @@ GeneralResult::_inplace_unpack(const char *buf, const size_t buflen) case RES_JSONSTRING: case RES_FEATUREDATA: case RES_LONG_STRING: { - uint32_t flen; uint32_t lslen; if (p + sizeof(flen) <= ebuf) { - memcpy(&flen, p, sizeof(flen)); p += sizeof(flen); - lslen = flen & 0x7fffffff; - if (p + lslen <= ebuf) { - _entries[i]._stringval = const_cast<char *>(p); _entries[i]._stringlen = flen; // with compression flag _entries[i]._type = RES_STRING; // type normalization p += lslen; - } else { - LOG(debug, "GeneralResult::_inplace_unpack: p + lslen > ebuf"); LOG(error, "Document summary too short, couldn't unpack"); rc = false; } - } else { - LOG(debug, "GeneralResult::_inplace_unpack: p + sizeof(lslen) > ebuf"); LOG(error, "Document summary too short, couldn't unpack"); rc = false; @@ -742,32 +266,23 @@ GeneralResult::_inplace_unpack(const char *buf, const size_t buflen) } case RES_TENSOR : case RES_LONG_DATA: { - uint32_t flen; uint32_t ldlen; if (p + sizeof(flen) <= ebuf) { - memcpy(&flen, p, sizeof(flen)); p += sizeof(flen); - ldlen = flen & 0x7fffffff; - if (p + ldlen <= ebuf) { - _entries[i]._dataval = const_cast<char *>(p); _entries[i]._datalen = flen; // with compression flag _entries[i]._type = RES_DATA; // type normalization p += ldlen; - } else { - LOG(debug, "GeneralResult::_inplace_unpack: p + ldlen > ebuf"); LOG(error, "Document summary too short, couldn't unpack"); rc = false; } - } else { - LOG(debug, "GeneralResult::_inplace_unpack: p + sizeof(ldlen) > ebuf"); LOG(error, "Document summary too short, couldn't unpack"); rc = false; diff --git a/searchsummary/src/vespa/searchsummary/docsummary/urlresult.h b/searchsummary/src/vespa/searchsummary/docsummary/urlresult.h index 31128c73ca2..a4cdd1b7f69 100644 --- a/searchsummary/src/vespa/searchsummary/docsummary/urlresult.h +++ b/searchsummary/src/vespa/searchsummary/docsummary/urlresult.h @@ -7,37 +7,7 @@ namespace search::docsummary { -class urlresult -{ -protected: - uint32_t _partition; - uint32_t _docid; - HitRank _metric; - -public: - urlresult(uint32_t partition, uint32_t docid, HitRank metric); - virtual ~urlresult(); - - virtual bool IsGeneral() const { return false; } - uint32_t GetPartition() const { return _partition; } - uint32_t GetDocID() const { return _docid; } - HitRank GetMetric() const { return _metric; } - virtual int unpack(const char *buf, const size_t buflen) = 0; -}; - - -class badurlresult : public urlresult -{ -public: - badurlresult(); - badurlresult(uint32_t partition, uint32_t docid, HitRank metric); - ~badurlresult() override; - - int unpack(const char *buf, const size_t buflen) override; -}; - - -class GeneralResult : public urlresult +class GeneralResult { private: GeneralResult(const GeneralResult &); @@ -49,30 +19,27 @@ private: char *_buf; // allocated in same chunk as _entries char *_bufEnd; // first byte after _buf - bool InBuf(void *pt) { - return ((char *)pt >= _buf && - (char *)pt < _bufEnd); + bool InBuf(const void *pt) const { + return ((const char *)pt >= _buf && + (const char *)pt < _bufEnd); } void AllocEntries(uint32_t buflen, bool inplace = false); void FreeEntries(); - bool _inplace_unpack(const char *buf, const size_t buflen); - public: - GeneralResult(const ResultClass *resClass, uint32_t partition, uint32_t docid, HitRank metric); + GeneralResult(const ResultClass *resClass); ~GeneralResult(); const ResultClass *GetClass() const { return _resClass; } ResEntry *GetEntry(uint32_t idx); ResEntry *GetEntry(const char *name); ResEntry *GetEntryFromEnumValue(uint32_t val); - bool IsGeneral() const override { return true; } - int unpack(const char *buf, const size_t buflen) override; + bool unpack(const char *buf, const size_t buflen); bool inplaceUnpack(const DocsumStoreValue &value) { if (value.valid()) { - return _inplace_unpack(value.fieldsPt(), value.fieldsSz()); + return unpack(value.fieldsPt(), value.fieldsSz()); } else { return false; } diff --git a/vsm/src/vespa/vsm/vsm/docsumconfig.cpp b/vsm/src/vespa/vsm/vsm/docsumconfig.cpp index 25c13967c49..ab89f4d460f 100644 --- a/vsm/src/vespa/vsm/vsm/docsumconfig.cpp +++ b/vsm/src/vespa/vsm/vsm/docsumconfig.cpp @@ -20,7 +20,7 @@ DynamicDocsumConfig::createFieldWriter(const string & fieldName, const string & (overrideName == "absdist") || (overrideName == "subproject")) { - fieldWriter.reset(new EmptyDFW()); + fieldWriter = std::make_unique<EmptyDFW>(); rc = true; } else if ((overrideName == "attribute") || (overrideName == "attributecombiner") || |