From 4d1390ce9163614a18347a2d66c8bb992e26928b Mon Sep 17 00:00:00 2001 From: Kishore Nallan Date: Sat, 3 Jul 2021 21:05:41 +0530 Subject: [PATCH] When sorting on geo field, return distance from reference point in response. --- src/collection.cpp | 11 +++++++++++ test/collection_filtering_test.cpp | 2 +- test/collection_sorting_test.cpp | 6 +++++- 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/collection.cpp b/src/collection.cpp index 4ea1b113..eb9539ae 100644 --- a/src/collection.cpp +++ b/src/collection.cpp @@ -1173,6 +1173,17 @@ Option Collection::search(const std::string & query, const std:: wrapper_doc["text_match"] = field_order_kv->scores[field_order_kv->match_score_index]; } + nlohmann::json geo_distances; + + for(size_t sort_field_index = 0; sort_field_index < sort_fields_std.size(); sort_field_index++) { + const auto& sort_field = sort_fields_std[sort_field_index]; + if(sort_field.geopoint != 0) { + geo_distances[sort_field.name] = std::abs(field_order_kv->scores[sort_field_index]); + } + } + + wrapper_doc["geo_distance_meters"] = geo_distances; + hits_array.push_back(wrapper_doc); } diff --git a/test/collection_filtering_test.cpp b/test/collection_filtering_test.cpp index 175a4c91..e70612bb 100644 --- a/test/collection_filtering_test.cpp +++ b/test/collection_filtering_test.cpp @@ -1061,7 +1061,7 @@ TEST_F(CollectionFilteringTest, GeoPointFiltering) { ASSERT_FALSE(add_op.ok()); ASSERT_EQ("Field `loc` must be a geopoint.", add_op.error()); - // under corcion mode, it should work + // under coercion mode, it should work bad_doc["loc"] = {"48.91", "2.33"}; add_op = coll1->add(bad_doc.dump(), CREATE, "", DIRTY_VALUES::COERCE_OR_REJECT); ASSERT_TRUE(add_op.ok()); diff --git a/test/collection_sorting_test.cpp b/test/collection_sorting_test.cpp index 63085a1f..d85686a5 100644 --- a/test/collection_sorting_test.cpp +++ b/test/collection_sorting_test.cpp @@ -585,9 +585,13 @@ TEST_F(CollectionSortingTest, GeoPointSorting) { ASSERT_STREQ(expected_ids[i].c_str(), results["hits"][i]["document"]["id"].get().c_str()); } + ASSERT_EQ(348, results["hits"][0]["geo_distance_meters"]["loc"].get()); + ASSERT_EQ(900, results["hits"][1]["geo_distance_meters"]["loc"].get()); + ASSERT_EQ(1973, results["hits"][2]["geo_distance_meters"]["loc"].get()); + // desc, without filter geo_sort_fields = { - sort_by("loc(48.84442912268208, 2.3490714964332353)", "DESC") + sort_by("loc(48.84442912268208, 2.3490714964332353)", "DESC") }; results = coll1->search("*",