SELECT 'active-quest:' || CAST(quest.id AS TEXT) AS taskRecordId, 'active-quest' AS taskKind, CAST(quest.user_profile_id AS TEXT) AS userProfileId, CAST(quest.map_id AS TEXT) AS mapId, CAST(quest.id AS TEXT) AS trackingDataSetId, quest.quest_data_asset_path AS dataAssetPath, tracking.sequence_index AS sequenceIndex, CASE WHEN EXISTS (SELECT 1 FROM tracked_quest tracked WHERE tracked.quest_id = quest.id) THEN 1 ELSE 0 END AS isTracked, 'active' AS state, quest.completion_deadline AS completionDeadline FROM active_quest quest JOIN tracking_data_set tracking ON tracking.id = quest.id WHERE (:userProfileId IS NULL OR CAST(quest.user_profile_id AS TEXT) = :userProfileId) UNION ALL SELECT 'active-task:' || CAST(task.id AS TEXT), 'active-task', CAST(task.user_profile_id AS TEXT), CAST(task.map_id AS TEXT), CAST(task.id AS TEXT), available.task_data_asset_path, tracking.sequence_index, CASE WHEN EXISTS (SELECT 1 FROM tracked_quest tracked WHERE tracked.quest_id = task.id) THEN 1 ELSE 0 END, 'active', NULL FROM active_task task JOIN tracking_data_set tracking ON tracking.id = task.id JOIN available_task available ON available.id = task.available_task_id WHERE (:userProfileId IS NULL OR CAST(task.user_profile_id AS TEXT) = :userProfileId) UNION ALL SELECT 'available-task:' || CAST(available.id AS TEXT), 'available-task', CAST(available.user_profile_id AS TEXT), CAST(available.map_id AS TEXT), NULL, available.task_data_asset_path, NULL, 0, CASE WHEN available.was_ever_completed = 1 THEN 'completed-before' ELSE 'available' END, NULL FROM available_task available WHERE (:userProfileId IS NULL OR CAST(available.user_profile_id AS TEXT) = :userProfileId) LIMIT COALESCE(:limit, 500)