From b5389784c171df0401edbf881901371296583a5e Mon Sep 17 00:00:00 2001 From: Colin Barry Date: Mon, 30 Jun 2025 16:03:16 +0100 Subject: [PATCH 1/3] wip: Implement frequencies_as_map --- .../algorithm/collections.cpp | 27 +++++++++++++++++++ .../algorithm/collections.hpp | 6 +++++ cpp/collections_module/collections_module.cpp | 5 ++++ .../test_frequencies_as_map1/input.cyp | 1 + .../test_frequencies_as_map1/test.yml | 5 ++++ .../test_frequencies_as_map2/input.cyp | 1 + .../test_frequencies_as_map2/test.yml | 5 ++++ .../test_frequencies_as_map3/input.cyp | 1 + .../test_frequencies_as_map3/test.yml | 5 ++++ 9 files changed, 56 insertions(+) create mode 100644 e2e/collections_test/test_frequencies_as_map1/input.cyp create mode 100644 e2e/collections_test/test_frequencies_as_map1/test.yml create mode 100644 e2e/collections_test/test_frequencies_as_map2/input.cyp create mode 100644 e2e/collections_test/test_frequencies_as_map2/test.yml create mode 100644 e2e/collections_test/test_frequencies_as_map3/input.cyp create mode 100644 e2e/collections_test/test_frequencies_as_map3/test.yml diff --git a/cpp/collections_module/algorithm/collections.cpp b/cpp/collections_module/algorithm/collections.cpp index f7acd9919..e84b5e31b 100644 --- a/cpp/collections_module/algorithm/collections.cpp +++ b/cpp/collections_module/algorithm/collections.cpp @@ -590,3 +590,30 @@ void Collections::Flatten(mgp_list *args, mgp_func_context *ctx, mgp_func_result return; } } + +void Collections::FrequenciesAsMap(mgp_list *args, mgp_func_context *ctx, mgp_func_result *res, mgp_memory *memory) { + mgp::MemoryDispatcherGuard guard{memory}; + const auto arguments = mgp::List(args); + auto result = mgp::Result(res); + + try { + const auto input_list = arguments[0].ValueList(); + std::unordered_map frequency_map; + + for (const auto &element : input_list) { + frequency_map[element]++; + } + + mgp::Map result_map; + for (const auto &[element, count] : frequency_map) { + const auto key = element.ToString(); + result_map.Insert(key, mgp::Value(count)); + } + + result.SetValue(std::move(result_map)); + + } catch (const std::exception &e) { + result.SetErrorMessage(e.what()); + return; + } +} diff --git a/cpp/collections_module/algorithm/collections.hpp b/cpp/collections_module/algorithm/collections.hpp index ddfe0cf11..a223cbd98 100644 --- a/cpp/collections_module/algorithm/collections.hpp +++ b/cpp/collections_module/algorithm/collections.hpp @@ -90,6 +90,10 @@ constexpr std::string_view kArgumentSizePartition = "partition_size"; constexpr std::string_view kProcedureFlatten = "flatten"; constexpr std::string_view kArgumentListFlatten = "list"; +/* frequencies_as_map constants */ +constexpr std::string_view kProcedureFrequenciesAsMap = "frequencies_as_map"; +constexpr std::string_view kArgumentListFrequenciesAsMap = "coll"; + void SetResult(mgp::Result &result, const mgp::Value &value); void SumLongs(mgp_list *args, mgp_func_context *ctx, mgp_func_result *res, mgp_memory *memory); @@ -128,4 +132,6 @@ void Partition(mgp_list *args, mgp_graph *memgraph_graph, mgp_result *result, mg void Flatten(mgp_list *args, mgp_func_context *ctx, mgp_func_result *res, mgp_memory *memory); +void FrequenciesAsMap(mgp_list *args, mgp_func_context *ctx, mgp_func_result *res, mgp_memory *memory); + } // namespace Collections diff --git a/cpp/collections_module/collections_module.cpp b/cpp/collections_module/collections_module.cpp index cef596882..df1cf7a09 100644 --- a/cpp/collections_module/collections_module.cpp +++ b/cpp/collections_module/collections_module.cpp @@ -75,6 +75,11 @@ extern "C" int mgp_init_module(struct mgp_module *module, struct mgp_memory *mem {mgp::Parameter(Collections::kArgumentListToSet, {mgp::Type::List, mgp::Type::Any})}, module, memory); + mgp::AddFunction(Collections::FrequenciesAsMap, Collections::kProcedureFrequenciesAsMap, + {mgp::Parameter(Collections::kArgumentListFrequenciesAsMap, {mgp::Type::List, mgp::Type::Any})}, + module, memory); + + AddProcedure( Collections::Partition, std::string(Collections::kProcedurePartition).c_str(), mgp::ProcedureType::Read, {mgp::Parameter(std::string(Collections::kArgumentListPartition).c_str(), {mgp::Type::List, mgp::Type::Any}), diff --git a/e2e/collections_test/test_frequencies_as_map1/input.cyp b/e2e/collections_test/test_frequencies_as_map1/input.cyp new file mode 100644 index 000000000..0519ecba6 --- /dev/null +++ b/e2e/collections_test/test_frequencies_as_map1/input.cyp @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/e2e/collections_test/test_frequencies_as_map1/test.yml b/e2e/collections_test/test_frequencies_as_map1/test.yml new file mode 100644 index 000000000..d1624c53d --- /dev/null +++ b/e2e/collections_test/test_frequencies_as_map1/test.yml @@ -0,0 +1,5 @@ +query: > + RETURN collections.frequencies_as_map([1,1,2,1,3,4,1]) AS result; + +output: + - result: {"1": 4, "2": 1, "3": 1, "4": 1} \ No newline at end of file diff --git a/e2e/collections_test/test_frequencies_as_map2/input.cyp b/e2e/collections_test/test_frequencies_as_map2/input.cyp new file mode 100644 index 000000000..0519ecba6 --- /dev/null +++ b/e2e/collections_test/test_frequencies_as_map2/input.cyp @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/e2e/collections_test/test_frequencies_as_map2/test.yml b/e2e/collections_test/test_frequencies_as_map2/test.yml new file mode 100644 index 000000000..523439088 --- /dev/null +++ b/e2e/collections_test/test_frequencies_as_map2/test.yml @@ -0,0 +1,5 @@ +query: > + RETURN collections.frequencies_as_map(['a','b','a','c','b','a']) AS result; + +output: + - result: {"a": 3, "b": 2, "c": 1} \ No newline at end of file diff --git a/e2e/collections_test/test_frequencies_as_map3/input.cyp b/e2e/collections_test/test_frequencies_as_map3/input.cyp new file mode 100644 index 000000000..0519ecba6 --- /dev/null +++ b/e2e/collections_test/test_frequencies_as_map3/input.cyp @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/e2e/collections_test/test_frequencies_as_map3/test.yml b/e2e/collections_test/test_frequencies_as_map3/test.yml new file mode 100644 index 000000000..d935b38bf --- /dev/null +++ b/e2e/collections_test/test_frequencies_as_map3/test.yml @@ -0,0 +1,5 @@ +query: > + RETURN collections.frequencies_as_map([]) AS result; + +output: + - result: {} \ No newline at end of file From 01612711d5e973131068c514f19cb6f48ff1452f Mon Sep 17 00:00:00 2001 From: Colin Barry Date: Wed, 2 Jul 2025 15:37:39 +0100 Subject: [PATCH 2/3] test: Fix test by removing newlines in test input files --- e2e/collections_test/test_frequencies_as_map1/input.cyp | 1 - e2e/collections_test/test_frequencies_as_map1/test.yml | 2 +- e2e/collections_test/test_frequencies_as_map2/input.cyp | 1 - e2e/collections_test/test_frequencies_as_map2/test.yml | 2 +- e2e/collections_test/test_frequencies_as_map3/input.cyp | 1 - e2e/collections_test/test_frequencies_as_map3/test.yml | 2 +- 6 files changed, 3 insertions(+), 6 deletions(-) diff --git a/e2e/collections_test/test_frequencies_as_map1/input.cyp b/e2e/collections_test/test_frequencies_as_map1/input.cyp index 0519ecba6..e69de29bb 100644 --- a/e2e/collections_test/test_frequencies_as_map1/input.cyp +++ b/e2e/collections_test/test_frequencies_as_map1/input.cyp @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/e2e/collections_test/test_frequencies_as_map1/test.yml b/e2e/collections_test/test_frequencies_as_map1/test.yml index d1624c53d..6b768dd8f 100644 --- a/e2e/collections_test/test_frequencies_as_map1/test.yml +++ b/e2e/collections_test/test_frequencies_as_map1/test.yml @@ -2,4 +2,4 @@ query: > RETURN collections.frequencies_as_map([1,1,2,1,3,4,1]) AS result; output: - - result: {"1": 4, "2": 1, "3": 1, "4": 1} \ No newline at end of file + - result: {"1": 4, "2": 1, "3": 1, "4": 1} \ No newline at end of file diff --git a/e2e/collections_test/test_frequencies_as_map2/input.cyp b/e2e/collections_test/test_frequencies_as_map2/input.cyp index 0519ecba6..e69de29bb 100644 --- a/e2e/collections_test/test_frequencies_as_map2/input.cyp +++ b/e2e/collections_test/test_frequencies_as_map2/input.cyp @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/e2e/collections_test/test_frequencies_as_map2/test.yml b/e2e/collections_test/test_frequencies_as_map2/test.yml index 523439088..9b5b1cf27 100644 --- a/e2e/collections_test/test_frequencies_as_map2/test.yml +++ b/e2e/collections_test/test_frequencies_as_map2/test.yml @@ -2,4 +2,4 @@ query: > RETURN collections.frequencies_as_map(['a','b','a','c','b','a']) AS result; output: - - result: {"a": 3, "b": 2, "c": 1} \ No newline at end of file + - result: {"a": 3, "b": 2, "c": 1} \ No newline at end of file diff --git a/e2e/collections_test/test_frequencies_as_map3/input.cyp b/e2e/collections_test/test_frequencies_as_map3/input.cyp index 0519ecba6..e69de29bb 100644 --- a/e2e/collections_test/test_frequencies_as_map3/input.cyp +++ b/e2e/collections_test/test_frequencies_as_map3/input.cyp @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/e2e/collections_test/test_frequencies_as_map3/test.yml b/e2e/collections_test/test_frequencies_as_map3/test.yml index d935b38bf..c680dab15 100644 --- a/e2e/collections_test/test_frequencies_as_map3/test.yml +++ b/e2e/collections_test/test_frequencies_as_map3/test.yml @@ -2,4 +2,4 @@ query: > RETURN collections.frequencies_as_map([]) AS result; output: - - result: {} \ No newline at end of file + - result: {} \ No newline at end of file From 2c62f84f538ef915451ffbbd7e86394527fe2bc3 Mon Sep 17 00:00:00 2001 From: Colin Barry Date: Fri, 15 Aug 2025 15:15:12 +0100 Subject: [PATCH 3/3] test: Add (failing) test for nulls in `frequencies_as_map` --- e2e/collections_test/test_frequencies_as_map4/input.cyp | 0 e2e/collections_test/test_frequencies_as_map4/test.yml | 5 +++++ 2 files changed, 5 insertions(+) create mode 100644 e2e/collections_test/test_frequencies_as_map4/input.cyp create mode 100644 e2e/collections_test/test_frequencies_as_map4/test.yml diff --git a/e2e/collections_test/test_frequencies_as_map4/input.cyp b/e2e/collections_test/test_frequencies_as_map4/input.cyp new file mode 100644 index 000000000..e69de29bb diff --git a/e2e/collections_test/test_frequencies_as_map4/test.yml b/e2e/collections_test/test_frequencies_as_map4/test.yml new file mode 100644 index 000000000..ec693048c --- /dev/null +++ b/e2e/collections_test/test_frequencies_as_map4/test.yml @@ -0,0 +1,5 @@ +query: > + RETURN collections.frequencies_as_map([1, 1, null, null, 1]) AS result; + +output: + - result: {"1": 3, "null": 2} \ No newline at end of file