This commit is contained in:
Kenneth Kehl
2023-08-29 14:54:30 -07:00
parent 19dcd7a48b
commit 1ecb747c6d
588 changed files with 34100 additions and 23589 deletions

View File

@@ -10,44 +10,56 @@ from app.models import FactProcessingTime
@autocommit
def insert_update_processing_time(processing_time):
'''
"""
This uses the Postgres upsert to avoid race conditions when two threads try and insert
at the same row. The excluded object refers to values that we tried to insert but were
rejected.
http://docs.sqlalchemy.org/en/latest/dialects/postgresql.html#insert-on-conflict-upsert
'''
"""
table = FactProcessingTime.__table__
stmt = insert(table).values(
local_date=processing_time.local_date,
messages_total=processing_time.messages_total,
messages_within_10_secs=processing_time.messages_within_10_secs
messages_within_10_secs=processing_time.messages_within_10_secs,
)
stmt = stmt.on_conflict_do_update(
index_elements=[table.c.local_date],
set_={
'messages_total': stmt.excluded.messages_total,
'messages_within_10_secs': stmt.excluded.messages_within_10_secs,
'updated_at': datetime.utcnow()
}
"messages_total": stmt.excluded.messages_total,
"messages_within_10_secs": stmt.excluded.messages_within_10_secs,
"updated_at": datetime.utcnow(),
},
)
db.session.connection().execute(stmt)
def get_processing_time_percentage_for_date_range(start_date, end_date):
query = db.session.query(
FactProcessingTime.local_date.cast(db.Text).label("date"),
FactProcessingTime.messages_total,
FactProcessingTime.messages_within_10_secs,
case([
(
FactProcessingTime.messages_total > 0,
((FactProcessingTime.messages_within_10_secs / FactProcessingTime.messages_total.cast(db.Float)) * 100)
),
(FactProcessingTime.messages_total == 0, 100.0)
]).label("percentage")
).filter(
FactProcessingTime.local_date >= start_date,
FactProcessingTime.local_date <= end_date
).order_by(FactProcessingTime.local_date)
query = (
db.session.query(
FactProcessingTime.local_date.cast(db.Text).label("date"),
FactProcessingTime.messages_total,
FactProcessingTime.messages_within_10_secs,
case(
[
(
FactProcessingTime.messages_total > 0,
(
(
FactProcessingTime.messages_within_10_secs
/ FactProcessingTime.messages_total.cast(db.Float)
)
* 100
),
),
(FactProcessingTime.messages_total == 0, 100.0),
]
).label("percentage"),
)
.filter(
FactProcessingTime.local_date >= start_date,
FactProcessingTime.local_date <= end_date,
)
.order_by(FactProcessingTime.local_date)
)
return query.all()