58 lines
No EOL
2.3 KiB
SQL
58 lines
No EOL
2.3 KiB
SQL
-- Create enum for run status
|
|
DO $$ BEGIN
|
|
CREATE TYPE run_status AS ENUM ('pending', 'running', 'completed', 'failed', 'cancelled', 'paused');
|
|
EXCEPTION
|
|
WHEN duplicate_object THEN null;
|
|
END $$;
|
|
|
|
-- Update backtests table to remove status and error columns (these belong to runs)
|
|
ALTER TABLE backtests DROP COLUMN IF EXISTS status;
|
|
ALTER TABLE backtests DROP COLUMN IF EXISTS error;
|
|
|
|
-- Create runs table
|
|
CREATE TABLE IF NOT EXISTS runs (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
backtest_id UUID NOT NULL REFERENCES backtests(id) ON DELETE CASCADE,
|
|
run_number INTEGER NOT NULL,
|
|
status run_status NOT NULL DEFAULT 'pending',
|
|
speed_multiplier NUMERIC(10, 2) DEFAULT 1.0,
|
|
error TEXT,
|
|
started_at TIMESTAMP WITH TIME ZONE,
|
|
completed_at TIMESTAMP WITH TIME ZONE,
|
|
paused_at TIMESTAMP WITH TIME ZONE,
|
|
progress NUMERIC(5, 2) DEFAULT 0, -- Progress percentage (0-100)
|
|
current_simulation_date TIMESTAMP WITH TIME ZONE, -- Current simulation date
|
|
created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(),
|
|
updated_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(),
|
|
UNIQUE(backtest_id, run_number)
|
|
);
|
|
|
|
-- Move backtest_results to reference runs instead of backtests
|
|
ALTER TABLE backtest_results DROP CONSTRAINT IF EXISTS backtest_results_backtest_id_fkey;
|
|
ALTER TABLE backtest_results RENAME COLUMN backtest_id TO run_id;
|
|
ALTER TABLE backtest_results ADD CONSTRAINT backtest_results_run_id_fkey
|
|
FOREIGN KEY (run_id) REFERENCES runs(id) ON DELETE CASCADE;
|
|
|
|
-- Create indexes for better query performance
|
|
CREATE INDEX idx_runs_backtest_id ON runs(backtest_id);
|
|
CREATE INDEX idx_runs_status ON runs(status);
|
|
CREATE INDEX idx_runs_created_at ON runs(created_at DESC);
|
|
|
|
-- Create updated_at trigger for runs
|
|
DROP TRIGGER IF EXISTS update_runs_updated_at ON runs;
|
|
CREATE TRIGGER update_runs_updated_at BEFORE UPDATE
|
|
ON runs FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
|
|
|
|
-- Create a view for easy querying of latest run per backtest
|
|
CREATE OR REPLACE VIEW latest_runs AS
|
|
SELECT DISTINCT ON (backtest_id)
|
|
r.*,
|
|
b.name as backtest_name,
|
|
b.strategy,
|
|
b.symbols,
|
|
b.start_date,
|
|
b.end_date,
|
|
b.initial_capital
|
|
FROM runs r
|
|
JOIN backtests b ON b.id = r.backtest_id
|
|
ORDER BY backtest_id, created_at DESC; |