From 5c60e066901ba96afe8e1cac3ce5c1058a01088e Mon Sep 17 00:00:00 2001 From: Kishore Nallan Date: Sun, 9 Jul 2023 19:50:21 +0530 Subject: [PATCH] Don't allow rule creation targeting the same destination collection. Upsert can still be used for this. --- src/analytics_manager.cpp | 4 ++++ test/analytics_manager_test.cpp | 21 +++++++++++++++++++-- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/analytics_manager.cpp b/src/analytics_manager.cpp index dcb6a64a..b23c6cc2 100644 --- a/src/analytics_manager.cpp +++ b/src/analytics_manager.cpp @@ -83,6 +83,10 @@ Option AnalyticsManager::create_popular_queries_index(nlohmann::json &payl suggestion_config.suggestion_collection = suggestion_collection; suggestion_config.limit = limit; + if(!upsert && popular_queries.count(suggestion_collection) != 0) { + return Option(400, "There's already another configuration for this destination collection."); + } + for(const auto& coll: params["source"]["collections"]) { if(!coll.is_string()) { return Option(400, "Must contain a valid list of source collection names."); diff --git a/test/analytics_manager_test.cpp b/test/analytics_manager_test.cpp index a86bf809..24fdcbf0 100644 --- a/test/analytics_manager_test.cpp +++ b/test/analytics_manager_test.cpp @@ -134,6 +134,23 @@ TEST_F(AnalyticsManagerTest, GetAndDeleteSuggestions) { } })"_json; + create_op = analyticsManager.create_rule(analytics_rule, false, true); + ASSERT_FALSE(create_op.ok()); + ASSERT_EQ("There's already another configuration for this destination collection.", create_op.error()); + + analytics_rule = R"({ + "name": "top_search_queries2", + "type": "popular_queries", + "params": { + "limit": 100, + "source": { + "collections": ["titles"] + }, + "destination": { + "collection": "top_queries2" + } + } + })"_json; create_op = analyticsManager.create_rule(analytics_rule, false, true); ASSERT_TRUE(create_op.ok()); @@ -173,8 +190,8 @@ TEST_F(AnalyticsManagerTest, GetAndDeleteSuggestions) { ASSERT_EQ("There's already another configuration with the name `top_search_queries2`.", create_op.error()); // try deleting both rules - analyticsManager.remove_rule("top_search_queries"); - analyticsManager.remove_rule("top_search_queries2"); + ASSERT_TRUE(analyticsManager.remove_rule("top_search_queries").ok()); + ASSERT_TRUE(analyticsManager.remove_rule("top_search_queries2").ok()); missing_rule_op = analyticsManager.get_rule("top_search_queries"); ASSERT_FALSE(missing_rule_op.ok());