feat: add AI data validation, test data generator, index advisor, and snapshots
Four new killer features leveraging AI (Ollama) and PostgreSQL internals: - Data Validation: describe quality rules in natural language, AI generates SQL to find violations, run with pass/fail results and sample violations - Test Data Generator: right-click table to generate realistic FK-aware test data with AI, preview before inserting in a transaction - Index Advisor: analyze pg_stat tables + AI recommendations for CREATE/DROP INDEX with one-click apply - Data Snapshots: export selected tables to JSON (FK-ordered), restore from file with optional truncate in a transaction Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -57,3 +57,137 @@ pub struct OllamaTagsResponse {
|
||||
pub struct OllamaModel {
|
||||
pub name: String,
|
||||
}
|
||||
|
||||
// --- Wave 1: Validation ---
|
||||
|
||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||
#[serde(rename_all = "snake_case")]
|
||||
pub enum ValidationStatus {
|
||||
Pending,
|
||||
Generating,
|
||||
Running,
|
||||
Passed,
|
||||
Failed,
|
||||
Error,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||
pub struct ValidationRule {
|
||||
pub id: String,
|
||||
pub description: String,
|
||||
pub generated_sql: String,
|
||||
pub status: ValidationStatus,
|
||||
pub violation_count: u64,
|
||||
pub sample_violations: Vec<Vec<serde_json::Value>>,
|
||||
pub violation_columns: Vec<String>,
|
||||
pub error: Option<String>,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||
pub struct ValidationReport {
|
||||
pub rules: Vec<ValidationRule>,
|
||||
pub total_rules: usize,
|
||||
pub passed: usize,
|
||||
pub failed: usize,
|
||||
pub errors: usize,
|
||||
pub execution_time_ms: u128,
|
||||
}
|
||||
|
||||
// --- Wave 2: Data Generator ---
|
||||
|
||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||
pub struct GenerateDataParams {
|
||||
pub connection_id: String,
|
||||
pub schema: String,
|
||||
pub table: String,
|
||||
pub row_count: u32,
|
||||
pub include_related: bool,
|
||||
pub custom_instructions: Option<String>,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||
pub struct GeneratedDataPreview {
|
||||
pub tables: Vec<GeneratedTableData>,
|
||||
pub insert_order: Vec<String>,
|
||||
pub total_rows: u32,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||
pub struct GeneratedTableData {
|
||||
pub schema: String,
|
||||
pub table: String,
|
||||
pub columns: Vec<String>,
|
||||
pub rows: Vec<Vec<serde_json::Value>>,
|
||||
pub row_count: u32,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||
pub struct DataGenProgress {
|
||||
pub gen_id: String,
|
||||
pub stage: String,
|
||||
pub percent: u8,
|
||||
pub message: String,
|
||||
pub detail: Option<String>,
|
||||
}
|
||||
|
||||
// --- Wave 3A: Index Advisor ---
|
||||
|
||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||
pub struct TableStats {
|
||||
pub schema: String,
|
||||
pub table: String,
|
||||
pub seq_scan: i64,
|
||||
pub idx_scan: i64,
|
||||
pub n_live_tup: i64,
|
||||
pub table_size: String,
|
||||
pub index_size: String,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||
pub struct IndexStats {
|
||||
pub schema: String,
|
||||
pub table: String,
|
||||
pub index_name: String,
|
||||
pub idx_scan: i64,
|
||||
pub index_size: String,
|
||||
pub definition: String,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||
pub struct SlowQuery {
|
||||
pub query: String,
|
||||
pub calls: i64,
|
||||
pub total_time_ms: f64,
|
||||
pub mean_time_ms: f64,
|
||||
pub rows: i64,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||
#[serde(rename_all = "snake_case")]
|
||||
pub enum IndexRecommendationType {
|
||||
CreateIndex,
|
||||
DropIndex,
|
||||
ReplaceIndex,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||
pub struct IndexRecommendation {
|
||||
pub id: String,
|
||||
pub recommendation_type: IndexRecommendationType,
|
||||
pub table_schema: String,
|
||||
pub table_name: String,
|
||||
pub index_name: Option<String>,
|
||||
pub ddl: String,
|
||||
pub rationale: String,
|
||||
pub estimated_impact: String,
|
||||
pub priority: String,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||
pub struct IndexAdvisorReport {
|
||||
pub table_stats: Vec<TableStats>,
|
||||
pub index_stats: Vec<IndexStats>,
|
||||
pub slow_queries: Vec<SlowQuery>,
|
||||
pub recommendations: Vec<IndexRecommendation>,
|
||||
pub has_pg_stat_statements: bool,
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user