From ccf3cdab8ff4557bcb98485dbfe2512f6df345b6 Mon Sep 17 00:00:00 2001 From: Henning Baldersheim Date: Wed, 25 Jan 2017 16:08:54 +0100 Subject: Ensure that we detect out of order collection also after passing the array limit. --- .../src/tests/hitcollector/hitcollector_test.cpp | 23 ++++++++++++++++++++++ searchlib/src/vespa/searchlib/common/resultset.h | 2 +- .../src/vespa/searchlib/queryeval/hitcollector.cpp | 6 ++++++ 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/searchlib/src/tests/hitcollector/hitcollector_test.cpp b/searchlib/src/tests/hitcollector/hitcollector_test.cpp index c76c9d16160..edb2ecdcaaa 100644 --- a/searchlib/src/tests/hitcollector/hitcollector_test.cpp +++ b/searchlib/src/tests/hitcollector/hitcollector_test.cpp @@ -509,4 +509,27 @@ TEST("require that hits can be added out of order when passing array limit") { TEST_DO(checkResult(*rs.get(), nullptr)); } +TEST("require that hits can be added out of order only after passing array limit") { + HitCollector hc(10000, 100, 10); + std::vector expRh; + // produce expected result in normal order + const size_t numHits = 150; + for (uint32_t i = 0; i < numHits; ++i) { + expRh.push_back(RankedHit()); + expRh.back()._docId = i; + expRh.back()._rankValue = (i < 50) ? 0 : (i + 100); + } + // add results in reverse order + const uint32_t numInOrder = numHits - 30; + for (uint32_t i = 0; i < numInOrder; i++) { + hc.addHit(i, i + 100); + } + for (uint32_t i = numHits; i-- > numInOrder; ) { + hc.addHit(i, i + 100); + } + std::unique_ptr rs = hc.getResultSet(); + TEST_DO(checkResult(*rs.get(), expRh)); + TEST_DO(checkResult(*rs.get(), nullptr)); +} + TEST_MAIN() { TEST_RUN_ALL(); } diff --git a/searchlib/src/vespa/searchlib/common/resultset.h b/searchlib/src/vespa/searchlib/common/resultset.h index 1ea32cc9cee..95c191682a4 100644 --- a/searchlib/src/vespa/searchlib/common/resultset.h +++ b/searchlib/src/vespa/searchlib/common/resultset.h @@ -4,7 +4,7 @@ #pragma once -#include +#include "rankedhit.h" #include namespace search { diff --git a/searchlib/src/vespa/searchlib/queryeval/hitcollector.cpp b/searchlib/src/vespa/searchlib/queryeval/hitcollector.cpp index 47c9f62ef51..6cb567a6043 100644 --- a/searchlib/src/vespa/searchlib/queryeval/hitcollector.cpp +++ b/searchlib/src/vespa/searchlib/queryeval/hitcollector.cpp @@ -141,6 +141,12 @@ HitCollector::DocIdCollector::collect(uint32_t docId, feature_ } HitCollector & hc = this->_hc; if (hc._docIdVector.size() < hc._maxDocIdVectorSize) { + if (__builtin_expect(((hc._docIdVector.size() > 0) && + (docId < hc._docIdVector.back()) && + (hc._unordered == false)), false)) + { + hc._unordered = true; + } hc._docIdVector.push_back(docId); } else { collectAndChangeCollector(docId); -- cgit v1.2.3