Skip to content

Commit 32d083b

Browse files
committed
test + fixes
1 parent 6da4958 commit 32d083b

File tree

3 files changed

+37
-19
lines changed

3 files changed

+37
-19
lines changed

src/core/search/index_result.h

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -90,28 +90,28 @@ inline std::pair<IndexResult::DocVec, size_t> IndexResult::Take(size_t limit) {
9090
}
9191

9292
// Numeric ranges need to be filtered and don't know their size ahead
93-
// if (std::holds_alternative<RangeResult>(value_)) {
94-
auto cb = [](auto* range) -> std::pair<DocVec, size_t> {
95-
DocVec out;
96-
out.reserve(range->size());
97-
for (auto it = range->begin(); it != range->end(); ++it)
98-
out.push_back(*it);
99-
size_t total = out.size();
100-
return {std::move(out), total};
101-
};
102-
return std::visit(cb, Borrowed());
103-
//}
93+
if (std::holds_alternative<RangeResult>(value_)) {
94+
auto cb = [limit](auto* range) -> std::pair<DocVec, size_t> {
95+
DocVec out;
96+
out.reserve(range->size());
97+
for (auto it = range->begin(); it != range->end(); ++it)
98+
out.push_back(*it);
99+
size_t total = out.size();
100+
out.resize(std::min(out.size(), limit));
101+
return {std::move(out), total};
102+
};
103+
return std::visit(cb, Borrowed());
104+
}
104105

105106
// Generic borrowed results sets don't need to be filtered, so we can tell the result size ahead
106-
/*auto cb = [limit](auto* set) -> std::pair<DocVec, size_t> {
107+
auto cb = [limit](auto* set) -> std::pair<DocVec, size_t> {
107108
DocVec out;
108-
size_t taken = std::min(limit, set->size());
109-
out.reserve(taken);
110-
for (auto it = set->begin(); it != set->end() && out.size(); ++it)
109+
out.reserve(set->size());
110+
for (auto it = set->begin(); it != set->end() && out.size() < limit; ++it)
111111
out.push_back(*it);
112112
return {std::move(out), set->size()};
113113
};
114-
return std::visit(cb, Borrowed());*/
114+
return std::visit(cb, Borrowed());
115115
}
116116

117117
inline bool IndexResult::IsOwned() const {

src/server/search/search_family.cc

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1007,7 +1007,7 @@ bool SearchReply(const SearchParams& params,
10071007

10081008
// Check if we havent' chosen too few documents due to cutoffs
10091009
size_t left = docs.size() - params.limit_offset;
1010-
size_t expected = std::min(limit, total_hits - params.limit_offset);
1010+
size_t expected = std::min(params.limit_total, total_hits - params.limit_offset);
10111011
if (left < expected)
10121012
return false;
10131013

@@ -1303,7 +1303,7 @@ void SearchFamily::FtSearch(CmdArgList args, const CommandContext& cmd_cntx) {
13031303
if (succeeded)
13041304
params->limit_serialization =
13051305
params->limit_offset +
1306-
std::min(params->limit_total, 2 * params->limit_total / shard_set->size());
1306+
std::min(params->limit_total, params->limit_total / shard_set->size());
13071307
else
13081308
params->limit_serialization = params->limit_total + params->limit_offset;
13091309

@@ -1325,9 +1325,9 @@ void SearchFamily::FtSearch(CmdArgList args, const CommandContext& cmd_cntx) {
13251325

13261326
bool did_succeed =
13271327
SearchReply(*params, search_algo.GetKnnScoreSortOption(), absl::MakeSpan(docs), builder);
1328-
CHECK(did_succeed);
13291328
DCHECK(succeeded || did_succeed);
13301329
succeeded = did_succeed;
1330+
cmd_cntx.tx->Refurbish();
13311331
} while (!succeeded);
13321332
}
13331333

src/server/search/search_family_test.cc

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -751,6 +751,24 @@ TEST_F(SearchFamilyTest, ReturnOptionJson) {
751751
MatchEntry("k1", "name", "dragon"));
752752
}
753753

754+
TEST_F(SearchFamilyTest, TestUnbalanced) {
755+
Run({"ft.create", "i1", "schema", "title", "text"});
756+
757+
size_t added = 0;
758+
for (size_t i = 0; i < 200; i++) {
759+
string key = absl::StrCat("k", i);
760+
if (Shard(key, shard_set->size()) != 1)
761+
continue;
762+
763+
Run({"hset", key, "name", "olaf"});
764+
added++;
765+
}
766+
767+
auto res = Run({"ft.search", "i1", "*", "LIMIT", "0", "15"});
768+
EXPECT_THAT(res.GetVec()[0], IntArg(added));
769+
EXPECT_EQ(res.GetVec().size(), 1 + 2 * 15);
770+
}
771+
754772
TEST_F(SearchFamilyTest, TestStopWords) {
755773
Run({"ft.create", "i1", "STOPWORDS", "3", "red", "green", "blue", "SCHEMA", "title", "TEXT"});
756774

0 commit comments

Comments
 (0)