Skip to content

Commit c166253

Browse files
authored
fix: [2.4] Make legacy non-lexicographic branch break swtich (#36126)
Cherry-pick from master pr: #36125 Related to #35941 Previous PR: #36034 This patch makes the switch branching logic correct and make the unit test work for cases which does not select the whole dataset. Signed-off-by: Congqi Xia <congqi.xia@zilliz.com>
1 parent 14fe321 commit c166253

File tree

2 files changed

+40
-11
lines changed

2 files changed

+40
-11
lines changed

internal/core/src/index/StringIndexMarisa.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -458,7 +458,6 @@ StringIndexMarisa::Range(std::string value, OpType op) {
458458
}
459459
ids.push_back(agent.key().id());
460460
}
461-
break;
462461
} else {
463462
// lexicographic order is not guaranteed, check all values
464463
while (trie_.predictive_search(agent)) {
@@ -469,6 +468,7 @@ StringIndexMarisa::Range(std::string value, OpType op) {
469468
}
470469
};
471470
}
471+
break;
472472
}
473473
case OpType::LessEqual: {
474474
if (in_lexico_order) {
@@ -480,7 +480,6 @@ StringIndexMarisa::Range(std::string value, OpType op) {
480480
}
481481
ids.push_back(agent.key().id());
482482
}
483-
break;
484483
} else {
485484
// lexicographic order is not guaranteed, check all values
486485
while (trie_.predictive_search(agent)) {
@@ -491,6 +490,7 @@ StringIndexMarisa::Range(std::string value, OpType op) {
491490
}
492491
};
493492
}
493+
break;
494494
}
495495
default:
496496
PanicInfo(

internal/core/unittest/test_string_index.cpp

Lines changed: 38 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#include "test_utils/indexbuilder_test_utils.h"
2222
#include "test_utils/AssertUtils.h"
2323
#include <boost/filesystem.hpp>
24+
#include <numeric>
2425
#include "test_utils/storage_test_utils.h"
2526

2627
constexpr int64_t nb = 100;
@@ -83,39 +84,67 @@ TEST_F(StringIndexMarisaTest, NotIn) {
8384
TEST_F(StringIndexMarisaTest, Range) {
8485
auto index = milvus::index::CreateStringIndexMarisa();
8586
std::vector<std::string> strings(nb);
87+
std::vector<int> counts(10);
8688
for (int i = 0; i < nb; ++i) {
87-
strings[i] = std::to_string(std::rand() % 10);
89+
int val = std::rand() % 10;
90+
counts[val]++;
91+
strings[i] = std::to_string(val);
8892
}
8993
index->Build(nb, strings.data());
9094

9195
{
96+
// [0...9]
9297
auto bitset = index->Range("0", milvus::OpType::GreaterEqual);
9398
ASSERT_EQ(bitset.size(), nb);
9499
ASSERT_EQ(Count(bitset), nb);
95100
}
96101

97102
{
98-
auto bitset = index->Range("90", milvus::OpType::LessThan);
103+
// [5...9]
104+
int expect = std::accumulate(counts.begin() + 5, counts.end(), 0);
105+
auto bitset = index->Range("5", milvus::OpType::GreaterEqual);
99106
ASSERT_EQ(bitset.size(), nb);
100-
ASSERT_EQ(Count(bitset), nb);
107+
ASSERT_EQ(Count(bitset), expect);
101108
}
102109

103110
{
104-
auto bitset = index->Range("9", milvus::OpType::LessEqual);
111+
// [6...9]
112+
int expect = std::accumulate(counts.begin() + 6, counts.end(), 0);
113+
auto bitset = index->Range("5", milvus::OpType::GreaterThan);
105114
ASSERT_EQ(bitset.size(), nb);
106-
ASSERT_EQ(Count(bitset), nb);
115+
ASSERT_EQ(Count(bitset), expect);
107116
}
108117

109118
{
110-
auto bitset = index->Range("0", true, "9", true);
119+
// [0...3]
120+
int expect = std::accumulate(counts.begin(), counts.begin() + 4, 0);
121+
auto bitset = index->Range("4", milvus::OpType::LessThan);
111122
ASSERT_EQ(bitset.size(), nb);
112-
ASSERT_EQ(Count(bitset), nb);
123+
ASSERT_EQ(Count(bitset), expect);
113124
}
114125

115126
{
116-
auto bitset = index->Range("0", true, "90", false);
127+
// [0...4]
128+
int expect = std::accumulate(counts.begin(), counts.begin() + 5, 0);
129+
auto bitset = index->Range("4", milvus::OpType::LessEqual);
117130
ASSERT_EQ(bitset.size(), nb);
118-
ASSERT_EQ(Count(bitset), nb);
131+
ASSERT_EQ(Count(bitset), expect);
132+
}
133+
134+
{
135+
// [2...8]
136+
int expect = std::accumulate(counts.begin() + 2, counts.begin() + 9, 0);
137+
auto bitset = index->Range("2", true, "8", true);
138+
ASSERT_EQ(bitset.size(), nb);
139+
ASSERT_EQ(Count(bitset), expect);
140+
}
141+
142+
{
143+
// [0...8]
144+
int expect = std::accumulate(counts.begin(), counts.begin() + 9, 0);
145+
auto bitset = index->Range("0", true, "9", false);
146+
ASSERT_EQ(bitset.size(), nb);
147+
ASSERT_EQ(Count(bitset), expect);
119148
}
120149
}
121150

0 commit comments

Comments
 (0)