Skip to main content

rjango_contrib_postgres/
search.rs

1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
4pub struct SearchVector {
5    pub fields: Vec<String>,
6    pub config: Option<String>,
7    pub weight: Option<char>,
8}
9
10#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)]
11pub struct SearchQuery {
12    pub value: String,
13    pub config: Option<String>,
14    pub search_type: SearchType,
15}
16
17#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)]
18pub enum SearchType {
19    #[default]
20    Plain,
21    Phrase,
22    Raw,
23    Websearch,
24}
25
26#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
27pub struct SearchRank {
28    pub vector: String,
29    pub query: String,
30}
31
32#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
33pub struct TrigramSimilarity {
34    pub expression: String,
35    pub comparison: String,
36}
37
38#[cfg(test)]
39mod tests {
40    use super::{SearchQuery, SearchRank, SearchType, SearchVector, TrigramSimilarity};
41
42    #[test]
43    fn search_vector_construction_preserves_fields() {
44        let vector = SearchVector {
45            fields: vec!["title".to_string(), "body".to_string()],
46            config: Some("english".to_string()),
47            weight: Some('A'),
48        };
49
50        assert_eq!(vector.fields, ["title", "body"]);
51        assert_eq!(vector.config.as_deref(), Some("english"));
52        assert_eq!(vector.weight, Some('A'));
53    }
54
55    #[test]
56    fn search_query_construction_preserves_search_type() {
57        let query = SearchQuery {
58            value: "postgres".to_string(),
59            config: Some("simple".to_string()),
60            search_type: SearchType::Websearch,
61        };
62
63        assert_eq!(query.value, "postgres");
64        assert_eq!(query.config.as_deref(), Some("simple"));
65        assert_eq!(query.search_type, SearchType::Websearch);
66    }
67
68    #[test]
69    fn search_query_default_is_plain_and_empty() {
70        let query = SearchQuery::default();
71
72        assert!(query.value.is_empty());
73        assert_eq!(query.config, None);
74        assert_eq!(query.search_type, SearchType::Plain);
75    }
76
77    #[test]
78    fn search_type_default_is_plain() {
79        assert_eq!(SearchType::default(), SearchType::Plain);
80    }
81
82    #[test]
83    fn search_rank_construction_preserves_inputs() {
84        let rank = SearchRank {
85            vector: "search_vector".to_string(),
86            query: "search_query".to_string(),
87        };
88
89        assert_eq!(rank.vector, "search_vector");
90        assert_eq!(rank.query, "search_query");
91    }
92
93    #[test]
94    fn trigram_similarity_construction_preserves_inputs() {
95        let similarity = TrigramSimilarity {
96            expression: "title".to_string(),
97            comparison: "postgresql".to_string(),
98        };
99
100        assert_eq!(similarity.expression, "title");
101        assert_eq!(similarity.comparison, "postgresql");
102    }
103}