storage-kit 0.0.1

Portable database and transactional state-store Kit.
Documentation
use serde_json::Value;

use crate::{QueryResponse, ScoreKind, ScrollRequest, StorageError};

use super::super::mapper;
use super::{SurrealManager, shared};

pub(super) async fn scroll(
    db: &SurrealManager,
    request: ScrollRequest,
) -> Result<QueryResponse, StorageError> {
    let scope = db.scope(&request.locator)?;
    let projection = mapper::projection_clause(&request.projection)?;
    let where_sql = mapper::where_clause(request.filter.as_ref())?
        .map(|sql| format!(" WHERE {sql}"))
        .unwrap_or_default();
    let effective_offset =
        crate::PageToken::effective_offset(request.page_token.as_deref(), request.offset)?;
    let limit_sql = mapper::limit_offset_clause(request.limit, effective_offset);
    let sql = format!(
        "SELECT {projection} FROM {}{where_sql} {limit_sql};",
        scope.table()
    );
    let rows: Value = scope.run_value(sql).await?;
    let next_page = shared::next_page_token_from_rows(&rows, request.limit, effective_offset)?;
    shared::SurrealScoring::Unscored(ScoreKind::Unknown).response(rows, next_page)
}