File: /volume1/@appstore/SynologyPhotos/etc/sql/55.sql
ALTER TABLE public.concept_album_additional
ADD COLUMN IF NOT EXISTS visibility_status smallint NOT NULL DEFAULT 0;
DROP FUNCTION IF EXISTS public.concept_album_list(integer);
CREATE FUNCTION public.concept_album_list(user_id integer)
RETURNS TABLE(
id_concept integer,
stem text,
parent integer[],
display_threshold smallint,
sort_index integer,
item_count bigint,
default_cover_id_unit integer[],
custom_cover_id_unit integer,
visibility_status smallint
) AS $$ BEGIN RETURN QUERY
WITH main AS(
SELECT concept.id AS id_concept,
(
SELECT caa.custom_cover_id_unit
FROM concept_album_additional caa
WHERE concept.id = caa.id_concept
AND caa.id_user = user_id
) as custom_cover_unit_id,
(
SELECT caa.item_count
FROM concept_album_additional caa
WHERE concept.id = caa.id_concept
AND caa.id_user = user_id
) as item_count,
ARRAY(
(
SELECT m.id_unit
FROM many_unit_has_many_concept m
JOIN unit ON unit.id = m.id_unit
WHERE m.id_user = user_id
AND concept.id = m.id_concept
AND unit.is_major = true
ORDER BY m.confidence
LIMIT 5
)
) as default_cover_id_unit,
(
SELECT caa.visibility_status
FROM concept_album_additional caa
WHERE concept.id = caa.id_concept
AND caa.id_user = user_id
) as visibility_status
FROM concept
WHERE concept.hidden = false
ORDER BY concept.sort_index
)
SELECT main.id_concept,
concept.stem,
concept.parent,
concept.display_threshold,
concept.sort_index,
main.item_count,
main.default_cover_id_unit,
CASE
WHEN (
EXISTS(
SELECT 1
FROM many_unit_has_many_concept m
WHERE m.id_unit = main.custom_cover_unit_id
AND m.id_concept = main.id_concept
)
) THEN main.custom_cover_unit_id
ELSE NULL
END as custom_cover_id_unit,
main.visibility_status
FROM main
JOIN concept on concept.id = main.id_concept;
END;
$$ LANGUAGE plpgsql;