use std::collections::HashMap;
use std::path::PathBuf;
use std::time::SystemTime;
use serde::{Deserialize, Serialize};
use crate::{parser::header::CassandraVersion, schema::ClusteringColumn, types::Value};
#[derive(Debug, Clone)]
pub struct SchemaDiscoveryConfig {
pub max_sample_rows: usize,
pub aggressive_inference: bool,
pub enable_schema_cache: bool,
pub cache_ttl_seconds: u64,
pub enable_versioning: bool,
pub max_versions: usize,
pub enable_udt_discovery: bool,
pub enable_collection_analysis: bool,
pub enable_index_discovery: bool,
pub enable_cross_file_validation: bool,
pub min_confidence_threshold: f64,
}
impl Default for SchemaDiscoveryConfig {
fn default() -> Self {
Self {
max_sample_rows: 2000,
aggressive_inference: true,
enable_schema_cache: true,
cache_ttl_seconds: 3600, enable_versioning: true,
max_versions: 10,
enable_udt_discovery: true,
enable_collection_analysis: true,
enable_index_discovery: true,
enable_cross_file_validation: true,
min_confidence_threshold: 0.7,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SchemaInfo {
pub keyspace: String,
pub table: String,
pub partition_key: Vec<ColumnDefinition>,
pub clustering_keys: Vec<ClusteringColumn>,
pub regular_columns: Vec<ColumnDefinition>,
pub static_columns: Vec<ColumnDefinition>,
pub collection_types: HashMap<String, CollectionType>,
pub user_defined_types: Vec<UDTDefinition>,
pub indexes: Vec<IndexDefinition>,
pub table_options: TableOptions,
pub metadata: SchemaMetadata,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ColumnDefinition {
pub name: String,
pub data_type: String,
pub type_info: TypeInfo,
pub nullable: bool,
pub is_static: bool,
pub default_value: Option<Value>,
pub position: usize,
pub confidence: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TypeInfo {
pub type_id: String,
pub type_params: Vec<String>,
pub is_frozen: bool,
pub element_type: Option<Box<TypeInfo>>,
pub key_type: Option<Box<TypeInfo>>,
pub value_type: Option<Box<TypeInfo>>,
pub udt_fields: Option<Vec<UdtFieldInfo>>,
pub tuple_elements: Option<Vec<TypeInfo>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UdtFieldInfo {
pub name: String,
pub field_type: TypeInfo,
pub nullable: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CollectionType {
pub kind: CollectionKind,
pub element_type: Option<String>,
pub key_type: Option<String>,
pub value_type: Option<String>,
pub is_frozen: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum CollectionKind {
List,
Set,
Map,
Tuple,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UDTDefinition {
pub name: String,
pub keyspace: String,
pub fields: Vec<UdtFieldDefinition>,
pub version: Option<u32>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UdtFieldDefinition {
pub name: String,
pub field_type: String,
pub position: usize,
pub nullable: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct IndexDefinition {
pub name: String,
pub target_column: String,
pub index_type: IndexType,
pub options: HashMap<String, String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum IndexType {
Secondary,
Composite,
Custom(String),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TableOptions {
pub compaction: Option<CompactionStrategy>,
pub compression: Option<CompressionOptions>,
pub caching: Option<CachingOptions>,
pub bloom_filter_fp_chance: Option<f64>,
pub gc_grace_seconds: Option<u32>,
pub default_time_to_live: Option<u32>,
pub memtable_flush_period_in_ms: Option<u32>,
pub additional_properties: HashMap<String, String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CompactionStrategy {
pub class: String,
pub options: HashMap<String, String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CompressionOptions {
pub algorithm: String,
pub chunk_length_kb: Option<u32>,
pub crc_check_chance: Option<f32>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CachingOptions {
pub keys: String,
pub rows_per_partition: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SchemaMetadata {
pub discovered_at: SystemTime,
pub source_files: Vec<PathBuf>,
pub total_rows_sampled: usize,
pub cassandra_version: Option<CassandraVersion>,
pub discovery_method: DiscoveryMethod,
pub version: u32,
pub validation_results: ValidationResults,
pub performance_metrics: DiscoveryMetrics,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum DiscoveryMethod {
HeaderMetadata,
DataSampling,
Hybrid,
External,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ValidationResults {
pub status: ValidationStatus,
pub errors: Vec<ValidationError>,
pub warnings: Vec<ValidationWarning>,
pub consistency_results: ConsistencyResults,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub enum ValidationStatus {
Valid,
ValidWithWarnings,
Invalid,
ValidationFailed,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ValidationError {
pub error_type: ValidationErrorType,
pub message: String,
pub component: Option<String>,
pub source_file: Option<PathBuf>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum ValidationErrorType {
TypeMismatch,
MissingComponent,
InvalidTypeDefinition,
ConstraintViolation,
UdtInconsistency,
IndexError,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ValidationWarning {
pub warning_type: ValidationWarningType,
pub message: String,
pub component: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum ValidationWarningType {
LowConfidence,
DeprecatedFeature,
VersionCompatibility,
PerformanceRecommendation,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ConsistencyResults {
pub files_analyzed: usize,
pub schema_mismatches: usize,
pub type_inconsistencies: Vec<TypeInconsistency>,
pub udt_conflicts: Vec<UdtConflict>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TypeInconsistency {
pub column_name: String,
pub conflicting_types: Vec<String>,
pub conflicting_files: Vec<PathBuf>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UdtConflict {
pub udt_name: String,
pub field_conflicts: Vec<FieldConflict>,
pub conflicting_files: Vec<PathBuf>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FieldConflict {
pub field_name: String,
pub conflicting_types: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DiscoveryMetrics {
pub total_time_ms: u64,
pub header_parsing_time_ms: u64,
pub data_sampling_time_ms: u64,
pub type_inference_time_ms: u64,
pub validation_time_ms: u64,
pub peak_memory_usage_bytes: usize,
}