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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
use crate::simple::{indexable::Indexable, search_index::SearchIndex};
// -----------------------------------------------------------------------------
impl<K: Clone + Ord> SearchIndex<K> {
// -------------------------------------------------------------------------
//
/// Replaces (or updates) the value for a key-value pair in the search
/// index.
///
/// Note that for the search results to be accurate, it is important to
/// update the search index as the collection is updated. If an element is
/// changed into your collection, it should also be changed in the search
/// index.
///
/// Basic usage:
///
/// ```rust
/// # use indicium::simple::{AutocompleteType, Indexable, SearchIndex, SearchType};
/// # use pretty_assertions::assert_eq;
/// #
/// # struct MyStruct {
/// # title: String,
/// # year: u16,
/// # body: String,
/// # }
/// #
/// # impl Indexable for MyStruct {
/// # fn strings(&self) -> Vec<String> {
/// # vec![
/// # self.title.clone(),
/// # self.year.to_string(),
/// # self.body.clone(),
/// # ]
/// # }
/// # }
/// #
/// # let my_vec = vec![
/// # MyStruct {
/// # title: "Harold Godwinson".to_string(),
/// # year: 1066,
/// # body: "Last crowned Anglo-Saxon king of England.".to_string(),
/// # },
/// # MyStruct {
/// # title: "Edgar Ætheling".to_string(),
/// # year: 1066,
/// # body: "Last male member of the royal house of Cerdic of Wessex.".to_string(),
/// # },
/// # MyStruct {
/// # title: "William the Conqueror".to_string(),
/// # year: 1066,
/// # body: "First Norman monarch of England.".to_string(),
/// # },
/// # MyStruct {
/// # title: "William Rufus".to_string(),
/// # year: 1087,
/// # body: "Third son of William the Conqueror.".to_string(),
/// # },
/// # MyStruct {
/// # title: "Henry Beauclerc".to_string(),
/// # year: 1100,
/// # body: "Fourth son of William the Conqueror.".to_string(),
/// # },
/// # ];
/// #
/// # let mut search_index: SearchIndex<usize> = SearchIndex::default();
/// #
/// # my_vec
/// # .iter()
/// # .enumerate()
/// # .for_each(|(index, element)|
/// # search_index.insert(&index, element)
/// # );
/// #
/// let search_results = search_index.search("last");
/// assert_eq!(search_results, vec![&0, &1]);
///
/// search_index.replace(
/// &0,
/// &MyStruct {
/// title: "Harold Godwinson".to_string(),
/// year: 1066,
/// body: "Last crowned Anglo-Saxon king of England.".to_string(),
/// },
/// &MyStruct {
/// title: "Edward the Confessor".to_string(),
/// year: 1042,
/// body: "One of the last Anglo-Saxon kings of England.".to_string(),
/// },
/// );
///
/// let search_results = search_index.search("1042");
/// assert_eq!(search_results, vec![&0]);
/// ```
#[tracing::instrument(
level = "trace",
name = "search index replace",
skip(self, key, before, after)
)]
pub fn replace(&mut self, key: &K, before: &dyn Indexable, after: &dyn Indexable) {
// Remove all references to the old record and its keywords:
self.remove(key, before);
// Index the updated record:
self.insert(key, after);
} // fn
} // impl