diff --git a/sql/search_for_user.sql b/sql/search_for_user.sql index 433831a..0e3167e 100644 --- a/sql/search_for_user.sql +++ b/sql/search_for_user.sql @@ -1,9 +1,10 @@ SELECT - user_id, username, email -FROM - users -ORDER BY + user_id, username, email, GREATEST ( similarity (email, $1), similarity (username, $1) - ) DESC \ No newline at end of file + ) as "similarity!" +FROM + users +ORDER BY + "similarity!" DESC \ No newline at end of file diff --git a/src/db/users.rs b/src/db/users.rs index 4e55314..0d25cac 100644 --- a/src/db/users.rs +++ b/src/db/users.rs @@ -95,9 +95,17 @@ pub async fn get_hash(search_string: &str, pool: &Pool) -> sqlx::Result( search_string: &str, pool: &'a Pool, -) -> BoxStream<'a, sqlx::Result> { - sqlx::query_file_as!(UserInfo, "sql/search_for_user.sql", search_string).fetch(pool) +) -> BoxStream<'a, sqlx::Result> { + sqlx::query_file_as!(UserSearch, "sql/search_for_user.sql", search_string).fetch(pool) } diff --git a/src/endpoints/users/search.rs b/src/endpoints/users/search.rs index 1a9a6e6..4bf3d77 100644 --- a/src/endpoints/users/search.rs +++ b/src/endpoints/users/search.rs @@ -1,4 +1,4 @@ -use futures::TryStreamExt; +use futures::{future, TryStreamExt}; use crate::prelude::*; @@ -10,9 +10,10 @@ pub struct Params { pub async fn search( State(pool): State, Query(params): Query, -) -> sqlx::Result>, StatusCode> { +) -> sqlx::Result>, StatusCode> { let users = db::users::search_for_user(¶ms.search_string, &pool) .take(20) + .try_filter(|user| future::ready(user.similarity > 0.1)) .try_collect() .await .handle_internal()?;