rocksgraph 0.1.0

A Gremlin-inspired property graph query engine written in Rust, backed by RocksDB
Documentation
// Copyright (c) 2026 Austin Han <austinhan1024@gmail.com>
//
// This file is part of RocksGraph.
//
// RocksGraph is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 2 of the License, or
// (at your option) any later version.
//
// RocksGraph is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with RocksGraph.  If not, see <https://www.gnu.org/licenses/>.

use crate::types::PIPELINE_PRODUCE_SIZE;
use std::rc::Rc;

use smallvec::SmallVec;

use crate::engine::volcano::steps::traits::ExplainNode;
use crate::{
    engine::{
        context::GraphCtx,
        traverser::Traverser,
        volcano::steps::traits::{CoreStep, StepRef},
    },
    types::error::StoreError,
};

/// A physical step that acts as a source, emitting a predefined vector of `Traverser` items.
#[derive(Debug)]
pub struct VecSourceStep {
    // ── Dynamic/Runtime execution state ──
    /// Predefined vector of traverser items to emit.
    items: SmallVec<[Rc<Traverser>; PIPELINE_PRODUCE_SIZE]>,
}

impl VecSourceStep {
    /// Creates an empty `VecSourceStep`.
    pub fn empty() -> Self {
        Self { items: SmallVec::new() }
    }

    /// Injects a collection of `Traverser` items into this source step.
    /// These items will be emitted when `produce` is called.
    pub fn inject(&mut self, items: SmallVec<[Rc<Traverser>; PIPELINE_PRODUCE_SIZE]>) {
        self.items.extend(items);
    }
}

impl CoreStep for VecSourceStep {
    fn add_upper(&mut self, _upstream: StepRef) {
        // `VecSourceStep` is a source step and does not have an upstream.
        panic!("VecSourceStep is a source step and cannot have an upstream");
    }

    fn produce(
        &mut self,
        _ctx: &mut dyn GraphCtx,
    ) -> Result<Option<SmallVec<[Rc<Traverser>; PIPELINE_PRODUCE_SIZE]>>, StoreError> {
        // Emits all currently held `Traverser` items and then clears its internal buffer.
        if !self.items.is_empty() {
            Ok(Some(std::mem::take(&mut self.items)))
        } else {
            Ok(None)
        }
    }

    fn reset(&mut self) {
        // Resets the step by clearing its internal buffer of items.
        self.items.clear();
    }

    fn explain(&self) -> ExplainNode {
        ExplainNode::new("VecSourceStep")
    }
}