diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2021-03-31 11:46:20 +0000 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2021-03-31 11:46:20 +0000 |
commit | 29c4d245cb7b3ea357b649debe391ff20682db81 (patch) | |
tree | 0350b22095cc757a82bc30a08ea84adb7d94bdb3 /searchsummary | |
parent | 38fd35c658567f6bed3f69effd879c91f57aaae1 (diff) |
Make jsonstringer lazy.
Diffstat (limited to 'searchsummary')
4 files changed, 30 insertions, 18 deletions
diff --git a/searchsummary/src/vespa/searchsummary/docsummary/docsumstate.cpp b/searchsummary/src/vespa/searchsummary/docsummary/docsumstate.cpp index 822017e0bdf..99a372d9676 100644 --- a/searchsummary/src/vespa/searchsummary/docsummary/docsumstate.cpp +++ b/searchsummary/src/vespa/searchsummary/docsummary/docsumstate.cpp @@ -22,29 +22,30 @@ namespace search::docsummary { GetDocsumsState::GetDocsumsState(GetDocsumsStateCallback &callback) : _args(), - _docsumbuf(NULL), + _docsumbuf(nullptr), _docsumcnt(0), - _kwExtractor(NULL), - _keywords(NULL), + _kwExtractor(nullptr), + _keywords(nullptr), _callback(callback), _dynteaser(), + _docSumFieldSpaceStore(), _docSumFieldSpace(_docSumFieldSpaceStore, sizeof(_docSumFieldSpaceStore)), // only alloc buffer if needed _attrCtx(), _attributes(), _fieldWriterStates(), - _jsonStringer(), _parsedLocations(), - _summaryFeatures(NULL), + _summaryFeatures(nullptr), _summaryFeaturesCached(false), - _rankFeatures(NULL), - _matching_elements() + _rankFeatures(nullptr), + _matching_elements(), + _jsonStringer() { _dynteaser._docid = static_cast<uint32_t>(-1); _dynteaser._input = static_cast<uint32_t>(-1); _dynteaser._lang = static_cast<uint32_t>(-1); - _dynteaser._config = NULL; - _dynteaser._query = NULL; - _dynteaser._result = NULL; + _dynteaser._config = nullptr; + _dynteaser._query = nullptr; + _dynteaser._result = nullptr; } @@ -52,10 +53,10 @@ GetDocsumsState::~GetDocsumsState() { free(_docsumbuf); free(_keywords); - if (_dynteaser._result != NULL) { + if (_dynteaser._result != nullptr) { juniper::ReleaseResult(_dynteaser._result); } - if (_dynteaser._query != NULL) { + if (_dynteaser._query != nullptr) { juniper::ReleaseQueryHandle(_dynteaser._query); } } @@ -69,6 +70,14 @@ GetDocsumsState::get_matching_elements(const MatchingElementsFields &matching_el return *_matching_elements; } +vespalib::JSONStringer & +GetDocsumsState::jsonStringer() { + if (!_jsonStringer) { + _jsonStringer = std::make_unique<vespalib::JSONStringer>(); + } + return *_jsonStringer; +} + void GetDocsumsState::parse_locations() { diff --git a/searchsummary/src/vespa/searchsummary/docsummary/docsumstate.h b/searchsummary/src/vespa/searchsummary/docsummary/docsumstate.h index 46f8e52dd37..db0f8e6e8ad 100644 --- a/searchsummary/src/vespa/searchsummary/docsummary/docsumstate.h +++ b/searchsummary/src/vespa/searchsummary/docsummary/docsumstate.h @@ -48,8 +48,6 @@ protected: **/ class GetDocsumsState { -private: - public: const search::attribute::IAttributeVector * getAttribute(size_t index) const { return _attributes[index]; } @@ -72,12 +70,12 @@ public: juniper::Result *_result; // juniper analyze result } _dynteaser; - search::RawBuf _docSumFieldSpace; + char _docSumFieldSpaceStore[2048]; + search::RawBuf _docSumFieldSpace; std::unique_ptr<search::attribute::IAttributeContext> _attrCtx; std::vector<const search::attribute::IAttributeVector *> _attributes; std::vector<std::unique_ptr<DocsumFieldWriterState>> _fieldWriterStates; - vespalib::JSONStringer _jsonStringer; // used by AbsDistanceDFW std::vector<search::common::GeoLocationSpec> _parsedLocations; @@ -97,7 +95,12 @@ public: GetDocsumsState& operator=(const GetDocsumsState &) = delete; GetDocsumsState(GetDocsumsStateCallback &callback); ~GetDocsumsState(); + const MatchingElements &get_matching_elements(const MatchingElementsFields &matching_elems_fields); + vespalib::JSONStringer & jsonStringer(); +private: + // Only used by rank/summary features, so make it lazy + std::unique_ptr<vespalib::JSONStringer> _jsonStringer; }; } diff --git a/searchsummary/src/vespa/searchsummary/docsummary/rankfeaturesdfw.cpp b/searchsummary/src/vespa/searchsummary/docsummary/rankfeaturesdfw.cpp index 71febe10e59..d0ecb63a9a1 100644 --- a/searchsummary/src/vespa/searchsummary/docsummary/rankfeaturesdfw.cpp +++ b/searchsummary/src/vespa/searchsummary/docsummary/rankfeaturesdfw.cpp @@ -43,7 +43,7 @@ RankFeaturesDFW::insertField(uint32_t docid, GetDocsumsState *state, } return; } - vespalib::JSONStringer & json(state->_jsonStringer); + vespalib::JSONStringer & json(state->jsonStringer()); if (values != nullptr) { json.clear(); json.beginObject(); diff --git a/searchsummary/src/vespa/searchsummary/docsummary/summaryfeaturesdfw.cpp b/searchsummary/src/vespa/searchsummary/docsummary/summaryfeaturesdfw.cpp index c5b027a372d..425faff6a67 100644 --- a/searchsummary/src/vespa/searchsummary/docsummary/summaryfeaturesdfw.cpp +++ b/searchsummary/src/vespa/searchsummary/docsummary/summaryfeaturesdfw.cpp @@ -55,7 +55,7 @@ SummaryFeaturesDFW::insertField(uint32_t docid, GetDocsumsState *state, ResType } return; } - vespalib::JSONStringer & json(state->_jsonStringer); + vespalib::JSONStringer & json(state->jsonStringer()); if (values != nullptr) { json.clear(); json.beginObject(); |