diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2021-03-30 13:44:50 +0000 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2021-03-30 13:55:40 +0000 |
commit | 9bfa816ed895c2f253dfe72348842931933b6c31 (patch) | |
tree | 27a86b995e041a9bbb401c9cdc5e0d0eef5dffdf /searchlib | |
parent | aa8a92dee13fd0de81392e48e360b15ca60f9b0b (diff) |
- Add type to MultiTerm to enable perfect replication.
- Ensure the string is zero terminated.
Diffstat (limited to 'searchlib')
3 files changed, 24 insertions, 5 deletions
diff --git a/searchlib/src/vespa/searchlib/query/tree/queryreplicator.h b/searchlib/src/vespa/searchlib/query/tree/queryreplicator.h index 24afe3d83c8..43364dc8575 100644 --- a/searchlib/src/vespa/searchlib/query/tree/queryreplicator.h +++ b/searchlib/src/vespa/searchlib/query/tree/queryreplicator.h @@ -79,9 +79,19 @@ private: } void replicateMultiTerm(const MultiTerm &original, MultiTerm & replica) { - for (uint32_t i(0); i < original.getNumTerms(); i++) { - auto v = original.getAsString(i); - replica.addTerm(v.first, v.second); + if (original.getType() == MultiTerm::Type::STRING) { + for (uint32_t i(0); i < original.getNumTerms(); i++) { + auto v = original.getAsString(i); + replica.addTerm(v.first, v.second); + } + } else if (original.getType() == MultiTerm::Type::INTEGER) { + for (uint32_t i(0); i < original.getNumTerms(); i++) { + auto v = original.getAsInteger(i); + replica.addTerm(v.first, v.second); + } + } else { + assert (original.getType() == MultiTerm::Type::UNKNOWN); + assert (original.getNumTerms() == 0); } } diff --git a/searchlib/src/vespa/searchlib/query/tree/termnodes.cpp b/searchlib/src/vespa/searchlib/query/tree/termnodes.cpp index a6309ce8061..a15938d4ca0 100644 --- a/searchlib/src/vespa/searchlib/query/tree/termnodes.cpp +++ b/searchlib/src/vespa/searchlib/query/tree/termnodes.cpp @@ -69,7 +69,8 @@ public: } StringAndWeight getAsString(uint32_t index) const override { const auto & v = _terms[index]; - auto res = std::to_chars(_scratchPad, _scratchPad + sizeof(_scratchPad), v.first, 10); + auto res = std::to_chars(_scratchPad, _scratchPad + sizeof(_scratchPad)-1, v.first, 10); + res.ptr[0] = '\0'; return StringAndWeight(stringref(_scratchPad, res.ptr - _scratchPad), v.second); } IntegerAndWeight getAsInteger(uint32_t index) const override { @@ -87,7 +88,8 @@ private: MultiTerm::MultiTerm(uint32_t num_terms) : _terms(), - _num_terms(num_terms) + _num_terms(num_terms), + _type(Type::UNKNOWN) {} MultiTerm::~MultiTerm() = default; @@ -96,6 +98,7 @@ void MultiTerm::addTerm(vespalib::stringref term, Weight weight) { if ( ! _terms) { _terms = std::make_unique<StringTermVector>(_num_terms); + _type = Type::STRING; } _terms->addTerm(term, weight); } @@ -104,6 +107,7 @@ void MultiTerm::addTerm(int64_t term, Weight weight) { if ( ! _terms) { _terms = std::make_unique<IntegerTermVector>(_num_terms); + _type = Type::INTEGER; } _terms->addTerm(term, weight); } diff --git a/searchlib/src/vespa/searchlib/query/tree/termnodes.h b/searchlib/src/vespa/searchlib/query/tree/termnodes.h index 00d2257c9cc..8fbaacdd20d 100644 --- a/searchlib/src/vespa/searchlib/query/tree/termnodes.h +++ b/searchlib/src/vespa/searchlib/query/tree/termnodes.h @@ -155,6 +155,7 @@ public: class MultiTerm : public Node { public: + enum class Type {STRING, INTEGER, UNKNOWN}; using StringAndWeight = std::pair<vespalib::stringref, Weight>; using IntegerAndWeight = std::pair<int64_t, Weight>; struct TermVector { @@ -170,15 +171,19 @@ public: ~MultiTerm() override; void addTerm(vespalib::stringref term, Weight weight); void addTerm(int64_t term, Weight weight); + // Note that the first refers to a zero terminated string. + // That is required as the comparator for the enum store requires it. StringAndWeight getAsString(uint32_t index) const { return _terms->getAsString(index); } IntegerAndWeight getAsInteger(uint32_t index) const { return _terms->getAsInteger(index); } Weight weight(uint32_t index) const { return _terms->getWeight(index); } uint32_t getNumTerms() const { return _num_terms; } + Type getType() const { return _type; } protected: MultiTerm(uint32_t num_terms); private: std::unique_ptr<TermVector> _terms; uint32_t _num_terms; + Type _type; }; class WeightedSetTerm : public QueryNodeMixin<WeightedSetTerm, MultiTerm>, public Term { |