Skip to main content

graphrecords_query/capabilities/numeric/
sign.rs

1use crate::{
2    AttributeName, Failure, IndexValue, QueryResult, Scalar, ValueDomain,
3    error::numeric::NonNumericValue,
4};
5use graphrecords_core::graphrecord::{GraphRecordAttribute, GraphRecordValue, NodeIndex};
6
7pub trait ValueSign: ValueDomain {
8    fn sign<'a>(label: &'static str, value: Self::Value<'a>) -> QueryResult<Self::Value<'a>>;
9}
10
11impl ValueSign for Scalar {
12    fn sign<'a>(label: &'static str, value: Self::Value<'a>) -> QueryResult<Self::Value<'a>> {
13        match value {
14            GraphRecordValue::Int(integer) => Ok(GraphRecordValue::Int(integer.signum())),
15            GraphRecordValue::Float(float) => Ok(GraphRecordValue::Float(if float == 0.0 {
16                0.0
17            } else {
18                float.signum()
19            })),
20            value => Err(Failure::new(label, NonNumericValue::new(value))),
21        }
22    }
23}
24
25impl ValueSign for AttributeName {
26    fn sign<'a>(label: &'static str, value: Self::Value<'a>) -> QueryResult<Self::Value<'a>> {
27        match value {
28            GraphRecordAttribute::Int(integer) => Ok(GraphRecordAttribute::Int(integer.signum())),
29            value @ GraphRecordAttribute::String(_) => {
30                Err(Failure::new(label, NonNumericValue::new(value)))
31            }
32        }
33    }
34}
35
36impl ValueSign for IndexValue<NodeIndex> {
37    fn sign<'a>(label: &'static str, value: Self::Value<'a>) -> QueryResult<Self::Value<'a>> {
38        match value {
39            GraphRecordAttribute::Int(integer) => Ok(GraphRecordAttribute::Int(integer.signum())),
40            value @ GraphRecordAttribute::String(_) => {
41                Err(Failure::new(label, NonNumericValue::new(value)))
42            }
43        }
44    }
45}
46
47impl ValueSign for IndexValue<AttributeName> {
48    fn sign<'a>(label: &'static str, value: Self::Value<'a>) -> QueryResult<Self::Value<'a>> {
49        match value {
50            GraphRecordAttribute::Int(integer) => Ok(GraphRecordAttribute::Int(integer.signum())),
51            value @ GraphRecordAttribute::String(_) => {
52                Err(Failure::new(label, NonNumericValue::new(value)))
53            }
54        }
55    }
56}
57
58impl ValueSign for IndexValue<GraphRecordValue> {
59    fn sign<'a>(label: &'static str, value: Self::Value<'a>) -> QueryResult<Self::Value<'a>> {
60        match value {
61            GraphRecordValue::Int(integer) => Ok(GraphRecordValue::Int(integer.signum())),
62            GraphRecordValue::Float(float) => Ok(GraphRecordValue::Float(if float == 0.0 {
63                0.0
64            } else {
65                float.signum()
66            })),
67            value => Err(Failure::new(label, NonNumericValue::new(value))),
68        }
69    }
70}