ruroonga_expr/
greater_expr.rs1use 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 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 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}