1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
use {
    super::{error::ValueError, Value},
    crate::{
        executor::GroupKey,
        result::{Error, Result},
    },
};

impl TryInto<GroupKey> for Value {
    type Error = Error;

    fn try_into(self) -> Result<GroupKey> {
        use Value::*;

        match self {
            Bool(v) => Ok(GroupKey::Bool(v)),
            I8(v) => Ok(GroupKey::I8(v)),
            I64(v) => Ok(GroupKey::I64(v)),
            Str(v) => Ok(GroupKey::Str(v)),
            Date(v) => Ok(GroupKey::Date(v)),
            Timestamp(v) => Ok(GroupKey::Timestamp(v)),
            Time(v) => Ok(GroupKey::Time(v)),
            Interval(v) => Ok(GroupKey::Interval(v)),
            Uuid(v) => Ok(GroupKey::Uuid(v)),
            Decimal(v) => Ok(GroupKey::Decimal(v)),
            Null => Ok(GroupKey::None),
            F64(_) => Err(ValueError::GroupByNotSupported("FLOAT".to_owned()).into()),
            Map(_) => Err(ValueError::GroupByNotSupported("MAP".to_owned()).into()),
            List(_) => Err(ValueError::GroupByNotSupported("LIST".to_owned()).into()),
        }
    }
}

impl TryInto<GroupKey> for &Value {
    type Error = Error;

    fn try_into(self) -> Result<GroupKey> {
        self.clone().try_into()
    }
}