From ce9bba8e836e5d99beb3a3f3c0ab9255cb777160 Mon Sep 17 00:00:00 2001 From: Josip Mrden <josip.mrden@memgraph.io> Date: Fri, 1 Mar 2024 12:55:41 +0100 Subject: [PATCH] Add has more for fetching optional result if no more rows to fetch --- include/_mgp.hpp | 2 ++ include/mg_procedure.h | 2 ++ include/mgp.hpp | 9 ++++++++- src/query/procedure/mg_procedure_impl.cpp | 4 ++++ 4 files changed, 16 insertions(+), 1 deletion(-) diff --git a/include/_mgp.hpp b/include/_mgp.hpp index 6efa78ec9..b04a099b3 100644 --- a/include/_mgp.hpp +++ b/include/_mgp.hpp @@ -871,4 +871,6 @@ inline mgp_map *pull_one(mgp_execution_result *result, mgp_graph *graph, mgp_mem return MgInvoke<mgp_map *>(mgp_pull_one, result, graph, memory); } +inline bool has_more_rows(mgp_execution_result *result) { return MgInvoke<bool>(mgp_has_more_rows, result); } + } // namespace mgp diff --git a/include/mg_procedure.h b/include/mg_procedure.h index de99a488b..6ca5c043b 100644 --- a/include/mg_procedure.h +++ b/include/mg_procedure.h @@ -1815,6 +1815,8 @@ enum mgp_error mgp_execute_query(struct mgp_graph *graph, struct mgp_memory *mem enum mgp_error mgp_fetch_execution_headers(struct mgp_execution_result *exec_result, struct mgp_execution_headers **headers); +enum mgp_error mgp_has_more_rows(struct mgp_execution_result *exec_result, bool *result); + enum mgp_error mgp_pull_one(struct mgp_execution_result *exec_result, struct mgp_graph *graph, struct mgp_memory *memory, struct mgp_map **result); diff --git a/include/mgp.hpp b/include/mgp.hpp index f3a0cfcfc..22aeb7848 100644 --- a/include/mgp.hpp +++ b/include/mgp.hpp @@ -1635,6 +1635,7 @@ class ExecutionResult { public: ExecutionResult(mgp_execution_result *result, mgp_graph *graph); ExecutionHeaders Headers() const; + bool HasMore() const; std::optional<ExecutionRow> PullOne() const; private: @@ -4397,8 +4398,14 @@ inline ExecutionResult::ExecutionResult(mgp_execution_result *result, mgp_graph inline ExecutionHeaders ExecutionResult::Headers() const { return mgp::fetch_execution_headers(result_); }; +inline bool ExecutionResult::HasMore() const { return mgp::has_more_rows(result_); } + inline std::optional<ExecutionRow> ExecutionResult::PullOne() const { - return ExecutionRow(mgp::MemHandlerCallback(pull_one, result_, graph_)); + if (HasMore()) { + return ExecutionRow(mgp::MemHandlerCallback(pull_one, result_, graph_)); + } + + return std::nullopt; } inline bool ExecutionHeaders::Iterator::operator==(const Iterator &other) const { diff --git a/src/query/procedure/mg_procedure_impl.cpp b/src/query/procedure/mg_procedure_impl.cpp index 1800a9302..09d15c61a 100644 --- a/src/query/procedure/mg_procedure_impl.cpp +++ b/src/query/procedure/mg_procedure_impl.cpp @@ -4106,6 +4106,10 @@ mgp_error mgp_fetch_execution_headers(mgp_execution_result *exec_result, mgp_exe return WrapExceptions([exec_result]() { return &exec_result->headers; }, result); } +mgp_error mgp_has_more_rows(mgp_execution_result *exec_result, bool *result) { + return WrapExceptions([exec_result]() { return exec_result->index >= exec_result->rows.rows.size(); }, result); +} + mgp_error mgp_pull_one(mgp_execution_result *exec_result, mgp_graph *graph, mgp_memory *memory, mgp_map **result) { return WrapExceptions( [exec_result, graph, memory]() {