dynamic = rather than glob

This commit is contained in:
polv committed 2026-03-06 23:17:14 +07:00
1 parent 7df0ad6066
commit 729f6635fc
1 file changed
+29 -27
+29 -27
View File
@@ -54,8 +54,11 @@ impl YomitanDatabase {
} }
new_t.push_str(&normalize_term(&new_seg)); new_t.push_str(&normalize_term(&new_seg));
let q_term_norm = new_t; 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(); let conn = self.db.conn.lock().unwrap();
conn.execute_batch( conn.execute_batch(
@@ -74,11 +77,10 @@ impl YomitanDatabase {
DELETE FROM yomitan_lookup_keys; DELETE FROM yomitan_lookup_keys;
", ",
)?; )?;
// let _timer = Timer::new(format!("search_yomitan: {} {}", q_term, q_reading));
conn.execute( // let _timer = Timer::new(format!("search_yomitan: {} {}", q_term, q_reading));
&format!( let sql_string = format!(
" "
INSERT INTO yomitan_lookup_keys INSERT INTO yomitan_lookup_keys
SELECT SELECT
t.term, t.term,
@@ -93,33 +95,33 @@ impl YomitanDatabase {
FROM yomitan.terms t FROM yomitan.terms t
JOIN yomitan.view_terms_term_rank tr ON tr.term = t.term AND tr.reading = t.reading 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 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 ORDER BY tr.max_score DESC, d.sort_order DESC
LIMIT ?3 OFFSET ?4 LIMIT ?3 OFFSET ?4
", "
and_or );
), // println!("{}", sql_string);
params![q_term_norm, q_reading, limit, offset], // 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 _timer = Timer::new(format!("search_yomitan: {} {}", q_term, q_reading));
let mut stmt = conn.prepare( let mut stmt = conn.prepare(
" "
SELECT SELECT
t.term, t.term,
t.reading, t.reading,
COALESCE(dt.tags, '') AS def_tags, COALESCE(dt.tags, '') AS def_tags,
COALESCE(r.rules, '') AS rules, COALESCE(r.rules, '') AS rules,
t.score, t.score,
g.content AS glossary_json, g.content AS glossary_json,
t.sequence, t.sequence,
COALESCE(tt.tags, '') AS term_tags, COALESCE(tt.tags, '') AS term_tags,
t.title AS dict_title t.title AS dict_title
FROM yomitan_lookup_keys t FROM yomitan_lookup_keys t
JOIN yomitan.glossaries g ON g.id = t.glossary_id 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.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.rule_sets r ON r.id = t.rules_id
LEFT JOIN yomitan.term_tag_sets tt ON tt.id = t.term_tags_id LEFT JOIN yomitan.term_tag_sets tt ON tt.id = t.term_tags_id
", ",
)?; )?;
let rows = stmt.query_map(params![], |r| { let rows = stmt.query_map(params![], |r| {