Data aggregation and distribution service: - Market data collection - OHLCV aggregation - Real-time data feeds - Data API endpoints Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
55 lines
2.5 KiB
PL/PgSQL
55 lines
2.5 KiB
PL/PgSQL
-- Migration: Add sync_status table
|
|
-- OrbiQuant IA Trading Platform - Data Service
|
|
-- Date: 2024-12-08
|
|
-- Purpose: Track synchronization status for market data
|
|
|
|
-- Create sync_status table
|
|
CREATE TABLE IF NOT EXISTS market_data.sync_status (
|
|
id SERIAL PRIMARY KEY,
|
|
ticker_id INTEGER NOT NULL REFERENCES market_data.tickers(id) ON DELETE CASCADE,
|
|
timeframe VARCHAR(20) NOT NULL,
|
|
last_sync_timestamp TIMESTAMP,
|
|
last_sync_rows INTEGER DEFAULT 0,
|
|
sync_status VARCHAR(20) NOT NULL DEFAULT 'pending',
|
|
error_message TEXT,
|
|
created_at TIMESTAMP DEFAULT NOW(),
|
|
updated_at TIMESTAMP DEFAULT NOW(),
|
|
|
|
-- Constraints
|
|
CONSTRAINT unique_ticker_timeframe UNIQUE (ticker_id, timeframe),
|
|
CONSTRAINT valid_status CHECK (sync_status IN ('pending', 'in_progress', 'success', 'failed', 'partial'))
|
|
);
|
|
|
|
-- Indexes for performance
|
|
CREATE INDEX IF NOT EXISTS idx_sync_status_ticker_id ON market_data.sync_status(ticker_id);
|
|
CREATE INDEX IF NOT EXISTS idx_sync_status_timeframe ON market_data.sync_status(timeframe);
|
|
CREATE INDEX IF NOT EXISTS idx_sync_status_status ON market_data.sync_status(sync_status);
|
|
CREATE INDEX IF NOT EXISTS idx_sync_status_last_sync ON market_data.sync_status(last_sync_timestamp);
|
|
|
|
-- Comments
|
|
COMMENT ON TABLE market_data.sync_status IS 'Tracks synchronization status for market data from external providers';
|
|
COMMENT ON COLUMN market_data.sync_status.ticker_id IS 'Reference to ticker being synced';
|
|
COMMENT ON COLUMN market_data.sync_status.timeframe IS 'Timeframe being synced (1min, 5min, 1hour, etc)';
|
|
COMMENT ON COLUMN market_data.sync_status.last_sync_timestamp IS 'Last successful sync timestamp';
|
|
COMMENT ON COLUMN market_data.sync_status.last_sync_rows IS 'Number of rows inserted in last sync';
|
|
COMMENT ON COLUMN market_data.sync_status.sync_status IS 'Status: pending, in_progress, success, failed, partial';
|
|
COMMENT ON COLUMN market_data.sync_status.error_message IS 'Error message if sync failed';
|
|
|
|
-- Create updated_at trigger
|
|
CREATE OR REPLACE FUNCTION update_sync_status_timestamp()
|
|
RETURNS TRIGGER AS $$
|
|
BEGIN
|
|
NEW.updated_at = NOW();
|
|
RETURN NEW;
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
CREATE TRIGGER sync_status_updated_at
|
|
BEFORE UPDATE ON market_data.sync_status
|
|
FOR EACH ROW
|
|
EXECUTE FUNCTION update_sync_status_timestamp();
|
|
|
|
-- Grant permissions (adjust as needed)
|
|
GRANT SELECT, INSERT, UPDATE, DELETE ON market_data.sync_status TO orbiquant_user;
|
|
GRANT USAGE, SELECT ON SEQUENCE market_data.sync_status_id_seq TO orbiquant_user;
|