dial/failure/
solutions.rs1use crate::errors::Result;
2use crate::{TRUST_DECREMENT, TRUST_INCREMENT, TRUST_THRESHOLD};
3use chrono::Local;
4use rusqlite::Connection;
5
6#[derive(Debug, Clone)]
7pub struct Solution {
8 pub id: i64,
9 pub pattern_id: i64,
10 pub description: String,
11 pub code_example: Option<String>,
12 pub confidence: f64,
13 pub success_count: i64,
14 pub failure_count: i64,
15 pub created_at: String,
16 pub last_used_at: Option<String>,
17}
18
19impl Solution {
20 pub fn from_row(row: &rusqlite::Row) -> rusqlite::Result<Self> {
21 Ok(Solution {
22 id: row.get("id")?,
23 pattern_id: row.get("pattern_id")?,
24 description: row.get("description")?,
25 code_example: row.get("code_example")?,
26 confidence: row.get("confidence")?,
27 success_count: row.get("success_count")?,
28 failure_count: row.get("failure_count")?,
29 created_at: row.get("created_at")?,
30 last_used_at: row.get("last_used_at")?,
31 })
32 }
33
34 pub fn is_trusted(&self) -> bool {
35 self.confidence >= TRUST_THRESHOLD
36 }
37}
38
39pub fn find_trusted_solutions(conn: &Connection, pattern_id: i64) -> Result<Vec<Solution>> {
40 let mut stmt = conn.prepare(
41 "SELECT id, pattern_id, description, code_example, confidence, success_count, failure_count, created_at, last_used_at
42 FROM solutions
43 WHERE pattern_id = ?1 AND confidence >= ?2
44 ORDER BY confidence DESC",
45 )?;
46
47 let solutions = stmt
48 .query_map(rusqlite::params![pattern_id, TRUST_THRESHOLD], |row| {
49 Solution::from_row(row)
50 })?
51 .collect::<std::result::Result<Vec<_>, _>>()?;
52
53 Ok(solutions)
54}
55
56pub fn record_solution(
57 conn: &Connection,
58 pattern_id: i64,
59 description: &str,
60 code_example: Option<&str>,
61) -> Result<i64> {
62 conn.execute(
63 "INSERT INTO solutions (pattern_id, description, code_example)
64 VALUES (?1, ?2, ?3)",
65 rusqlite::params![pattern_id, description, code_example],
66 )?;
67 Ok(conn.last_insert_rowid())
68}
69
70pub fn apply_solution_success(conn: &Connection, solution_id: i64) -> Result<()> {
71 let now = Local::now().to_rfc3339();
72 conn.execute(
73 "UPDATE solutions
74 SET confidence = MIN(1.0, confidence + ?1),
75 success_count = success_count + 1,
76 last_used_at = ?2
77 WHERE id = ?3",
78 rusqlite::params![TRUST_INCREMENT, now, solution_id],
79 )?;
80 Ok(())
81}
82
83pub fn apply_solution_failure(conn: &Connection, solution_id: i64) -> Result<()> {
84 let now = Local::now().to_rfc3339();
85 conn.execute(
86 "UPDATE solutions
87 SET confidence = MAX(0.0, confidence - ?1),
88 failure_count = failure_count + 1,
89 last_used_at = ?2
90 WHERE id = ?3",
91 rusqlite::params![TRUST_DECREMENT, now, solution_id],
92 )?;
93 Ok(())
94}