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
//! Database functions for diesel query-builder.

use diesel::{
    define_sql_function,
    expression::AsExpression,
    pg::Pg,
    sql_types::{Array, Float, Nullable, SqlType, Text},
    Expression,
};

define_sql_function! {
    /// The SQL function `array_to_string`.
    ///
    /// Used to convert arrays to strings using a delimiter.
    fn array_to_string(
        array: Nullable<Array<Nullable<Text>>>,
        delimiter: Text
    ) -> Text
}

define_sql_function! {
    /// The `pg_trgm` SQL function `similarity`.
    ///
    /// Used to find how similar two strings are.
    ///
    /// If your column is nullable use [`similarity_nullable()`] instead.
    fn similarity(
        t1: Text,
        t2: Text
    ) -> Float
}

define_sql_function! {
    /// The `pg_trgm` SQL function `similarity`.
    ///
    /// Used to find how similar two strings are.
    ///
    /// If your column is not nullable use [`similarity()`] instead.
    #[sql_name = "similarity"]
    fn similarity_nullable(
        t1: Nullable<Text>,
        t2: Text
    ) -> Float
}

define_sql_function! {
    /// The SQL function `greatest`.
    ///
    /// Used to find the greatest value of the inputs.
    fn greatest(
        t1: Float,
        t2: Float,
        t3: Float,
        t4: Float
    ) -> Float
}

diesel::infix_operator!(PgTrgmFuzzy, " % ", backend: Pg);

/// Implements `pg_trgm` methods for diesel
pub trait PgTrgmExpressionMethods
where
    Self: Expression + Sized,
{
    /// Fuzzy search. Uses the `pg_trgm` `%` operator.
    ///
    /// The `%` operator uses the `pg_trgm` function `similarity` in the background with a default value of `0.3`.
    /// <br>
    /// If you want a different value use `similarity` with `gt/lt` instead.
    fn fuzzy<U>(self, right: U) -> PgTrgmFuzzy<Self, U::Expression>
    where
        Self::SqlType: SqlType,
        U: AsExpression<Self::SqlType>,
    {
        PgTrgmFuzzy::new(self, right.as_expression())
    }
}

impl<T: Expression> PgTrgmExpressionMethods for T {}