diff --git a/src-core/src/db/yomitan.rs b/src-core/src/db/yomitan.rs index d1a69a7..3498622 100644 --- a/src-core/src/db/yomitan.rs +++ b/src-core/src/db/yomitan.rs @@ -54,8 +54,11 @@ impl YomitanDatabase { } new_t.push_str(&normalize_term(&new_seg)); - let q_term_norm = new_t; + + let eq1 = if q_term_norm.len() > 0 { "GLOB" } else { "=" }; + let eq2 = if q_reading.len() > 0 { "GLOB" } else { "=" }; + let conn = self.db.conn.lock().unwrap(); conn.execute_batch( @@ -74,11 +77,10 @@ impl YomitanDatabase { DELETE FROM yomitan_lookup_keys; ", )?; - // let _timer = Timer::new(format!("search_yomitan: {} {}", q_term, q_reading)); - conn.execute( - &format!( - " + // let _timer = Timer::new(format!("search_yomitan: {} {}", q_term, q_reading)); + let sql_string = format!( + " INSERT INTO yomitan_lookup_keys SELECT t.term, @@ -93,33 +95,33 @@ impl YomitanDatabase { FROM yomitan.terms t JOIN yomitan.view_terms_term_rank tr ON tr.term = t.term AND tr.reading = t.reading JOIN yomitan.dictionaries d ON d.id = t.dict_id - WHERE t.term_norm GLOB ?1 {} t.reading GLOB ?2 + WHERE t.term_norm {eq1} ?1 {and_or} t.reading {eq2} ?2 ORDER BY tr.max_score DESC, d.sort_order DESC LIMIT ?3 OFFSET ?4 - ", - and_or - ), - params![q_term_norm, q_reading, limit, offset], - )?; - // let _timer = Timer::new(format!("search_yomitan: {} {}", q_term, q_reading)); + " + ); + // println!("{}", sql_string); + // still the most time bottleneck step, several seconds + conn.execute(&sql_string, params![q_term_norm, q_reading, limit, offset])?; + // let _timer = Timer::new(format!("search_yomitan: {} {}", q_term, q_reading)); let mut stmt = conn.prepare( " - SELECT - t.term, - t.reading, - COALESCE(dt.tags, '') AS def_tags, - COALESCE(r.rules, '') AS rules, - t.score, - g.content AS glossary_json, - t.sequence, - COALESCE(tt.tags, '') AS term_tags, - t.title AS dict_title - FROM yomitan_lookup_keys t - JOIN yomitan.glossaries g ON g.id = t.glossary_id - LEFT JOIN yomitan.def_tag_sets dt ON dt.id = t.def_tags_id - LEFT JOIN yomitan.rule_sets r ON r.id = t.rules_id - LEFT JOIN yomitan.term_tag_sets tt ON tt.id = t.term_tags_id + SELECT + t.term, + t.reading, + COALESCE(dt.tags, '') AS def_tags, + COALESCE(r.rules, '') AS rules, + t.score, + g.content AS glossary_json, + t.sequence, + COALESCE(tt.tags, '') AS term_tags, + t.title AS dict_title + FROM yomitan_lookup_keys t + JOIN yomitan.glossaries g ON g.id = t.glossary_id + LEFT JOIN yomitan.def_tag_sets dt ON dt.id = t.def_tags_id + LEFT JOIN yomitan.rule_sets r ON r.id = t.rules_id + LEFT JOIN yomitan.term_tag_sets tt ON tt.id = t.term_tags_id ", )?; let rows = stmt.query_map(params![], |r| {