From 0d81a66257ca467b009e53c06484c2eb0df87757 Mon Sep 17 00:00:00 2001 From: Harpreet Sangar Date: Wed, 4 Oct 2023 13:00:31 +0530 Subject: [PATCH] Add test case. --- src/index.cpp | 25 ++++++++++++++----------- test/collection_sorting_test.cpp | 23 ++++++++++++++++++++++- 2 files changed, 36 insertions(+), 12 deletions(-) diff --git a/src/index.cpp b/src/index.cpp index 9c9299ec..a35ad262 100644 --- a/src/index.cpp +++ b/src/index.cpp @@ -2478,7 +2478,8 @@ Option Index::search(std::vector& field_query_tokens, cons } } - std::vector nearest_ids, filter_indexes; + std::vector nearest_ids; + std::vector eval_filter_indexes; for (auto& dist_result : dist_results) { auto& seq_id = dist_result.second.seq_id; @@ -2507,7 +2508,7 @@ Option Index::search(std::vector& field_query_tokens, cons int64_t match_score_index = -1; auto compute_sort_scores_op = compute_sort_scores(sort_fields_std, sort_order, field_values, - geopoint_indices, seq_id, references, filter_indexes, + geopoint_indices, seq_id, references, eval_filter_indexes, 0, scores, match_score_index, vec_dist_score, collection_name); if (!compute_sort_scores_op.ok()) { @@ -2848,7 +2849,8 @@ Option Index::search(std::vector& field_query_tokens, cons result->scores[result->match_score_index] = float_to_int64_t((1.0 / (i + 1)) * TEXT_MATCH_WEIGHT); } - std::vector vec_search_ids, filter_indexes; // list of IDs found only in vector search + std::vector vec_search_ids; // list of IDs found only in vector search + std::vector eval_filter_indexes; for(size_t res_index = 0; res_index < vec_results.size(); res_index++) { auto& vec_result = vec_results[res_index]; @@ -2889,7 +2891,7 @@ Option Index::search(std::vector& field_query_tokens, cons int64_t scores[3] = {0}; auto compute_sort_scores_op = compute_sort_scores(sort_fields_std, sort_order, field_values, - geopoint_indices, seq_id, references, filter_indexes, + geopoint_indices, seq_id, references, eval_filter_indexes, match_score, scores, match_score_index, vec_result.second, collection_name); if (!compute_sort_scores_op.ok()) { @@ -2910,7 +2912,7 @@ Option Index::search(std::vector& field_query_tokens, cons int64_t match_score_index = -1; auto compute_sort_scores_op = compute_sort_scores(sort_fields_std, sort_order, field_values, - geopoint_indices, seq_id, references, filter_indexes, + geopoint_indices, seq_id, references, eval_filter_indexes, match_score, scores, match_score_index, vec_result.second, collection_name); if (!compute_sort_scores_op.ok()) { @@ -3808,7 +3810,8 @@ Option Index::search_across_fields(const std::vector& query_token token_its.push_back(std::move(token_fields)); } - std::vector result_ids, filter_indexes; + std::vector result_ids; + std::vector eval_filter_indexes; Option status(true); or_iterator_t::intersect(token_its, istate, @@ -3905,7 +3908,7 @@ Option Index::search_across_fields(const std::vector& query_token int64_t match_score_index = -1; auto compute_sort_scores_op = compute_sort_scores(sort_fields, sort_order, field_values, geopoint_indices, - seq_id, references, filter_indexes, best_field_match_score, + seq_id, references, eval_filter_indexes, best_field_match_score, scores, match_score_index, 0, collection_name); if (!compute_sort_scores_op.ok()) { status = Option(compute_sort_scores_op.code(), compute_sort_scores_op.error()); @@ -4684,7 +4687,7 @@ Option Index::do_phrase_search(const size_t num_search_fields, const std:: all_result_ids_len = filter_result_iterator->to_filter_id_array(all_result_ids); filter_result_iterator->reset(); - std::vector filter_indexes; + std::vector eval_filter_indexes; // populate topster for(size_t i = 0; i < std::min(10000, all_result_ids_len); i++) { auto seq_id = filter_result_iterator->seq_id; @@ -4696,7 +4699,7 @@ Option Index::do_phrase_search(const size_t num_search_fields, const std:: int64_t match_score_index = -1; auto compute_sort_scores_op = compute_sort_scores(sort_fields, sort_order, field_values, geopoint_indices, - seq_id, references, filter_indexes, match_score, scores, + seq_id, references, eval_filter_indexes, match_score, scores, match_score_index, 0, collection_name); if (!compute_sort_scores_op.ok()) { return compute_sort_scores_op; @@ -4840,7 +4843,7 @@ Option Index::do_infix_search(const size_t num_search_fields, const std::v } bool field_is_array = search_schema.at(the_fields[field_id].name).is_array(); - std::vector filter_indexes; + std::vector eval_filter_indexes; for(size_t i = 0; i < raw_infix_ids_length; i++) { auto seq_id = raw_infix_ids[i]; @@ -4858,7 +4861,7 @@ Option Index::do_infix_search(const size_t num_search_fields, const std::v auto compute_sort_scores_op = compute_sort_scores(sort_fields, sort_order, field_values, geopoint_indices, seq_id, references, - filter_indexes, 100, scores, match_score_index, + eval_filter_indexes, 100, scores, match_score_index, 0, collection_name); if (!compute_sort_scores_op.ok()) { return compute_sort_scores_op; diff --git a/test/collection_sorting_test.cpp b/test/collection_sorting_test.cpp index 3b729c26..2465a481 100644 --- a/test/collection_sorting_test.cpp +++ b/test/collection_sorting_test.cpp @@ -2060,6 +2060,28 @@ TEST_F(CollectionSortingTest, OptionalFilteringViaSortingWildcard) { ASSERT_EQ(expected_ids[i], results["hits"][i]["document"]["id"].get()); } + nlohmann::json doc = R"( + { + "title": "title5", + "brand": "puma", + "points": 5 + } + )"_json; + ASSERT_TRUE(coll1->add(doc.dump()).ok()); + + sort_fields = { + sort_by({"brand:nike", "brand:adidas"}, {3, 2}, "DESC"), + sort_by("points", "DESC"), + }; + + results = coll1->search("*", {"title"}, "", {}, sort_fields, {2}, 10, 1, FREQUENCY, {true}, 10).get(); + ASSERT_EQ(6, results["hits"].size()); + + expected_ids = {"3", "0", "4", "2", "1", "5"}; + for(size_t i = 0; i < expected_ids.size(); i++) { + ASSERT_EQ(expected_ids[i], results["hits"][i]["document"]["id"].get()); + } + // bad syntax for eval query sort_fields = { sort_by({"brandnike || points:0"}, {1}, "DESC"), @@ -2071,7 +2093,6 @@ TEST_F(CollectionSortingTest, OptionalFilteringViaSortingWildcard) { ASSERT_EQ("Error parsing eval expression in sort_by clause.", res_op.error()); // when eval condition is empty - std::map req_params = { {"collection", "coll1"}, {"q", "*"},