diff --git a/internal/core/src/query/ScalarIndex.h b/internal/core/src/query/ScalarIndex.h index b80d845d85..684baf629a 100644 --- a/internal/core/src/query/ScalarIndex.h +++ b/internal/core/src/query/ScalarIndex.h @@ -13,7 +13,8 @@ #include #include -#include +#include "index/ScalarIndexSort.h" +#include "index/StringIndexSort.h" #include "common/FieldMeta.h" #include "common/Span.h" @@ -28,6 +29,14 @@ generate_scalar_index(Span data) { return indexing; } +template <> +inline scalar::ScalarIndexPtr +generate_scalar_index(Span data) { + auto indexing = scalar::CreateStringIndexSort(); + indexing->Build(data.row_count(), data.data()); + return indexing; +} + inline std::unique_ptr generate_scalar_index(SpanBase data, DataType data_type) { Assert(!datatype_is_vector(data_type)); diff --git a/internal/core/unittest/test_sealed.cpp b/internal/core/unittest/test_sealed.cpp index 0707672118..1be652ad2c 100644 --- a/internal/core/unittest/test_sealed.cpp +++ b/internal/core/unittest/test_sealed.cpp @@ -222,6 +222,7 @@ TEST(Sealed, LoadFieldData) { auto counter_id = schema->AddDebugField("counter", DataType::INT64); auto double_id = schema->AddDebugField("double", DataType::DOUBLE); auto nothing_id = schema->AddDebugField("nothing", DataType::INT32); + auto str_id = schema->AddDebugField("str", DataType::VARCHAR); schema->set_primary_field_id(counter_id); auto dataset = DataGen(schema, N); @@ -281,13 +282,18 @@ TEST(Sealed, LoadFieldData) { segment->LoadIndex(vec_info); ASSERT_EQ(segment->num_chunk(), 1); + ASSERT_EQ(segment->num_chunk_index(double_id), 1); + ASSERT_EQ(segment->num_chunk_index(str_id), 1); auto chunk_span1 = segment->chunk_data(counter_id, 0); auto chunk_span2 = segment->chunk_data(double_id, 0); + auto chunk_span3 = segment->chunk_data(str_id, 0); auto ref1 = dataset.get_col(counter_id); auto ref2 = dataset.get_col(double_id); + auto ref3 = dataset.get_col(str_id)->scalars().string_data().data(); for (int i = 0; i < N; ++i) { ASSERT_EQ(chunk_span1[i], ref1[i]); ASSERT_EQ(chunk_span2[i], ref2[i]); + ASSERT_EQ(chunk_span3[i], ref3[i]); } auto sr = segment->Search(plan.get(), *ph_group, time);