1use std::collections::HashMap;
7use std::path::PathBuf;
8use std::time::SystemTime;
9
10use serde::{Deserialize, Serialize};
11
12use crate::{parser::header::CassandraVersion, schema::ClusteringColumn, types::Value};
13
14#[derive(Debug, Clone)]
16pub struct SchemaDiscoveryConfig {
17 pub max_sample_rows: usize,
19 pub aggressive_inference: bool,
21 pub enable_schema_cache: bool,
23 pub cache_ttl_seconds: u64,
25 pub enable_versioning: bool,
27 pub max_versions: usize,
29 pub enable_udt_discovery: bool,
31 pub enable_collection_analysis: bool,
33 pub enable_index_discovery: bool,
35 pub enable_cross_file_validation: bool,
37 pub min_confidence_threshold: f64,
39}
40
41impl Default for SchemaDiscoveryConfig {
42 fn default() -> Self {
43 Self {
44 max_sample_rows: 2000,
45 aggressive_inference: true,
46 enable_schema_cache: true,
47 cache_ttl_seconds: 3600, enable_versioning: true,
49 max_versions: 10,
50 enable_udt_discovery: true,
51 enable_collection_analysis: true,
52 enable_index_discovery: true,
53 enable_cross_file_validation: true,
54 min_confidence_threshold: 0.7,
55 }
56 }
57}
58
59#[derive(Debug, Clone, Serialize, Deserialize)]
61pub struct SchemaInfo {
62 pub keyspace: String,
64 pub table: String,
66 pub partition_key: Vec<ColumnDefinition>,
68 pub clustering_keys: Vec<ClusteringColumn>,
70 pub regular_columns: Vec<ColumnDefinition>,
72 pub static_columns: Vec<ColumnDefinition>,
74 pub collection_types: HashMap<String, CollectionType>,
76 pub user_defined_types: Vec<UDTDefinition>,
78 pub indexes: Vec<IndexDefinition>,
80 pub table_options: TableOptions,
82 pub metadata: SchemaMetadata,
84}
85
86#[derive(Debug, Clone, Serialize, Deserialize)]
88pub struct ColumnDefinition {
89 pub name: String,
91 pub data_type: String,
93 pub type_info: TypeInfo,
95 pub nullable: bool,
97 pub is_static: bool,
99 pub default_value: Option<Value>,
101 pub position: usize,
103 pub confidence: f64,
105}
106
107#[derive(Debug, Clone, Serialize, Deserialize)]
109pub struct TypeInfo {
110 pub type_id: String,
112 pub type_params: Vec<String>,
114 pub is_frozen: bool,
116 pub element_type: Option<Box<TypeInfo>>,
118 pub key_type: Option<Box<TypeInfo>>,
120 pub value_type: Option<Box<TypeInfo>>,
122 pub udt_fields: Option<Vec<UdtFieldInfo>>,
124 pub tuple_elements: Option<Vec<TypeInfo>>,
126}
127
128#[derive(Debug, Clone, Serialize, Deserialize)]
130pub struct UdtFieldInfo {
131 pub name: String,
133 pub field_type: TypeInfo,
135 pub nullable: bool,
137}
138
139#[derive(Debug, Clone, Serialize, Deserialize)]
141pub struct CollectionType {
142 pub kind: CollectionKind,
144 pub element_type: Option<String>,
146 pub key_type: Option<String>,
148 pub value_type: Option<String>,
150 pub is_frozen: bool,
152}
153
154#[derive(Debug, Clone, Serialize, Deserialize)]
156pub enum CollectionKind {
157 List,
158 Set,
159 Map,
160 Tuple,
161}
162
163#[derive(Debug, Clone, Serialize, Deserialize)]
165pub struct UDTDefinition {
166 pub name: String,
168 pub keyspace: String,
170 pub fields: Vec<UdtFieldDefinition>,
172 pub version: Option<u32>,
174}
175
176#[derive(Debug, Clone, Serialize, Deserialize)]
178pub struct UdtFieldDefinition {
179 pub name: String,
181 pub field_type: String,
183 pub position: usize,
185 pub nullable: bool,
187}
188
189#[derive(Debug, Clone, Serialize, Deserialize)]
191pub struct IndexDefinition {
192 pub name: String,
194 pub target_column: String,
196 pub index_type: IndexType,
198 pub options: HashMap<String, String>,
200}
201
202#[derive(Debug, Clone, Serialize, Deserialize)]
204pub enum IndexType {
205 Secondary,
207 Composite,
209 Custom(String),
211}
212
213#[derive(Debug, Clone, Serialize, Deserialize)]
215pub struct TableOptions {
216 pub compaction: Option<CompactionStrategy>,
218 pub compression: Option<CompressionOptions>,
220 pub caching: Option<CachingOptions>,
222 pub bloom_filter_fp_chance: Option<f64>,
224 pub gc_grace_seconds: Option<u32>,
226 pub default_time_to_live: Option<u32>,
228 pub memtable_flush_period_in_ms: Option<u32>,
230 pub additional_properties: HashMap<String, String>,
232}
233
234#[derive(Debug, Clone, Serialize, Deserialize)]
236pub struct CompactionStrategy {
237 pub class: String,
239 pub options: HashMap<String, String>,
241}
242
243#[derive(Debug, Clone, Serialize, Deserialize)]
245pub struct CompressionOptions {
246 pub algorithm: String,
248 pub chunk_length_kb: Option<u32>,
250 pub crc_check_chance: Option<f32>,
252}
253
254#[derive(Debug, Clone, Serialize, Deserialize)]
256pub struct CachingOptions {
257 pub keys: String,
259 pub rows_per_partition: String,
261}
262
263#[derive(Debug, Clone, Serialize, Deserialize)]
265pub struct SchemaMetadata {
266 pub discovered_at: SystemTime,
268 pub source_files: Vec<PathBuf>,
270 pub total_rows_sampled: usize,
272 pub cassandra_version: Option<CassandraVersion>,
274 pub discovery_method: DiscoveryMethod,
276 pub version: u32,
278 pub validation_results: ValidationResults,
280 pub performance_metrics: DiscoveryMetrics,
282}
283
284#[derive(Debug, Clone, Serialize, Deserialize)]
286pub enum DiscoveryMethod {
287 HeaderMetadata,
289 DataSampling,
291 Hybrid,
293 External,
295}
296
297#[derive(Debug, Clone, Serialize, Deserialize)]
299pub struct ValidationResults {
300 pub status: ValidationStatus,
302 pub errors: Vec<ValidationError>,
304 pub warnings: Vec<ValidationWarning>,
306 pub consistency_results: ConsistencyResults,
308}
309
310#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
312pub enum ValidationStatus {
313 Valid,
315 ValidWithWarnings,
317 Invalid,
319 ValidationFailed,
321}
322
323#[derive(Debug, Clone, Serialize, Deserialize)]
325pub struct ValidationError {
326 pub error_type: ValidationErrorType,
328 pub message: String,
330 pub component: Option<String>,
332 pub source_file: Option<PathBuf>,
334}
335
336#[derive(Debug, Clone, Serialize, Deserialize)]
338pub enum ValidationErrorType {
339 TypeMismatch,
341 MissingComponent,
343 InvalidTypeDefinition,
345 ConstraintViolation,
347 UdtInconsistency,
349 IndexError,
351}
352
353#[derive(Debug, Clone, Serialize, Deserialize)]
355pub struct ValidationWarning {
356 pub warning_type: ValidationWarningType,
358 pub message: String,
360 pub component: Option<String>,
362}
363
364#[derive(Debug, Clone, Serialize, Deserialize)]
366pub enum ValidationWarningType {
367 LowConfidence,
369 DeprecatedFeature,
371 VersionCompatibility,
373 PerformanceRecommendation,
375}
376
377#[derive(Debug, Clone, Serialize, Deserialize)]
379pub struct ConsistencyResults {
380 pub files_analyzed: usize,
382 pub schema_mismatches: usize,
384 pub type_inconsistencies: Vec<TypeInconsistency>,
386 pub udt_conflicts: Vec<UdtConflict>,
388}
389
390#[derive(Debug, Clone, Serialize, Deserialize)]
392pub struct TypeInconsistency {
393 pub column_name: String,
395 pub conflicting_types: Vec<String>,
397 pub conflicting_files: Vec<PathBuf>,
399}
400
401#[derive(Debug, Clone, Serialize, Deserialize)]
403pub struct UdtConflict {
404 pub udt_name: String,
406 pub field_conflicts: Vec<FieldConflict>,
408 pub conflicting_files: Vec<PathBuf>,
410}
411
412#[derive(Debug, Clone, Serialize, Deserialize)]
414pub struct FieldConflict {
415 pub field_name: String,
417 pub conflicting_types: Vec<String>,
419}
420
421#[derive(Debug, Clone, Serialize, Deserialize)]
423pub struct DiscoveryMetrics {
424 pub total_time_ms: u64,
426 pub header_parsing_time_ms: u64,
428 pub data_sampling_time_ms: u64,
430 pub type_inference_time_ms: u64,
432 pub validation_time_ms: u64,
434 pub peak_memory_usage_bytes: usize,
436}