aboutsummaryrefslogblamecommitdiffstats
path: root/include/CursorManager.h
blob: 78ea24c5e2677639da2ab10fd3e065e5907d6ff6 (plain) (tree)
1
2
3
4
5
6
7
8
9


                





                           
 




                                                                       

            
       


                                                                                       


                                                                                
      



                                                                              
      

                                                                             
      



                                                                                
      

                                                                             
       

                              















































                                                                                         

      
#pragma once

#include "Api.h"
#include "HandlerManager.h"
#include "Types.h"

#include <string>
#include <unordered_map>
#include <vector>

/**
 * @file CursorManager.h
 * @brief Declares paging and cursor orchestration for query execution.
 */

namespace nt
{
    /**
     * @class CursorManager
     * @brief Orchestrates data pagination from storage backends to the query executor.
     *
     * The cursor manager is the glue between registry objects and the
     * Volcano-style iterator model. It translates high-level plan requests into
     * low-level backend operations such as LMDB or etcd reads.
     *
     * Responsibilities:
     * - Snapshot anchoring and pins: bind retrieval to a multigroup snapshot.
     *   The snapshot object should hold the reference to the tree containing
     *   all relations and tuples.
     *
     * - State maintenance: track the current iterator or offset inside a
     *   relation to support sequential Next() calls from the algebra engine.
     *
     * - Prefetching and buffering: abstract backend paging. For remote
     *   backends like etcd, manage local buffers to hide latency from the
     *   executor. Think of this as a database equivalent of an operating-system
     *   driver.
     *
     * - Boundary enforcement: ensure scans do not cross commit boundaries or
     *   logical branch definitions unless explicitly requested by the plan.
     */
    class NT_API CursorManager
    {
    public:
        /** @brief Active scan state for a single relation. */
        struct cursor {
            /** Handle that authorized this cursor. */
            HandlerManager::handle* handle;
            // TODO: Replace with a lazy iterator into the physical storage backend.
            // Pre-loading all tuples on Open() is a mock simplification.
            std::vector<Tuple> tuples;
            size_t position = 0;
        };

        /**
         * @brief Opens a cursor on the relation referenced by the handle.
         * @param handle Authorized handle to a RELATION object.
         * @return A new cursor, or nullptr if the object is not a RELATION.
         */
        cursor* Open(HandlerManager::handle* handle);

        /**
         * @brief Pulls the next tuple from the cursor.
         *
         * The returned pointer is valid until the next Next() or Close() call.
         *
         * @param cursor Active cursor.
         * @return Pointer to the next tuple, or nullptr when exhausted.
         */
        Tuple* Next(cursor* cursor);

        /**
         * @brief Closes the cursor and releases its resources.
         * @param cursor Cursor to close.
         */
        void Close(cursor* cursor);

        /**
         * @brief Inserts one tuple into the mock store for a given relation path.
         *
         * TODO: Replace with physical storage writes when the backend is wired up.
         *
         * @param path  Logical path of the relation.
         * @param tuple Attribute values for the tuple to insert.
         */
        void MockInsert(std::vector<std::string> path, std::vector<Attribute> tuple);

    private:
        // TODO: Replace with physical storage backend access.
        // Keyed by the relation path joined as "seg/seg/...".
        std::unordered_map<std::string, std::vector<std::vector<Attribute>>> mock_store_;
    };
}