gaialive's picture
Upload 136 files
19bd8b9 verified
-- 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;