diff --git a/schema/triggers/log_insert.sql b/schema/triggers/log_insert.sql index f58288a..497cedb 100644 --- a/schema/triggers/log_insert.sql +++ b/schema/triggers/log_insert.sql @@ -1,52 +1,49 @@ - -WITH - NEW as ( - SELECT $${ - "gl": { - "lines": [ - { - "amount": 2.19, - "account": "h.food" - }, - { - "amount": -2.19, - "account": "h.dcard" - } - ], - "jpath": [ - [ - "{item,0}", - "{header}" - ], - [ - "{item,0}", - "{header}" - ] - ] - }, - "item": [ - { - "item": "green olives", - "amount": 2.19, - "reason": "food", - "account": "h.food" - } - ], - "header": { - "entity": "home", - "module": "MHI", - "offset": "h.dcard", - "transaction": "purchase" - } -}$$::jsonb bpr +CREATE FUNCTION log_insert() RETURNS trigger + LANGUAGE plpgsql + AS + $func$ + BEGIN + WITH + ------------------------------------full extraction------------------------------------------- + full_ex AS ( + SELECT + ins.id + ,a.i gl_line + ,a.rn gl_row + ,NEW.bpr#>ARRAY['gl','jpath',(a.rn - 1)::text] gl_ref + ,p.i ref_line + ,p.rn ref_row + ,NEW.bpr#>(p.i->>0)::text[] bpr_extract + FROM + ins + --gl array hold each gl line + LEFT JOIN LATERAL JSONB_ARRAY_ELEMENTS(NEW.bpr->'gl'->'lines') WITH ORDINALITY a(i, rn) ON TRUE + --for each + LEFT JOIN LATERAL JSONB_ARRAY_ELEMENTS(NEW.bpr#>ARRAY['gl','jpath',(a.rn - 1)::text]) WITH ORDINALITY p(i, rn) ON TRUE ) -SELECT - * -FROM - NEW - --gl array hold each gl line - LEFT JOIN LATERAL JSONB_ARRAY_ELEMENTS(NEW.bpr->'gl') WITH ORDINALITY gl(i, rn) ON TRUE - --eaxpand the array of gl lines - LEFT JOIN LATERAL JSONB_ARRAY_ELEMENTS(gl.i->'lines') WITH ORDINALITY a(i, rn) ON TRUE - --for each - LEFT JOIN LATERAL JSONB_ARRAY_ELEMENTS(gl.i->'jpath') WITH ORDINALITY p(i, rn) ON TRUE \ No newline at end of file + --------------------------------re-ggregate extraction to gl line level---------------------- + ,ex_gl_line + SELECT + id + ,gl_line->>'account' account + ,(gl_line->>'amount')::numeric amount + ,gl_row + ,gl_ref + ,public.jsonb_concat(bpr_extract) ref_extract + FROM + full_ex + GROUP BY + id + ,gl_line + ,gl_row + ,gl_ref; + RETURN NULL; + END; + $func$ + + +CREATE TRIGGER log_insert + AFTER INSERT ON log + REFERENCING NEW TABLE AS ins + FOR EACH STATEMENT + EXECUTE PROCEDURE log_insert(); \ No newline at end of file