HEX
Server: Apache/2.4.63 (Unix)
System: Linux Synopilou92 4.4.302+ #72806 SMP Mon Jul 21 23:16:00 CST 2025 x86_64
User: pilou92 (1026)
PHP: 8.0.30
Disabled: NONE
Upload Files
File: /volume1/@appstore/SynologyPhotos/etc/sql/35.sql
ALTER TABLE public.one_filter_has_many_unit
  ADD COLUMN IF NOT EXISTS is_major bool NOT NULL DEFAULT true;
CREATE OR REPLACE FUNCTION public.update_one_filter_has_many_unit_is_major_func()
  RETURNS trigger
  LANGUAGE plpgsql
  VOLATILE
  CALLED ON NULL INPUT
  SECURITY INVOKER
  COST 1
  AS $$
DECLARE
  one_filter_has_many_unit_table text;
BEGIN
  one_filter_has_many_unit_table = TG_TABLE_SCHEMA || '.one_filter_has_many_unit';
  EXECUTE format('UPDATE %s SET is_major = %L WHERE id_unit = %L AND id_user = %L', one_filter_has_many_unit_table, NEW.is_major, OLD.id, OLD.id_user);
  RETURN NULL;
END;
$$;
DROP TRIGGER IF EXISTS update_one_filter_has_many_unit_is_major_trigger ON public.unit CASCADE;
CREATE TRIGGER update_one_filter_has_many_unit_is_major_trigger
  AFTER UPDATE OF is_major ON public.unit
  FOR EACH ROW
  EXECUTE PROCEDURE public.update_one_filter_has_many_unit_is_major_func();
CREATE OR REPLACE FUNCTION public.update_one_filter_has_many_unit_func ()
  RETURNS trigger
  LANGUAGE plpgsql
  VOLATILE
  CALLED ON NULL INPUT
  SECURITY INVOKER
  COST 1
  AS $$
DECLARE
  one_filter_has_many_unit_table text;
  target_column text;
  filter_type text;
  is_major boolean;
BEGIN
  filter_type = COALESCE(NEW.filter_type, OLD.filter_type);
  IF (filter_type IN (
    'aperture',
    'camera',
    'exposure_time',
    'flash',
    'focal_length',
    'folder',
    'iso',
    'item_type',
    'lens',
    'takentime',
    'rating'
  ))
  THEN
    one_filter_has_many_unit_table = TG_TABLE_SCHEMA || '.one_filter_has_many_unit';
    target_column = 'id_' || filter_type;
    IF (TG_OP = 'INSERT') THEN
      EXECUTE format('SELECT is_major FROM unit WHERE unit.id = %L', NEW.id_unit) INTO is_major;
      EXECUTE format('INSERT INTO %s (id_unit, %s, id_user, is_major) VALUES (%L, %L, %L, %L) ON CONFLICT (id_unit) DO UPDATE SET %s = %L', one_filter_has_many_unit_table, target_column, NEW.id_unit, NEW.id_filter, NEW.id_user, is_major, target_column, NEW.id_filter);
    ELSIF (TG_OP = 'DELETE') THEN
      IF (filter_type IN ('rating')) THEN
        EXECUTE format('UPDATE %s SET %s = 0 WHERE id_unit = %L', one_filter_has_many_unit_table, target_column, OLD.id_unit);
      ELSE
        EXECUTE format('UPDATE %s SET %s = NULL WHERE id_unit = %L', one_filter_has_many_unit_table, target_column, OLD.id_unit);
      END IF;
    ELSIF (TG_OP = 'UPDATE') THEN
      EXECUTE format('UPDATE %s SET %s = %L WHERE id_unit = %L AND id_user = %L', one_filter_has_many_unit_table, target_column, NEW.id_filter, NEW.id_unit, NEW.id_user);
    END IF;
  END IF;
  RETURN NULL;
END;
$$;
DROP TRIGGER IF EXISTS update_person_item_count_trigger ON public.face CASCADE;
DROP FUNCTION IF EXISTS public.update_person_item_count_func() CASCADE;
CREATE OR REPLACE VIEW public.person_face_view
AS
SELECT
  face.id,
  face.id_user,
  id_person,
  id_unit,
  score,
  is_major,
  id_item
FROM face, unit
WHERE unit.id = face.id_unit AND unit.id_user = face.id_user;