From 8fe24ee90b12e91fff449eba6f105acb8a89d578 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ferry=20J=C3=A9r=C3=A9mie?= Date: Sun, 27 Nov 2022 11:26:34 +0100 Subject: [PATCH] change search request --- src/db/populate.rs | 59 +++++++++++++++++++++++++++-------------- src/db/search.rs | 65 +++++++++++++++++++++++----------------------- 2 files changed, 72 insertions(+), 52 deletions(-) diff --git a/src/db/populate.rs b/src/db/populate.rs index e97e195..11e2478 100644 --- a/src/db/populate.rs +++ b/src/db/populate.rs @@ -26,7 +26,7 @@ impl PopulateDb for DesktopDDb { let mut locales = HashMap::new(); for d in &desktop_files { - if let Some(exec) = d.exec.as_deref() { + if let Some(_exec) = d.exec.as_deref() { for c in &d.i18n_comments { if locales.contains_key(c.0) { continue; @@ -66,7 +66,8 @@ impl PopulateDb for DesktopDDb { .execute(connection)?; let mut app_id = 0; - let mut constrain_keywords = HashSet::new(); + let mut constrain_app_keywords = HashSet::new(); + let mut constrain_locale_keywords = HashSet::new(); let mut constrain_app_comments = HashSet::new(); let mut constrain_locale_comments = HashSet::new(); @@ -87,12 +88,14 @@ impl PopulateDb for DesktopDDb { app_id += 1; - if let Some(_locale_id) = ( - locales.get(no_locale) - ) { - let hash = format!("{}_{}", app_id, d.default_name); - if !constrain_keywords.contains(&hash) { - constrain_keywords.insert(hash); + if let Some(_locale_id) = locales.get(no_locale) { + let app_hash = format!("{}_{}", app_id, d.default_name); + let locale_hash = format!("{}_{}", _locale_id, d.default_name); + if !constrain_app_keywords.contains(&app_hash) + && !constrain_locale_keywords.contains(&locale_hash) { + constrain_app_keywords.insert(app_hash); + constrain_locale_keywords.insert(locale_hash); + let a_l = NewAppLocale { app_id: app_id as i32, locale_id: *_locale_id, @@ -114,11 +117,15 @@ impl PopulateDb for DesktopDDb { for n in &d.i18n_names { if let Some(_locale_id) = locales.get(n.0) { - let hash = format!("{}_{}", app_id, n.1); - if constrain_keywords.contains(&hash) { + let app_hash = format!("{}_{}", app_id, n.1); + let locale_hash = format!("{}_{}", _locale_id, n.1); + if constrain_app_keywords.contains(&app_hash) + || constrain_locale_keywords.contains(&locale_hash) { continue; } - constrain_keywords.insert(hash); + constrain_app_keywords.insert(app_hash); + constrain_locale_keywords.insert(locale_hash); + let a_l = NewAppLocale { app_id: app_id as i32, locale_id: *_locale_id, @@ -140,11 +147,15 @@ impl PopulateDb for DesktopDDb { for g in &d.i18n_generic_names { if let Some(_locale_id) = locales.get(g.0) { - let hash = format!("{}_{}", app_id, g.1); - if constrain_keywords.contains(&hash) { + let app_hash = format!("{}_{}", app_id, g.1); + let locale_hash = format!("{}_{}", _locale_id, g.1); + if constrain_app_keywords.contains(&app_hash) + || constrain_locale_keywords.contains(&locale_hash) { continue; } - constrain_keywords.insert(hash); + constrain_app_keywords.insert(app_hash); + constrain_locale_keywords.insert(locale_hash); + let a_l = NewAppLocale { app_id: app_id as i32, locale_id: *_locale_id, @@ -226,11 +237,15 @@ impl PopulateDb for DesktopDDb { for k in &d.default_keywords { if let Some(_locale_id) = locales.get(no_locale) { - let hash = format!("{}_{}", app_id, k); - if constrain_keywords.contains(&hash) { + let app_hash = format!("{}_{}", app_id, k); + let locale_hash = format!("{}_{}", _locale_id, k); + if constrain_app_keywords.contains(&app_hash) + || constrain_locale_keywords.contains(&locale_hash) { continue; } - constrain_keywords.insert(hash); + constrain_app_keywords.insert(app_hash); + constrain_locale_keywords.insert(locale_hash); + let a_l = NewAppLocale { app_id: app_id as i32, locale_id: *_locale_id, @@ -253,11 +268,15 @@ impl PopulateDb for DesktopDDb { for k_lang in &d.i18n_keywords { if let Some(_locale_id) = locales.get(k_lang.0) { for k in k_lang.1 { - let hash = format!("{}_{}", app_id, k); - if constrain_keywords.contains(&hash) { + let app_hash = format!("{}_{}", app_id, k); + let locale_hash = format!("{}_{}", _locale_id, k); + if constrain_app_keywords.contains(&app_hash) + || constrain_locale_keywords.contains(&locale_hash) { continue; } - constrain_keywords.insert(hash); + constrain_app_keywords.insert(app_hash); + constrain_locale_keywords.insert(locale_hash); + let a_l = NewAppLocale { app_id: app_id as i32, locale_id: *_locale_id, diff --git a/src/db/search.rs b/src/db/search.rs index c8fbb57..cff9c06 100644 --- a/src/db/search.rs +++ b/src/db/search.rs @@ -1,8 +1,9 @@ use diesel::debug_query; use diesel::sqlite::Sqlite; +use crate::diesel::JoinOnDsl; use diesel::{ - BoolExpressionMethods, ExpressionMethods, NullableExpressionMethods, QueryDsl, RunQueryDsl, + BoolExpressionMethods, ExpressionMethods, QueryDsl, RunQueryDsl, TextExpressionMethods, }; @@ -15,7 +16,7 @@ pub trait SearchDb { text: &str, locale: &str, limit: u8, - ) -> Result>, diesel::result::Error>; + ) -> Result, diesel::result::Error>; } impl SearchDb for DesktopDDb { @@ -24,8 +25,8 @@ impl SearchDb for DesktopDDb { text: &str, locale: &str, limit: u8, - ) -> Result>, diesel::result::Error> { - use crate::schema::{app, comments, keywords}; + ) -> Result, diesel::result::Error> { + use crate::schema::{app, app_locale, locale, comments, keywords}; let selection = ( app::title, @@ -52,43 +53,43 @@ impl SearchDb for DesktopDDb { let location = locale.get(0..5).unwrap_or("en_EN"); let query = app::dsl::app - .left_join(keywords::dsl::keywords) - .inner_join(comments::dsl::comments) - .filter( - app::title - .like(format!("{}%", text)) - /* - .or( - comments::title - .like(format!("%{}%", text)) - .and( - comments::lang.eq(lang) - .or( - comments::lang.eq(location) - ) - ) + .inner_join( + app_locale::dsl::app_locale.on(app_locale::app_id.eq(app::id)) + ) + .inner_join( + locale::dsl::locale.on(locale::id.eq(app_locale::locale_id)) + ) + .inner_join(keywords::dsl::keywords) + .inner_join(comments::dsl::comments.on( + comments::app_id.eq(app::id) + .and( + comments::locale_id.eq(locale::id) ) - .or( - keywords::key - .like(format!("{}%", text)) - .and( - keywords::lang.eq(lang) - .or( - keywords::lang.eq(location) - ) - ) + ) + ) + .filter( + keywords::key + .like(format!("%{}%", text)) + .and( + locale::key.eq(lang) + .or( + locale::key.eq(location) + ) + .or( + locale::key.eq("__NO_LOCALE__") + ) ) - */ ) //.limit(limit.into()) - .select(selection.nullable()) - .group_by(selection); + .select(selection) + .group_by(selection) + ; if self.debug { let sql_debug = debug_query::(&query); println!("{}", sql_debug); } - query.load::>(&mut self.connection) + query.load::(&mut self.connection) } }