elasticsearch_dsl/search/queries/params/
stored_fields.rs

1use serde::Serialize;
2
3use crate::{types::Set, util::ShouldSkip};
4
5/// It’s also possible to store an individual field’s values by using the store mapping option.
6///
7/// <https://www.elastic.co/guide/en/elasticsearch/reference/8.8/search-fields.html#stored-fields>
8#[derive(Debug, Clone, PartialEq, Eq)]
9pub enum StoredFields {
10    /// To disable the stored fields (and metadata fields) entirely use: `_none_`
11    None,
12
13    /// Allows to selectively load specific stored fields for each document represented by a search hit.
14    Fields(Set<String>),
15}
16
17impl Default for StoredFields {
18    fn default() -> Self {
19        Self::Fields(Set::default())
20    }
21}
22
23impl ShouldSkip for StoredFields {
24    fn should_skip(&self) -> bool {
25        match self {
26            Self::None => false,
27            Self::Fields(fields) => fields.should_skip(),
28        }
29    }
30}
31
32impl Serialize for StoredFields {
33    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
34    where
35        S: serde::Serializer,
36    {
37        match self {
38            Self::None => serializer.serialize_str("_none_"),
39            Self::Fields(fields) => fields.serialize(serializer),
40        }
41    }
42}
43
44impl<T> From<T> for StoredFields
45where
46    T: IntoIterator,
47    T::Item: ToString,
48{
49    fn from(value: T) -> Self {
50        let fields = value.into_iter().map(|v| v.to_string()).collect::<Set<_>>();
51
52        if fields.len() == 1 && fields.contains("_none_") {
53            Self::None
54        } else {
55            Self::Fields(fields)
56        }
57    }
58}
59
60#[cfg(test)]
61mod tests {
62    use super::*;
63    use crate::util::assert_serialize;
64
65    #[test]
66    fn serialization() {
67        assert_serialize(StoredFields::None, json!("_none_"));
68        assert_serialize(StoredFields::from(["_none_"]), json!("_none_"));
69        assert_serialize(StoredFields::from(["abc", "def"]), json!(["abc", "def"]));
70    }
71
72    #[test]
73    fn should_skip() {
74        assert!(!StoredFields::None.should_skip());
75        assert!(!StoredFields::from(["abc", "def"]).should_skip());
76        assert!(StoredFields::from(Vec::<String>::new()).should_skip());
77    }
78}