db/rdbms/migration/0003_add_jobs_state_column.sql (48 lines of code) (raw):

-- Copyright (c) Facebook, Inc. and its affiliates. -- -- This source code is licensed under the MIT license found in the -- LICENSE file in the root directory of this source tree. -- +goose Up ALTER TABLE jobs ADD COLUMN state tinyint DEFAULT 0 AFTER extended_descriptor; CREATE INDEX job_state ON jobs (state, job_id); -- Populate the column. SET SQL_BIG_SELECTS=1; UPDATE jobs INNER JOIN ( -- This query retrieves job state event by its id. SELECT jobs.job_id AS job_id, fe2.event_name AS state FROM jobs INNER JOIN ( -- This query finds id of the last job state event for each job. SELECT job_id, MAX(event_id) AS max_event FROM framework_events fe WHERE fe.event_name IN ("JobStateStarted", "JobStateCompleted", "JobStateFailed", "JobStatePaused", "JobStatePauseFailed", "JobStateCancelling", "JobStateCancelled", "JobStateCancellationFailed") GROUP BY job_id ) fe1 ON fe1.job_id = jobs.job_id INNER JOIN framework_events fe2 ON fe2.event_id = fe1.max_event ) tt ON jobs.job_id = tt.job_id SET jobs.state = -- Translate string to numeric representation. IF(tt.state = "JobStateStarted", 1, IF(tt.state = "JobStateCompleted", 2, IF(tt.state = "JobStateFailed", 3, IF(tt.state = "JobStatePaused", 4, IF(tt.state = "JobStatePauseFailed", 5, IF(tt.state = "JobStateCancelling", 6, IF(tt.state = "JobStateCancelled", 7, IF(tt.state = "JobStateCancellationFailed", 8, 0)))))))); -- +goose Down DROP INDEX job_state ON jobs ALTER TABLE jobs DROP COLUMN state;