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 pancake_types::types::{PrimaryKey, SubValue, SubValueSpec, Value};

#[derive(PartialEq, Eq, Debug)]
pub enum Operation {
    Query(Statement),
    CreateScndIdx(SubValueSpec),
    DelScndIdx(SubValueSpec),
}

impl From<Statement> for Operation {
    fn from(stmt: Statement) -> Self {
        Self::Query(stmt)
    }
}

#[derive(PartialEq, Eq, Debug)]
pub enum Statement {
    GetPK(SearchRange<PrimaryKey>),
    GetSV(SubValueSpec, SearchRange<SubValue>),
    Put(PrimaryKey, Option<Value>),
}

#[derive(PartialEq, Eq, Debug)]
pub enum SearchRange<T> {
    One(T),
    Range { lo: Option<T>, hi: Option<T> },
}

impl<T> SearchRange<T> {
    pub fn all() -> Self {
        Self::Range { lo: None, hi: None }
    }

    pub fn as_ref(&self) -> (Option<&T>, Option<&T>) {
        match &self {
            Self::One(one) => (Some(one), Some(one)),
            Self::Range { lo, hi } => (lo.as_ref(), hi.as_ref()),
        }
    }
}