stock-bot/database/postgres/init/04-provider-exchange-mapping-schema.sql
2025-06-17 23:19:12 -04:00

73 lines
No EOL
3.1 KiB
SQL

-- Enhanced Schema with Provider Exchange Mappings
-- Connect to trading_bot database
\c trading_bot;
-- First, rename is_active to active in existing tables
ALTER TABLE IF EXISTS exchanges RENAME COLUMN is_active TO active;
ALTER TABLE IF EXISTS symbols RENAME COLUMN is_active TO active;
-- Provider Exchange Mappings Table
-- Maps provider-specific exchange codes to our master exchanges
CREATE TABLE IF NOT EXISTS provider_exchange_mappings (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
provider VARCHAR(50) NOT NULL, -- 'qm', 'eod', 'ib', etc.
provider_exchange_code VARCHAR(50) NOT NULL, -- Provider's exchange code: 'NYE', 'US', 'NASDAQ'
provider_exchange_name VARCHAR(255), -- Provider's exchange name
master_exchange_id UUID REFERENCES exchanges(id),
country_code CHAR(2), -- Provider's country code
currency CHAR(3), -- Provider's currency
confidence DECIMAL(3,2) DEFAULT 0.8, -- Mapping confidence (0.0 to 1.0)
active BOOLEAN DEFAULT false, -- Manual activation flag
verified BOOLEAN DEFAULT false, -- Manually verified flag
auto_mapped BOOLEAN DEFAULT true, -- Was this auto-created by sync?
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW(),
UNIQUE(provider, provider_exchange_code)
);
-- Create indexes for provider exchange mappings
CREATE INDEX IF NOT EXISTS idx_provider_exchange_mappings_provider ON provider_exchange_mappings(provider);
CREATE INDEX IF NOT EXISTS idx_provider_exchange_mappings_master ON provider_exchange_mappings(master_exchange_id);
CREATE INDEX IF NOT EXISTS idx_provider_exchange_mappings_active ON provider_exchange_mappings(provider, active);
-- Update existing exchanges to be inactive by default (for new syncs)
-- But preserve any existing active status
-- This only affects future INSERTs, not existing data
-- Add some useful views for management
CREATE OR REPLACE VIEW exchange_provider_summary AS
SELECT
e.code as master_code,
e.name as master_name,
e.country,
e.currency,
e.active as master_active,
COUNT(pem.id) as provider_mappings,
COUNT(CASE WHEN pem.active = true THEN 1 END) as active_mappings,
COUNT(CASE WHEN pem.verified = true THEN 1 END) as verified_mappings,
STRING_AGG(DISTINCT pem.provider, ', ') as providers
FROM exchanges e
LEFT JOIN provider_exchange_mappings pem ON e.id = pem.master_exchange_id
GROUP BY e.id, e.code, e.name, e.country, e.currency, e.active
ORDER BY e.code;
CREATE OR REPLACE VIEW provider_exchange_details AS
SELECT
pem.provider,
pem.provider_exchange_code,
pem.provider_exchange_name,
pem.country_code,
pem.currency,
pem.active,
pem.verified,
pem.auto_mapped,
pem.confidence,
e.code as master_exchange_code,
e.name as master_exchange_name,
e.active as master_active
FROM provider_exchange_mappings pem
JOIN exchanges e ON pem.master_exchange_id = e.id
ORDER BY pem.provider, pem.provider_exchange_code;
-- Show what we created
SELECT 'Enhanced provider exchange mapping schema created' as status;