1.0.91
Role_status & enrollment_status additions, filtering and event logic adjustments
Release Date
October 29, 2025
Key Features
This release improves many of our UDP Data Marts. There are a few new fields, but most of the changes are filtering adjustments and logic changes for event times.
Schema Changes
A few data marts surface the role field of enrollment records. We added the role_status and enrollment_status fields alongside the role field for the following marts:
mart_course_offering.last_activitymart_course_section.last_activitymart_course_offering.interaction_sessionsmart_course_section.interaction_sessionsmart_general.lms_toolmart_general.lti_tool
Adding these two fields helps for analytics that may need only a certain subset of individuals in scope (e.g. only student role with enrolled role_status and active enrollment_status).
Student Activity Score Final Filtering Changes
Mart in scope: mart_student_activity_score.final
In a previous UDP Marts release, we removed a hard filter for requiring 10 enrolled students in courses/course_sections to compute a student activity score. However, this filter remained in place for the mart_student_activity_score.final table. We now removed the same hard filter in this final mart so that the final, course_final, and course_section_final marts align on included and excluded records.
For analytics use cases that require the 10-or-greater enrollment threshold, Unizin recommends using course_final or course_section_final instead of the final mart. The course_final and course_section_final marts have a Boolean flag named course_has_10_or_more_students that can be leveraged.
Event Logic Adjustments
Event Logic AdjustmentsInteraction Session Dates And Missing Data
Each record in the interaction session data marts (both mart_course_offering.interaction_sessions and mart_course_section.interaction_sessions ) should only have one record per-person, per-course, per-day. The run times of the mart refreshes plus our date range logic allowed the possibility of 2 records per-person, per-course, per day.
This has been corrected. The Interaction Session data marts now only populate with the latest fully-completed day of interaction sessions. If the current date is October 29, 2025, these data marts will populate with all interaction sessions through October 28, 2025. There are no longer "partial days" of interaction sessions in these marts.
Also, we found cases where LMS-only courses were not being populated in the final interaction session marts. We added logic to make sure all courses with an LMS-presence are represented in these marts.
Partial Event Time Windows
Many data marts update hourly to capture the latest Caliper events for the previous hour. Based on the run times and orchestration of these updates, it's possible that an hourly update of a data mart could occur a couple of minutes past the hour. This can result in partial data for an hour in scope.
We adjusted all hourly-updating event dependencies in data marts to only take the last fully-completed hour into scope. The previous logic looked like the following:
r.event_time >= CAST(TIMESTAMP_SUB(@run_time, INTERVAL 1 HOUR) AS DATETIME)
If @run_time happens to be 1:02 pm for an hourly run based on the orchestration architecture, then events that occurred between 12:02 pm and 1:02 pm are added to the mart. However, if the previous hourly run's @run_time was 12:01 pm, and therefore appended events that occurred between 11:01 am and 12:01 pm to the mart, the mart will not include any of the events that occurred between 12:01 pm and 12:02 pm. To make sure that all relevant student activity is captured in the marts, the new logic is
r.event_time >= CAST(TIMESTAMP_SUB(DATETIME_TRUNC(CURRENT_DATETIME(),HOUR), INTERVAL 1 HOUR) AS DATETIME)
AND r.event_time < DATETIME_TRUNC(CURRENT_DATETIME(),HOUR)If @run_time happens to be 1:02pm for an hourly run, the logic now pulls all Caliper events from 12:00pm to 1:00pm. This updated logic makes sure that every hourly update appends the previous hour's events to the marts, without any events being dropped because of differing run times between consecutive updates.
These logic changes are in the mart_helper dataset, specifically the event__* tables. The starter scripts will run again to repopulate these marts starting from January 1, 2021.
Last updated