mirror of
https://github.com/patarapolw/cjdic2.git
synced 2026-11-09 17:39:35 +00:00
try to speed up query
This commit is contained in:
1 parent
dd52b82cc7
commit
7df0ad6066
3 files changed
+56
-20
No files matched your search
@@ -1,7 +1,7 @@
|
|||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
|
|
||||||
pub fn get_db_dir() -> PathBuf {
|
pub fn get_db_dir() -> PathBuf {
|
||||||
PathBuf::from("tmp/save-db")
|
PathBuf::from(r"C:\Users\HP\AppData\Roaming\cc.polv.cjdic2")
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_vibrato_dict_dir() -> PathBuf {
|
pub fn get_vibrato_dict_dir() -> PathBuf {
|
||||||
|
|||||||
+54
-19
@@ -6,7 +6,7 @@ use crate::{
|
|||||||
db::{Database, yomitan_writer::normalize_term},
|
db::{Database, yomitan_writer::normalize_term},
|
||||||
};
|
};
|
||||||
|
|
||||||
#[derive(Serialize, Debug)]
|
#[derive(Serialize, Debug, Clone)]
|
||||||
pub struct YomitanRow {
|
pub struct YomitanRow {
|
||||||
term: String,
|
term: String,
|
||||||
reading: String,
|
reading: String,
|
||||||
@@ -56,10 +56,55 @@ 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 conn = self.db.conn.lock().unwrap();
|
||||||
|
|
||||||
// TODO: consider using = if not GLOB string
|
conn.execute_batch(
|
||||||
let sql = format!(
|
"
|
||||||
r#"
|
CREATE TEMP TABLE IF NOT EXISTS yomitan_lookup_keys (
|
||||||
|
term,
|
||||||
|
reading,
|
||||||
|
score,
|
||||||
|
title,
|
||||||
|
glossary_id,
|
||||||
|
def_tags_id,
|
||||||
|
rules_id,
|
||||||
|
term_tags_id,
|
||||||
|
sequence
|
||||||
|
);
|
||||||
|
DELETE FROM yomitan_lookup_keys;
|
||||||
|
",
|
||||||
|
)?;
|
||||||
|
// let _timer = Timer::new(format!("search_yomitan: {} {}", q_term, q_reading));
|
||||||
|
|
||||||
|
conn.execute(
|
||||||
|
&format!(
|
||||||
|
"
|
||||||
|
INSERT INTO yomitan_lookup_keys
|
||||||
|
SELECT
|
||||||
|
t.term,
|
||||||
|
t.reading,
|
||||||
|
t.score,
|
||||||
|
d.title,
|
||||||
|
t.glossary_id,
|
||||||
|
t.def_tags_id,
|
||||||
|
rules_id,
|
||||||
|
term_tags_id,
|
||||||
|
sequence
|
||||||
|
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
|
||||||
|
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));
|
||||||
|
|
||||||
|
let mut stmt = conn.prepare(
|
||||||
|
"
|
||||||
SELECT
|
SELECT
|
||||||
t.term,
|
t.term,
|
||||||
t.reading,
|
t.reading,
|
||||||
@@ -69,25 +114,15 @@ impl YomitanDatabase {
|
|||||||
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,
|
||||||
d.title AS dict_title
|
t.title AS dict_title
|
||||||
FROM yomitan.terms t
|
FROM yomitan_lookup_keys t
|
||||||
JOIN yomitan.view_terms_term_rank tr ON tr.term = t.term AND tr.reading = t.reading
|
|
||||||
JOIN yomitan.glossaries g ON g.id = t.glossary_id
|
JOIN yomitan.glossaries g ON g.id = t.glossary_id
|
||||||
JOIN yomitan.dictionaries d ON d.id = t.dict_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
|
||||||
WHERE t.term_norm GLOB ?1 {} t.reading GLOB ?2
|
",
|
||||||
ORDER BY tr.max_score DESC, d.sort_order DESC
|
)?;
|
||||||
LIMIT ?3 OFFSET ?4
|
let rows = stmt.query_map(params![], |r| {
|
||||||
"#,
|
|
||||||
and_or
|
|
||||||
);
|
|
||||||
|
|
||||||
let conn = self.db.conn.lock().unwrap();
|
|
||||||
|
|
||||||
let mut stmt = conn.prepare(&sql)?;
|
|
||||||
let rows = stmt.query_map(params![q_term_norm, q_reading, limit, offset], |r| {
|
|
||||||
Ok(YomitanRow {
|
Ok(YomitanRow {
|
||||||
term: r.get(0)?,
|
term: r.get(0)?,
|
||||||
reading: r.get(1)?,
|
reading: r.get(1)?,
|
||||||
|
|||||||
@@ -155,6 +155,7 @@ impl YomitanWriter {
|
|||||||
CREATE INDEX IF NOT EXISTS dictionaries_lang ON dictionaries (lang);
|
CREATE INDEX IF NOT EXISTS dictionaries_lang ON dictionaries (lang);
|
||||||
|
|
||||||
CREATE INDEX IF NOT EXISTS terms_dict_id ON terms (dict_id);
|
CREATE INDEX IF NOT EXISTS terms_dict_id ON terms (dict_id);
|
||||||
|
CREATE INDEX IF NOT EXISTS terms_term_norm ON terms (term_norm);
|
||||||
CREATE INDEX IF NOT EXISTS terms_reading ON terms (reading);
|
CREATE INDEX IF NOT EXISTS terms_reading ON terms (reading);
|
||||||
CREATE INDEX IF NOT EXISTS terms_term_reading_score ON terms(term, reading, score DESC);
|
CREATE INDEX IF NOT EXISTS terms_term_reading_score ON terms(term, reading, score DESC);
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user