* Define initial warehouse schema * Add session id as the primary key to the session accumulating fact table * Insert a row to use instead of nulls in the time and date dimensions * Add missing attributes and a partial index * Rename files * Refactor: move fact table to a separate migration * Add domain types for the warehouse * Add session connection transaction fact table * Change columns to match ingress data types * Add views for host dimension ingress * Create source and target views for the host and user dimensions * Generate random ID for dimension table primary key * Formatting changes * Add current dimension id to target views * Implement upsert function for host dimension * Use domain types for upsert function parameters * Fix indentation * Add wh_public_id domain type * Fix value of type columns when the other columns are null * Implement upsert function for user dimension * Add warehouse domain types for timestamps and text fields * Move fact table migrations to a higher number * Add functions for getting the current date and current time IDs * Rename backend to endpoint in column names * Rename fact tables The fact tables are actually accumulating fact tables not transactional fact tables. * Add default value to connection_authorized_time column * Update session fact table * Add session_max_seconds, session_connection_limit, and default_port to wh_host_dimension * Move session table above connection table * Add after insert trigger to session table for warehouse ingress * Add fk from connection warehouse table to session warehouse table * Implement insert trigger for session connections * Update warehouse for a user having multiple auth accounts * Rename warehouse columns to be consistent with operational tables * Add connection specific columns to the connection fact table * Update session calculations in warehouse * Rename functions and formatting changes * Rename session columns to match names of session states * Implement warehouse triggers for session and connection state changes * Run 'make migrations' * Use a static start and end date for the warehouse date dimension * Document warehouse functions * Remove outdated TODO comments * Add TODO comments for additional dimensions and fact table columns
98 lines
3.7 KiB
PL/PgSQL
98 lines
3.7 KiB
PL/PgSQL
begin;
|
|
|
|
create table wh_date_dimension (
|
|
id integer primary key,
|
|
date date not null,
|
|
calendar_quarter wh_dim_text,
|
|
calendar_month wh_dim_text,
|
|
calendar_year smallint not null,
|
|
day_of_week wh_dim_text,
|
|
day_of_week_number smallint not null,
|
|
day_of_week_number_iso smallint not null,
|
|
day_of_week_number_zero_based smallint not null,
|
|
day_number_in_calendar_month smallint not null,
|
|
day_number_in_calendar_year smallint not null,
|
|
weekday_indicator wh_dim_text
|
|
);
|
|
|
|
insert into wh_date_dimension (
|
|
id, date,
|
|
calendar_quarter, calendar_month, calendar_year,
|
|
day_of_week, day_of_week_number, day_of_week_number_iso, day_of_week_number_zero_based,
|
|
day_number_in_calendar_month, day_number_in_calendar_year,
|
|
weekday_indicator
|
|
) values (
|
|
-1, 'infinity',
|
|
'None', 'None', -1,
|
|
'None', -1, -1, -1,
|
|
-1, -1,
|
|
'None'
|
|
);
|
|
|
|
insert
|
|
into wh_date_dimension
|
|
select to_char(t.day, 'YYYYMMDD')::integer as id,
|
|
t.day::date as date,
|
|
'Q' || to_char(t.day, 'Q') as calendar_quarter,
|
|
to_char(t.day, 'Month') as calendar_month,
|
|
extract(year from t.day) as calendar_year,
|
|
to_char(t.day, 'Day') as day_of_week,
|
|
to_char(t.day, 'D')::int as day_of_week_number,
|
|
extract(isodow from t.day) as day_of_week_number_iso,
|
|
extract(dow from t.day) as day_of_week_number_zero_based,
|
|
extract(day from t.day) as day_number_in_calendar_month,
|
|
extract(doy from t.day) as day_number_in_calendar_year,
|
|
case extract(isodow from t.day)
|
|
when 6 then 'Weekend'
|
|
when 7 then 'Weekend'
|
|
else 'Weekday'
|
|
end as weekday_indicator
|
|
from generate_series(
|
|
date_trunc('day', timestamp '2019-10-09'),
|
|
date_trunc('day', timestamp '2019-10-09' + interval '50 years'),
|
|
interval '1 day'
|
|
) as t(day);
|
|
|
|
create table wh_time_of_day_dimension (
|
|
id integer primary key,
|
|
time_no_zone time not null,
|
|
time_at_utc timetz not null,
|
|
hour_of_day smallint not null,
|
|
minute_of_hour smallint not null,
|
|
second_of_minute smallint not null,
|
|
display_time_24 wh_dim_text,
|
|
display_time_12 wh_dim_text,
|
|
meridiem_indicator wh_dim_text
|
|
);
|
|
|
|
set timezone = 'UTC';
|
|
|
|
insert into wh_time_of_day_dimension (
|
|
id, time_no_zone, time_at_utc,
|
|
hour_of_day, minute_of_hour, second_of_minute,
|
|
display_time_24, display_time_12, meridiem_indicator
|
|
) values (
|
|
-1, 'allballs', 'allballs',
|
|
-1, -1, -1,
|
|
'None', 'None', 'None'
|
|
);
|
|
|
|
insert
|
|
into wh_time_of_day_dimension
|
|
select to_char(t.second, 'SSSS')::integer as id,
|
|
t.second::time as time_no_zone,
|
|
t.second::time as time_at_utc,
|
|
extract(hour from t.second) as hour_of_day,
|
|
extract(minute from t.second) as minute_of_hour,
|
|
extract(second from t.second) as second_of_minute,
|
|
to_char(t.second, 'HH24:MI:SS') as display_time_24,
|
|
to_char(t.second, 'HH12:MI:SS AM') as display_time_12,
|
|
to_char(t.second, 'PM') as meridiem_indicator
|
|
from generate_series(
|
|
date_trunc('day', current_timestamp),
|
|
date_trunc('day', current_timestamp) + interval '24 hours' - interval '1 second',
|
|
interval '1 second'
|
|
) as t(second);
|
|
|
|
commit;
|