aboutsummaryrefslogtreecommitdiffstats
path: root/searchlib
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2021-03-30 13:44:50 +0000
committerHenning Baldersheim <balder@yahoo-inc.com>2021-03-30 13:55:40 +0000
commit9bfa816ed895c2f253dfe72348842931933b6c31 (patch)
tree27a86b995e041a9bbb401c9cdc5e0d0eef5dffdf /searchlib
parentaa8a92dee13fd0de81392e48e360b15ca60f9b0b (diff)
- Add type to MultiTerm to enable perfect replication.
- Ensure the string is zero terminated.
Diffstat (limited to 'searchlib')
-rw-r--r--searchlib/src/vespa/searchlib/query/tree/queryreplicator.h16
-rw-r--r--searchlib/src/vespa/searchlib/query/tree/termnodes.cpp8
-rw-r--r--searchlib/src/vespa/searchlib/query/tree/termnodes.h5
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 {