Skip to content

Commit 985a8ac

Browse files
author
dragonfly1033
committed
fixup! fixup! fixup! test(sdk): Add integration test for search
1 parent 3e80b03 commit 985a8ac

File tree

7 files changed

+84
-83
lines changed

7 files changed

+84
-83
lines changed

crates/matrix-sdk-search/src/index.rs

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,11 @@ use crate::{
4444
writer::SearchIndexWriter,
4545
};
4646

47+
/// A struct to represent the operations on a [`RoomIndex`]
48+
pub(crate) enum RoomIndexOperation {
49+
Add(TantivyDocument),
50+
}
51+
4752
/// A struct that holds all data pertaining to a particular room's
4853
/// message index.
4954
pub struct RoomIndex {
@@ -130,10 +135,11 @@ impl RoomIndex {
130135
RoomIndex::new_with(index, schema, room_id)
131136
}
132137

133-
/// Add [`AnyMessageLikeEvent`] to [`RoomIndex`]
134-
pub fn add_event(&mut self, event: AnyMessageLikeEvent) -> Result<(), IndexError> {
135-
let doc = self.schema.make_doc(event)?;
136-
self.writer.add_document(doc)?; // TODO: This is blocking. Handle it.
138+
/// Handle [`AnyMessageLikeEvent`]
139+
pub fn handle_event(&mut self, event: AnyMessageLikeEvent) -> Result<(), IndexError> {
140+
match self.schema.handle_event(event)? {
141+
RoomIndexOperation::Add(document) => self.writer.add_document(document)?,
142+
};
137143
Ok(())
138144
}
139145

@@ -206,7 +212,7 @@ mod tests {
206212
}
207213

208214
#[test]
209-
fn test_add_event() {
215+
fn test_handle_event() {
210216
let room_id = room_id!("!room_id:localhost");
211217
let mut index =
212218
RoomIndex::new_in_ram(room_id).expect("failed to make index in ram: {index:?}");
@@ -218,7 +224,7 @@ mod tests {
218224
.sender(user_id!("@user_id:localhost"))
219225
.into_any_message_like_event();
220226

221-
index.add_event(event).expect("failed to add event: {res:?}");
227+
index.handle_event(event).expect("failed to add event: {res:?}");
222228
}
223229

224230
#[test]
@@ -231,7 +237,7 @@ mod tests {
231237
let event_id_2 = event_id!("$event_id_2:localhost");
232238
let event_id_3 = event_id!("$event_id_3:localhost");
233239

234-
index.add_event(
240+
index.handle_event(
235241
EventFactory::new()
236242
.text_msg("This is a sentence")
237243
.event_id(event_id_1)
@@ -240,7 +246,7 @@ mod tests {
240246
.into_any_message_like_event(),
241247
)?;
242248

243-
index.add_event(
249+
index.handle_event(
244250
EventFactory::new()
245251
.text_msg("All new words")
246252
.event_id(event_id_2)
@@ -249,7 +255,7 @@ mod tests {
249255
.into_any_message_like_event(),
250256
)?;
251257

252-
index.add_event(
258+
index.handle_event(
253259
EventFactory::new()
254260
.text_msg("A similar sentence")
255261
.event_id(event_id_3)

crates/matrix-sdk-search/src/schema.rs

Lines changed: 39 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -25,26 +25,26 @@
2525
//! See the [github issue](https://github.com/matrix-org/matrix-rust-sdk/issues/3058) for more
2626
//! details about the historical reasons that led us to start writing this.
2727
28-
use ruma::{
29-
MilliSecondsSinceUnixEpoch, OwnedEventId, OwnedUserId,
30-
events::{
31-
AnyMessageLikeEvent, MessageLikeEvent, MessageLikeEventContent, RedactContent,
32-
RedactedMessageLikeEventContent, room::message::MessageType,
33-
},
28+
use ruma::events::{
29+
AnyMessageLikeEvent, MessageLikeEvent, MessageLikeEventContent, RedactContent,
30+
RedactedMessageLikeEventContent, room::message::MessageType,
3431
};
3532
use tantivy::{
3633
DateTime, TantivyDocument, doc,
3734
schema::{DateOptions, DateTimePrecision, Field, INDEXED, STORED, STRING, Schema, TEXT},
3835
};
3936

40-
use crate::error::{IndexError, IndexSchemaError};
37+
use crate::{
38+
error::{IndexError, IndexSchemaError},
39+
index::RoomIndexOperation,
40+
};
4141

4242
pub(crate) trait MatrixSearchIndexSchema {
4343
fn new() -> Self;
4444
fn default_search_fields(&self) -> Vec<Field>;
4545
fn primary_key(&self) -> Field;
4646
fn as_tantivy_schema(&self) -> Schema;
47-
fn make_doc(&self, event: AnyMessageLikeEvent) -> Result<TantivyDocument, IndexError>;
47+
fn handle_event(&self, event: AnyMessageLikeEvent) -> Result<RoomIndexOperation, IndexError>;
4848
}
4949

5050
#[derive(Debug, Clone)]
@@ -58,48 +58,30 @@ pub(crate) struct RoomMessageSchema {
5858
}
5959

6060
impl RoomMessageSchema {
61-
fn parse_event<C: MessageLikeEventContent + RedactContent, F>(
61+
/// Given an [`AnyMessageLikeEvent`] and a function to convert the content
62+
/// into a String to be indexed, return a [`TantivyDocument`] to index.
63+
fn make_doc<C: MessageLikeEventContent + RedactContent, F>(
6264
&self,
6365
event: MessageLikeEvent<C>,
64-
get_body: F,
65-
) -> Result<(OwnedEventId, String, MilliSecondsSinceUnixEpoch, OwnedUserId), IndexError>
66+
get_body_from_content: F,
67+
) -> Result<TantivyDocument, IndexError>
6668
where
6769
<C as RedactContent>::Redacted: RedactedMessageLikeEventContent,
6870
F: FnOnce(&C) -> Result<String, IndexError>,
6971
{
7072
let unredacted = event.as_original().ok_or(IndexError::CannotIndexRedactedMessage)?;
7173

72-
let body = get_body(&unredacted.content)?;
74+
let body = get_body_from_content(&unredacted.content)?;
7375

74-
Ok((
75-
unredacted.event_id.clone(),
76-
body,
77-
unredacted.origin_server_ts,
78-
unredacted.sender.clone(),
76+
Ok(doc!(
77+
self.event_id_field => unredacted.event_id.to_string(),
78+
self.body_field => body,
79+
self.date_field =>
80+
DateTime::from_timestamp_millis(
81+
unredacted.origin_server_ts.get().into()),
82+
self.sender_field => unredacted.sender.to_string(),
7983
))
8084
}
81-
82-
fn parse_any_event(
83-
&self,
84-
event: AnyMessageLikeEvent,
85-
) -> Result<(OwnedEventId, String, MilliSecondsSinceUnixEpoch, OwnedUserId), IndexError> {
86-
match event {
87-
// old m.room.message behaviour
88-
AnyMessageLikeEvent::RoomMessage(event) => {
89-
self.parse_event(event, |content| match &content.msgtype {
90-
MessageType::Text(content) => Ok(content.body.clone()),
91-
_ => Err(IndexError::MessageTypeNotSupported),
92-
})
93-
}
94-
95-
// new m.message behaviour
96-
AnyMessageLikeEvent::Message(event) => self.parse_event(event, |content| {
97-
content.text.find_plain().ok_or(IndexError::EmptyMessage).map(|v| v.to_owned())
98-
}),
99-
100-
_ => Err(IndexError::MessageTypeNotSupported),
101-
}
102-
}
10385
}
10486

10587
impl MatrixSearchIndexSchema for RoomMessageSchema {
@@ -140,17 +122,25 @@ impl MatrixSearchIndexSchema for RoomMessageSchema {
140122
self.inner.clone()
141123
}
142124

143-
fn make_doc(&self, event: AnyMessageLikeEvent) -> Result<TantivyDocument, IndexError> {
144-
let (event_id, body, timestamp, sender) = self.parse_any_event(event)?;
125+
fn handle_event(&self, event: AnyMessageLikeEvent) -> Result<RoomIndexOperation, IndexError> {
126+
match event {
127+
// old m.room.message behaviour
128+
AnyMessageLikeEvent::RoomMessage(event) => self
129+
.make_doc(event, |content| match &content.msgtype {
130+
MessageType::Text(content) => Ok(content.body.clone()),
131+
_ => Err(IndexError::MessageTypeNotSupported),
132+
})
133+
.map(RoomIndexOperation::Add),
145134

146-
Ok(doc!(
147-
self.event_id_field => event_id.to_string(),
148-
self.body_field => body,
149-
self.date_field =>
150-
DateTime::from_timestamp_millis(
151-
timestamp.get().into()),
152-
self.sender_field => sender.to_string(),
153-
))
135+
// new m.message behaviour
136+
AnyMessageLikeEvent::Message(event) => self
137+
.make_doc(event, |content| {
138+
content.text.find_plain().ok_or(IndexError::EmptyMessage).map(|v| v.to_owned())
139+
})
140+
.map(RoomIndexOperation::Add),
141+
142+
_ => Err(IndexError::MessageTypeNotSupported),
143+
}
154144
}
155145
}
156146

crates/matrix-sdk/src/client/builder/mod.rs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -503,8 +503,8 @@ impl ClientBuilder {
503503

504504
/// The base directory in which each room's index directory will be stored.
505505
#[cfg(feature = "experimental-search")]
506-
pub fn index_base_directory(mut self, path: SearchIndexStoreKind) -> Self {
507-
self.search_index_store_kind = path;
506+
pub fn search_index_store(mut self, kind: SearchIndexStoreKind) -> Self {
507+
self.search_index_store_kind = kind;
508508
self
509509
}
510510

@@ -610,10 +610,8 @@ impl ClientBuilder {
610610
let latest_events = OnceCell::new();
611611

612612
#[cfg(feature = "experimental-search")]
613-
let room_indexes = Arc::new(Mutex::new(HashMap::new()));
614-
615-
#[cfg(feature = "experimental-search")]
616-
let search_index = SearchIndex::new(room_indexes, self.search_index_store_kind);
613+
let search_index =
614+
SearchIndex::new(Arc::new(Mutex::new(HashMap::new())), self.search_index_store_kind);
617615

618616
let inner = ClientInner::new(
619617
auth_ctx,

crates/matrix-sdk/src/client/search.rs

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright 2024 The Matrix.org Foundation C.I.C.
1+
// Copyright 2025 The Matrix.org Foundation C.I.C.
22
//
33
// Licensed under the Apache License, Version 2.0 (the "License");
44
// you may not use this file except in compliance with the License.
@@ -30,7 +30,7 @@ use std::{collections::hash_map::HashMap, path::PathBuf, sync::Arc};
3030
use matrix_sdk_search::{error::IndexError, index::RoomIndex};
3131
use ruma::{events::AnyMessageLikeEvent, OwnedEventId, OwnedRoomId, RoomId};
3232
use tokio::sync::{Mutex, MutexGuard};
33-
use tracing::{debug, error, warn};
33+
use tracing::{debug, error};
3434

3535
/// Type of location to store [`RoomIndex`]
3636
#[derive(Clone, Debug)]
@@ -85,8 +85,9 @@ impl SearchIndexGuard<'_> {
8585
Ok(index)
8686
}
8787

88-
/// Add [`AnyMessageLikeEvent`] to [`RoomIndex`] of given [`RoomId`]
89-
pub(crate) fn index_event(
88+
/// Handle an [`AnyMessageLikeEvent`] in the [`RoomIndex`] of a given
89+
/// [`RoomId`]
90+
pub(crate) fn handle_event(
9091
&mut self,
9192
event: AnyMessageLikeEvent,
9293
room_id: &RoomId,
@@ -97,7 +98,7 @@ impl SearchIndexGuard<'_> {
9798
}
9899

99100
let index = self.index_map.get_mut(room_id).expect("index should exist");
100-
let result = index.add_event(event);
101+
let result = index.handle_event(event);
101102

102103
match result {
103104
Ok(_) => {}
@@ -107,7 +108,7 @@ impl SearchIndexGuard<'_> {
107108
debug!("failed to parse event for indexing: {result:?}")
108109
}
109110
Err(IndexError::TantivyError(err)) => {
110-
error!("failed to add/commit event to index: {err:?}")
111+
error!("failed to handle event in index: {err:?}")
111112
}
112113
Err(_) => error!("unexpected error during indexing: {result:?}"),
113114
}
@@ -130,7 +131,7 @@ impl SearchIndexGuard<'_> {
130131
})
131132
.ok()
132133
} else {
133-
warn!("Tried to search in a room with no index");
134+
debug!("Tried to search in a room with no index");
134135
None
135136
}
136137
}

crates/matrix-sdk/src/event_cache/room/mod.rs

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -542,14 +542,20 @@ impl RoomEventCacheInner {
542542
// Add all the events to the backend.
543543
trace!("adding new events");
544544

545+
#[cfg(feature = "experimental-search")]
546+
let Some(room) = self.weak_room.get() else {
547+
warn!("Couldn't get room while handling timeline");
548+
return Err(EventCacheError::RoomNotFound { room_id: self.room_id.clone() });
549+
};
550+
545551
let (stored_prev_batch_token, timeline_event_diffs) = self
546552
.state
547553
.write()
548554
.await
549555
.handle_sync(
550556
timeline,
551557
#[cfg(feature = "experimental-search")]
552-
&self.weak_room.get().expect("Should be able to get room"),
558+
&room,
553559
)
554560
.await?;
555561

@@ -1466,10 +1472,7 @@ mod private {
14661472
};
14671473

14681474
match maybe_try_event {
1469-
Some(Ok(event)) => match event {
1470-
// TODO: Handle room redaction.
1471-
AnyMessageLikeEvent::RoomRedaction(_) | _ => Some(event),
1472-
},
1475+
Some(Ok(event)) => Some(event),
14731476
Some(Err(e)) => {
14741477
warn!("failed to index event: {e:?}");
14751478
None
@@ -1479,13 +1482,13 @@ mod private {
14791482
}
14801483

14811484
#[cfg(feature = "experimental-search")]
1482-
async fn index_timeline_event(
1485+
async fn index_handle_timeline_event(
14831486
&self,
14841487
event: &TimelineEvent,
14851488
room: &Room,
14861489
) -> Result<(), EventCacheError> {
14871490
if let Some(message_event) = self.parse_timeline_event(event) {
1488-
room.index_event(message_event).await.map_err(EventCacheError::from)
1491+
room.index_handle_event(message_event).await.map_err(EventCacheError::from)
14891492
} else {
14901493
Ok(())
14911494
}
@@ -1511,7 +1514,7 @@ mod private {
15111514

15121515
// We can also add the event to the index.
15131516
#[cfg(feature = "experimental-search")]
1514-
if let Err(err) = self.index_timeline_event(&event, room).await {
1517+
if let Err(err) = self.index_handle_timeline_event(&event, room).await {
15151518
warn!("error while trying to index event: {err:?}");
15161519
}
15171520

crates/matrix-sdk/src/room/mod.rs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3678,10 +3678,13 @@ impl Room {
36783678
opts.send(self, event_id).await
36793679
}
36803680

3681-
/// Add an [`AnyMessageLikeEvent`] to this room's [`RoomIndex`]
3681+
/// Handle an [`AnyMessageLikeEvent`] in this room's [`RoomIndex`]
36823682
#[cfg(feature = "experimental-search")]
3683-
pub(crate) async fn index_event(&self, event: AnyMessageLikeEvent) -> Result<(), IndexError> {
3684-
self.client.search_index().lock().await.index_event(event, self.room_id())
3683+
pub(crate) async fn index_handle_event(
3684+
&self,
3685+
event: AnyMessageLikeEvent,
3686+
) -> Result<(), IndexError> {
3687+
self.client.search_index().lock().await.handle_event(event, self.room_id())
36853688
}
36863689

36873690
/// Search this room's [`RoomIndex`] for query and return at most

crates/matrix-sdk/tests/integration/room/joined.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -768,7 +768,7 @@ async fn test_sending_message_indexes_message() {
768768

769769
let response = room.search_index("this", 5).await.expect("search should have 1 result");
770770

771-
assert!(!response.is_empty(), "no results found {response:?}");
771+
assert_eq!(response.len(), 1, "unexpected numbers of responses: {response:?}");
772772
assert_eq!(response[0], event_id, "event id doesn't match: {response:?}");
773773
}
774774

0 commit comments

Comments
 (0)