This change is a temporary fix to allow users for high volume services to use the admin app.

The trouble is the aggregate query to return the big blue numbers on the dashboard and /notifications/{notification_type} page is taking too long to return.
I have some ideas on how to improve the query, but should take some time to do some more research and test. In the meantime, let's just ignore "todays" total numbers for the high volume services. There are only two services that this will affect.
This commit is contained in:
Rebecca Law
2021-06-02 10:31:38 +01:00
parent 8b19719b48
commit b170b5ed80
2 changed files with 70 additions and 16 deletions

View File

@@ -154,23 +154,25 @@ def fetch_notification_status_for_service_for_today_and_7_previous_days(service_
FactNotificationStatus.bst_date >= start_date,
FactNotificationStatus.key_type != KEY_TYPE_TEST
)
if str(service_id) in (current_app.config['HIGH_VOLUME_SERVICE']):
all_stats_table = stats_for_7_days.subquery()
else:
stats_for_today = db.session.query(
Notification.notification_type.cast(db.Text),
Notification.status,
*([Notification.template_id] if by_template else []),
func.count().label('count')
).filter(
Notification.created_at >= get_london_midnight_in_utc(now),
Notification.service_id == service_id,
Notification.key_type != KEY_TYPE_TEST
).group_by(
Notification.notification_type,
*([Notification.template_id] if by_template else []),
Notification.status
)
stats_for_today = db.session.query(
Notification.notification_type.cast(db.Text),
Notification.status,
*([Notification.template_id] if by_template else []),
func.count().label('count')
).filter(
Notification.created_at >= get_london_midnight_in_utc(now),
Notification.service_id == service_id,
Notification.key_type != KEY_TYPE_TEST
).group_by(
Notification.notification_type,
*([Notification.template_id] if by_template else []),
Notification.status
)
all_stats_table = stats_for_7_days.union_all(stats_for_today).subquery()
all_stats_table = stats_for_7_days.union_all(stats_for_today).subquery()
query = db.session.query(
*([

View File

@@ -3,6 +3,7 @@ from uuid import UUID
import mock
import pytest
from flask import current_app
from freezegun import freeze_time
from app.dao.fact_notification_status_dao import (
@@ -44,6 +45,7 @@ from tests.app.db import (
create_service_data_retention,
create_template,
)
from tests.conftest import set_config_values
def test_update_fact_notification_status(notify_db_session):
@@ -267,6 +269,56 @@ def test_fetch_notification_status_for_service_for_today_and_7_previous_days(not
assert results[3].count == 19
@freeze_time('2018-10-31T18:00:00')
def test_fetch_notification_status_for_service_for_today_and_7_previous_days_for_high_volume_service(
notify_api, notify_db_session
):
service_1 = create_service(service_name='service_1')
sms_template = create_template(service=service_1, template_type=SMS_TYPE)
sms_template_2 = create_template(service=service_1, template_type=SMS_TYPE)
email_template = create_template(service=service_1, template_type=EMAIL_TYPE)
create_ft_notification_status(date(2018, 10, 29), 'sms', service_1, count=10)
create_ft_notification_status(date(2018, 10, 24), 'sms', service_1, count=8)
create_ft_notification_status(date(2018, 10, 29), 'sms', service_1, notification_status='created')
create_ft_notification_status(date(2018, 10, 29), 'email', service_1, count=3)
create_ft_notification_status(date(2018, 10, 26), 'letter', service_1, count=5)
create_notification(sms_template, created_at=datetime(2018, 10, 31, 11, 0, 0))
create_notification(sms_template_2, created_at=datetime(2018, 10, 31, 11, 0, 0))
create_notification(sms_template, created_at=datetime(2018, 10, 31, 12, 0, 0), status='delivered')
create_notification(email_template, created_at=datetime(2018, 10, 31, 13, 0, 0), status='delivered')
# too early, shouldn't be included
create_notification(service_1.templates[0], created_at=datetime(2018, 10, 30, 12, 0, 0), status='delivered')
with set_config_values(current_app, {
'HIGH_VOLUME_SERVICE': [str(service_1.id)],
}):
results = sorted(
fetch_notification_status_for_service_for_today_and_7_previous_days(service_1.id),
key=lambda x: (x.notification_type, x.status)
)
assert len(results) == 4
assert results[0].notification_type == 'email'
assert results[0].status == 'delivered'
assert results[0].count == 3
assert results[1].notification_type == 'letter'
assert results[1].status == 'delivered'
assert results[1].count == 5
assert results[2].notification_type == 'sms'
assert results[2].status == 'created'
assert results[2].count == 1
assert results[3].notification_type == 'sms'
assert results[3].status == 'delivered'
assert results[3].count == 18
@freeze_time('2018-10-31T18:00:00')
def test_fetch_notification_status_by_template_for_service_for_today_and_7_previous_days(notify_db_session):
service_1 = create_service(service_name='service_1')