pub mod degree_pushdown;
pub mod extract_end_vertex_filter;
pub mod merge_adde_ids;
pub mod merge_end_vertex_filter;
pub mod merge_haslabel_into_edge;
pub mod merge_property_into_add;
pub mod merge_v_id_filter;
pub mod normalize_inv_outv;
pub mod reorder_filter;
use crate::types::SMALL_VECTOR_LENGTH;
use crate::types::{gvalue::Primitive, keys::Rank, StoreError};
pub(crate) fn primitive_to_rank(value: &Primitive) -> Result<Rank, StoreError> {
match value {
Primitive::UInt16(r) => Ok(*r),
Primitive::Int32(r) => {
if *r < 0 || *r > u16::MAX as i32 {
return Err(StoreError::UnexpectedDataType("rank must be between 0 and 65535".into()));
}
Ok(*r as u16)
}
Primitive::Int64(r) => {
if *r < 0 || *r > u16::MAX as i64 {
return Err(StoreError::UnexpectedDataType("rank must be between 0 and 65535".into()));
}
Ok(*r as u16)
}
_ => Err(StoreError::UnexpectedDataType("only integers can be edge rank".into())),
}
}
pub(crate) fn extract_ids_from_predicate(
pred: &crate::types::PrimitivePredicate,
) -> Result<Option<smallvec::SmallVec<[i64; SMALL_VECTOR_LENGTH]>>, StoreError> {
use crate::types::{Primitive, PrimitivePredicate};
use smallvec::smallvec;
fn to_i64(v: &Primitive) -> Result<i64, StoreError> {
match v {
Primitive::Int64(n) => Ok(*n),
Primitive::Int32(n) => Ok(*n as i64),
other => {
Err(StoreError::UnexpectedDataType(format!("expect i32 or i64 type for vertex id, got {other:?}")))
}
}
}
match pred {
PrimitivePredicate::Eq(v) => Ok(Some(smallvec![to_i64(v)?])),
PrimitivePredicate::Within(vs) => {
let parsed: smallvec::SmallVec<[i64; SMALL_VECTOR_LENGTH]> =
vs.iter().map(to_i64).collect::<Result<_, _>>()?;
Ok(if parsed.is_empty() { None } else { Some(parsed) })
}
_ => Ok(None),
}
}