improvement: show most recent PDUs first when searching
This commit is contained in:
		
							parent
							
								
									366554630a
								
							
						
					
					
						commit
						7ba9263cc6
					
				
					 3 changed files with 25 additions and 9 deletions
				
			
		|  | @ -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(|_| { | ||||||
|  |  | ||||||
							
								
								
									
										16
									
								
								src/utils.rs
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								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,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(); | ||||||
|  |                         } | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue