-- This table is used to store trace values. See go/tracestore/sqltracestore.
CREATE TABLE IF NOT EXISTS TraceValues (
	trace_id BYTES,
	-- Id of the trace name from TraceIDS.
	commit_number INT,
	-- A types.CommitNumber.
	val REAL,
	-- The floating point measurement.
	source_file_id INT,
	-- Id of the source filename, from SourceFiles.
	PRIMARY KEY (trace_id, commit_number),
	INDEX by_source_file_id (source_file_id, trace_id)
);

-- This table is used to store source filenames. See go/tracestore/sqltracestore.
CREATE TABLE IF NOT EXISTS SourceFiles (
	source_file_id INT PRIMARY KEY DEFAULT unique_rowid(),
	-- The full name of the source file, e.g. gs://bucket/2020/01/02/03/15/foo.json
	source_file STRING UNIQUE NOT NULL,
	INDEX by_source_file (source_file, source_file_id)
);

-- This table stores the ParamSet for each tile.
CREATE TABLE IF NOT EXISTS ParamSets (
	tile_number INT,
	param_key STRING,
	param_value STRING,
	-- The primary key is used to load a paramset for a given tile.
	PRIMARY KEY (tile_number, param_key, param_value),
	-- This secondary index is used to determine the most recent tile.
	INDEX by_tile_number (tile_number DESC)
);

-- This table is used to store an inverted index for trace names. See go/tracestore/sqltracestore.
CREATE TABLE IF NOT EXISTS Postings (
	-- A types.TileNumber.
	tile_number INT,
	-- A key value pair from a structured key, e.g. "config=8888".
	key_value STRING NOT NULL,
	-- md5(trace_name)
	trace_id BYTES,
	-- The primary index is used for looking up trace_ids based on queries for key=value pairs.
	PRIMARY KEY (tile_number, key_value, trace_id),
	-- This secondary index is used to reconstruct a trace's full name from a
	-- given trace_id.
	INDEX by_trace_id (tile_number, trace_id, key_value),
	-- This  index is used to query trace_ids from a given key_value.
	INDEX by_key_value (tile_number, key_value)
);

-- This table is used to store shortcuts. See go/shortcut/sqlshortcutstore.
CREATE TABLE IF NOT EXISTS Shortcuts (
	id TEXT UNIQUE NOT NULL PRIMARY KEY,
	trace_ids TEXT -- A shortcut.Shortcut serialized as JSON.
);

-- This table is used to store alerts. See go/alerts/sqlalertstore.
CREATE TABLE IF NOT EXISTS Alerts (
	id INT PRIMARY KEY DEFAULT unique_rowid(),
	-- alerts.Alert serialized as JSON.
	alert TEXT,
	-- The Alert.State which is an alerts.ConfigState value.
	config_state INT DEFAULT 0,
	last_modified INT -- Unix timestamp.
);

-- This table is used to store regressions. See go/regression/sqlregressionstore.
CREATE TABLE IF NOT EXISTS Regressions (
	-- The commit_number where the regression occurred.
	commit_number INT,
	-- The id of an Alert, i.e. the id from the Alerts table.
	alert_id INT,
	-- A regression.Regression serialized as JSON.
	regression TEXT,
	PRIMARY KEY (commit_number, alert_id)
);

-- This table is use to store commits. See go/git.
CREATE TABLE IF NOT EXISTS Commits (
	-- The commit_number.
	commit_number INT PRIMARY KEY,
	-- The git hash at that commit_number.
	git_hash TEXT UNIQUE NOT NULL,
	-- Commit time, as opposed to author time.
	commit_time INT,
	-- Author in the format of "Name <email>".
	author TEXT,
	-- The git commit subject.
	subject TEXT
);