use serde::{Deserialize, Serialize};
use crate::capabilities::types::OpKind;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum OpOrderingContract {
EngineDefinedStable,
StablePassThrough,
FanOutDeterministicPerInput,
DeterministicSortStableTies,
UnspecifiedWithoutSort,
StableConcatOrUnspecifiedDistinct,
ScoreDescStableTies,
}
pub fn op_ordering_contract(kind: OpKind) -> OpOrderingContract {
match kind {
OpKind::ScanNodes | OpKind::ScanRels | OpKind::ConstRow => {
OpOrderingContract::EngineDefinedStable
}
OpKind::Expand | OpKind::OptionalExpand | OpKind::SemiExpand | OpKind::ExpandVarLen => {
OpOrderingContract::FanOutDeterministicPerInput
}
OpKind::Filter
| OpKind::Project
| OpKind::Limit
| OpKind::Unwind
| OpKind::PathConstruct
| OpKind::BlockMarker
| OpKind::Return
| OpKind::CreateNode
| OpKind::CreateRel
| OpKind::Merge
| OpKind::Delete
| OpKind::SetProperty
| OpKind::RemoveProperty => OpOrderingContract::StablePassThrough,
OpKind::Rerank => OpOrderingContract::ScoreDescStableTies,
OpKind::Aggregate | OpKind::VectorScan => OpOrderingContract::UnspecifiedWithoutSort,
OpKind::Sort => OpOrderingContract::DeterministicSortStableTies,
OpKind::Union => OpOrderingContract::StableConcatOrUnspecifiedDistinct,
}
}