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 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
#[macro_use] extern crate diesel; mod types { use diesel::backend::Debug; use diesel::types::{HasSqlType, NotNull}; use diesel::pg::{Pg, PgTypeMetadata, PgMetadataLookup}; #[derive(Clone, Copy)] pub struct TsQuery; #[derive(Clone, Copy)] pub struct TsVector; impl HasSqlType<TsQuery> for Pg { fn metadata(_: &PgMetadataLookup) -> PgTypeMetadata { PgTypeMetadata { oid: 3615, array_oid: 3645, } } } impl HasSqlType<TsQuery> for Debug { fn metadata(_: &()) -> () { () } } impl HasSqlType<TsVector> for Pg { fn metadata(_: &PgMetadataLookup) -> PgTypeMetadata { PgTypeMetadata { oid: 3614, array_oid: 3643, } } } impl HasSqlType<TsVector> for Debug { fn metadata(_: &()) -> () { () } } impl NotNull for TsVector {} impl NotNull for TsQuery {} } mod functions { use types::*; use diesel::types::*; sql_function!(length, length_t, (x: TsVector) -> Integer); sql_function!(numnode, numnode_t, (x: TsQuery) -> Integer); sql_function!(plainto_tsquery, plain_to_tsquery_t, (x: Text) -> TsQuery); sql_function!(querytree, querytree_t, (x: TsQuery) -> Text); sql_function!(strip, strip_t, (x: TsVector) -> TsVector); sql_function!(to_tsquery, to_tsquery_t, (x: Text) -> TsQuery); sql_function!(to_tsvector, to_tsvector_t, (x: Text) -> TsVector); sql_function!(ts_headline, ts_headline_t, (x: Text, y: TsQuery) -> Text); sql_function!(ts_rank, ts_rank_t, (x: TsVector, y: TsQuery) -> Float); sql_function!(ts_rank_cd, ts_rank_cd_t, (x: TsVector, y: TsQuery) -> Float); } mod dsl { use types::*; use diesel::expression::{Expression, AsExpression}; mod predicates { use types::*; use diesel::pg::Pg; diesel_infix_operator!(Matches, " @@ ", backend: Pg); diesel_infix_operator!(Concat, " || ", TsVector, backend: Pg); diesel_infix_operator!(And, " && ", TsQuery, backend: Pg); diesel_infix_operator!(Or, " || ", TsQuery, backend: Pg); diesel_infix_operator!(Contains, " @> ", backend: Pg); diesel_infix_operator!(ContainedBy, " @> ", backend: Pg); } use self::predicates::*; pub trait TsVectorExtensions: Expression<SqlType=TsVector> + Sized { fn matches<T: AsExpression<TsQuery>>(self, other: T) -> Matches<Self, T::Expression> { Matches::new(self, other.as_expression()) } fn concat<T: AsExpression<TsVector>>(self, other: T) -> Concat<Self, T::Expression> { Concat::new(self, other.as_expression()) } } pub trait TsQueryExtensions: Expression<SqlType=TsQuery> + Sized { fn matches<T: AsExpression<TsVector>>(self, other: T) -> Matches<Self, T::Expression> { Matches::new(self, other.as_expression()) } fn and<T: AsExpression<TsQuery>>(self, other: T) -> And<Self, T::Expression> { And::new(self, other.as_expression()) } fn or<T: AsExpression<TsQuery>>(self, other: T) -> Or<Self, T::Expression> { Or::new(self, other.as_expression()) } fn contains<T: AsExpression<TsQuery>>(self, other: T) -> Contains<Self, T::Expression> { Contains::new(self, other.as_expression()) } fn contained_by<T: AsExpression<TsQuery>>(self, other: T) -> ContainedBy<Self, T::Expression> { ContainedBy::new(self, other.as_expression()) } } impl<T: Expression<SqlType=TsVector>> TsVectorExtensions for T { } impl<T: Expression<SqlType=TsQuery>> TsQueryExtensions for T { } } pub use self::types::*; pub use self::functions::*; pub use self::dsl::*;