Spaces:
Running
Running
| -- Aqua-Lens Water Quality Database Schema | |
| -- SQLite database initialization script | |
| -- Main water tests table | |
| CREATE TABLE IF NOT EXISTS water_tests ( | |
| id TEXT PRIMARY KEY, | |
| timestamp DATETIME DEFAULT CURRENT_TIMESTAMP, | |
| user_id TEXT, | |
| latitude REAL, | |
| longitude REAL, | |
| water_source TEXT NOT NULL, | |
| image_path TEXT, | |
| -- Water quality parameters | |
| ph REAL NOT NULL, | |
| chlorine REAL NOT NULL, | |
| nitrates INTEGER NOT NULL, | |
| hardness INTEGER NOT NULL, | |
| alkalinity INTEGER NOT NULL, | |
| bacteria INTEGER NOT NULL DEFAULT 0, | |
| -- Analysis results | |
| overall_quality TEXT NOT NULL, | |
| safety_level TEXT NOT NULL, | |
| confidence REAL NOT NULL DEFAULT 95.0, | |
| processing_time REAL, | |
| alerts TEXT, -- JSON array of alerts | |
| color_analysis TEXT, -- JSON object with color data | |
| -- Metadata | |
| strip_type TEXT DEFAULT 'multi-parameter', | |
| calibration_used TEXT DEFAULT 'standard', | |
| lighting_conditions TEXT, | |
| image_quality_score REAL, | |
| -- Indexing for performance | |
| FOREIGN KEY(user_id) REFERENCES users(id) | |
| ); | |
| -- Water quality alerts table | |
| CREATE TABLE IF NOT EXISTS water_alerts ( | |
| id TEXT PRIMARY KEY, | |
| test_id TEXT NOT NULL, | |
| alert_type TEXT NOT NULL, -- 'contamination', 'ph_warning', 'bacteria', etc. | |
| severity TEXT NOT NULL, -- 'low', 'medium', 'high', 'critical' | |
| message TEXT NOT NULL, | |
| timestamp DATETIME DEFAULT CURRENT_TIMESTAMP, | |
| latitude REAL, | |
| longitude REAL, | |
| resolved BOOLEAN DEFAULT FALSE, | |
| resolved_timestamp DATETIME, | |
| FOREIGN KEY(test_id) REFERENCES water_tests(id) | |
| ); | |
| -- User profiles table (optional) | |
| CREATE TABLE IF NOT EXISTS users ( | |
| id TEXT PRIMARY KEY, | |
| username TEXT UNIQUE, | |
| email TEXT UNIQUE, | |
| created_at DATETIME DEFAULT CURRENT_TIMESTAMP, | |
| location_name TEXT, | |
| default_latitude REAL, | |
| default_longitude REAL, | |
| test_count INTEGER DEFAULT 0, | |
| last_test_date DATETIME | |
| ); | |
| -- Calibration data for improving accuracy | |
| CREATE TABLE IF NOT EXISTS calibration_data ( | |
| id TEXT PRIMARY KEY, | |
| parameter TEXT NOT NULL, -- 'ph', 'chlorine', etc. | |
| color_rgb TEXT NOT NULL, -- JSON array [r, g, b] | |
| actual_value REAL NOT NULL, | |
| confidence REAL DEFAULT 100.0, | |
| timestamp DATETIME DEFAULT CURRENT_TIMESTAMP, | |
| source TEXT DEFAULT 'lab_verified', -- 'lab_verified', 'user_reported', 'estimated' | |
| -- For machine learning model training | |
| image_path TEXT, | |
| lighting_condition TEXT, | |
| strip_brand TEXT | |
| ); | |
| -- Water source locations for mapping | |
| CREATE TABLE IF NOT EXISTS water_sources ( | |
| id TEXT PRIMARY KEY, | |
| name TEXT NOT NULL, | |
| type TEXT NOT NULL, -- 'well', 'lake', 'river', 'tap', etc. | |
| latitude REAL NOT NULL, | |
| longitude REAL NOT NULL, | |
| description TEXT, | |
| last_tested DATETIME, | |
| average_quality TEXT, | |
| test_count INTEGER DEFAULT 0, | |
| created_at DATETIME DEFAULT CURRENT_TIMESTAMP | |
| ); | |
| -- Community reports and feedback | |
| CREATE TABLE IF NOT EXISTS community_reports ( | |
| id TEXT PRIMARY KEY, | |
| test_id TEXT, | |
| user_id TEXT, | |
| report_type TEXT NOT NULL, -- 'accuracy_feedback', 'contamination_report', 'false_positive' | |
| message TEXT, | |
| timestamp DATETIME DEFAULT CURRENT_TIMESTAMP, | |
| latitude REAL, | |
| longitude REAL, | |
| status TEXT DEFAULT 'pending', -- 'pending', 'verified', 'dismissed' | |
| FOREIGN KEY(test_id) REFERENCES water_tests(id), | |
| FOREIGN KEY(user_id) REFERENCES users(id) | |
| ); | |
| -- System performance metrics | |
| CREATE TABLE IF NOT EXISTS system_metrics ( | |
| id TEXT PRIMARY KEY, | |
| metric_name TEXT NOT NULL, | |
| metric_value REAL NOT NULL, | |
| timestamp DATETIME DEFAULT CURRENT_TIMESTAMP, | |
| details TEXT -- JSON object with additional data | |
| ); | |
| -- Create indexes for better query performance | |
| CREATE INDEX IF NOT EXISTS idx_water_tests_location ON water_tests(latitude, longitude); | |
| CREATE INDEX IF NOT EXISTS idx_water_tests_timestamp ON water_tests(timestamp); | |
| CREATE INDEX IF NOT EXISTS idx_water_tests_quality ON water_tests(overall_quality, safety_level); | |
| CREATE INDEX IF NOT EXISTS idx_water_tests_user ON water_tests(user_id); | |
| CREATE INDEX IF NOT EXISTS idx_alerts_location ON water_alerts(latitude, longitude); | |
| CREATE INDEX IF NOT EXISTS idx_alerts_severity ON water_alerts(severity, resolved); | |
| CREATE INDEX IF NOT EXISTS idx_alerts_timestamp ON water_alerts(timestamp); | |
| CREATE INDEX IF NOT EXISTS idx_calibration_parameter ON calibration_data(parameter); | |
| CREATE INDEX IF NOT EXISTS idx_water_sources_location ON water_sources(latitude, longitude); | |
| -- Insert some sample calibration data | |
| INSERT OR IGNORE INTO calibration_data (id, parameter, color_rgb, actual_value, source) VALUES | |
| ('cal_ph_1', 'ph', '[255, 0, 0]', 4.0, 'lab_verified'), | |
| ('cal_ph_2', 'ph', '[255, 140, 0]', 6.0, 'lab_verified'), | |
| ('cal_ph_3', 'ph', '[255, 255, 0]', 7.0, 'lab_verified'), | |
| ('cal_ph_4', 'ph', '[0, 255, 0]', 8.0, 'lab_verified'), | |
| ('cal_ph_5', 'ph', '[0, 0, 255]', 9.0, 'lab_verified'), | |
| ('cal_chlorine_1', 'chlorine', '[255, 255, 255]', 0.0, 'lab_verified'), | |
| ('cal_chlorine_2', 'chlorine', '[255, 182, 193]', 1.0, 'lab_verified'), | |
| ('cal_chlorine_3', 'chlorine', '[255, 105, 180]', 2.0, 'lab_verified'), | |
| ('cal_chlorine_4', 'chlorine', '[220, 20, 60]', 4.0, 'lab_verified'), | |
| ('cal_nitrates_1', 'nitrates', '[255, 255, 255]', 0, 'lab_verified'), | |
| ('cal_nitrates_2', 'nitrates', '[255, 192, 203]', 10, 'lab_verified'), | |
| ('cal_nitrates_3', 'nitrates', '[255, 105, 180]', 25, 'lab_verified'), | |
| ('cal_nitrates_4', 'nitrates', '[255, 69, 0]', 50, 'lab_verified'); | |
| -- Create a view for easy water quality mapping | |
| CREATE VIEW IF NOT EXISTS water_quality_map AS | |
| SELECT | |
| wt.id, | |
| wt.latitude, | |
| wt.longitude, | |
| wt.water_source, | |
| wt.overall_quality, | |
| wt.safety_level, | |
| wt.ph, | |
| wt.chlorine, | |
| wt.nitrates, | |
| wt.timestamp, | |
| CASE | |
| WHEN wt.safety_level = 'Unsafe' THEN 'red' | |
| WHEN wt.overall_quality = 'Poor' THEN 'orange' | |
| WHEN wt.overall_quality = 'Fair' THEN 'yellow' | |
| WHEN wt.overall_quality = 'Good' THEN 'lightgreen' | |
| ELSE 'green' | |
| END as marker_color, | |
| COUNT(wa.id) as alert_count | |
| FROM water_tests wt | |
| LEFT JOIN water_alerts wa ON wt.id = wa.test_id AND wa.resolved = FALSE | |
| WHERE wt.latitude IS NOT NULL AND wt.longitude IS NOT NULL | |
| GROUP BY wt.id | |
| ORDER BY wt.timestamp DESC; | |
| -- Create a view for recent alerts | |
| CREATE VIEW IF NOT EXISTS recent_alerts AS | |
| SELECT | |
| wa.*, | |
| wt.water_source, | |
| wt.overall_quality, | |
| wt.ph, | |
| wt.chlorine, | |
| wt.nitrates | |
| FROM water_alerts wa | |
| JOIN water_tests wt ON wa.test_id = wt.id | |
| WHERE wa.resolved = FALSE | |
| ORDER BY wa.timestamp DESC; | |
| -- Trigger to update user test count | |
| CREATE TRIGGER IF NOT EXISTS update_user_test_count | |
| AFTER INSERT ON water_tests | |
| FOR EACH ROW | |
| WHEN NEW.user_id IS NOT NULL | |
| BEGIN | |
| UPDATE users | |
| SET test_count = test_count + 1, | |
| last_test_date = NEW.timestamp | |
| WHERE id = NEW.user_id; | |
| END; | |
| -- Trigger to create alerts for unsafe water | |
| CREATE TRIGGER IF NOT EXISTS create_safety_alerts | |
| AFTER INSERT ON water_tests | |
| FOR EACH ROW | |
| WHEN NEW.safety_level = 'Unsafe' | |
| BEGIN | |
| INSERT INTO water_alerts (id, test_id, alert_type, severity, message, latitude, longitude) | |
| VALUES ( | |
| 'alert_' || NEW.id, | |
| NEW.id, | |
| 'contamination', | |
| 'high', | |
| 'Unsafe water quality detected: ' || NEW.overall_quality, | |
| NEW.latitude, | |
| NEW.longitude | |
| ); | |
| END; |