From 192234c950d60da804a0e634a37536b2fe6010f6 Mon Sep 17 00:00:00 2001 From: salmonik Date: Tue, 9 Jun 2026 13:55:00 +0300 Subject: limit completions to LIMIT --- src/database.rs | 50 ++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 36 insertions(+), 14 deletions(-) diff --git a/src/database.rs b/src/database.rs index e6f6f6e..831a7ba 100644 --- a/src/database.rs +++ b/src/database.rs @@ -43,6 +43,8 @@ pub struct Database { conn: Connection, } +const LIMIT: usize = 50; + #[allow(dead_code)] impl Database { pub fn conn(&self) -> &Connection { @@ -309,9 +311,9 @@ impl Database { let mut results: Vec = Vec::new(); if query.is_empty() { - let mut stmt = self - .conn - .prepare("SELECT name FROM artists ORDER BY name LIMIT 25")?; + let mut stmt = self.conn.prepare( + &format!("SELECT name FROM artists ORDER BY name LIMIT {}", LIMIT).to_string(), + )?; let rows = stmt.query_map([], |row| row.get::<_, String>(0))?; for name in rows.flatten() { results.push(format!("{name}/")); @@ -329,10 +331,14 @@ impl Database { 1 => { let artist = segments[0]; let mut stmt = self.conn.prepare( - "SELECT a.title FROM albums a + &format!( + "SELECT a.title FROM albums a JOIN artists ar ON a.artist_id = ar.id WHERE ar.name LIKE ?1 - ORDER BY a.title LIMIT 25", + ORDER BY a.title LIMIT {}", + LIMIT + ) + .to_string(), )?; let rows = stmt.query_map([artist], |row| row.get::<_, String>(0))?; for album in rows.flatten() { @@ -343,11 +349,15 @@ impl Database { let artist = segments[0]; let album = segments[1]; let mut stmt = self.conn.prepare( - "SELECT t.title FROM tracks t + &format!( + "SELECT t.title FROM tracks t JOIN albums a ON t.album_id = a.id JOIN artists ar ON a.artist_id = ar.id WHERE ar.name LIKE ?1 AND a.title LIKE ?2 - ORDER BY t.track_number, t.title LIMIT 25", + ORDER BY t.track_number, t.title LIMIT {}", + LIMIT + ) + .to_string(), )?; let rows = stmt.query_map(rusqlite::params![artist, album], |row| { row.get::<_, String>(0) @@ -368,12 +378,16 @@ impl Database { let prefix_pattern = format!("{prefix}%"); let mut stmt = self.conn.prepare( - "SELECT name FROM artists + &format!( + "SELECT name FROM artists WHERE name LIKE ?1 ORDER BY CASE WHEN name LIKE ?2 THEN 0 ELSE 1 END, name - LIMIT 25", + LIMIT {}", + LIMIT + ) + .to_string(), )?; let rows = stmt .query_map(rusqlite::params![&like_pattern, &prefix_pattern], |row| { @@ -396,14 +410,18 @@ impl Database { let album_prefix_pattern = format!("{album_prefix}%"); let mut stmt = self.conn.prepare( - "SELECT ar.name, a.title FROM albums a + &format!( + "SELECT ar.name, a.title FROM albums a JOIN artists ar ON a.artist_id = ar.id WHERE ar.name LIKE ?1 AND a.title LIKE ?2 ORDER BY CASE WHEN ar.name LIKE ?3 THEN 0 ELSE 1 END, CASE WHEN a.title LIKE ?4 THEN 0 ELSE 1 END, ar.name, a.title - LIMIT 25", + LIMIT {}", + LIMIT + ) + .to_string(), )?; let rows = stmt.query_map( rusqlite::params![ @@ -434,7 +452,8 @@ impl Database { let track_prefix_pattern = format!("{track_prefix}%"); let mut stmt = self.conn.prepare( - "SELECT ar.name, a.title, t.title FROM tracks t + &format!( + "SELECT ar.name, a.title, t.title FROM tracks t JOIN albums a ON t.album_id = a.id JOIN artists ar ON a.artist_id = ar.id WHERE ar.name LIKE ?1 AND a.title LIKE ?2 AND t.title LIKE ?3 @@ -443,7 +462,10 @@ impl Database { CASE WHEN a.title LIKE ?5 THEN 0 ELSE 1 END, CASE WHEN t.title LIKE ?6 THEN 0 ELSE 1 END, t.track_number, t.title - LIMIT 25", + LIMIT {}", + LIMIT + ) + .to_string(), )?; let rows = stmt.query_map( rusqlite::params![ @@ -470,7 +492,7 @@ impl Database { } } - results.truncate(25); + results.truncate(LIMIT); Ok(results) } -- cgit v1.2.3