// Code generated by sqlc. DO NOT EDIT. // versions: // sqlc v1.24.0 // source: tickers.sql package dbsqlc import ( "context" "github.com/jackc/pgx/v5/pgtype" ) const createTicker = `-- name: CreateTicker :one INSERT INTO "Ticker" ("id", "lastHeartbeatAt", "isActive") VALUES ($1::uuid, CURRENT_TIMESTAMP, 't') RETURNING id, "createdAt", "updatedAt", "lastHeartbeatAt", "isActive" ` func (q *Queries) CreateTicker(ctx context.Context, db DBTX, id pgtype.UUID) (*Ticker, error) { row := db.QueryRow(ctx, createTicker, id) var i Ticker err := row.Scan( &i.ID, &i.CreatedAt, &i.UpdatedAt, &i.LastHeartbeatAt, &i.IsActive, ) return &i, err } const deleteTicker = `-- name: DeleteTicker :one DELETE FROM "Ticker" as tickers WHERE "id" = $1::uuid RETURNING id, "createdAt", "updatedAt", "lastHeartbeatAt", "isActive" ` func (q *Queries) DeleteTicker(ctx context.Context, db DBTX, id pgtype.UUID) (*Ticker, error) { row := db.QueryRow(ctx, deleteTicker, id) var i Ticker err := row.Scan( &i.ID, &i.CreatedAt, &i.UpdatedAt, &i.LastHeartbeatAt, &i.IsActive, ) return &i, err } const listActiveTickers = `-- name: ListActiveTickers :many SELECT tickers.id, tickers."createdAt", tickers."updatedAt", tickers."lastHeartbeatAt", tickers."isActive" FROM "Ticker" as tickers WHERE -- last heartbeat greater than 15 seconds "lastHeartbeatAt" > NOW () - INTERVAL '15 seconds' -- active AND "isActive" = true ` type ListActiveTickersRow struct { Ticker Ticker `json:"ticker"` } func (q *Queries) ListActiveTickers(ctx context.Context, db DBTX) ([]*ListActiveTickersRow, error) { rows, err := db.Query(ctx, listActiveTickers) if err != nil { return nil, err } defer rows.Close() var items []*ListActiveTickersRow for rows.Next() { var i ListActiveTickersRow if err := rows.Scan( &i.Ticker.ID, &i.Ticker.CreatedAt, &i.Ticker.UpdatedAt, &i.Ticker.LastHeartbeatAt, &i.Ticker.IsActive, ); err != nil { return nil, err } items = append(items, &i) } if err := rows.Err(); err != nil { return nil, err } return items, nil } const listNewlyStaleTickers = `-- name: ListNewlyStaleTickers :many SELECT tickers.id, tickers."createdAt", tickers."updatedAt", tickers."lastHeartbeatAt", tickers."isActive" FROM "Ticker" as tickers WHERE -- last heartbeat older than 15 seconds "lastHeartbeatAt" < NOW () - INTERVAL '15 seconds' -- active AND "isActive" = true ` type ListNewlyStaleTickersRow struct { Ticker Ticker `json:"ticker"` } func (q *Queries) ListNewlyStaleTickers(ctx context.Context, db DBTX) ([]*ListNewlyStaleTickersRow, error) { rows, err := db.Query(ctx, listNewlyStaleTickers) if err != nil { return nil, err } defer rows.Close() var items []*ListNewlyStaleTickersRow for rows.Next() { var i ListNewlyStaleTickersRow if err := rows.Scan( &i.Ticker.ID, &i.Ticker.CreatedAt, &i.Ticker.UpdatedAt, &i.Ticker.LastHeartbeatAt, &i.Ticker.IsActive, ); err != nil { return nil, err } items = append(items, &i) } if err := rows.Err(); err != nil { return nil, err } return items, nil } const listTickers = `-- name: ListTickers :many SELECT id, "createdAt", "updatedAt", "lastHeartbeatAt", "isActive" FROM "Ticker" as tickers WHERE ( $1::boolean IS NULL OR "isActive" = $1::boolean ) AND ( $2::timestamp IS NULL OR tickers."lastHeartbeatAt" > $2::timestamp ) ` type ListTickersParams struct { IsActive bool `json:"isActive"` LastHeartbeatAfter pgtype.Timestamp `json:"lastHeartbeatAfter"` } func (q *Queries) ListTickers(ctx context.Context, db DBTX, arg ListTickersParams) ([]*Ticker, error) { rows, err := db.Query(ctx, listTickers, arg.IsActive, arg.LastHeartbeatAfter) if err != nil { return nil, err } defer rows.Close() var items []*Ticker for rows.Next() { var i Ticker if err := rows.Scan( &i.ID, &i.CreatedAt, &i.UpdatedAt, &i.LastHeartbeatAt, &i.IsActive, ); err != nil { return nil, err } items = append(items, &i) } if err := rows.Err(); err != nil { return nil, err } return items, nil } const pollCronSchedules = `-- name: PollCronSchedules :many WITH latest_workflow_versions AS ( SELECT "workflowId", MAX("order") as max_order FROM "WorkflowVersion" GROUP BY "workflowId" ), active_cron_schedules AS ( SELECT cronSchedule."parentId", versions."id" AS "workflowVersionId", triggers."tenantId" AS "tenantId" FROM "WorkflowTriggerCronRef" as cronSchedule JOIN "WorkflowTriggers" as triggers ON triggers."id" = cronSchedule."parentId" JOIN "WorkflowVersion" as versions ON versions."id" = triggers."workflowVersionId" JOIN latest_workflow_versions l ON versions."workflowId" = l."workflowId" AND versions."order" = l.max_order WHERE "enabled" = TRUE AND ("tickerId" IS NULL OR NOT EXISTS ( SELECT 1 FROM "Ticker" WHERE "id" = cronSchedule."tickerId" AND "isActive" = true AND "lastHeartbeatAt" >= NOW() - INTERVAL '10 seconds' ) OR "tickerId" = $1::uuid) FOR UPDATE SKIP LOCKED ) UPDATE "WorkflowTriggerCronRef" as cronSchedules SET "tickerId" = $1::uuid FROM active_cron_schedules WHERE cronSchedules."parentId" = active_cron_schedules."parentId" RETURNING cronschedules."parentId", cronschedules.cron, cronschedules."tickerId", cronschedules.input, cronschedules.enabled, active_cron_schedules."workflowVersionId", active_cron_schedules."tenantId" ` type PollCronSchedulesRow struct { ParentId pgtype.UUID `json:"parentId"` Cron string `json:"cron"` TickerId pgtype.UUID `json:"tickerId"` Input []byte `json:"input"` Enabled bool `json:"enabled"` WorkflowVersionId pgtype.UUID `json:"workflowVersionId"` TenantId pgtype.UUID `json:"tenantId"` } func (q *Queries) PollCronSchedules(ctx context.Context, db DBTX, tickerid pgtype.UUID) ([]*PollCronSchedulesRow, error) { rows, err := db.Query(ctx, pollCronSchedules, tickerid) if err != nil { return nil, err } defer rows.Close() var items []*PollCronSchedulesRow for rows.Next() { var i PollCronSchedulesRow if err := rows.Scan( &i.ParentId, &i.Cron, &i.TickerId, &i.Input, &i.Enabled, &i.WorkflowVersionId, &i.TenantId, ); err != nil { return nil, err } items = append(items, &i) } if err := rows.Err(); err != nil { return nil, err } return items, nil } const pollGetGroupKeyRuns = `-- name: PollGetGroupKeyRuns :many WITH getGroupKeyRunsToTimeout AS ( SELECT getGroupKeyRun."id" FROM "GetGroupKeyRun" as getGroupKeyRun WHERE ("status" = 'RUNNING' OR "status" = 'ASSIGNED') AND "timeoutAt" < NOW() AND ( NOT EXISTS ( SELECT 1 FROM "Ticker" WHERE "id" = getGroupKeyRun."tickerId" AND "isActive" = true AND "lastHeartbeatAt" >= NOW() - INTERVAL '10 seconds' ) OR "tickerId" IS NULL ) FOR UPDATE SKIP LOCKED ) UPDATE "GetGroupKeyRun" as getGroupKeyRuns SET "tickerId" = $1::uuid FROM getGroupKeyRunsToTimeout WHERE getGroupKeyRuns."id" = getGroupKeyRunsToTimeout."id" RETURNING getgroupkeyruns.id, getgroupkeyruns."createdAt", getgroupkeyruns."updatedAt", getgroupkeyruns."deletedAt", getgroupkeyruns."tenantId", getgroupkeyruns."workerId", getgroupkeyruns."tickerId", getgroupkeyruns.status, getgroupkeyruns.input, getgroupkeyruns.output, getgroupkeyruns."requeueAfter", getgroupkeyruns.error, getgroupkeyruns."startedAt", getgroupkeyruns."finishedAt", getgroupkeyruns."timeoutAt", getgroupkeyruns."cancelledAt", getgroupkeyruns."cancelledReason", getgroupkeyruns."cancelledError", getgroupkeyruns."workflowRunId", getgroupkeyruns."scheduleTimeoutAt" ` func (q *Queries) PollGetGroupKeyRuns(ctx context.Context, db DBTX, tickerid pgtype.UUID) ([]*GetGroupKeyRun, error) { rows, err := db.Query(ctx, pollGetGroupKeyRuns, tickerid) if err != nil { return nil, err } defer rows.Close() var items []*GetGroupKeyRun for rows.Next() { var i GetGroupKeyRun if err := rows.Scan( &i.ID, &i.CreatedAt, &i.UpdatedAt, &i.DeletedAt, &i.TenantId, &i.WorkerId, &i.TickerId, &i.Status, &i.Input, &i.Output, &i.RequeueAfter, &i.Error, &i.StartedAt, &i.FinishedAt, &i.TimeoutAt, &i.CancelledAt, &i.CancelledReason, &i.CancelledError, &i.WorkflowRunId, &i.ScheduleTimeoutAt, ); err != nil { return nil, err } items = append(items, &i) } if err := rows.Err(); err != nil { return nil, err } return items, nil } const pollScheduledWorkflows = `-- name: PollScheduledWorkflows :many WITH latest_workflow_versions AS ( SELECT "workflowId", MAX("order") as max_order FROM "WorkflowVersion" GROUP BY "workflowId" ), not_run_scheduled_workflows AS ( SELECT scheduledWorkflow."id", versions."id" AS "workflowVersionId", workflow."tenantId" AS "tenantId" FROM "WorkflowTriggerScheduledRef" as scheduledWorkflow JOIN "WorkflowVersion" as versions ON versions."id" = scheduledWorkflow."parentId" JOIN latest_workflow_versions l ON versions."workflowId" = l."workflowId" AND versions."order" = l.max_order JOIN "Workflow" as workflow ON workflow."id" = versions."workflowId" LEFT JOIN "WorkflowRunTriggeredBy" as runTriggeredBy ON runTriggeredBy."scheduledId" = scheduledWorkflow."id" WHERE "triggerAt" <= NOW() + INTERVAL '5 seconds' AND runTriggeredBy IS NULL AND ( "tickerId" IS NULL OR NOT EXISTS ( SELECT 1 FROM "Ticker" WHERE "id" = scheduledWorkflow."tickerId" AND "isActive" = true AND "lastHeartbeatAt" >= NOW() - INTERVAL '10 seconds' ) OR "tickerId" = $1::uuid ) ), active_scheduled_workflows AS ( SELECT id, "workflowVersionId", "tenantId" FROM not_run_scheduled_workflows FOR UPDATE SKIP LOCKED ) UPDATE "WorkflowTriggerScheduledRef" as scheduledWorkflows SET "tickerId" = $1::uuid FROM active_scheduled_workflows WHERE scheduledWorkflows."id" = active_scheduled_workflows."id" RETURNING scheduledworkflows.id, scheduledworkflows."parentId", scheduledworkflows."triggerAt", scheduledworkflows."tickerId", scheduledworkflows.input, scheduledworkflows."childIndex", scheduledworkflows."childKey", scheduledworkflows."parentStepRunId", scheduledworkflows."parentWorkflowRunId", active_scheduled_workflows."workflowVersionId", active_scheduled_workflows."tenantId" ` type PollScheduledWorkflowsRow struct { ID pgtype.UUID `json:"id"` ParentId pgtype.UUID `json:"parentId"` TriggerAt pgtype.Timestamp `json:"triggerAt"` TickerId pgtype.UUID `json:"tickerId"` Input []byte `json:"input"` ChildIndex pgtype.Int4 `json:"childIndex"` ChildKey pgtype.Text `json:"childKey"` ParentStepRunId pgtype.UUID `json:"parentStepRunId"` ParentWorkflowRunId pgtype.UUID `json:"parentWorkflowRunId"` WorkflowVersionId pgtype.UUID `json:"workflowVersionId"` TenantId pgtype.UUID `json:"tenantId"` } // Finds workflows that are either past their execution time or will be in the next 5 seconds and assigns them // to a ticker, or finds workflows that were assigned to a ticker that is no longer active func (q *Queries) PollScheduledWorkflows(ctx context.Context, db DBTX, tickerid pgtype.UUID) ([]*PollScheduledWorkflowsRow, error) { rows, err := db.Query(ctx, pollScheduledWorkflows, tickerid) if err != nil { return nil, err } defer rows.Close() var items []*PollScheduledWorkflowsRow for rows.Next() { var i PollScheduledWorkflowsRow if err := rows.Scan( &i.ID, &i.ParentId, &i.TriggerAt, &i.TickerId, &i.Input, &i.ChildIndex, &i.ChildKey, &i.ParentStepRunId, &i.ParentWorkflowRunId, &i.WorkflowVersionId, &i.TenantId, ); err != nil { return nil, err } items = append(items, &i) } if err := rows.Err(); err != nil { return nil, err } return items, nil } const pollStepRuns = `-- name: PollStepRuns :many WITH stepRunsToTimeout AS ( SELECT stepRun."id" FROM "StepRun" as stepRun WHERE ("status" = 'RUNNING' OR "status" = 'ASSIGNED') AND "timeoutAt" < NOW() AND ( NOT EXISTS ( SELECT 1 FROM "Ticker" WHERE "id" = stepRun."tickerId" AND "isActive" = true AND "lastHeartbeatAt" >= NOW() - INTERVAL '10 seconds' ) OR "tickerId" IS NULL ) FOR UPDATE SKIP LOCKED ) UPDATE "StepRun" as stepRuns SET "tickerId" = $1::uuid FROM stepRunsToTimeout WHERE stepRuns."id" = stepRunsToTimeout."id" RETURNING stepruns.id, stepruns."createdAt", stepruns."updatedAt", stepruns."deletedAt", stepruns."tenantId", stepruns."jobRunId", stepruns."stepId", stepruns."order", stepruns."workerId", stepruns."tickerId", stepruns.status, stepruns.input, stepruns.output, stepruns."requeueAfter", stepruns."scheduleTimeoutAt", stepruns.error, stepruns."startedAt", stepruns."finishedAt", stepruns."timeoutAt", stepruns."cancelledAt", stepruns."cancelledReason", stepruns."cancelledError", stepruns."inputSchema", stepruns."callerFiles", stepruns."gitRepoBranch", stepruns."retryCount", stepruns."semaphoreReleased" ` func (q *Queries) PollStepRuns(ctx context.Context, db DBTX, tickerid pgtype.UUID) ([]*StepRun, error) { rows, err := db.Query(ctx, pollStepRuns, tickerid) if err != nil { return nil, err } defer rows.Close() var items []*StepRun for rows.Next() { var i StepRun if err := rows.Scan( &i.ID, &i.CreatedAt, &i.UpdatedAt, &i.DeletedAt, &i.TenantId, &i.JobRunId, &i.StepId, &i.Order, &i.WorkerId, &i.TickerId, &i.Status, &i.Input, &i.Output, &i.RequeueAfter, &i.ScheduleTimeoutAt, &i.Error, &i.StartedAt, &i.FinishedAt, &i.TimeoutAt, &i.CancelledAt, &i.CancelledReason, &i.CancelledError, &i.InputSchema, &i.CallerFiles, &i.GitRepoBranch, &i.RetryCount, &i.SemaphoreReleased, ); err != nil { return nil, err } items = append(items, &i) } if err := rows.Err(); err != nil { return nil, err } return items, nil } const pollTenantAlerts = `-- name: PollTenantAlerts :many WITH active_tenant_alerts AS ( SELECT alerts.id, alerts."createdAt", alerts."updatedAt", alerts."deletedAt", alerts."tenantId", alerts."maxFrequency", alerts."lastAlertedAt", alerts."tickerId" FROM "TenantAlertingSettings" as alerts WHERE "lastAlertedAt" IS NULL OR "lastAlertedAt" <= NOW() - convert_duration_to_interval(alerts."maxFrequency") FOR UPDATE SKIP LOCKED ), failed_run_count_by_tenant AS ( SELECT workflowRun."tenantId", COUNT(*) as "failedWorkflowRunCount" FROM "WorkflowRun" as workflowRun JOIN active_tenant_alerts ON active_tenant_alerts."tenantId" = workflowRun."tenantId" WHERE "status" = 'FAILED' AND ( ( "lastAlertedAt" IS NULL AND workflowRun."finishedAt" >= NOW() - convert_duration_to_interval(active_tenant_alerts."maxFrequency") ) OR workflowRun."finishedAt" >= "lastAlertedAt" ) GROUP BY workflowRun."tenantId" ) UPDATE "TenantAlertingSettings" as alerts SET "tickerId" = $1::uuid, "lastAlertedAt" = NOW() FROM active_tenant_alerts WHERE alerts."id" = active_tenant_alerts."id" AND alerts."tenantId" IN (SELECT "tenantId" FROM failed_run_count_by_tenant WHERE "failedWorkflowRunCount" > 0) RETURNING alerts.id, alerts."createdAt", alerts."updatedAt", alerts."deletedAt", alerts."tenantId", alerts."maxFrequency", alerts."lastAlertedAt", alerts."tickerId", active_tenant_alerts."lastAlertedAt" AS "prevLastAlertedAt" ` type PollTenantAlertsRow struct { ID pgtype.UUID `json:"id"` CreatedAt pgtype.Timestamp `json:"createdAt"` UpdatedAt pgtype.Timestamp `json:"updatedAt"` DeletedAt pgtype.Timestamp `json:"deletedAt"` TenantId pgtype.UUID `json:"tenantId"` MaxFrequency string `json:"maxFrequency"` LastAlertedAt pgtype.Timestamp `json:"lastAlertedAt"` TickerId pgtype.UUID `json:"tickerId"` PrevLastAlertedAt pgtype.Timestamp `json:"prevLastAlertedAt"` } // Finds tenant alerts which haven't alerted since their frequency and assigns them to a ticker func (q *Queries) PollTenantAlerts(ctx context.Context, db DBTX, tickerid pgtype.UUID) ([]*PollTenantAlertsRow, error) { rows, err := db.Query(ctx, pollTenantAlerts, tickerid) if err != nil { return nil, err } defer rows.Close() var items []*PollTenantAlertsRow for rows.Next() { var i PollTenantAlertsRow if err := rows.Scan( &i.ID, &i.CreatedAt, &i.UpdatedAt, &i.DeletedAt, &i.TenantId, &i.MaxFrequency, &i.LastAlertedAt, &i.TickerId, &i.PrevLastAlertedAt, ); err != nil { return nil, err } items = append(items, &i) } if err := rows.Err(); err != nil { return nil, err } return items, nil } const setTickersInactive = `-- name: SetTickersInactive :many UPDATE "Ticker" as tickers SET "isActive" = false WHERE "id" = ANY ($1::uuid[]) RETURNING tickers.id, tickers."createdAt", tickers."updatedAt", tickers."lastHeartbeatAt", tickers."isActive" ` type SetTickersInactiveRow struct { Ticker Ticker `json:"ticker"` } func (q *Queries) SetTickersInactive(ctx context.Context, db DBTX, ids []pgtype.UUID) ([]*SetTickersInactiveRow, error) { rows, err := db.Query(ctx, setTickersInactive, ids) if err != nil { return nil, err } defer rows.Close() var items []*SetTickersInactiveRow for rows.Next() { var i SetTickersInactiveRow if err := rows.Scan( &i.Ticker.ID, &i.Ticker.CreatedAt, &i.Ticker.UpdatedAt, &i.Ticker.LastHeartbeatAt, &i.Ticker.IsActive, ); err != nil { return nil, err } items = append(items, &i) } if err := rows.Err(); err != nil { return nil, err } return items, nil } const updateTicker = `-- name: UpdateTicker :one UPDATE "Ticker" as tickers SET "lastHeartbeatAt" = $1::timestamp WHERE "id" = $2::uuid RETURNING id, "createdAt", "updatedAt", "lastHeartbeatAt", "isActive" ` type UpdateTickerParams struct { LastHeartbeatAt pgtype.Timestamp `json:"lastHeartbeatAt"` ID pgtype.UUID `json:"id"` } func (q *Queries) UpdateTicker(ctx context.Context, db DBTX, arg UpdateTickerParams) (*Ticker, error) { row := db.QueryRow(ctx, updateTicker, arg.LastHeartbeatAt, arg.ID) var i Ticker err := row.Scan( &i.ID, &i.CreatedAt, &i.UpdatedAt, &i.LastHeartbeatAt, &i.IsActive, ) return &i, err }