ruroonga_expr/
greater_expr.rs

1use std::borrow::Cow;
2use exprable::Escape;
3use std::any::Any;
4use std::marker::PhantomData;
5use expr::{Unescaped, Escaped};
6use groupable::{Fragmentable, Query};
7
8#[derive(Debug, Clone, PartialEq, Eq)]
9pub struct GreaterExpr<'a, S: Any = Unescaped> {
10    column: Cow<'a, str>,
11    target: Cow<'a, str>,
12    _marker: PhantomData<S>,
13}
14
15impl<'a> GreaterExpr<'a, Unescaped> {
16    pub fn new<T>(column: T, target: T) -> GreaterExpr<'a, Unescaped>
17        where T: Into<Cow<'a, str>>
18    {
19        GreaterExpr {
20            column: column.into(),
21            target: target.into(),
22            _marker: PhantomData,
23        }
24    }
25
26    /// Prepare grn_expr
27    pub fn prepare(self) -> GreaterExpr<'a, Escaped> {
28        GreaterExpr {
29            column: self.column,
30            target: format!("{}", Escape(&*self.target.into_owned())).into(),
31            _marker: PhantomData,
32        }
33    }
34}
35
36impl<'a> GreaterExpr<'a, Escaped> {
37    /// Build grn_expr for greater search
38    pub fn build(self) -> String {
39        format!("{}:>{}", self.column.into_owned(), self.target.into_owned())
40    }
41}
42
43impl<'a> Fragmentable for GreaterExpr<'a, Escaped> {
44    fn to_fragment(self) -> Query {
45        vec![self.build()]
46    }
47}
48
49operators!(GreaterExpr<'a, Escaped>);
50
51#[cfg(test)]
52mod tests {
53    use super::*;
54    use std::borrow::Cow;
55    use std::marker::PhantomData;
56    use expr::{Unescaped, Escaped};
57
58    #[test]
59    fn test_new() {
60        let expr = GreaterExpr::new("n_likes", "10");
61        let expected = GreaterExpr::<Unescaped> {
62            column: Cow::Borrowed("n_likes"),
63            target: Cow::Borrowed("10"),
64            _marker: PhantomData,
65        };
66        assert_eq!(expected, expr)
67    }
68
69    #[test]
70    fn test_prepare() {
71        let expr = GreaterExpr::new("n_likes", "10").prepare();
72        let expected = GreaterExpr::<Escaped> {
73            column: Cow::Borrowed("n_likes"),
74            target: Cow::Borrowed("10"),
75            _marker: PhantomData,
76        };
77        assert_eq!(expected, expr)
78    }
79
80    #[test]
81    fn test_build() {
82        let expr = GreaterExpr::new("n_likes", "10").prepare().build();
83        let expected = "n_likes:>10";
84        assert_eq!(expected, expr)
85    }
86}