Ports the leaf data-layer modules and validates them: - mschema/ (models, eligibility, merge, render), db/ (connection, sampling, introspect, fetch_ca), rest/client.py -- renamed psdwp3->nsp, verbatim. - L0 (testcontainers, real Postgres): db connection read-only enforcement (psd_ro cannot CREATE/INSERT), introspect against a known schema (tables, columns, types, comments, FKs, enum, composite PK), sampling most-frequent values + truncation reporting. 15 tests, ~4s. - L1 (fake data): rest/client RPC contract (mocked transport -- X-API-Key header, payloads, base_url slash handling, HTTP/network error surfacing), mschema/render 3 formats (markdown, mschema-text, schema-dict) + eligibility rules (wide_text excluded, short_text/numeric/enum/temporal/ boolean eligible, annotation override wins). 25 tests. pyproject registers l0/l2 markers + addopts '-m not l2' (L2 opt-in). Deferred to their dependency-porting tasks: test_rrf.py (search needs vectorstore, B3) and the 11 CLI contract tests (need _guards/session, wired when each command lands). 'Not assumed reliable' now has real teeth for the data layer; CLI/search contracts follow.
59 lines
2.6 KiB
SQL
59 lines
2.6 KiB
SQL
CREATE SCHEMA dw;
|
|
|
|
CREATE TABLE dw.dim_pazienti (
|
|
id_paziente BIGINT PRIMARY KEY,
|
|
nome VARCHAR(100),
|
|
citta VARCHAR(100)
|
|
);
|
|
COMMENT ON TABLE dw.dim_pazienti IS 'Anagrafica pazienti';
|
|
COMMENT ON COLUMN dw.dim_pazienti.citta IS 'Comune di residenza';
|
|
|
|
CREATE TABLE dw.dim_periodi (
|
|
anno INT NOT NULL,
|
|
mese INT NOT NULL,
|
|
descrizione VARCHAR(50),
|
|
PRIMARY KEY (anno, mese)
|
|
);
|
|
|
|
CREATE TYPE dw.tipo_ricovero AS ENUM ('ordinario', 'day_hospital', 'urgenza');
|
|
|
|
CREATE TABLE dw.fct_ricoveri (
|
|
id_ricovero BIGINT PRIMARY KEY,
|
|
id_paziente BIGINT REFERENCES dw.dim_pazienti (id_paziente),
|
|
anno INT,
|
|
mese INT,
|
|
diagnosi VARCHAR(200),
|
|
procedura TEXT,
|
|
reparto VARCHAR(50),
|
|
tipo dw.tipo_ricovero,
|
|
lettera_dimissione TEXT,
|
|
etl_last_update TIMESTAMP,
|
|
FOREIGN KEY (anno, mese) REFERENCES dw.dim_periodi (anno, mese)
|
|
);
|
|
COMMENT ON TABLE dw.fct_ricoveri IS 'Fatti: ricoveri ospedalieri';
|
|
COMMENT ON COLUMN dw.fct_ricoveri.diagnosi IS 'Diagnosi principale (testo)';
|
|
|
|
INSERT INTO dw.dim_pazienti VALUES
|
|
(1, 'Mario Rossi', 'Milano'),
|
|
(2, 'Anna Bianchi', 'Bergamo'),
|
|
(3, 'Luca Verdi', 'Brescia');
|
|
INSERT INTO dw.dim_periodi VALUES
|
|
(2025, 1, 'Gennaio 2025'), (2025, 2, 'Febbraio 2025');
|
|
INSERT INTO dw.fct_ricoveri VALUES
|
|
(10, 1, 2025, 1, 'fibrillazione atriale', 'ablazione transcatetere', 'cardiologia', 'ordinario',
|
|
'Si dimette il paziente in condizioni cliniche stabili dopo ablazione transcatetere della fibrillazione atriale; si raccomanda terapia anticoagulante orale e controllo cardiologico ambulatoriale a trenta giorni dalla dimissione.',
|
|
'2025-02-01 03:00:00'),
|
|
(11, 2, 2025, 1, 'infarto miocardico acuto', 'angioplastica coronarica', 'cardiologia', 'urgenza',
|
|
'Paziente ricoverato per infarto miocardico acuto trattato con angioplastica coronarica primaria e impianto di stent medicato; decorso post-procedurale regolare, si dimette con doppia antiaggregazione e indicazione a riabilitazione cardiologica.',
|
|
'2025-02-01 03:00:00'),
|
|
(12, 3, 2025, 2, 'fibrillazione ventricolare', 'defibrillazione', 'cardiologia', 'urgenza',
|
|
'Ricovero in urgenza per fibrillazione ventricolare con arresto cardiocircolatorio rianimato; stabilizzato in terapia intensiva cardiologica, si dimette con indicazione a impianto di defibrillatore e follow-up elettrofisiologico.',
|
|
'2025-03-01 03:00:00'),
|
|
(13, 1, 2025, 2, 'scompenso cardiaco', NULL, 'pronto soccorso', 'ordinario', NULL, '2025-03-01 03:00:00');
|
|
|
|
CREATE ROLE psd_ro LOGIN PASSWORD 'psd_ro';
|
|
GRANT USAGE ON SCHEMA dw TO psd_ro;
|
|
GRANT SELECT ON ALL TABLES IN SCHEMA dw TO psd_ro;
|
|
|
|
ANALYZE;
|