rjango_contrib_postgres/
search.rs1use 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}