Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add teacher details directly to the users table #5303

Merged
merged 2 commits into from
Apr 18, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
DROP MATERIALIZED VIEW IF EXISTS report.raw_users CASCADE;

-- The building blocks of a user. We won't export this. See
-- `*_entities_decorated/*_users` for the version for external consumers.
CREATE MATERIALIZED VIEW report.raw_users AS (
SELECT
id,
username,
registered_date::date
FROM h.user AS users
WHERE
users.authority = '{{ region.authority }}'
-- users.authority = 'lms.hypothes.is'
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Left from testing?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've left these in permanently as they are kind of handy when copy pasting things into Metabase to test

ORDER BY registered_date
) WITH NO DATA;
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
DROP INDEX IF EXISTS report.raw_users_id_idx;

REFRESH MATERIALIZED VIEW report.raw_users;

ANALYSE report.raw_users;

-- A unique index is mandatory for concurrent updates used in the refresh
CREATE UNIQUE INDEX raw_users_id_idx ON report.raw_users (id);

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,11 @@ DROP MATERIALIZED VIEW IF EXISTS report.user_map CASCADE;
CREATE MATERIALIZED VIEW report.user_map AS (
SELECT
lms_users.id AS lms_user_id,
users.id AS user_id,
raw_users.id AS user_id,
application_instances.organization_id
FROM "user" AS lms_users
JOIN report.users ON
users.username = SUBSTRING(SPLIT_PART(lms_users.h_userid, '@', 1), 6)
JOIN report.raw_users ON
raw_users.username = SUBSTRING(SPLIT_PART(lms_users.h_userid, '@', 1), 6)
JOIN application_instances ON
lms_users.application_instance_id = application_instances.id
ORDER BY lms_user_id, user_id
Expand Down

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
DROP MATERIALIZED VIEW IF EXISTS report.users CASCADE;

CREATE MATERIALIZED VIEW report.users AS (
WITH
user_details AS (
SELECT DISTINCT
user_map.user_id,

-- The order here should ensure empty strings and nulls are
-- sorted to the back, so the "first" value should be non-null
-- if possible
FIRST_VALUE(lms_user.display_name) OVER (
PARTITION BY user_map.user_id
ORDER BY lms_user.display_name
RANGE BETWEEN
UNBOUNDED PRECEDING AND
UNBOUNDED FOLLOWING
) AS display_name,

FIRST_VALUE(lms_user.email) OVER (
PARTITION BY user_map.user_id
ORDER BY lms_user.email
RANGE BETWEEN
UNBOUNDED PRECEDING AND
UNBOUNDED FOLLOWING
) AS email,

true AS is_teacher
FROM report.user_map
JOIN "user" AS lms_user ON
lms_user.id = user_map.lms_user_id
WHERE
-- Ensure we are only providing contact details for users who
-- are a teacher in at least one context
user_map.user_id IN (
SELECT DISTINCT(user_id)
FROM report.organization_roles
WHERE role = 'teacher'
)
)

SELECT
raw_users.id,
user_details.display_name,
user_details.email,
raw_users.username,
CASE
WHEN user_details.is_teacher IS true THEN true ELSE false
END AS is_teacher,
-- Add a column which indicates that a user is a teacher in at least
-- one context. This helps us notice / demonstrate we are only keeping
-- teacher contact info. Keeping student contact info out of region is
-- not permitted.
raw_users.registered_date
FROM report.raw_users
LEFT OUTER JOIN user_details ON
user_details.user_id = raw_users.id
) WITH NO DATA;
Original file line number Diff line number Diff line change
@@ -1,10 +1,8 @@
DROP INDEX IF EXISTS report.users_id_idx;
DROP INDEX IF EXISTS report.users_registered_date_idx;

REFRESH MATERIALIZED VIEW report.users;

ANALYSE report.users;

-- A unique index is mandatory for concurrent updates used in the refresh
CREATE UNIQUE INDEX users_id_idx ON report.users (id);
CREATE INDEX users_registered_date_idx ON report.users USING BRIN (registered_date);
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think we used this

Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
DROP VIEW IF EXISTS report.users_sensitive CASCADE;

-- Create a plain view to act as a shim while we replace `users_sensitive`
CREATE VIEW report.users_sensitive AS (
SELECT
id, email, display_name
FROM report.users
);
4 changes: 2 additions & 2 deletions lms/data_tasks/report/refresh/01_entities_refresh.sql
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
REFRESH MATERIALIZED VIEW CONCURRENTLY report.users;
ANALYSE report.users;
REFRESH MATERIALIZED VIEW CONCURRENTLY report.raw_users;
ANALYSE report.raw_users;

REFRESH MATERIALIZED VIEW CONCURRENTLY report.user_map;
ANALYSE report.user_map;
Expand Down
2 changes: 2 additions & 0 deletions lms/data_tasks/report/refresh/04_entities_decorated.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
REFRESH MATERIALIZED VIEW CONCURRENTLY report.users;
ANALYSE report.users;