Skip to content

RoomEndpoint sometimes not in executable_summary table yet #51

Description

@Puckoland

Compartment::getRoomEndpoints() sometimes skips RoomEndpoints because they are fetched lazily. Hence, they are not instances of RoomEndpoint but HibernateProxy#RoomEndpoint instead.

    @Transient
    public List<RoomEndpoint> getRoomEndpoints()
    {
        List<RoomEndpoint> roomEndpoints = new ArrayList<RoomEndpoint>();
        for (Executable childExecutable : getChildExecutables()) {
            if (!(childExecutable instanceof RoomEndpoint)) {
                continue;
            }
            RoomEndpoint roomEndpoint = (RoomEndpoint) childExecutable;
            roomEndpoints.add(roomEndpoint);
        }
        return roomEndpoints;
    }

While adding getLazyImplementation() to unproxy and resolving this problem, I found another problem in RoomEndpoint::toApi(), which uses the executable_summary table, and there is no given RoomEndpoint yet.
(executable_summary table is updated manually using Executable::updateExecutableSummary())

// RoomEndpoint::toApi()
// Determine whether room has recording service and recordings
// (use executable_summary for used_room_endpoints to be taken into account)
// Sometimes there is no data yet in executable_summary, so we must use the original query (see below)
Object[] result = (Object[]) entityManager.createNativeQuery(
    "SELECT room_has_recording_service, room_has_recordings FROM executable_summary WHERE id = :id")
    .setParameter("id", getId())
    .getSingleResult();
    public void updateExecutableSummary(EntityManager entityManager, boolean deleteOnly)
    {
        entityManager.flush();
        ExecutableManager executableManager = new ExecutableManager(entityManager);
        executableManager.updateExecutableSummary(this, deleteOnly);
    }

For now, as a workaround, we can either use executable_summary_view or join the tables directly:

"SELECT room_has_recording_service, room_has_recordings FROM executable_summary_view WHERE id = :id"

// or

"""
SELECT
    COUNT(recording_service.id) > 0 AS room_has_recording_service,
    COUNT(recording_service.id) > 0 OR COUNT(resource_room_endpoint_recording_folder_ids.recording_folder_id) > 0 AS room_has_recordings
FROM used_room_endpoint
LEFT JOIN used_room_endpoint AS room_endpoint_usage ON room_endpoint_usage.room_endpoint_id = :id
LEFT JOIN executable_service ON executable_service.executable_id = :id OR executable_service.executable_id = room_endpoint_usage.id
LEFT JOIN recording_service ON recording_service.id = executable_service.id
LEFT JOIN resource_room_endpoint_recording_folder_ids ON resource_room_endpoint_recording_folder_ids.resource_room_endpoint_id = :id OR resource_room_endpoint_recording_folder_ids.resource_room_endpoint_id = used_room_endpoint.room_endpoint_id
WHERE used_room_endpoint.id = :id
"""

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions