swiftide_core/
query_evaluation.rs

1use crate::querying::{Query, states};
2
3/// Wraps a query for evaluation. Used by the [`crate::query_traits::EvaluateQuery`] trait.
4pub enum QueryEvaluation {
5    /// Retrieve documents
6    RetrieveDocuments(Query<states::Retrieved>),
7    /// Answer the query
8    AnswerQuery(Query<states::Answered>),
9}
10
11impl std::fmt::Debug for QueryEvaluation {
12    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
13        match self {
14            QueryEvaluation::RetrieveDocuments(query) => {
15                write!(f, "RetrieveDocuments({query:?})")
16            }
17            QueryEvaluation::AnswerQuery(query) => write!(f, "AnswerQuery({query:?})"),
18        }
19    }
20}
21
22impl From<Query<states::Retrieved>> for QueryEvaluation {
23    fn from(val: Query<states::Retrieved>) -> Self {
24        QueryEvaluation::RetrieveDocuments(val)
25    }
26}
27
28impl From<Query<states::Answered>> for QueryEvaluation {
29    fn from(val: Query<states::Answered>) -> Self {
30        QueryEvaluation::AnswerQuery(val)
31    }
32}
33
34// TODO: must be a nicer way, maybe not needed and full encapsulation is better anyway
35impl QueryEvaluation {
36    pub fn retrieve_documents_query(self) -> Option<Query<states::Retrieved>> {
37        if let QueryEvaluation::RetrieveDocuments(query) = self {
38            Some(query)
39        } else {
40            None
41        }
42    }
43
44    pub fn answer_query(self) -> Option<Query<states::Answered>> {
45        if let QueryEvaluation::AnswerQuery(query) = self {
46            Some(query)
47        } else {
48            None
49        }
50    }
51}
52
53#[cfg(test)]
54mod tests {
55    use super::*;
56
57    #[test]
58    fn test_from_retrieved() {
59        let query = Query::<states::Retrieved>::new(); // Assuming Query has a new() method
60        let evaluation = QueryEvaluation::from(query.clone());
61
62        match evaluation {
63            QueryEvaluation::RetrieveDocuments(q) => assert_eq!(q, query),
64            QueryEvaluation::AnswerQuery(_) => panic!("Unexpected QueryEvaluation variant"),
65        }
66    }
67
68    #[test]
69    fn test_from_answered() {
70        let query = Query::<states::Answered>::new(); // Assuming Query has a new() method
71        let evaluation = QueryEvaluation::from(query.clone());
72
73        match evaluation {
74            QueryEvaluation::AnswerQuery(q) => assert_eq!(q, query),
75            QueryEvaluation::RetrieveDocuments(_) => panic!("Unexpected QueryEvaluation variant"),
76        }
77    }
78
79    #[test]
80    fn test_retrieve_documents_query() {
81        let query = Query::<states::Retrieved>::new(); // Assuming Query has a new() method
82        let evaluation = QueryEvaluation::RetrieveDocuments(query.clone());
83
84        match evaluation.retrieve_documents_query() {
85            Some(q) => assert_eq!(q, query),
86            None => panic!("Expected a query, got None"),
87        }
88    }
89
90    #[test]
91    fn test_answer_query() {
92        let query = Query::<states::Answered>::new(); // Assuming Query has a new() method
93        let evaluation = QueryEvaluation::AnswerQuery(query.clone());
94
95        match evaluation.answer_query() {
96            Some(q) => assert_eq!(q, query),
97            None => panic!("Expected a query, got None"),
98        }
99    }
100}