
CREATE SCHEMA IF NOT EXISTS public ;


-- nettoyage

BEGIN ;
-- Pour accélérer
SET LOCAL work_mem TO '100MB';

-- Une table des machines
CREATE TABLE machines  (   id_machine  int  PRIMARY KEY,
                            type        smallint       NOT NULL,
                            code        varchar (10)   NOT NULL,
                            description varchar (50),
                            active      boolean,
                            UNIQUE (type,code)
                       ) ;
-- Les valeurs des capteurs sur ces machines
CREATE TABLE donnees
                        (   -- clé étrangère
                            id_machine  int     NOT NULL REFERENCES machines, 
                            capteur     char(1) NOT NULL,
                            horodatage  timestamp with time zone,
                            valeur1     int,
                            valeur2     int,
                            valeur3     float
                        ) ;

-- Insertions
INSERT INTO machines (id_machine, type, code, description, active)
SELECT  i,
        CASE mod (i,2) WHEN 0 THEN 1 ELSE mod (i,13) END,
        upper (left(md5(i::text),6)),
        'M-'||md5(i::text),
        (i in (1,5,10,200) or i between 50 and 100)
FROM generate_series (1,1000) i
ORDER BY md5(i::text) ;

INSERT INTO donnees (id_machine, capteur, horodatage, valeur1, valeur2, valeur3)
SELECT * FROM (
    SELECT  m.id_machine,
            chr(64+c.c) AS capteur,
            '2023-01-01 00:00:00'::timestamptz + id_machine * interval '1d' + d * interval '10s' AS horodatage,
            mod (m.id_machine * d, 148313),
            d / m.id_machine,
            cos (d)
    FROM    machines m
    CROSS JOIN generate_series (1,9,2) c,
    LATERAL (SELECT d FROM generate_series (1, m.id_machine*c.c*c.c*c.c ) d ) AS dd
    WHERE m.active
) x
ORDER BY horodatage, id_machine, capteur ASC
;

-- Créations d'index
CREATE INDEX ON donnees (capteur) ;
CREATE INDEX ON donnees (id_machine) ;
CREATE INDEX ON donnees (horodatage) ;

COMMIT ;

