Annotation: core.get_associated_units

CREATE OR REPLACE FUNCTION core.get_associated_units(integer)
RETURNS TABLE(unit_id integer, unit_code text, unit_name text)

Information: core.get_associated_units

Schema core
Function Name get_associated_units
Arguments integer
Owner postgres
Result Type TABLE(unit_id integer, unit_code text, unit_name text)
Description

Implementation: core.get_associated_units

CREATE OR REPLACE FUNCTION core.get_associated_units(integer)
 RETURNS TABLE(unit_id integer, unit_code text, unit_name text)
 LANGUAGE plpgsql
AS $function$
    DECLARE root_unit_id integer;
BEGIN
    CREATE TEMPORARY TABLE IF NOT EXISTS temp_unit(unit_id integer) ON COMMIT DROP; 
    
    SELECT core.get_root_unit_id($1) INTO root_unit_id;
    
    INSERT INTO temp_unit(unit_id) 
    SELECT root_unit_id
    WHERE NOT EXISTS
    (
        SELECT * FROM temp_unit
        WHERE temp_unit.unit_id=root_unit_id
    );
    
    WITH RECURSIVE cte(unit_id)
    AS
    (
         SELECT 
            compare_unit_id
         FROM 
            core.compound_units
         WHERE 
            base_unit_id = root_unit_id

        UNION ALL

         SELECT
            units.compare_unit_id
         FROM 
            core.compound_units units
         INNER JOIN cte 
         ON cte.unit_id = units.base_unit_id
    )
    
    INSERT INTO temp_unit(unit_id)
    SELECT cte.unit_id FROM cte;
    
    DELETE FROM temp_unit
    WHERE temp_unit.unit_id IS NULL;
    
    RETURN QUERY 
    SELECT 
        core.units.unit_id,
        core.units.unit_code::text,
        core.units.unit_name::text
    FROM
        core.units
    WHERE
        core.units.unit_id 
    IN
    (
        SELECT temp_unit.unit_id FROM temp_unit
    );
END
$function$