Skip to content

Commit 20bb15d

Browse files
authored
feat(search): trim whitespaces in tag values (#2702)
Signed-off-by: PragmaTwice <[email protected]>
1 parent 3d6e8aa commit 20bb15d

File tree

3 files changed

+15
-3
lines changed

3 files changed

+15
-3
lines changed

src/common/string_util.h

+8
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@
3030

3131
namespace util {
3232

33+
inline const char ASCII_WHITESPACES[] = " \t\r\n\v\f";
34+
3335
std::string Float2String(double d);
3436
std::string ToLower(std::string in);
3537
std::string ToUpper(std::string in);
@@ -65,4 +67,10 @@ std::string StringJoin(const T &con, F &&f, std::string_view sep = ", ") {
6567
return res;
6668
}
6769

70+
template <typename T>
71+
std::string StringJoin(const T &con, std::string_view sep = ", ") {
72+
return StringJoin(
73+
con, [](const auto &v) -> decltype(auto) { return v; }, sep);
74+
}
75+
6876
} // namespace util

src/search/indexer.cc

+4
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,8 @@ StatusOr<kqir::Value> FieldValueRetriever::ParseFromJson(const jsoncons::json &v
6969
if (val.is_string()) {
7070
const char delim[] = {tag->separator, '\0'};
7171
auto vec = util::Split(val.as_string(), delim);
72+
std::transform(vec.begin(), vec.end(), vec.begin(),
73+
[](const std::string &s) { return util::Trim(s, util::ASCII_WHITESPACES); });
7274
return kqir::MakeValue<kqir::StringArray>(vec);
7375
} else if (val.is_array()) {
7476
std::vector<std::string> strs;
@@ -105,6 +107,8 @@ StatusOr<kqir::Value> FieldValueRetriever::ParseFromHash(const std::string &valu
105107
} else if (auto tag = dynamic_cast<const redis::TagFieldMetadata *>(type)) {
106108
const char delim[] = {tag->separator, '\0'};
107109
auto vec = util::Split(value, delim);
110+
std::transform(vec.begin(), vec.end(), vec.begin(),
111+
[](const std::string &s) { return util::Trim(s, util::ASCII_WHITESPACES); });
108112
return kqir::MakeValue<kqir::StringArray>(vec);
109113
} else if (auto vector = dynamic_cast<const redis::HnswVectorFieldMetadata *>(type)) {
110114
const auto dim = vector->dim;

tests/cppunit/indexer_test.cc

+3-3
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ TEST_F(IndexerTest, HashTag) {
125125
ASSERT_EQ(s->fields["x"], T("food,kitChen,Beauty"));
126126

127127
uint64_t cnt = 0;
128-
auto s_set = db.Set(*ctx_, key1, "x", "Clothing,FOOD,sport", &cnt);
128+
auto s_set = db.Set(*ctx_, key1, "x", "Clothing,FOOD,sport ", &cnt);
129129
ASSERT_EQ(cnt, 0);
130130
ASSERT_TRUE(s_set.ok());
131131

@@ -214,7 +214,7 @@ TEST_F(IndexerTest, JsonTag) {
214214
ASSERT_EQ(s->fields.size(), 1);
215215
ASSERT_EQ(s->fields["$.x"], T("food,kitChen,Beauty"));
216216

217-
auto s_set = db.Set(*ctx_, key1, "$.x", "\"Clothing,FOOD,sport\"");
217+
auto s_set = db.Set(*ctx_, key1, "$.x", "\" Clothing, FOOD ,sport\"");
218218
ASSERT_TRUE(s_set.ok());
219219

220220
auto s2 = indexer.Update(*ctx_, *s);
@@ -259,7 +259,7 @@ TEST_F(IndexerTest, JsonTagBuildIndex) {
259259
auto idxname = "jsontest";
260260

261261
{
262-
auto s_set = db.Set(*ctx_, key1, "$", R"({"x": "food,kitChen,Beauty"})");
262+
auto s_set = db.Set(*ctx_, key1, "$", R"({"x": "food , \nkitChen,Beauty\t "})");
263263
ASSERT_TRUE(s_set.ok());
264264

265265
auto s2 = indexer.updater_list[1]->Build(*ctx_);

0 commit comments

Comments
 (0)