diff options
-rw-r--r-- | searchlib/src/tests/aggregator/perdocexpr.cpp | 6 | ||||
-rw-r--r-- | searchlib/src/vespa/searchlib/expression/resultnodes.cpp | 77 |
2 files changed, 49 insertions, 34 deletions
diff --git a/searchlib/src/tests/aggregator/perdocexpr.cpp b/searchlib/src/tests/aggregator/perdocexpr.cpp index f56d61eabec..1c07843d71e 100644 --- a/searchlib/src/tests/aggregator/perdocexpr.cpp +++ b/searchlib/src/tests/aggregator/perdocexpr.cpp @@ -79,6 +79,9 @@ TEST("testMin") { testMin(StringResultNode("67"), StringResultNode("68")); testMin(RawResultNode("67", 2), RawResultNode("68", 2)); testMin(RawResultNode("-67", 2), RawResultNode("68", 2)); + TEST_DO(testMin(RawResultNode("abc", 3), RawResultNode("abd", 3))); + TEST_DO(testMin(RawResultNode("abc", 3), RawResultNode("abcd", 4))); + TEST_DO(testMin(RawResultNode("abcd", 4), RawResultNode("abd", 3))); } void testMax(const ResultNode & a, const ResultNode & b) { @@ -102,6 +105,9 @@ TEST("testMax") { testMax(StringResultNode("67"), StringResultNode("68")); testMax(RawResultNode("67", 2), RawResultNode("68", 2)); testMax(RawResultNode("-67", 2), RawResultNode("68", 2)); + TEST_DO(testMax(RawResultNode("abc", 3), RawResultNode("abd", 3))); + TEST_DO(testMax(RawResultNode("abc", 3), RawResultNode("abcd", 4))); + TEST_DO(testMax(RawResultNode("abcd", 4), RawResultNode("abd", 3))); } ExpressionCountAggregationResult getExpressionCountWithNormalSketch() { diff --git a/searchlib/src/vespa/searchlib/expression/resultnodes.cpp b/searchlib/src/vespa/searchlib/expression/resultnodes.cpp index a315e5d0818..638a1abc496 100644 --- a/searchlib/src/vespa/searchlib/expression/resultnodes.cpp +++ b/searchlib/src/vespa/searchlib/expression/resultnodes.cpp @@ -39,6 +39,35 @@ IMPLEMENT_RESULTNODE(Int64ResultNode, IntegerResultNode); IMPLEMENT_RESULTNODE(EnumResultNode, IntegerResultNode); IMPLEMENT_RESULTNODE(FloatResultNode, NumericResultNode); +namespace { + +const vespalib::string TRUE = "true"; +const vespalib::string FALSE = "false"; + +size_t hashBuf(const void *s, size_t sz) +{ + size_t result(0); + const size_t * value = static_cast<const size_t *>(s); + for(size_t i(0), m(sz/sizeof(size_t)); i < m; i++) { + result ^= value[i]; + } + unsigned left(sz%sizeof(size_t)); + if (left) { + size_t lastValue(0); + memcpy(&lastValue, static_cast<const char *>(s)+sz-left, left); + result ^= lastValue; + } + return result; +} + +template <typename T> +int cmpNum(T a, T b) { + return a < b ? -1 : a > b ? 1 : 0; +} + +} + + void ResultNode::sort() {} void ResultNode::reverse() {} @@ -218,8 +247,13 @@ RawResultNode::min(const ResultNode & b) if ( ! _value.empty()) { setBuffer("", 0); } - } else if (memcmp(_value.data(), s.data(), std::min(s.size(), _value.size())) > 0) { - setBuffer(s.data(), s.size()); + } else { + int cmp = memcmp(_value.data(), s.data(), min_sz); + if (cmp > 0) { + setBuffer(s.data(), s.size()); + } else if (cmp == 0 && cmpNum(_value.size(), s.size()) > 0) { + setBuffer(s.data(), s.size()); + } } } @@ -235,8 +269,13 @@ RawResultNode::max(const ResultNode & b) setBuffer(s.data(), s.size()); } - } else if (memcmp(&_value[0], s.data(), std::min(s.size(), _value.size())) < 0) { - setBuffer(s.data(), s.size()); + } else { + int cmp = memcmp(_value.data(), s.data(), min_sz); + if (cmp < 0) { + setBuffer(s.data(), s.size()); + } else if (cmp == 0 && cmpNum(_value.size(), s.size()) < 0) { + setBuffer(s.data(), s.size()); + } } } @@ -322,31 +361,6 @@ StringResultNode & StringResultNode::append(const ResultNode & rhs) return *this; } -namespace { - -size_t hashBuf(const void *s, size_t sz) -{ - size_t result(0); - const size_t * value = static_cast<const size_t *>(s); - for(size_t i(0), m(sz/sizeof(size_t)); i < m; i++) { - result ^= value[i]; - } - unsigned left(sz%sizeof(size_t)); - if (left) { - size_t lastValue(0); - memcpy(&lastValue, static_cast<const char *>(s)+sz-left, left); - result ^= lastValue; - } - return result; -} - -template <typename T> -int cmpNum(T a, T b) { - return a < b ? -1 : a > b ? 1 : 0; -} - -} - size_t StringResultNode::hash() const { return hashBuf(_value.c_str(), _value.size()); } size_t @@ -454,11 +468,6 @@ RawResultNode::setBuffer(const void *buf, size_t sz) _value.resize(sz); } -namespace { - const vespalib::string TRUE = "true"; - const vespalib::string FALSE = "false"; -} - ResultNode::ConstBufferRef RawResultNode::onGetString(size_t, BufferRef ) const { return ConstBufferRef(&_value[0], _value.size()); |