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]() {