improvement: show most recent PDUs first when searching
parent
366554630a
commit
7ba9263cc6
|
@ -145,7 +145,10 @@ pub fn register_route(
|
||||||
}
|
}
|
||||||
|
|
||||||
if missing_username {
|
if missing_username {
|
||||||
return Err(Error::BadRequest(ErrorKind::MissingParam, "Missing username field."));
|
return Err(Error::BadRequest(
|
||||||
|
ErrorKind::MissingParam,
|
||||||
|
"Missing username field.",
|
||||||
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
let password = if is_guest {
|
let password = if is_guest {
|
||||||
|
|
|
@ -965,6 +965,7 @@ impl Rooms {
|
||||||
self.tokenids
|
self.tokenids
|
||||||
.scan_prefix(&prefix2)
|
.scan_prefix(&prefix2)
|
||||||
.keys()
|
.keys()
|
||||||
|
.rev() // Newest pdus first
|
||||||
.filter_map(|r| r.ok())
|
.filter_map(|r| r.ok())
|
||||||
.map(|key| {
|
.map(|key| {
|
||||||
let pduid_index = key
|
let pduid_index = key
|
||||||
|
@ -983,7 +984,14 @@ impl Rooms {
|
||||||
.filter_map(|r| r.ok())
|
.filter_map(|r| r.ok())
|
||||||
});
|
});
|
||||||
|
|
||||||
Ok((utils::common_elements(iterators).unwrap(), words))
|
Ok((
|
||||||
|
utils::common_elements(iterators, |a, b| {
|
||||||
|
// We compare b with a because we reversed the iterator earlier
|
||||||
|
b.cmp(a)
|
||||||
|
})
|
||||||
|
.unwrap(),
|
||||||
|
words,
|
||||||
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_shared_rooms<'a>(
|
pub fn get_shared_rooms<'a>(
|
||||||
|
@ -1015,7 +1023,8 @@ impl Rooms {
|
||||||
.filter_map(|r| r.ok())
|
.filter_map(|r| r.ok())
|
||||||
});
|
});
|
||||||
|
|
||||||
utils::common_elements(iterators)
|
// We use the default compare function because keys are sorted correctly (not reversed)
|
||||||
|
utils::common_elements(iterators, Ord::cmp)
|
||||||
.expect("users is not empty")
|
.expect("users is not empty")
|
||||||
.map(|bytes| {
|
.map(|bytes| {
|
||||||
RoomId::try_from(utils::string_from_bytes(&*bytes).map_err(|_| {
|
RoomId::try_from(utils::string_from_bytes(&*bytes).map_err(|_| {
|
||||||
|
|
14
src/utils.rs
14
src/utils.rs
|
@ -1,7 +1,9 @@
|
||||||
use argon2::{Config, Variant};
|
use argon2::{Config, Variant};
|
||||||
|
use cmp::Ordering;
|
||||||
use rand::prelude::*;
|
use rand::prelude::*;
|
||||||
use sled::IVec;
|
use sled::IVec;
|
||||||
use std::{
|
use std::{
|
||||||
|
cmp,
|
||||||
convert::TryInto,
|
convert::TryInto,
|
||||||
time::{SystemTime, UNIX_EPOCH},
|
time::{SystemTime, UNIX_EPOCH},
|
||||||
};
|
};
|
||||||
|
@ -63,6 +65,7 @@ pub fn calculate_hash(password: &str) -> Result<String, argon2::Error> {
|
||||||
|
|
||||||
pub fn common_elements(
|
pub fn common_elements(
|
||||||
mut iterators: impl Iterator<Item = impl Iterator<Item = IVec>>,
|
mut iterators: impl Iterator<Item = impl Iterator<Item = IVec>>,
|
||||||
|
check_order: impl Fn(&IVec, &IVec) -> Ordering,
|
||||||
) -> Option<impl Iterator<Item = IVec>> {
|
) -> Option<impl Iterator<Item = IVec>> {
|
||||||
let first_iterator = iterators.next()?;
|
let first_iterator = iterators.next()?;
|
||||||
let mut other_iterators = iterators.map(|i| i.peekable()).collect::<Vec<_>>();
|
let mut other_iterators = iterators.map(|i| i.peekable()).collect::<Vec<_>>();
|
||||||
|
@ -72,14 +75,15 @@ pub fn common_elements(
|
||||||
.iter_mut()
|
.iter_mut()
|
||||||
.map(|it| {
|
.map(|it| {
|
||||||
while let Some(element) = it.peek() {
|
while let Some(element) = it.peek() {
|
||||||
if element > target {
|
match check_order(element, target) {
|
||||||
return false;
|
Ordering::Greater => return false, // We went too far
|
||||||
} else if element == target {
|
Ordering::Equal => return true, // Element is in both iters
|
||||||
return true;
|
Ordering::Less => {
|
||||||
} else {
|
// Keep searching
|
||||||
it.next();
|
it.next();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
false
|
false
|
||||||
})
|
})
|
||||||
|
|
Loading…
Reference in New Issue