atagen

macltok

public
Star0
Watch0
419c65426a62191a26b47d07a0e0661e047317da
3
ssh://brewery@pls.lobotomise.me:33/atagen/macltok.git

Blame: src/search_model.rs

c9effeac326aatagen2026-10-25 10:32 UTC1
use ruma::{OwnedEventId, OwnedRoomId};
c9effeac326aatagen2026-10-25 10:32 UTC2
#[cfg(feature = "serde")]
c9effeac326aatagen2026-10-25 10:32 UTC3
use serde::{Deserialize, Serialize};
c9effeac326aatagen2026-10-25 10:32 UTC4
c9effeac326aatagen2026-10-25 10:32 UTC5
use crate::TimelineEvent;
c9effeac326aatagen2026-10-25 10:32 UTC6
c9effeac326aatagen2026-10-25 10:32 UTC7
#[derive(Clone, Debug, Eq, PartialEq)]
c9effeac326aatagen2026-10-25 10:32 UTC8
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
c9effeac326aatagen2026-10-25 10:32 UTC9
#[non_exhaustive]
c9effeac326aatagen2026-10-25 10:32 UTC10
pub enum SearchScope {
c9effeac326aatagen2026-10-25 10:32 UTC11
    Room(OwnedRoomId),
c9effeac326aatagen2026-10-25 10:32 UTC12
    /// a space's rooms, resolved by the host
c9effeac326aatagen2026-10-25 10:32 UTC13
    Rooms(Vec<OwnedRoomId>),
c9effeac326aatagen2026-10-25 10:32 UTC14
    /// every joined room
c9effeac326aatagen2026-10-25 10:32 UTC15
    All,
c9effeac326aatagen2026-10-25 10:32 UTC16
}
c9effeac326aatagen2026-10-25 10:32 UTC17
c9effeac326aatagen2026-10-25 10:32 UTC18
#[derive(Clone, Debug, Eq, PartialEq)]
c9effeac326aatagen2026-10-25 10:32 UTC19
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
c9effeac326aatagen2026-10-25 10:32 UTC20
#[non_exhaustive]
c9effeac326aatagen2026-10-25 10:32 UTC21
pub enum SearchCommand {
c9effeac326aatagen2026-10-25 10:32 UTC22
    /// opens a search that owns the media of every hit it hands out. at most 8 stay open,
c9effeac326aatagen2026-10-25 10:32 UTC23
    /// opening another closes the oldest. words must all match, `"quoted phrases"` match
c9effeac326aatagen2026-10-25 10:32 UTC24
    /// in order and `-word` excludes, newest first
c9effeac326aatagen2026-10-25 10:32 UTC25
    Search {
c9effeac326aatagen2026-10-25 10:32 UTC26
        query: String,
c9effeac326aatagen2026-10-25 10:32 UTC27
        scope: SearchScope,
c9effeac326aatagen2026-10-25 10:32 UTC28
        limit: u16,
c9effeac326aatagen2026-10-25 10:32 UTC29
    },
c9effeac326aatagen2026-10-25 10:32 UTC30
    /// `cursor` is the previous page's `next_cursor`
c9effeac326aatagen2026-10-25 10:32 UTC31
    More {
c9effeac326aatagen2026-10-25 10:32 UTC32
        search_id: String,
c9effeac326aatagen2026-10-25 10:32 UTC33
        cursor: String,
c9effeac326aatagen2026-10-25 10:32 UTC34
        limit: u16,
c9effeac326aatagen2026-10-25 10:32 UTC35
    },
c9effeac326aatagen2026-10-25 10:32 UTC36
    /// frees the search's media. its hits' media ids stop resolving
74befbc72bafatagen2026-10-25 11:18 UTC37
    Close {
74befbc72bafatagen2026-10-25 11:18 UTC38
        search_id: String,
74befbc72bafatagen2026-10-25 11:18 UTC39
    },
c9effeac326aatagen2026-10-25 10:32 UTC40
    Coverage(SearchScope),
c9effeac326aatagen2026-10-25 10:32 UTC41
}
c9effeac326aatagen2026-10-25 10:32 UTC42
c9effeac326aatagen2026-10-25 10:32 UTC43
/// a search's media stay resolvable until it closes, and past `EngineConfig::max_context_media`
c9effeac326aatagen2026-10-25 10:32 UTC44
/// its least recently used are dropped
c9effeac326aatagen2026-10-25 10:32 UTC45
#[derive(Clone, Debug, Eq, PartialEq)]
c9effeac326aatagen2026-10-25 10:32 UTC46
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
c9effeac326aatagen2026-10-25 10:32 UTC47
pub struct SearchSession {
c9effeac326aatagen2026-10-25 10:32 UTC48
    pub search_id: String,
c9effeac326aatagen2026-10-25 10:32 UTC49
    pub page: SearchPage,
c9effeac326aatagen2026-10-25 10:32 UTC50
}
c9effeac326aatagen2026-10-25 10:32 UTC51
74befbc72bafatagen2026-10-25 11:18 UTC52
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
74befbc72bafatagen2026-10-25 11:18 UTC53
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
74befbc72bafatagen2026-10-25 11:18 UTC54
pub enum SearchCloseReason {
74befbc72bafatagen2026-10-25 11:18 UTC55
    /// opening a ninth search closed the oldest
74befbc72bafatagen2026-10-25 11:18 UTC56
    Evicted,
74befbc72bafatagen2026-10-25 11:18 UTC57
}
74befbc72bafatagen2026-10-25 11:18 UTC58
c9effeac326aatagen2026-10-25 10:32 UTC59
#[derive(Clone, Debug, Eq, PartialEq)]
c9effeac326aatagen2026-10-25 10:32 UTC60
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
c9effeac326aatagen2026-10-25 10:32 UTC61
pub struct SearchPage {
c9effeac326aatagen2026-10-25 10:32 UTC62
    pub hits: Vec<SearchHit>,
c9effeac326aatagen2026-10-25 10:32 UTC63
    /// `None` once there's nothing older that matches
c9effeac326aatagen2026-10-25 10:32 UTC64
    pub next_cursor: Option<String>,
c9effeac326aatagen2026-10-25 10:32 UTC65
    pub coverage: SearchCoverage,
c9effeac326aatagen2026-10-25 10:32 UTC66
}
c9effeac326aatagen2026-10-25 10:32 UTC67
c9effeac326aatagen2026-10-25 10:32 UTC68
#[derive(Clone, Debug, Eq, PartialEq)]
c9effeac326aatagen2026-10-25 10:32 UTC69
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
c9effeac326aatagen2026-10-25 10:32 UTC70
pub struct SearchHit {
c9effeac326aatagen2026-10-25 10:32 UTC71
    pub room_id: OwnedRoomId,
c9effeac326aatagen2026-10-25 10:32 UTC72
    pub event_id: OwnedEventId,
c9effeac326aatagen2026-10-25 10:32 UTC73
    pub timestamp_ms: u64,
c9effeac326aatagen2026-10-25 10:32 UTC74
    /// as event context shows it, with the latest edit applied
c9effeac326aatagen2026-10-25 10:32 UTC75
    pub event: TimelineEvent,
c9effeac326aatagen2026-10-25 10:32 UTC76
    /// utf-8 byte ranges of matched words in the content's text, the message body, a
c9effeac326aatagen2026-10-25 10:32 UTC77
    /// sticker's body or a poll's question
c9effeac326aatagen2026-10-25 10:32 UTC78
    pub matches: Vec<SearchMatch>,
c9effeac326aatagen2026-10-25 10:32 UTC79
}
c9effeac326aatagen2026-10-25 10:32 UTC80
c9effeac326aatagen2026-10-25 10:32 UTC81
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
c9effeac326aatagen2026-10-25 10:32 UTC82
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
c9effeac326aatagen2026-10-25 10:32 UTC83
pub struct SearchMatch {
c9effeac326aatagen2026-10-25 10:32 UTC84
    pub start: u32,
c9effeac326aatagen2026-10-25 10:32 UTC85
    pub end: u32,
c9effeac326aatagen2026-10-25 10:32 UTC86
}
c9effeac326aatagen2026-10-25 10:32 UTC87
c9effeac326aatagen2026-10-25 10:32 UTC88
#[derive(Clone, Debug, Eq, PartialEq)]
c9effeac326aatagen2026-10-25 10:32 UTC89
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
c9effeac326aatagen2026-10-25 10:32 UTC90
pub struct SearchCoverage {
c9effeac326aatagen2026-10-25 10:32 UTC91
    pub rooms: Vec<RoomSearchCoverage>,
c9effeac326aatagen2026-10-25 10:32 UTC92
    /// false when the index lives in memory and starts over with the next engine
c9effeac326aatagen2026-10-25 10:32 UTC93
    pub persistent: bool,
74befbc72bafatagen2026-10-25 11:18 UTC94
    /// why it lives in memory, `None` exactly when `persistent`
74befbc72bafatagen2026-10-25 11:18 UTC95
    pub in_memory: Option<SearchInMemory>,
74befbc72bafatagen2026-10-25 11:18 UTC96
    /// messages in scope that couldn't be decrypted yet, so can't be found yet
c9effeac326aatagen2026-10-25 10:32 UTC97
    pub undecrypted: usize,
c9effeac326aatagen2026-10-25 10:32 UTC98
}
c9effeac326aatagen2026-10-25 10:32 UTC99
74befbc72bafatagen2026-10-25 11:18 UTC100
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
74befbc72bafatagen2026-10-25 11:18 UTC101
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
74befbc72bafatagen2026-10-25 11:18 UTC102
pub enum SearchInMemory {
74befbc72bafatagen2026-10-25 11:18 UTC103
    /// the engine was built without a store, `Engine::from_client` or no store feature
74befbc72bafatagen2026-10-25 11:18 UTC104
    NoStore,
74befbc72bafatagen2026-10-25 11:18 UTC105
    OpenFailed,
74befbc72bafatagen2026-10-25 11:18 UTC106
    ReadFailed,
74befbc72bafatagen2026-10-25 11:18 UTC107
    /// five commits in a row failed, so this engine stopped trying
74befbc72bafatagen2026-10-25 11:18 UTC108
    CommitFailed,
74befbc72bafatagen2026-10-25 11:18 UTC109
}
74befbc72bafatagen2026-10-25 11:18 UTC110
c9effeac326aatagen2026-10-25 10:32 UTC111
#[derive(Clone, Debug, Eq, PartialEq)]
c9effeac326aatagen2026-10-25 10:32 UTC112
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
c9effeac326aatagen2026-10-25 10:32 UTC113
pub struct RoomSearchCoverage {
c9effeac326aatagen2026-10-25 10:32 UTC114
    pub room_id: OwnedRoomId,
c9effeac326aatagen2026-10-25 10:32 UTC115
    pub oldest_indexed_ms: Option<u64>,
c9effeac326aatagen2026-10-25 10:32 UTC116
    pub newest_indexed_ms: Option<u64>,
c9effeac326aatagen2026-10-25 10:32 UTC117
    /// backfill walked back to the oldest event the server would hand over
c9effeac326aatagen2026-10-25 10:32 UTC118
    pub start_reached: bool,
c9effeac326aatagen2026-10-25 10:32 UTC119
    pub backfill: SearchBackfill,
c9effeac326aatagen2026-10-25 10:32 UTC120
}
c9effeac326aatagen2026-10-25 10:32 UTC121
c9effeac326aatagen2026-10-25 10:32 UTC122
#[derive(Clone, Debug, Eq, PartialEq)]
c9effeac326aatagen2026-10-25 10:32 UTC123
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
c9effeac326aatagen2026-10-25 10:32 UTC124
pub enum SearchBackfill {
c9effeac326aatagen2026-10-25 10:32 UTC125
    Waiting,
c9effeac326aatagen2026-10-25 10:32 UTC126
    Running,
c9effeac326aatagen2026-10-25 10:32 UTC127
    /// this engine's page budget for the room is spent, the next one carries on
c9effeac326aatagen2026-10-25 10:32 UTC128
    Paused,
c9effeac326aatagen2026-10-25 10:32 UTC129
    Complete,
c9effeac326aatagen2026-10-25 10:32 UTC130
    Disabled,
c9effeac326aatagen2026-10-25 10:32 UTC131
    Failed {
c9effeac326aatagen2026-10-25 10:32 UTC132
        message: String,
c9effeac326aatagen2026-10-25 10:32 UTC133
        retry_at_ms: u64,
c9effeac326aatagen2026-10-25 10:32 UTC134
    },
c9effeac326aatagen2026-10-25 10:32 UTC135
}