summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--searchlib/src/tests/aggregator/perdocexpr.cpp6
-rw-r--r--searchlib/src/vespa/searchlib/expression/resultnodes.cpp77
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());