repos
1.6 KB raw
-- Phase 7: rekey the fundamentals uniqueness constraint.
--
-- 0001 keyed `fundamentals` UNIQUE on (ticker, metric, period_end). That breaks
-- once both annual and quarterly figures are stored: a full-year revenue and a
-- fourth-quarter revenue can share the same period_end (the fiscal year end),
-- so one would overwrite the other. The fiscal `period` label ('FY2024' vs
-- 'Q4-2024') is the value that is genuinely unique per figure, so the key moves
-- there.
--
-- SQLite cannot alter a table constraint in place, and `fundamentals` is still
-- empty (Phase 7 introduces its first writer), so the table is simply recreated.

DROP TABLE IF EXISTS fundamentals;

CREATE TABLE fundamentals (
    id          INTEGER PRIMARY KEY AUTOINCREMENT,
    ticker      TEXT NOT NULL REFERENCES symbols(ticker) ON DELETE CASCADE,
    metric      TEXT NOT NULL,   -- revenue | net_income | eps_diluted | shares_diluted
                                 -- | dividends_per_share | assets | liabilities | equity
                                 -- | assets_current | liabilities_current
    period      TEXT NOT NULL,   -- 'FY2024' or 'Q3-2024'
    fiscal_year INTEGER NOT NULL,
    fiscal_qtr  INTEGER,         -- NULL for a full-year figure
    period_end  TEXT NOT NULL,   -- YYYY-MM-DD
    value       REAL NOT NULL,
    unit        TEXT,            -- USD | USD/shares | shares
    form        TEXT,            -- 10-K | 10-Q
    filed_at    TEXT,            -- YYYY-MM-DD
    UNIQUE (ticker, metric, period)
);
CREATE INDEX fundamentals_ticker_metric ON fundamentals(ticker, metric, period_end DESC);