Skip to main content

plexus_engine/capabilities/
ordering.rs

1use serde::{Deserialize, Serialize};
2
3use crate::capabilities::types::OpKind;
4
5#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
6pub enum OpOrderingContract {
7    EngineDefinedStable,
8    StablePassThrough,
9    FanOutDeterministicPerInput,
10    DeterministicSortStableTies,
11    UnspecifiedWithoutSort,
12    StableConcatOrUnspecifiedDistinct,
13    ScoreDescStableTies,
14}
15
16pub fn op_ordering_contract(kind: OpKind) -> OpOrderingContract {
17    match kind {
18        OpKind::ScanNodes | OpKind::ScanRels | OpKind::ConstRow => {
19            OpOrderingContract::EngineDefinedStable
20        }
21        OpKind::Expand | OpKind::OptionalExpand | OpKind::SemiExpand | OpKind::ExpandVarLen => {
22            OpOrderingContract::FanOutDeterministicPerInput
23        }
24        OpKind::Filter
25        | OpKind::Project
26        | OpKind::Limit
27        | OpKind::Unwind
28        | OpKind::PathConstruct
29        | OpKind::BlockMarker
30        | OpKind::Return
31        | OpKind::CreateNode
32        | OpKind::CreateRel
33        | OpKind::Merge
34        | OpKind::Delete
35        | OpKind::SetProperty
36        | OpKind::RemoveProperty => OpOrderingContract::StablePassThrough,
37        OpKind::Rerank => OpOrderingContract::ScoreDescStableTies,
38        OpKind::Aggregate | OpKind::VectorScan => OpOrderingContract::UnspecifiedWithoutSort,
39        OpKind::Sort => OpOrderingContract::DeterministicSortStableTies,
40        OpKind::Union => OpOrderingContract::StableConcatOrUnspecifiedDistinct,
41    }
42}