selene-db-gql 1.3.0

ISO/IEC 39075:2024 GQL parser, planner, optimizer, and executor for selene-db.
Documentation
//! Variable-length edge pattern lowering helpers.

use crate::{
    EdgePattern,
    plan::{PlannerError, RepeatEdgeMatch, ScanAccess, TailBinding},
};

use super::{
    bindings::edge_binding,
    expr,
    match_clause::{EdgeLoweringContext, RightNode},
};

pub(super) fn ensure_within_max_quantifier(
    max: u32,
    limit: u32,
    span: crate::SourceSpan,
) -> Result<(), PlannerError> {
    if max > limit {
        return Err(PlannerError::ProgramLimitExceeded {
            limit_name: "max_quantifier",
            limit,
            actual: max,
            span,
        });
    }
    Ok(())
}

pub(super) fn edge_match(
    edge: &EdgePattern,
    left_binding: Option<TailBinding>,
    final_node: RightNode,
    ctx: &mut EdgeLoweringContext<'_, '_>,
) -> Result<RepeatEdgeMatch, PlannerError> {
    let group_binding = edge_binding(edge, ctx.analyzed, ctx.names, ctx.binding_ids)?;
    let property_predicates = edge
        .properties
        .iter()
        .map(|(key, value)| expr::property_predicate(None, key.clone(), value, ctx.analyzed))
        .collect::<Result<Vec<_>, _>>()?;
    let inline_predicates = edge
        .inline_where
        .as_ref()
        .map(|where_clause| expr::filter_predicate(where_clause, ctx.analyzed))
        .transpose()?
        .into_iter()
        .collect();
    Ok(RepeatEdgeMatch {
        group_binding,
        group_hidden_binding: None,
        label_predicate: edge.label_expr.clone(),
        property_predicates,
        inline_predicates,
        left_binding: left_binding.and_then(TailBinding::named),
        left_hidden_binding: left_binding.and_then(TailBinding::hidden),
        final_binding: final_node.binding,
        final_hidden_binding: final_node.hidden_binding,
        final_label_predicate: final_node.label_predicate,
        final_property_predicates: final_node.property_predicates,
        access: ScanAccess::Linear,
        span: edge.span,
    })
}