graphrecords_query/capabilities/numeric/
sign.rs1use 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}