Skip to main content

do_memory_core/sync/
conflict.rs

1//! Conflict resolution for storage synchronization
2
3use crate::{Episode, Heuristic, Pattern};
4use std::sync::Arc;
5
6/// Conflict resolution strategy
7#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
8pub enum ConflictResolution {
9    /// Use Turso (durable) as source of truth
10    #[default]
11    TursoWins,
12    /// Use redb (cache) value
13    RedbWins,
14    /// Use most recently updated
15    MostRecent,
16}
17
18/// Resolve conflict between two episodes
19#[must_use]
20pub fn resolve_episode_conflict(
21    turso_episode: &Arc<Episode>,
22    redb_episode: &Arc<Episode>,
23    strategy: ConflictResolution,
24) -> Arc<Episode> {
25    match strategy {
26        ConflictResolution::TursoWins => Arc::clone(turso_episode),
27        ConflictResolution::RedbWins => Arc::clone(redb_episode),
28        ConflictResolution::MostRecent => {
29            // Compare based on last modification (use end_time or start_time)
30            let turso_time = turso_episode.end_time.unwrap_or(turso_episode.start_time);
31            let redb_time = redb_episode.end_time.unwrap_or(redb_episode.start_time);
32
33            if turso_time >= redb_time {
34                Arc::clone(turso_episode)
35            } else {
36                Arc::clone(redb_episode)
37            }
38        }
39    }
40}
41
42/// Resolve conflict between two patterns
43#[must_use]
44pub fn resolve_pattern_conflict(
45    turso_pattern: &Arc<Pattern>,
46    redb_pattern: &Arc<Pattern>,
47    strategy: ConflictResolution,
48) -> Arc<Pattern> {
49    match strategy {
50        ConflictResolution::TursoWins => Arc::clone(turso_pattern),
51        ConflictResolution::RedbWins => Arc::clone(redb_pattern),
52        ConflictResolution::MostRecent => {
53            // Compare based on success rate or occurrence count
54            if turso_pattern.success_rate() >= redb_pattern.success_rate() {
55                Arc::clone(turso_pattern)
56            } else {
57                Arc::clone(redb_pattern)
58            }
59        }
60    }
61}
62
63/// Resolve conflict between two heuristics
64#[must_use]
65pub fn resolve_heuristic_conflict(
66    turso_heuristic: &Arc<Heuristic>,
67    redb_heuristic: &Arc<Heuristic>,
68    strategy: ConflictResolution,
69) -> Arc<Heuristic> {
70    match strategy {
71        ConflictResolution::TursoWins => Arc::clone(turso_heuristic),
72        ConflictResolution::RedbWins => Arc::clone(redb_heuristic),
73        ConflictResolution::MostRecent => {
74            if turso_heuristic.updated_at >= redb_heuristic.updated_at {
75                Arc::clone(turso_heuristic)
76            } else {
77                Arc::clone(redb_heuristic)
78            }
79        }
80    }
81}