improvement: show most recent PDUs first when searching

next
Timo 2020-08-22 23:09:53 +02:00
parent 366554630a
commit 7ba9263cc6
No known key found for this signature in database
GPG Key ID: 24DA7517711A2BA4
3 changed files with 25 additions and 9 deletions

View File

@ -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 {

View File

@ -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(|_| {

View File

@ -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,12 +75,13 @@ 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();
}
} }
} }