Action: map
Lihtne "create table as" klots. Tulemtabeli tekitamiseks andmebaasis juba olemasolevate tabelite põhjal (st andmete teisendus) (st task_id esimene komponent on "inner").
Tabeli loomine tervikuna
actions:
- do: map
file: create.sql
Tegevus tugineb PostgreSQL võimekusele luua tabelit SELECT käsu põhjal ning siduda SELECT käsus kokku mitme erineva skeemi tabeleid.
Alati tehakse eelnev DROP (tark DROP ehk dünaamiline drop, mis sõltub objekti tüübist, ümbertee Postgre väikesele kiiksule unikaalsuse ja tüübi teemal). create.sql failides võib mõnikord näha ka drop table käsku, aga see on liiane (aktsioon "map" eemaldab tabeli enne siinse käsuni jõudmist) ning teenib ainult drop-aspekti meelespidamise eesmärki.
Sisendiks fail (soovituslikult nimega create.sql), mille sisuks on vähemalt 2 SQL käsku: tabeli loomise käsk ja tabelile kommentaari panemise käsk (see viimane on pigem hea tava, kui kohustus).
create.sql sisu
CREATE TABLE {{target_schema}}.{{target_table}} AS (
SELECT
toim.toiming_lopp_ts :: date AS syndmus_kp -- deklareeri väljatüüp läbi castingu operaatori, deklareeri tulemtabeli veerunimi AS abil
, asut.ylemus_nimi -- nii võib ... aga täiendamisel olla hoolikas, sest .. vt järgmine rida
, coalesce(asut.ylemus_nimi, 'puudub') AS ylemus_nimi -- siin on juba vaja nimi määrata, muidu paneb Postgre ise midagi suvalist
, asut.nimi AS asutus_nimi -- aga siin oleks ühe alustabeli lühikese (kontekstist arusaadava) veerunime kasutamine segadusse ajav, sest kontekst on teine, kasutada "uut" nime
, dwh.to_date_formats(split_part(trim(x2.string_value), ' ' , 1), array['DD.MM.YYYY', 'MM/DD/YYYY']) AS synniaeg_kp -- mitteusaldusväärsest tekstist kuupäeva väljalugemiseks kasuta custom fni
, dwh.f_date(x2.iadrkehtibkunikp) AS viibimiskoht_kehtib_kuni_kp -- on select-osas samaväärne järgmisega
, ia.kehtibkunikpv :: date AS litsents_kehtib_kuni_kp -- postgre "timestamp with time zone" lihtkonvertimine kuupäevaks on lubatud (kontekst on teada)
....
FROM dwh.dim_asutus asut
JOIN ....
WHERE dwh.f_date(x2.kehtibkunikp) = '2023-10-03' -- selle peale saab teha indeksi (vt allpool näidet)
AND x2.kehtibkunikp :: date = '2023-10-03' -- aga selle peale ei saa (postgre "timestamp with time zone" ei konvertu üheselt kuupäevaks universaalselt (indeksi loomise ajal pole piisav kontekst teada)
);
COMMENT ON TABLE {{target_schema}}.{{target_table}} is '....';
SQL-failis võib (ja ongi tungivalt soovitatav) kasutada tabeli ja skeemi asemel ülaltoodud koodilõigus näha olevaid kohahoidjaid (topelt-loogelistes-sulgudes).
Kui on teada tulemtabeli kasutusjuhud, siis võib kohe lõppu ära lisada ka indeksite loomised (kasuta nähaolevat soovituslikku mustrit indeksi nime jaoks, kõrvalekalle ainult juhul kui mustri järgi tuleks indeksi nime pikkuseks üle 63 märgi):
Indeksite tegemine
CREATE INDEX IF NOT EXISTS ix_{{target_table}}_4_asutus_id on {{target_schema}}.{{target_table}} (asutus_id);
CREATE INDEX IF NOT EXISTS ix_{{target_table}}_4_toiming_liik_id on {{target_schema}}.{{target_table}} (toiming_liik_id);
CREATE INDEX IF NOT EXISTS ix_{{target_table}}_4_kehtibalateskp ON {{target_schema}}.{{target_table}} ((dwh.f_date(kehtibalateskp))) -- jälgi topelt-sulgusid!!