-- Enhancement Features Database Schema -- Creates tables for XAI, A/B testing, model compression, and training pipeline integration -- Create extension if not exists CREATE EXTENSION IF NOT EXISTS timescaledb; -- XAI Analysis Results Table CREATE TABLE IF NOT EXISTS xai_analysis ( timestamp TIMESTAMPTZ NOT NULL, analysis_id TEXT NOT NULL, session_id TEXT NOT NULL, user_id TEXT, method_results JSONB, confidence_calibration JSONB, interpretation_score REAL, processing_time_ms REAL, model_version TEXT, created_at TIMESTAMPTZ DEFAULT NOW(), PRIMARY KEY (timestamp, analysis_id) ); -- Create hypertable for XAI analysis SELECT create_hypertable('xai_analysis', 'timestamp', if_not_exists => TRUE); -- A/B Test Results Table (for real-time monitoring) CREATE TABLE IF NOT EXISTS ab_test_results ( timestamp TIMESTAMPTZ NOT NULL, result_id TEXT NOT NULL, experiment_id TEXT NOT NULL, variant_id TEXT NOT NULL, user_id TEXT, session_id TEXT, metrics JSONB, processing_time_ms REAL, device_info JSONB, ip_address INET, created_at TIMESTAMPTZ DEFAULT NOW(), PRIMARY KEY (timestamp, result_id) ); -- Create hypertable for A/B test results SELECT create_hypertable('ab_test_results', 'timestamp', if_not_exists => TRUE); -- Model Compression Metrics Table CREATE TABLE IF NOT EXISTS model_compression_metrics ( timestamp TIMESTAMPTZ NOT NULL, compression_id TEXT NOT NULL, model_name TEXT, original_size_mb REAL, compressed_size_mb REAL, compression_ratio REAL, speedup_ratio REAL, accuracy_drop REAL, compression_config JSONB, processing_time_ms REAL, target_platform TEXT, created_at TIMESTAMPTZ DEFAULT NOW(), PRIMARY KEY (timestamp, compression_id) ); -- Create hypertable for compression metrics SELECT create_hypertable('model_compression_metrics', 'timestamp', if_not_exists => TRUE); -- Automated Training Pipeline Results CREATE TABLE IF NOT EXISTS training_pipeline_results ( timestamp TIMESTAMPTZ NOT NULL, pipeline_id TEXT NOT NULL, dataset_size INTEGER, training_config JSONB, hyperparameter_results JSONB, active_learning_results JSONB, final_metrics JSONB, training_time_hours REAL, data_efficiency_gain REAL, created_at TIMESTAMPTZ DEFAULT NOW(), PRIMARY KEY (timestamp, pipeline_id) ); -- Create hypertable for training results SELECT create_hypertable('training_pipeline_results', 'timestamp', if_not_exists => TRUE); -- Dataset Curation Results CREATE TABLE IF NOT EXISTS dataset_curation_results ( timestamp TIMESTAMPTZ NOT NULL, curation_id TEXT NOT NULL, original_size INTEGER, final_size INTEGER, quality_threshold REAL, average_quality REAL, duplicates_removed INTEGER, low_quality_removed INTEGER, processing_time_ms REAL, curation_config JSONB, created_at TIMESTAMPTZ DEFAULT NOW(), PRIMARY KEY (timestamp, curation_id) ); -- Create hypertable for curation results SELECT create_hypertable('dataset_curation_results', 'timestamp', if_not_exists => TRUE); -- User Enhancement Preferences CREATE TABLE IF NOT EXISTS user_enhancement_preferences ( user_id TEXT PRIMARY KEY, xai_enabled BOOLEAN DEFAULT true, preferred_xai_methods TEXT[] DEFAULT ARRAY['integrated_gradients', 'shap'], ab_testing_participation BOOLEAN DEFAULT true, compression_preference TEXT DEFAULT 'balanced', -- fast, balanced, accurate confidence_calibration_enabled BOOLEAN DEFAULT true, interpretability_level TEXT DEFAULT 'medium', -- low, medium, high updated_at TIMESTAMPTZ DEFAULT NOW(), created_at TIMESTAMPTZ DEFAULT NOW() ); -- Enhancement Session Tracking CREATE TABLE IF NOT EXISTS enhancement_sessions ( timestamp TIMESTAMPTZ NOT NULL, session_id TEXT NOT NULL, user_id TEXT, enhancement_type TEXT, -- xai, compression, ab_test, training configuration JSONB, results JSONB, processing_time_ms REAL, status TEXT, -- started, completed, failed error_message TEXT, created_at TIMESTAMPTZ DEFAULT NOW(), PRIMARY KEY (timestamp, session_id, enhancement_type) ); -- Create hypertable for enhancement sessions SELECT create_hypertable('enhancement_sessions', 'timestamp', if_not_exists => TRUE); -- Model Performance Tracking (Enhanced) CREATE TABLE IF NOT EXISTS enhanced_model_performance ( timestamp TIMESTAMPTZ NOT NULL, model_id TEXT NOT NULL, model_version TEXT, accuracy REAL, precision_score REAL, recall REAL, f1_score REAL, inference_time_ms REAL, memory_usage_mb REAL, interpretability_score REAL, confidence_calibration_score REAL, compression_ratio REAL, deployment_target TEXT, -- mobile, server, edge created_at TIMESTAMPTZ DEFAULT NOW(), PRIMARY KEY (timestamp, model_id) ); -- Create hypertable for enhanced performance tracking SELECT create_hypertable('enhanced_model_performance', 'timestamp', if_not_exists => TRUE); -- Create indexes for better query performance CREATE INDEX IF NOT EXISTS idx_xai_analysis_session ON xai_analysis (session_id, timestamp DESC); CREATE INDEX IF NOT EXISTS idx_xai_analysis_user ON xai_analysis (user_id, timestamp DESC); CREATE INDEX IF NOT EXISTS idx_ab_test_experiment ON ab_test_results (experiment_id, timestamp DESC); CREATE INDEX IF NOT EXISTS idx_ab_test_variant ON ab_test_results (variant_id, timestamp DESC); CREATE INDEX IF NOT EXISTS idx_compression_model ON model_compression_metrics (model_name, timestamp DESC); CREATE INDEX IF NOT EXISTS idx_training_pipeline ON training_pipeline_results (timestamp DESC); CREATE INDEX IF NOT EXISTS idx_enhancement_sessions_user ON enhancement_sessions (user_id, timestamp DESC); CREATE INDEX IF NOT EXISTS idx_enhancement_sessions_type ON enhancement_sessions (enhancement_type, timestamp DESC); -- Create materialized views for analytics CREATE MATERIALIZED VIEW IF NOT EXISTS xai_daily_stats AS SELECT DATE(timestamp) as date, COUNT(*) as total_analyses, COUNT(DISTINCT session_id) as unique_sessions, AVG(interpretation_score) as avg_interpretation_score, AVG(processing_time_ms) as avg_processing_time, PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY interpretation_score) as median_interpretation_score FROM xai_analysis WHERE timestamp >= NOW() - INTERVAL '90 days' GROUP BY DATE(timestamp) ORDER BY date DESC; CREATE MATERIALIZED VIEW IF NOT EXISTS ab_test_daily_stats AS SELECT DATE(timestamp) as date, experiment_id, variant_id, COUNT(*) as test_count, AVG((metrics->>'accuracy')::float) as avg_accuracy, AVG((metrics->>'latency')::float) as avg_latency, STDDEV((metrics->>'accuracy')::float) as accuracy_stddev FROM ab_test_results WHERE timestamp >= NOW() - INTERVAL '90 days' GROUP BY DATE(timestamp), experiment_id, variant_id ORDER BY date DESC, experiment_id, variant_id; CREATE MATERIALIZED VIEW IF NOT EXISTS compression_efficiency_stats AS SELECT DATE(timestamp) as date, target_platform, COUNT(*) as compression_count, AVG(compression_ratio) as avg_compression_ratio, AVG(speedup_ratio) as avg_speedup_ratio, AVG(accuracy_drop) as avg_accuracy_drop, AVG(processing_time_ms) as avg_processing_time FROM model_compression_metrics WHERE timestamp >= NOW() - INTERVAL '90 days' GROUP BY DATE(timestamp), target_platform ORDER BY date DESC, target_platform; -- Add retention policies for data lifecycle management SELECT add_retention_policy('xai_analysis', INTERVAL '1 year'); SELECT add_retention_policy('ab_test_results', INTERVAL '1 year'); SELECT add_retention_policy('model_compression_metrics', INTERVAL '2 years'); SELECT add_retention_policy('training_pipeline_results', INTERVAL '2 years'); SELECT add_retention_policy('dataset_curation_results', INTERVAL '1 year'); SELECT add_retention_policy('enhancement_sessions', INTERVAL '6 months'); -- Add continuous aggregate policies for materialized views SELECT add_continuous_aggregate_policy('xai_daily_stats', start_offset => INTERVAL '1 month', end_offset => INTERVAL '1 day', schedule_interval => INTERVAL '1 hour'); SELECT add_continuous_aggregate_policy('ab_test_daily_stats', start_offset => INTERVAL '1 month', end_offset => INTERVAL '1 day', schedule_interval => INTERVAL '1 hour'); SELECT add_continuous_aggregate_policy('compression_efficiency_stats', start_offset => INTERVAL '1 month', end_offset => INTERVAL '1 day', schedule_interval => INTERVAL '1 hour'); -- Create views for easy data access CREATE VIEW enhancement_user_summary AS SELECT u.user_id, u.xai_enabled, u.ab_testing_participation, u.compression_preference, COUNT(DISTINCT xa.analysis_id) as total_xai_analyses, COUNT(DISTINCT ab.result_id) as total_ab_tests, AVG(xa.interpretation_score) as avg_interpretation_score, MAX(xa.timestamp) as last_xai_analysis, MAX(ab.timestamp) as last_ab_test FROM user_enhancement_preferences u LEFT JOIN xai_analysis xa ON u.user_id = xa.user_id AND xa.timestamp >= NOW() - INTERVAL '30 days' LEFT JOIN ab_test_results ab ON u.user_id = ab.user_id AND ab.timestamp >= NOW() - INTERVAL '30 days' GROUP BY u.user_id, u.xai_enabled, u.ab_testing_participation, u.compression_preference; CREATE VIEW enhancement_performance_overview AS SELECT 'XAI Analysis' as enhancement_type, COUNT(*) as total_operations, AVG(processing_time_ms) as avg_processing_time, PERCENTILE_CONT(0.95) WITHIN GROUP (ORDER BY processing_time_ms) as p95_processing_time FROM xai_analysis WHERE timestamp >= NOW() - INTERVAL '24 hours' UNION ALL SELECT 'Model Compression' as enhancement_type, COUNT(*) as total_operations, AVG(processing_time_ms) as avg_processing_time, PERCENTILE_CONT(0.95) WITHIN GROUP (ORDER BY processing_time_ms) as p95_processing_time FROM model_compression_metrics WHERE timestamp >= NOW() - INTERVAL '24 hours' UNION ALL SELECT 'A/B Testing' as enhancement_type, COUNT(*) as total_operations, AVG(processing_time_ms) as avg_processing_time, PERCENTILE_CONT(0.95) WITHIN GROUP (ORDER BY processing_time_ms) as p95_processing_time FROM ab_test_results WHERE timestamp >= NOW() - INTERVAL '24 hours'; -- Grant permissions (adjust user as needed) GRANT SELECT, INSERT, UPDATE ON ALL TABLES IN SCHEMA public TO morphguard_app; GRANT SELECT ON ALL VIEWS IN SCHEMA public TO morphguard_app; -- Insert sample user preferences INSERT INTO user_enhancement_preferences (user_id, xai_enabled, preferred_xai_methods, compression_preference) VALUES ('admin', true, ARRAY['integrated_gradients', 'shap', 'lime'], 'accurate'), ('demo_user', true, ARRAY['integrated_gradients'], 'balanced') ON CONFLICT (user_id) DO NOTHING; -- Add comments for documentation COMMENT ON TABLE xai_analysis IS 'Stores XAI analysis results with interpretability scores and explanations'; COMMENT ON TABLE ab_test_results IS 'Real-time A/B test results for performance monitoring'; COMMENT ON TABLE model_compression_metrics IS 'Model compression performance and efficiency metrics'; COMMENT ON TABLE training_pipeline_results IS 'Automated training pipeline results and configurations'; COMMENT ON TABLE user_enhancement_preferences IS 'User preferences for enhancement features'; COMMENT ON TABLE enhancement_sessions IS 'Session tracking for all enhancement operations'; -- Create functions for common queries CREATE OR REPLACE FUNCTION get_user_enhancement_stats(p_user_id TEXT, p_days INTEGER DEFAULT 30) RETURNS JSON AS $$ DECLARE result JSON; BEGIN SELECT json_build_object( 'user_id', p_user_id, 'period_days', p_days, 'xai_analyses', COALESCE(xai_count, 0), 'ab_tests', COALESCE(ab_count, 0), 'avg_interpretation_score', COALESCE(avg_score, 0), 'last_activity', COALESCE(last_activity, '1970-01-01'::timestamp) ) INTO result FROM ( SELECT COUNT(DISTINCT xa.analysis_id) as xai_count, COUNT(DISTINCT ab.result_id) as ab_count, AVG(xa.interpretation_score) as avg_score, GREATEST(MAX(xa.timestamp), MAX(ab.timestamp)) as last_activity FROM user_enhancement_preferences u LEFT JOIN xai_analysis xa ON u.user_id = xa.user_id AND xa.timestamp >= NOW() - (p_days || ' days')::INTERVAL LEFT JOIN ab_test_results ab ON u.user_id = ab.user_id AND ab.timestamp >= NOW() - (p_days || ' days')::INTERVAL WHERE u.user_id = p_user_id ) stats; RETURN result; END; $$ LANGUAGE plpgsql; COMMENT ON FUNCTION get_user_enhancement_stats IS 'Get comprehensive enhancement statistics for a user'; -- Trigger to automatically refresh materialized views CREATE OR REPLACE FUNCTION refresh_enhancement_views() RETURNS TRIGGER AS $$ BEGIN -- Only refresh during business hours to avoid performance impact IF EXTRACT(hour FROM NOW()) BETWEEN 9 AND 17 THEN REFRESH MATERIALIZED VIEW CONCURRENTLY xai_daily_stats; REFRESH MATERIALIZED VIEW CONCURRENTLY ab_test_daily_stats; REFRESH MATERIALIZED VIEW CONCURRENTLY compression_efficiency_stats; END IF; RETURN NULL; END; $$ LANGUAGE plpgsql; -- Create triggers (commented out for manual control) -- CREATE TRIGGER refresh_views_on_xai_insert -- AFTER INSERT ON xai_analysis -- FOR EACH STATEMENT -- EXECUTE FUNCTION refresh_enhancement_views(); COMMENT ON FUNCTION refresh_enhancement_views IS 'Automatically refresh materialized views for analytics'; -- Create policy for row-level security (if needed) -- ALTER TABLE user_enhancement_preferences ENABLE ROW LEVEL SECURITY; -- CREATE POLICY user_own_preferences ON user_enhancement_preferences -- FOR ALL TO morphguard_app -- USING (user_id = current_setting('app.current_user', true)); -- Final success message DO $$ BEGIN RAISE NOTICE 'Enhancement database schema created successfully!'; RAISE NOTICE 'Tables created: xai_analysis, ab_test_results, model_compression_metrics, training_pipeline_results, dataset_curation_results, user_enhancement_preferences, enhancement_sessions, enhanced_model_performance'; RAISE NOTICE 'Materialized views created: xai_daily_stats, ab_test_daily_stats, compression_efficiency_stats'; RAISE NOTICE 'Functions created: get_user_enhancement_stats, refresh_enhancement_views'; END $$;