ruvector-postgres 2.0.5

High-performance PostgreSQL vector database extension v2 - pgvector drop-in replacement with 230+ SQL functions, SIMD acceleration, Flash Attention, GNN layers, hybrid search, multi-tenancy, self-healing, and self-learning capabilities
//! Background worker for periodic learning

use pgrx::prelude::*;
use pgrx::bgworkers::*;
use std::time::Duration;

/// Register the background worker
pub fn register_worker() {
    BackgroundWorkerBuilder::new("ruvector_dag_learner")
        .set_function("dag_learning_worker_main")
        .set_library("ruvector_postgres")
        .set_argument(None)
        .enable_spi_access()
        .set_start_time(BgWorkerStartTime::RecoveryFinished)
        .set_restart_time(Some(Duration::from_secs(60)))
        .load();
}

#[pg_guard]
#[no_mangle]
pub extern "C" fn dag_learning_worker_main(_arg: pg_sys::Datum) {
    // Attach to shared memory
    BackgroundWorker::attach_signal_handlers(SignalWakeFlags::SIGHUP | SignalWakeFlags::SIGTERM);

    log!("DAG learning worker started");

    // Main loop
    loop {
        // Check for shutdown
        if BackgroundWorker::sigterm_received() {
            log!("DAG learning worker shutting down");
            break;
        }

        // Perform learning cycle
        if super::guc::is_enabled() {
            perform_learning_cycle();
        }

        // Sleep for interval (1 minute)
        BackgroundWorker::wait_latch(Some(Duration::from_secs(60)));

        // Reset latch
        BackgroundWorker::reset_latch();
    }
}

fn perform_learning_cycle() {
    // Connect to database
    BackgroundWorker::connect_worker_to_spi(
        Some("ruvector_dag"),
        None,
    );

    // Run learning in SPI context
    Spi::connect(|client| {
        // Drain trajectory buffer
        // Update SONA engine
        // Recompute clusters
        // Store patterns

        log!("DAG learning cycle completed");
    });
}