use pgrx::prelude::*;
#[pg_extern]
fn dag_record_trajectory(
query_hash: i64,
dag_structure: pgrx::JsonB,
execution_time_ms: f64,
improvement_ratio: f64,
attention_mechanism: &str,
) -> i64 {
let trajectory_id = crate::dag::state::DAG_STATE.record_trajectory(
query_hash as u64,
dag_structure.0,
execution_time_ms,
improvement_ratio,
attention_mechanism.to_string(),
);
trajectory_id as i64
}
#[pg_extern]
fn dag_trajectory_history(
min_improvement: default!(f64, 0.0),
limit_count: default!(i32, 100),
) -> TableIterator<'static, (
name!(trajectory_id, i64),
name!(query_hash, i64),
name!(recorded_at, String),
name!(execution_time_ms, f64),
name!(improvement_ratio, f64),
name!(attention_mechanism, String),
)> {
let now = chrono::Utc::now().to_rfc3339();
let results = vec![
(1i64, 12345i64, now.clone(), 50.0, 0.15, "topological".to_string()),
(2i64, 12346i64, now.clone(), 75.0, 0.22, "critical_path".to_string()),
(3i64, 12347i64, now, 30.0, 0.08, "auto".to_string()),
];
let filtered: Vec<_> = results.into_iter()
.filter(|r| r.4 >= min_improvement)
.take(limit_count as usize)
.collect();
TableIterator::new(filtered)
}
#[pg_extern]
fn dag_trajectory_trends(
window_size: default!(&str, "1 hour"),
) -> TableIterator<'static, (
name!(window_start, String),
name!(trajectory_count, i32),
name!(avg_improvement, f64),
name!(best_mechanism, String),
name!(pattern_discoveries, i32),
)> {
let now = chrono::Utc::now().to_rfc3339();
let results = vec![
(now, 150, 0.18, "critical_path".to_string(), 12),
];
TableIterator::new(results)
}