Files
james.maes 80b0b66c49 Merge remote-tracking branch 'origin/develop' into feature/job-progress
# Conflicts:
#	README.md
#	docs/DESIGN.md
#	pom.xml
#	src/main/java/com/kingsrook/qbits/jobs/JobsCoreContract.java
#	src/main/java/com/kingsrook/qbits/jobs/widgets/JobsWidgetRenderer.java
#	src/test/java/com/kingsrook/qbits/jobs/JobsRetentionTest.java
2026-10-14 21:12:47 -05:00

199 lines
6.4 KiB
SQL

-- Durable jobs schema matching QQQ 4.1.0-RC.7 DurableJobsMetaDataProvider.
-- Snake-case columns; excludes test fixtures and destructive DROP statements.
CREATE TABLE jobs_job
(
id SERIAL PRIMARY KEY,
label VARCHAR(250),
process_name VARCHAR(250) NOT NULL,
table_name VARCHAR(250),
mode VARCHAR(20),
status VARCHAR(30) NOT NULL,
status_reason VARCHAR(500),
priority INTEGER DEFAULT 5,
user_id VARCHAR(250),
client_channel VARCHAR(250),
credential_scope_json TEXT,
source_type VARCHAR(30),
source_json TEXT,
params_json TEXT,
idempotency VARCHAR(30),
semantics VARCHAR(20),
chunk_size INTEGER,
max_parallel_chunks INTEGER,
current_phase VARCHAR(250),
percent_done INTEGER,
progress_message VARCHAR(1000),
bytes_done BIGINT,
bytes_total BIGINT,
eta_seconds BIGINT,
progress_json TEXT,
log_seq BIGINT,
log_dropped INTEGER,
rows_total INTEGER,
rows_done INTEGER,
rows_ok INTEGER,
rows_failed INTEGER,
chunks_total INTEGER,
chunks_done INTEGER,
chunks_failed INTEGER,
summary_json TEXT,
output_storage_json TEXT,
parent_job_id INTEGER,
saved_bulk_load_profile_id INTEGER,
notify_email BOOLEAN DEFAULT FALSE,
queued_at TIMESTAMPTZ,
started_at TIMESTAMPTZ,
finished_at TIMESTAMPTZ,
last_progress_at TIMESTAMPTZ,
error_message TEXT,
lease_version INTEGER DEFAULT 0,
create_date TIMESTAMPTZ,
modify_date TIMESTAMPTZ
);
CREATE INDEX jobs_job_claim_idx ON jobs_job (status, priority, queued_at);
CREATE INDEX jobs_job_user_idx ON jobs_job (user_id, status);
CREATE TABLE jobs_chunk
(
id SERIAL PRIMARY KEY,
job_id INTEGER NOT NULL REFERENCES jobs_job (id) ON DELETE CASCADE,
seq INTEGER NOT NULL,
status VARCHAR(30) NOT NULL,
range_json TEXT,
input_storage_ref VARCHAR(1000),
attempt INTEGER DEFAULT 0,
max_attempts INTEGER DEFAULT 3,
lease_owner VARCHAR(250),
lease_token VARCHAR(100),
lease_expires_at TIMESTAMPTZ,
heartbeat_at TIMESTAMPTZ,
rows_in INTEGER,
rows_ok INTEGER,
rows_failed INTEGER,
summary_json TEXT,
checkpoint_json TEXT,
error_message TEXT,
started_at TIMESTAMPTZ,
finished_at TIMESTAMPTZ,
lease_version INTEGER DEFAULT 0,
create_date TIMESTAMPTZ,
modify_date TIMESTAMPTZ,
UNIQUE (job_id, seq)
);
CREATE INDEX jobs_chunk_status_idx ON jobs_chunk (job_id, status);
CREATE INDEX jobs_chunk_lease_idx ON jobs_chunk (status, lease_expires_at);
CREATE TABLE jobs_row_error
(
id SERIAL PRIMARY KEY,
job_id INTEGER NOT NULL REFERENCES jobs_job (id) ON DELETE CASCADE,
chunk_id INTEGER,
row_number INTEGER,
record_pk VARCHAR(250),
field_name VARCHAR(250),
error_code VARCHAR(100),
message TEXT,
retry_job_id INTEGER,
resolved BOOLEAN DEFAULT FALSE,
create_date TIMESTAMPTZ
);
CREATE INDEX jobs_row_error_job_idx ON jobs_row_error (job_id);
-- Transactional outbox.
CREATE TABLE jobs_effect
(
id SERIAL PRIMARY KEY,
job_id INTEGER NOT NULL REFERENCES jobs_job (id) ON DELETE CASCADE,
effect_name VARCHAR(100),
status VARCHAR(30),
needs_review BOOLEAN DEFAULT FALSE,
row_key VARCHAR(250),
target_name VARCHAR(100),
effect_type VARCHAR(30),
chunk_id INTEGER,
chunk_seq INTEGER,
idempotency_key VARCHAR(500),
payload_json TEXT,
payload_ref VARCHAR(1000),
attempt INTEGER DEFAULT 0,
max_attempts INTEGER,
reconcile_attempts INTEGER DEFAULT 0,
next_attempt_at TIMESTAMPTZ,
lease_owner VARCHAR(250),
lease_token VARCHAR(100),
lease_expires_at TIMESTAMPTZ,
lease_version INTEGER DEFAULT 0,
provider_ref VARCHAR(500),
last_error TEXT,
sent_at TIMESTAMPTZ,
create_date TIMESTAMPTZ,
modify_date TIMESTAMPTZ
);
CREATE UNIQUE INDEX jobs_effect_idempotency_idx ON jobs_effect (idempotency_key);
CREATE INDEX jobs_effect_status_idx ON jobs_effect (status, next_attempt_at);
CREATE INDEX jobs_effect_job_idx ON jobs_effect (job_id);
CREATE TABLE jobs_event
(
id SERIAL PRIMARY KEY,
job_id INTEGER NOT NULL REFERENCES jobs_job (id) ON DELETE CASCADE,
chunk_id INTEGER,
type VARCHAR(30),
actor_user_id VARCHAR(250),
client_channel VARCHAR(250),
pod VARCHAR(250),
detail TEXT,
create_date TIMESTAMPTZ
);
CREATE INDEX jobs_event_job_idx ON jobs_event (job_id);
CREATE TABLE jobs_worker
(
id SERIAL PRIMARY KEY,
pod_id VARCHAR(250) NOT NULL UNIQUE,
started_at TIMESTAMPTZ,
heartbeat_at TIMESTAMPTZ,
threads INTEGER,
draining BOOLEAN,
version VARCHAR(100)
);
CREATE TABLE jobs_upload
(
id SERIAL PRIMARY KEY,
ref VARCHAR(100) NOT NULL UNIQUE,
user_id VARCHAR(250),
file_name VARCHAR(250),
content_type VARCHAR(250),
size_bytes BIGINT,
storage_table_name VARCHAR(250),
storage_reference VARCHAR(1000),
expires_at TIMESTAMPTZ,
job_id INTEGER,
create_date TIMESTAMPTZ
);
-- RC.8 job progress log; host migrations must also add the jobs_job columns above.
CREATE TABLE jobs_log
(
id BIGSERIAL PRIMARY KEY,
job_id INTEGER NOT NULL REFERENCES jobs_job(id) ON DELETE CASCADE,
chunk_id INTEGER REFERENCES jobs_chunk(id) ON DELETE SET NULL,
attempt INTEGER,
level VARCHAR(10) NOT NULL,
logged_at TIMESTAMPTZ NOT NULL,
phase VARCHAR(250),
message VARCHAR(1000)
);
CREATE INDEX jobs_log_cursor_idx ON jobs_log(job_id, id);