WIP: improve search #1
|
@ -26,7 +26,7 @@ use serde_json::Value;
|
||||||
const DEFAULT_SIZE: usize = 25;
|
const DEFAULT_SIZE: usize = 25;
|
||||||
|
|
||||||
#[derive(Copy, Clone, Debug, Deserialize)]
|
#[derive(Copy, Clone, Debug, Deserialize)]
|
||||||
enum Key {
|
enum SortKey {
|
||||||
Name,
|
Name,
|
||||||
Size,
|
Size,
|
||||||
Seeders,
|
Seeders,
|
||||||
|
@ -34,13 +34,13 @@ enum Key {
|
||||||
Date,
|
Date,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for Key {
|
impl Default for SortKey {
|
||||||
fn default() -> Self {
|
fn default() -> Self {
|
||||||
Self::Name
|
Self::Name
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl fmt::Display for Key {
|
impl fmt::Display for SortKey {
|
||||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||||
let s = match &self {
|
let s = match &self {
|
||||||
Self::Name => "name",
|
Self::Name => "name",
|
||||||
|
@ -54,18 +54,18 @@ impl fmt::Display for Key {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Copy, Clone, Debug, Deserialize)]
|
#[derive(Copy, Clone, Debug, Deserialize)]
|
||||||
enum Direction {
|
enum SortDirection {
|
||||||
Asc,
|
Asc,
|
||||||
Desc,
|
Desc,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for Direction {
|
impl Default for SortDirection {
|
||||||
fn default() -> Self {
|
fn default() -> Self {
|
||||||
Self::Desc
|
Self::Desc
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl fmt::Display for Direction {
|
impl fmt::Display for SortDirection {
|
||||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||||
let s = match &self {
|
let s = match &self {
|
||||||
Self::Asc => "asc",
|
Self::Asc => "asc",
|
||||||
|
@ -120,8 +120,8 @@ struct SearchQuery {
|
||||||
q: String,
|
q: String,
|
||||||
page: Option<usize>,
|
page: Option<usize>,
|
||||||
size: Option<usize>,
|
size: Option<usize>,
|
||||||
sort_key: Option<Key>,
|
sort_key: Option<SortKey>,
|
||||||
sort_dir: Option<Direction>,
|
sort_dir: Option<SortDirection>,
|
||||||
type_: Option<String>,
|
type_: Option<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -147,8 +147,8 @@ async fn search(
|
||||||
struct NewQuery {
|
struct NewQuery {
|
||||||
page: Option<usize>,
|
page: Option<usize>,
|
||||||
size: Option<usize>,
|
size: Option<usize>,
|
||||||
sort_key: Option<Key>,
|
sort_key: Option<SortKey>,
|
||||||
sort_dir: Option<Direction>,
|
sort_dir: Option<SortDirection>,
|
||||||
type_: Option<String>,
|
type_: Option<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -181,22 +181,22 @@ fn search_query(
|
||||||
}
|
}
|
||||||
|
|
||||||
let page = query.page.unwrap_or(1);
|
let page = query.page.unwrap_or(1);
|
||||||
let key = query.sort_key.unwrap_or_default();
|
let sort_key = query.sort_key.unwrap_or_default();
|
||||||
let direction = query.sort_dir.unwrap_or_default();
|
let sort_dir = query.sort_dir.unwrap_or_default();
|
||||||
let size = cmp::min(100, query.size.unwrap_or(DEFAULT_SIZE));
|
let size = cmp::min(100, query.size.unwrap_or(DEFAULT_SIZE));
|
||||||
let type_ = query.type_.as_ref().map_or("torrent", String::deref);
|
let type_ = query.type_.as_ref().map_or("torrent", String::deref);
|
||||||
let offset = size * (page - 1);
|
let offset = size * (page - 1);
|
||||||
|
|
||||||
println!(
|
println!(
|
||||||
"query = {}, type = {}, page = {}, size = {}, sort_key = {}, sort_dir = {}",
|
"query = {}, type = {}, page = {}, size = {}, sort_key = {}, sort_dir = {}",
|
||||||
q, type_, page, size, key, direction
|
q, type_, page, size, sort_key, sort_dir
|
||||||
);
|
);
|
||||||
|
|
||||||
let res = if type_ == "file" {
|
let res = if type_ == "file" {
|
||||||
let results = torrent_file_search(conn, q, size, offset)?;
|
let results = torrent_file_search(conn, q, size, offset)?;
|
||||||
serde_json::to_value(&results).unwrap()
|
serde_json::to_value(&results).unwrap()
|
||||||
} else {
|
} else {
|
||||||
let results = torrent_search(conn, q, key, direction, size, offset)?;
|
let results = torrent_search(conn, q, sort_key, sort_dir, size, offset)?;
|
||||||
serde_json::to_value(&results).unwrap()
|
serde_json::to_value(&results).unwrap()
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -210,14 +210,14 @@ fn new_query(
|
||||||
|
|
||||||
let page = query.page.unwrap_or(1);
|
let page = query.page.unwrap_or(1);
|
||||||
let size = cmp::min(100, query.size.unwrap_or(DEFAULT_SIZE));
|
let size = cmp::min(100, query.size.unwrap_or(DEFAULT_SIZE));
|
||||||
let key = query.sort_key.unwrap_or_default();
|
let sort_key = query.sort_key.unwrap_or_default();
|
||||||
let direction = query.sort_dir.unwrap_or_default();
|
let sort_dir = query.sort_dir.unwrap_or_default();
|
||||||
let type_ = query.type_.as_ref().map_or("torrent", String::deref);
|
let type_ = query.type_.as_ref().map_or("torrent", String::deref);
|
||||||
let offset = size * (page - 1);
|
let offset = size * (page - 1);
|
||||||
|
|
||||||
dbg!(
|
println!(
|
||||||
"new, type = {}, page = {}, size = {}, sort_key = {}, sort_dir = {}",
|
"new, type = {}, page = {}, size = {}, sort_key = {}, sort_dir = {}",
|
||||||
type_, page, size, key, direction
|
type_, page, size, sort_key, sort_dir
|
||||||
);
|
);
|
||||||
|
|
||||||
let res = if type_ == "file" {
|
let res = if type_ == "file" {
|
||||||
|
@ -246,8 +246,8 @@ struct Torrent {
|
||||||
fn torrent_search(
|
fn torrent_search(
|
||||||
conn: r2d2::PooledConnection<SqliteConnectionManager>,
|
conn: r2d2::PooledConnection<SqliteConnectionManager>,
|
||||||
query: &str,
|
query: &str,
|
||||||
key: Key,
|
key: SortKey,
|
||||||
direction: Direction,
|
direction: SortDirection,
|
||||||
size: usize,
|
size: usize,
|
||||||
offset: usize,
|
offset: usize,
|
||||||
) -> Result<Vec<Torrent>, Error> {
|
) -> Result<Vec<Torrent>, Error> {
|
||||||
|
@ -410,7 +410,7 @@ mod tests {
|
||||||
let manager = SqliteConnectionManager::file(super::torrents_db_file());
|
let manager = SqliteConnectionManager::file(super::torrents_db_file());
|
||||||
let pool = r2d2::Pool::builder().max_size(15).build(manager).unwrap();
|
let pool = r2d2::Pool::builder().max_size(15).build(manager).unwrap();
|
||||||
let conn = pool.get().unwrap();
|
let conn = pool.get().unwrap();
|
||||||
let results = super::torrent_search(conn, "sherlock", 10, 0, SortKey::Name, SortDir::Desc);
|
let results = super::torrent_search(conn, "sherlock", 10, 0, SortKey::Name, SortDirection::Desc);
|
||||||
assert!(results.unwrap().len() > 2);
|
assert!(results.unwrap().len() > 2);
|
||||||
// println!("Query took {:?} seconds.", end - start);
|
// println!("Query took {:?} seconds.", end - start);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue