From 62688a84021a78c25a05e13b623f49073c9de715 Mon Sep 17 00:00:00 2001 From: Antoine Gersant Date: Fri, 3 Nov 2017 13:42:42 -0700 Subject: [PATCH] Implemented search --- src/api.rs | 5 ++++- src/index.rs | 40 +++++++++++++++++++++++++++++++++++++--- 2 files changed, 41 insertions(+), 4 deletions(-) diff --git a/src/api.rs b/src/api.rs index 8ec1156..3b4aa3a 100644 --- a/src/api.rs +++ b/src/api.rs @@ -435,7 +435,10 @@ fn recent(_: &mut Request, db: &DB) -> IronResult { } fn search(request: &mut Request, db: &DB) -> IronResult { - let query = "Stratovarius"; // TODO + let query = request + .url + .path() + .join(&::std::path::MAIN_SEPARATOR.to_string()); let search_result = index::search(db, &query)?; let result_json = serde_json::to_string(&search_result); let result_json = match result_json { diff --git a/src/index.rs b/src/index.rs index 030ec45..f28ff72 100644 --- a/src/index.rs +++ b/src/index.rs @@ -579,12 +579,46 @@ pub fn get_recent_albums(db: &T, count: i64) -> Result> pub fn search(db: &T, query: &str) -> Result> where T: ConnectionSource + VFSSource { - Ok(vec![]) + let vfs = db.get_vfs()?; + let connection = db.get_connection(); + let like_test = format!("%{}%", query); + let mut output = Vec::new(); + // Find dirs with matching path and parent not matching + { + use self::directories::dsl::*; + let real_directories: Vec = directories + .filter(path.like(&like_test)) + .filter(parent.not_like(&like_test)) + .load(connection.deref())?; + let virtual_directories = real_directories + .into_iter() + .filter_map(|s| virtualize_directory(&vfs, s)); - // Find songs with matching title/album/artist - // Remove songs within a matched directory + output.extend(virtual_directories.map(|d| CollectionFile::Directory(d))); + } + + // Find songs with matching title/album/artist and non-matching parent + { + use self::songs::dsl::*; + let real_songs: Vec = songs + .filter(path.like(&like_test) + .or(title.like(&like_test)) + .or(album.like(&like_test)) + .or(artist.like(&like_test)) + .or(album_artist.like(&like_test))) + .filter(parent.not_like(&like_test)) + .load(connection.deref())?; + + let virtual_songs = real_songs + .into_iter() + .filter_map(|s| virtualize_song(&vfs, s)); + + output.extend(virtual_songs.map(|s| CollectionFile::Song(s))); + } + + Ok(output) } #[test]