Alejandro Acuña
2024-08-12 831c7bd85763b5eb5ef46664c65f0181824f9e13
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
DO 
$BODY$
BEGIN
    
    IF NOT EXISTS (SELECT FROM pg_catalog.pg_roles WHERE rolname = 'aluvisa') THEN
      CREATE USER aluvisa WITH ENCRYPTED PASSWORD 'aluvisa' LOGIN SUPERUSER INHERIT CREATEDB CREATEROLE REPLICATION;
    END IF;
   
   
    IF NOT EXISTS (SELECT spcname, pg_tablespace_location(oid) FROM pg_tablespace WHERE spcname = 'ARTICHISTORICAL') THEN
      CREATE TABLESPACE "ARTICHISTORICAL" OWNER aluvisa LOCATION 'D:\database\ARTICHISTORICAL';
    END IF;
    
    ALTER TABLESPACE "ARTICHISTORICAL" OWNER TO aluvisa;
    
    IF NOT EXISTS (SELECT FROM pg_database WHERE datname = 'ARTICHISTORICAL') THEN
      CREATE DATABASE "ARTICHISTORICAL"  WITH OWNER = aluvisa TEMPLATE = 'template0' ENCODING = 'UTF8' LC_COLLATE = 'C' LC_CTYPE = 'C' TABLESPACE = "ARTICHISTORICAL"  CONNECTION LIMIT = -1;
    END IF;
    
     
END
$BODY$;
 
 
 
CREATE UNLOGGED TABLE IF NOT EXISTS measurement 
(
    city_id         int not null,
    logdate         date not null,
    peaktemp        int,
    unitsales       int
PARTITION BY RANGE (logdate);
 
 
CREATE UNLOGGED TABLE IF NOT EXISTS measurement_2018 PARTITION OF measurement FOR VALUES FROM ('2018-01-01') TO ('2019-01-01');
CREATE UNLOGGED TABLE IF NOT EXISTS measurement_2019 PARTITION OF measurement FOR VALUES FROM ('2019-01-01') TO ('2020-01-01');
CREATE UNLOGGED TABLE IF NOT EXISTS measurement_2020 PARTITION OF measurement FOR VALUES FROM ('2020-01-01') TO ('2021-01-01');
 
 
 
CREATE INDEX IF NOT EXISTS index_logdate ON measurement_2018 (logdate);
CREATE INDEX IF NOT EXISTS index_logdate ON measurement_2019 (logdate);
CREATE INDEX IF NOT EXISTS index_logdate ON measurement_2020 (logdate);
 
 
 
 
 
 
CREATE OR REPLACE PROCEDURE measurement_creator(in inputtimestamp bigint)
 
LANGUAGE 'plpgsql'
 
AS $BODY$
 
DECLARE
 
 subtable VARCHAR(16);
 timestamp1 VARCHAR(16);
 timestamp2 VARCHAR(16);
 usetimestamp bigint;
 
BEGIN
 
    IF (inputtimestamp = 0) then
        SELECT extract(epoch from now() AT TIME ZONE 'UTC') into usetimestamp::bigint;
        ELSE
        usetimestamp := inputtimestamp;
    END IF;
 
    raise notice 'Value: %', usetimestamp;
 
    subtable :=  to_char(to_timestamp(usetimestamp), 'YYYY_MM');
    timestamp1 :=  to_char(to_timestamp(usetimestamp), 'YYYY-MM') || '-01';
    timestamp2 :=  to_char(to_timestamp(usetimestamp) + interval '1 month' , 'YYYY-MM') || '-01';
 
 
    raise notice 'Value: %', subtable;
    raise notice 'Value: %', timestamp1;
    raise notice 'Value: %', timestamp2;
    
 
    EXECUTE 'CREATE TABLE IF NOT EXISTS measurement_' || subtable || ' PARTITION OF measurement FOR VALUES FROM (' || quote_literal(timestamp1) || ') TO ('  || quote_literal(timestamp2) || ')';
    
    
END;
$BODY$;