graphrecords-query 0.5.0

High-performance graph-based data records
Documentation
use crate::{
    AttributeName, Failure, IndexValue, QueryResult, Scalar, ValueDomain,
    error::numeric::NonNumericValue,
};
use graphrecords_core::graphrecord::{GraphRecordAttribute, GraphRecordValue, NodeIndex};

pub trait ValueSign: ValueDomain {
    fn sign<'a>(label: &'static str, value: Self::Value<'a>) -> QueryResult<Self::Value<'a>>;
}

impl ValueSign for Scalar {
    fn sign<'a>(label: &'static str, value: Self::Value<'a>) -> QueryResult<Self::Value<'a>> {
        match value {
            GraphRecordValue::Int(integer) => Ok(GraphRecordValue::Int(integer.signum())),
            GraphRecordValue::Float(float) => Ok(GraphRecordValue::Float(if float == 0.0 {
                0.0
            } else {
                float.signum()
            })),
            value => Err(Failure::new(label, NonNumericValue::new(value))),
        }
    }
}

impl ValueSign for AttributeName {
    fn sign<'a>(label: &'static str, value: Self::Value<'a>) -> QueryResult<Self::Value<'a>> {
        match value {
            GraphRecordAttribute::Int(integer) => Ok(GraphRecordAttribute::Int(integer.signum())),
            value @ GraphRecordAttribute::String(_) => {
                Err(Failure::new(label, NonNumericValue::new(value)))
            }
        }
    }
}

impl ValueSign for IndexValue<NodeIndex> {
    fn sign<'a>(label: &'static str, value: Self::Value<'a>) -> QueryResult<Self::Value<'a>> {
        match value {
            GraphRecordAttribute::Int(integer) => Ok(GraphRecordAttribute::Int(integer.signum())),
            value @ GraphRecordAttribute::String(_) => {
                Err(Failure::new(label, NonNumericValue::new(value)))
            }
        }
    }
}

impl ValueSign for IndexValue<AttributeName> {
    fn sign<'a>(label: &'static str, value: Self::Value<'a>) -> QueryResult<Self::Value<'a>> {
        match value {
            GraphRecordAttribute::Int(integer) => Ok(GraphRecordAttribute::Int(integer.signum())),
            value @ GraphRecordAttribute::String(_) => {
                Err(Failure::new(label, NonNumericValue::new(value)))
            }
        }
    }
}

impl ValueSign for IndexValue<GraphRecordValue> {
    fn sign<'a>(label: &'static str, value: Self::Value<'a>) -> QueryResult<Self::Value<'a>> {
        match value {
            GraphRecordValue::Int(integer) => Ok(GraphRecordValue::Int(integer.signum())),
            GraphRecordValue::Float(float) => Ok(GraphRecordValue::Float(if float == 0.0 {
                0.0
            } else {
                float.signum()
            })),
            value => Err(Failure::new(label, NonNumericValue::new(value))),
        }
    }
}