Skip to content

Commit fc6ad3e

Browse files
authored
Add files via upload
1 parent f69f05b commit fc6ad3e

File tree

3 files changed

+582
-0
lines changed

3 files changed

+582
-0
lines changed

auto_distribute.sql

Lines changed: 165 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,165 @@
1+
/* FNC_AUTO_DISTRIBUTE */
2+
CREATE OR REPLACE FUNCTION generic.fnc_auto_distribute()
3+
RETURNS TRIGGER AS
4+
$fnc_body$
5+
DECLARE
6+
-- INSERT-waarden:
7+
_ID CHARACTER VARYING;
8+
_input_geldig_vanaf DATE;
9+
_id_kolom CHARACTER VARYING; -- De naam van de kolom die de sleutel bevat voor het betreffende record
10+
_id_kolom_d1 CHARACTER VARYING; -- _id_kolom, elk element voorafgegaan door '$1.'
11+
_id_kolom_c CHARACTER VARYING; -- _id_kolom, elk element voorafgegaan door 'c.'
12+
_id_kolom_f CHARACTER VARYING; -- _id_kolom, elk element voorafgegaan door 'f.'
13+
14+
-- Welke datum is als actueel geregistreerd
15+
_current_geldig_vanaf DATE;
16+
17+
_bestaat BOOLEAN;
18+
19+
-- Voor opbouw UPDATE-query
20+
_insert_tabel TEXT;
21+
_kolommen TEXT;
22+
_kolommen_new TEXT;
23+
_kolommen_futr TEXT;
24+
25+
_resultaten RECORD;
26+
_test TEXT;
27+
BEGIN
28+
29+
IF (NEW.geldig_vanaf IS NULL) THEN NEW.geldig_vanaf := CURRENT_DATE;
30+
END IF;
31+
_input_geldig_vanaf := NEW.geldig_vanaf;
32+
33+
-- Uitzoeken wat de '_id'-kolom is (dat is dus de primary key op de 'current'-tabel)
34+
EXECUTE FORMAT('SELECT STRING_AGG(k.column_name,'','' ORDER BY col.ordinal_position),
35+
STRING_AGG(CONCAT(''$1.'',k.column_name),'','' ORDER BY col.ordinal_position),
36+
STRING_AGG(CONCAT(''c.'',k.column_name),'','' ORDER BY col.ordinal_position),
37+
STRING_AGG(CONCAT(''f.'',k.column_name),'','' ORDER BY col.ordinal_position)
38+
FROM information_schema.table_constraints AS c,
39+
information_schema.key_column_usage AS k,
40+
information_schema.columns AS col
41+
WHERE c.table_name = ''%s'' AND
42+
c.table_schema = ''%s'' AND
43+
c.constraint_type = ''PRIMARY KEY'' AND
44+
c.constraint_name = k.constraint_name AND
45+
c.table_name = k.table_name AND
46+
c.table_schema = k.table_schema AND
47+
k.column_name = col.column_name AND
48+
c.table_name = col.table_name AND
49+
col.data_type = ''integer''
50+
', TG_TABLE_NAME,TG_TABLE_SCHEMA)
51+
INTO
52+
_id_kolom,
53+
_id_kolom_d1,
54+
_id_kolom_c,
55+
_id_kolom_f
56+
;
57+
58+
-- En de betreffende waarde bepalen
59+
EXECUTE FORMAT('SELECT CONCAT_WS('','',%s)',_id_kolom_d1) USING NEW INTO _ID;
60+
61+
-- RAISE NOTICE 'Het id (%): %', _id_kolom, _ID;
62+
63+
-- Kijken of deze uberhaupt bestaat
64+
65+
EXECUTE FORMAT('SELECT geldig_vanaf FROM ONLY %I.%I WHERE (%s) = (%s)',TG_TABLE_SCHEMA,TG_TABLE_NAME, _id_kolom, _ID) INTO _current_geldig_vanaf;
66+
67+
IF _current_geldig_vanaf IS NULL THEN
68+
-- Nee, bestaat nog niet - simpelweg toevoegen
69+
RETURN NEW;
70+
ELSE
71+
-- Ja, is al wel bekend
72+
73+
-- ------------------------------------------------------------------------------------------------
74+
-- De kolommen achter elkaar zetten
75+
SELECT STRING_AGG(QUOTE_IDENT(attname), ', '),
76+
STRING_AGG('($1).' || QUOTE_IDENT(attname), ', ') ,
77+
STRING_AGG('f.' || QUOTE_IDENT(attname), ', ')
78+
INTO _kolommen,
79+
_kolommen_new,
80+
_kolommen_futr
81+
FROM pg_catalog.pg_attribute
82+
WHERE attrelid = CONCAT(TG_TABLE_SCHEMA,'.',TG_TABLE_NAME)::regclass AND
83+
attisdropped = FALSE AND
84+
attnum > 0 AND
85+
NOT(LOWER(attname) = ANY(STRING_TO_ARRAY(_id_kolom,',')))
86+
;
87+
88+
-- RAISE NOTICE '_kolommen: %', _kolommen_new;
89+
90+
IF _current_geldig_vanaf::DATE > _input_geldig_vanaf::DATE
91+
THEN _insert_tabel = CONCAT(TG_TABLE_NAME,'_hist'); -- Dit is een (update/insert) op de HISTORISCHE tabel
92+
ELSEIF _current_geldig_vanaf::DATE = _input_geldig_vanaf::DATE THEN
93+
_insert_tabel = TG_TABLE_NAME; -- Feitelijk een update op de huidige situatie
94+
ELSE _insert_tabel = CONCAT(TG_TABLE_NAME,'_futr'); -- Dit is een (update/insert) op de TOEKOMST tabel
95+
END IF;
96+
97+
-- RAISE NOTICE '_insert_tabel: %', _insert_tabel;
98+
-- Bezien of er al een record in de juiste tabel bestaat met de opgegeven datum
99+
EXECUTE FORMAT('SELECT TRUE FROM %I.%I WHERE (%s) = (%s) AND geldig_vanaf = %L', TG_TABLE_SCHEMA, _insert_tabel, _id_kolom, _ID, _input_geldig_vanaf) INTO _bestaat;
100+
101+
-- RAISE NOTICE '_bestaat: %', _bestaat;
102+
103+
IF _bestaat IS NULL THEN
104+
-- Nog niet, dus gewoon toevoegen
105+
EXECUTE FORMAT('INSERT INTO %s VALUES ($1.*)',_insert_tabel) USING NEW;
106+
ELSE
107+
-- Jawel, bestaat al, dus een UPDATE
108+
EXECUTE FORMAT('UPDATE %I.%I SET (%s) = (%s) WHERE (%s) = (%s) AND geldig_vanaf = %L', TG_TABLE_SCHEMA, _insert_tabel, _kolommen, _kolommen_new, _id_kolom, _ID, _input_geldig_vanaf) USING NEW;
109+
END IF;
110+
111+
-- Nu de toekomsttabel doorspitten of dat er datums zijn die vóór (of gelijk aan) vandaag zijn...
112+
-- Zoja, dan zoveel mogelijk vanuit de toekomst-tabel naar de huidige / historie tabel verplaatsen...
113+
FOR _resultaten IN
114+
EXECUTE FORMAT (' SELECT CONCAT_WS('','',%s) AS _id, geldig_vanaf
115+
FROM %I.%I_futr
116+
WHERE geldig_vanaf <= CURRENT_DATE
117+
ORDER BY geldig_vanaf ASC', _id_kolom, TG_TABLE_SCHEMA, TG_TABLE_NAME)
118+
LOOP
119+
-- Voor elk legitiem toekomst record dat naar de huidige tabel moet worden verplaatst:
120+
EXECUTE FORMAT (' INSERT INTO %I.%I_hist
121+
SELECT *
122+
FROM ONLY %I.%I
123+
WHERE (%s) = (%s)',
124+
TG_TABLE_SCHEMA, TG_TABLE_NAME,
125+
TG_TABLE_SCHEMA, TG_TABLE_NAME,
126+
_id_kolom, _resultaten._id);
127+
128+
-- ... en de update op de 'huidige' tabel uitvoeren
129+
EXECUTE FORMAT('UPDATE ONLY %I.%I AS c
130+
SET (%s) = (%s)
131+
FROM ( SELECT *
132+
FROM %I.%I_futr
133+
WHERE (%s) = (%s) AND
134+
geldig_vanaf = %L) AS f
135+
WHERE (%s) = (%s) AND
136+
(%s) = (%s)',
137+
TG_TABLE_SCHEMA, TG_TABLE_NAME,
138+
_kolommen, _kolommen_futr,
139+
TG_TABLE_SCHEMA, TG_TABLE_NAME,
140+
_id_kolom, _resultaten._id,
141+
_resultaten.geldig_vanaf,
142+
_id_kolom_c, _id_kolom_f,
143+
_id_kolom_c, _resultaten._id);
144+
145+
--En de delete in de FUTR-tabel
146+
EXECUTE FORMAT (' DELETE
147+
FROM %I.%I_futr
148+
WHERE geldig_vanaf = %L AND
149+
(%s) = (%s)',
150+
TG_TABLE_SCHEMA, TG_TABLE_NAME,
151+
_resultaten.geldig_vanaf,
152+
_id_kolom, _resultaten._id);
153+
154+
-- RAISE NOTICE 'Auto-move % (%) / %', _id_kolom, _ID, _resultaten.geldig_vanaf;
155+
END LOOP;
156+
157+
-- ------------------------------------------------------------------------------------------------
158+
END IF;
159+
RETURN NULL; -- Rest, van wat er zou gebeuren, niet meer doen...
160+
END;
161+
$fnc_body$
162+
LANGUAGE plpgsql
163+
SECURITY DEFINER
164+
SET search_path = generic, pg_temp
165+
;

0 commit comments

Comments
 (0)