From 7c3da717ede5df87fa3bcfe16c0da95db09740ea Mon Sep 17 00:00:00 2001 From: Andy Atkinson Date: Tue, 10 Sep 2024 10:13:20 -0500 Subject: [PATCH] Add Solid Queue Adds the SQ DB tables Add Mission Control Add a basic test job to try it out, scheduled it out, and view it scheduled in Mission Control --- Gemfile | 3 + Gemfile.lock | 27 + app/jobs/solid_queue_hello_world_job.rb | 7 + bin/jobs | 6 + config/environments/development.rb | 2 + config/routes.rb | 3 + config/solid_queue.yml | 18 + db/queue_schema.rb | 129 ++++ db/structure.sql | 866 +++++++++++++++++++++++- erd.pdf | Bin 53922 -> 63262 bytes 10 files changed, 1037 insertions(+), 24 deletions(-) create mode 100644 app/jobs/solid_queue_hello_world_job.rb create mode 100755 bin/jobs create mode 100644 config/solid_queue.yml create mode 100644 db/queue_schema.rb diff --git a/Gemfile b/Gemfile index 591d8b6..e16248a 100644 --- a/Gemfile +++ b/Gemfile @@ -41,3 +41,6 @@ group :development, :test do gem 'database_consistency' gem 'dotenv-rails' # Manage .env end + +gem "solid_queue", "~> 0.8.2" +gem "mission_control-jobs" diff --git a/Gemfile.lock b/Gemfile.lock index 0ff1f88..b1a6fc7 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -120,6 +120,8 @@ GEM drb (2.2.1) erubi (1.13.0) erubis (2.7.0) + et-orbi (1.2.11) + tzinfo faker (3.4.1) i18n (>= 1.8.11, < 2) faraday (2.10.0) @@ -131,6 +133,9 @@ GEM activerecord (>= 6.0) fast_jsonapi (1.5) activesupport (>= 4.2) + fugit (1.11.1) + et-orbi (~> 1, >= 1.2.11) + raabro (~> 1.4) fx (0.8.0) activerecord (>= 6.0.0) railties (>= 6.0.0) @@ -178,6 +183,12 @@ GEM method_source (1.1.0) mini_mime (1.1.5) minitest (5.24.1) + mission_control-jobs (0.3.1) + importmap-rails + irb (~> 1.13) + rails (>= 7.1) + stimulus-rails + turbo-rails mutex_m (0.2.0) net-http (0.4.1) uri @@ -213,6 +224,7 @@ GEM stringio puma (6.4.2) nio4r (~> 2.0) + raabro (1.4.0) racc (1.8.0) rack (3.1.7) rack-session (2.0.0) @@ -285,6 +297,13 @@ GEM activerecord (>= 4.0.0) railties (>= 4.0.0) sexp_processor (4.17.2) + solid_queue (0.8.2) + activejob (>= 7.1) + activerecord (>= 7.1) + concurrent-ruby (>= 1.3.1) + fugit (~> 1.11.0) + railties (>= 7.1) + thor (~> 1.3.1) sprockets (4.2.1) concurrent-ruby (~> 1.0) rack (>= 2.2.4, < 4) @@ -292,6 +311,8 @@ GEM actionpack (>= 6.1) activesupport (>= 6.1) sprockets (>= 3.0.0) + stimulus-rails (1.3.4) + railties (>= 6.0.0) stringio (3.1.1) strong_migrations (2.0.0) activerecord (>= 6.1) @@ -300,6 +321,10 @@ GEM unicode-display_width (>= 1.1.1, < 3) thor (1.3.1) timeout (0.4.1) + turbo-rails (2.0.6) + actionpack (>= 6.0.0) + activejob (>= 6.0.0) + railties (>= 6.0.0) tzinfo (2.0.6) concurrent-ruby (~> 1.0) unicode-display_width (2.5.0) @@ -339,6 +364,7 @@ DEPENDENCIES importmap-rails (~> 1.2) json jwt (~> 2.7) + mission_control-jobs pg (~> 1.5) pg_query (~> 5.1) pg_search (~> 2.3) @@ -352,6 +378,7 @@ DEPENDENCIES rails-pg-extras rails_best_practices scenic + solid_queue (~> 0.8.2) sprockets-rails (~> 3.4) strong_migrations whenever (~> 1.0) diff --git a/app/jobs/solid_queue_hello_world_job.rb b/app/jobs/solid_queue_hello_world_job.rb new file mode 100644 index 0000000..295858c --- /dev/null +++ b/app/jobs/solid_queue_hello_world_job.rb @@ -0,0 +1,7 @@ +class SolidQueueHelloWorldJob < ApplicationJob + queue_as :default + + def perform(*args) + Rails.logger.info "solid queue hello world" + end +end diff --git a/bin/jobs b/bin/jobs new file mode 100755 index 0000000..dcf59f3 --- /dev/null +++ b/bin/jobs @@ -0,0 +1,6 @@ +#!/usr/bin/env ruby + +require_relative "../config/environment" +require "solid_queue/cli" + +SolidQueue::Cli.start(ARGV) diff --git a/config/environments/development.rb b/config/environments/development.rb index a9c3707..2f26960 100644 --- a/config/environments/development.rb +++ b/config/environments/development.rb @@ -64,4 +64,6 @@ # config.active_record.database_selector = { delay: 2.seconds } # config.active_record.database_resolver = ActiveRecord::Middleware::DatabaseSelector::Resolver # config.active_record.database_resolver_context = ActiveRecord::Middleware::DatabaseSelector::Resolver::Session + + config.active_job.queue_adapter = :solid_queue end diff --git a/config/routes.rb b/config/routes.rb index 8f4b158..58b60d6 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -14,4 +14,7 @@ end post '/auth/login', to: 'authentication#login' + + # Mission Control + mount MissionControl::Jobs::Engine, at: "/jobs" end diff --git a/config/solid_queue.yml b/config/solid_queue.yml new file mode 100644 index 0000000..9eace59 --- /dev/null +++ b/config/solid_queue.yml @@ -0,0 +1,18 @@ +default: &default + dispatchers: + - polling_interval: 1 + batch_size: 500 + workers: + - queues: "*" + threads: 3 + processes: <%= ENV.fetch("JOB_CONCURRENCY", 1) %> + polling_interval: 0.1 + +development: + <<: *default + +test: + <<: *default + +production: + <<: *default diff --git a/db/queue_schema.rb b/db/queue_schema.rb new file mode 100644 index 0000000..4b49a12 --- /dev/null +++ b/db/queue_schema.rb @@ -0,0 +1,129 @@ +ActiveRecord::Schema[7.1].define(version: 2024_09_04_193154) do + create_table "solid_queue_blocked_executions", force: :cascade do |t| + t.bigint "job_id", null: false + t.string "queue_name", null: false + t.integer "priority", default: 0, null: false + t.string "concurrency_key", null: false + t.datetime "expires_at", null: false + t.datetime "created_at", null: false + t.index [ "concurrency_key", "priority", "job_id" ], name: "index_solid_queue_blocked_executions_for_release" + t.index [ "expires_at", "concurrency_key" ], name: "index_solid_queue_blocked_executions_for_maintenance" + t.index [ "job_id" ], name: "index_solid_queue_blocked_executions_on_job_id", unique: true + end + + create_table "solid_queue_claimed_executions", force: :cascade do |t| + t.bigint "job_id", null: false + t.bigint "process_id" + t.datetime "created_at", null: false + t.index [ "job_id" ], name: "index_solid_queue_claimed_executions_on_job_id", unique: true + t.index [ "process_id", "job_id" ], name: "index_solid_queue_claimed_executions_on_process_id_and_job_id" + end + + create_table "solid_queue_failed_executions", force: :cascade do |t| + t.bigint "job_id", null: false + t.text "error" + t.datetime "created_at", null: false + t.index [ "job_id" ], name: "index_solid_queue_failed_executions_on_job_id", unique: true + end + + create_table "solid_queue_jobs", force: :cascade do |t| + t.string "queue_name", null: false + t.string "class_name", null: false + t.text "arguments" + t.integer "priority", default: 0, null: false + t.string "active_job_id" + t.datetime "scheduled_at" + t.datetime "finished_at" + t.string "concurrency_key" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index [ "active_job_id" ], name: "index_solid_queue_jobs_on_active_job_id" + t.index [ "class_name" ], name: "index_solid_queue_jobs_on_class_name" + t.index [ "finished_at" ], name: "index_solid_queue_jobs_on_finished_at" + t.index [ "queue_name", "finished_at" ], name: "index_solid_queue_jobs_for_filtering" + t.index [ "scheduled_at", "finished_at" ], name: "index_solid_queue_jobs_for_alerting" + end + + create_table "solid_queue_pauses", force: :cascade do |t| + t.string "queue_name", null: false + t.datetime "created_at", null: false + t.index [ "queue_name" ], name: "index_solid_queue_pauses_on_queue_name", unique: true + end + + create_table "solid_queue_processes", force: :cascade do |t| + t.string "kind", null: false + t.datetime "last_heartbeat_at", null: false + t.bigint "supervisor_id" + t.integer "pid", null: false + t.string "hostname" + t.text "metadata" + t.datetime "created_at", null: false + t.string "name", null: false + t.index [ "last_heartbeat_at" ], name: "index_solid_queue_processes_on_last_heartbeat_at" + t.index [ "name", "supervisor_id" ], name: "index_solid_queue_processes_on_name_and_supervisor_id", unique: true + t.index [ "supervisor_id" ], name: "index_solid_queue_processes_on_supervisor_id" + end + + create_table "solid_queue_ready_executions", force: :cascade do |t| + t.bigint "job_id", null: false + t.string "queue_name", null: false + t.integer "priority", default: 0, null: false + t.datetime "created_at", null: false + t.index [ "job_id" ], name: "index_solid_queue_ready_executions_on_job_id", unique: true + t.index [ "priority", "job_id" ], name: "index_solid_queue_poll_all" + t.index [ "queue_name", "priority", "job_id" ], name: "index_solid_queue_poll_by_queue" + end + + create_table "solid_queue_recurring_executions", force: :cascade do |t| + t.bigint "job_id", null: false + t.string "task_key", null: false + t.datetime "run_at", null: false + t.datetime "created_at", null: false + t.index [ "job_id" ], name: "index_solid_queue_recurring_executions_on_job_id", unique: true + t.index [ "task_key", "run_at" ], name: "index_solid_queue_recurring_executions_on_task_key_and_run_at", unique: true + end + + create_table "solid_queue_recurring_tasks", force: :cascade do |t| + t.string "key", null: false + t.string "schedule", null: false + t.string "command", limit: 2048 + t.string "class_name" + t.text "arguments" + t.string "queue_name" + t.integer "priority", default: 0 + t.boolean "static", default: true, null: false + t.text "description" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index [ "key" ], name: "index_solid_queue_recurring_tasks_on_key", unique: true + t.index [ "static" ], name: "index_solid_queue_recurring_tasks_on_static" + end + + create_table "solid_queue_scheduled_executions", force: :cascade do |t| + t.bigint "job_id", null: false + t.string "queue_name", null: false + t.integer "priority", default: 0, null: false + t.datetime "scheduled_at", null: false + t.datetime "created_at", null: false + t.index [ "job_id" ], name: "index_solid_queue_scheduled_executions_on_job_id", unique: true + t.index [ "scheduled_at", "priority", "job_id" ], name: "index_solid_queue_dispatch_all" + end + + create_table "solid_queue_semaphores", force: :cascade do |t| + t.string "key", null: false + t.integer "value", default: 1, null: false + t.datetime "expires_at", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index [ "expires_at" ], name: "index_solid_queue_semaphores_on_expires_at" + t.index [ "key", "value" ], name: "index_solid_queue_semaphores_on_key_and_value" + t.index [ "key" ], name: "index_solid_queue_semaphores_on_key", unique: true + end + + add_foreign_key "solid_queue_blocked_executions", "solid_queue_jobs", column: "job_id", on_delete: :cascade + add_foreign_key "solid_queue_claimed_executions", "solid_queue_jobs", column: "job_id", on_delete: :cascade + add_foreign_key "solid_queue_failed_executions", "solid_queue_jobs", column: "job_id", on_delete: :cascade + add_foreign_key "solid_queue_ready_executions", "solid_queue_jobs", column: "job_id", on_delete: :cascade + add_foreign_key "solid_queue_recurring_executions", "solid_queue_jobs", column: "job_id", on_delete: :cascade + add_foreign_key "solid_queue_scheduled_executions", "solid_queue_jobs", column: "job_id", on_delete: :cascade +end diff --git a/db/structure.sql b/db/structure.sql index 8da33d7..ce1748d 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -11,30 +11,70 @@ SET row_security = off; ALTER TABLE IF EXISTS ONLY rideshare.trip_requests DROP CONSTRAINT IF EXISTS fk_rails_fa2679b626; ALTER TABLE IF EXISTS ONLY rideshare.trips DROP CONSTRAINT IF EXISTS fk_rails_e7560abc33; +ALTER TABLE IF EXISTS ONLY rideshare.solid_queue_scheduled_executions DROP CONSTRAINT IF EXISTS fk_rails_c4316f352d; ALTER TABLE IF EXISTS ONLY rideshare.trip_requests DROP CONSTRAINT IF EXISTS fk_rails_c17a139554; +ALTER TABLE IF EXISTS ONLY rideshare.solid_queue_claimed_executions DROP CONSTRAINT IF EXISTS fk_rails_9cfe4d4944; ALTER TABLE IF EXISTS ONLY rideshare.trip_positions DROP CONSTRAINT IF EXISTS fk_rails_9688ac8706; +ALTER TABLE IF EXISTS ONLY rideshare.solid_queue_ready_executions DROP CONSTRAINT IF EXISTS fk_rails_81fcbd66af; ALTER TABLE IF EXISTS ONLY rideshare.vehicle_reservations DROP CONSTRAINT IF EXISTS fk_rails_7edc8e666a; ALTER TABLE IF EXISTS ONLY rideshare.trips DROP CONSTRAINT IF EXISTS fk_rails_6d92acb430; ALTER TABLE IF EXISTS ONLY rideshare.vehicle_reservations DROP CONSTRAINT IF EXISTS fk_rails_59996232fc; +ALTER TABLE IF EXISTS ONLY rideshare.solid_queue_blocked_executions DROP CONSTRAINT IF EXISTS fk_rails_4cd34e2228; ALTER TABLE IF EXISTS ONLY rideshare.trip_requests DROP CONSTRAINT IF EXISTS fk_rails_3fdebbfaca; +ALTER TABLE IF EXISTS ONLY rideshare.solid_queue_failed_executions DROP CONSTRAINT IF EXISTS fk_rails_39bbc7a631; +ALTER TABLE IF EXISTS ONLY rideshare.solid_queue_recurring_executions DROP CONSTRAINT IF EXISTS fk_rails_318a5533ed; DROP INDEX IF EXISTS rideshare.index_vehicles_on_name; DROP INDEX IF EXISTS rideshare.index_vehicle_reservations_on_vehicle_id; -DROP INDEX IF EXISTS rideshare.index_users_on_last_name; -DROP INDEX IF EXISTS rideshare.index_users_on_email; -DROP INDEX IF EXISTS rideshare.index_trips_on_trip_request_id; -DROP INDEX IF EXISTS rideshare.index_trips_on_rating; -DROP INDEX IF EXISTS rideshare.index_trips_on_driver_id; -DROP INDEX IF EXISTS rideshare.index_trip_requests_on_start_location_id; -DROP INDEX IF EXISTS rideshare.index_trip_requests_on_rider_id; -DROP INDEX IF EXISTS rideshare.index_trip_requests_on_end_location_id; +DROP INDEX IF EXISTS rideshare.index_solid_queue_semaphores_on_key_and_value; +DROP INDEX IF EXISTS rideshare.index_solid_queue_semaphores_on_key; +DROP INDEX IF EXISTS rideshare.index_solid_queue_semaphores_on_expires_at; +DROP INDEX IF EXISTS rideshare.index_solid_queue_scheduled_executions_on_job_id; +DROP INDEX IF EXISTS rideshare.index_solid_queue_recurring_tasks_on_static; +DROP INDEX IF EXISTS rideshare.index_solid_queue_recurring_tasks_on_key; +DROP INDEX IF EXISTS rideshare.index_solid_queue_recurring_executions_on_task_key_and_run_at; +DROP INDEX IF EXISTS rideshare.index_solid_queue_recurring_executions_on_job_id; +DROP INDEX IF EXISTS rideshare.index_solid_queue_ready_executions_on_job_id; +DROP INDEX IF EXISTS rideshare.index_solid_queue_processes_on_supervisor_id; +DROP INDEX IF EXISTS rideshare.index_solid_queue_processes_on_name_and_supervisor_id; +DROP INDEX IF EXISTS rideshare.index_solid_queue_processes_on_last_heartbeat_at; +DROP INDEX IF EXISTS rideshare.index_solid_queue_poll_by_queue; +DROP INDEX IF EXISTS rideshare.index_solid_queue_poll_all; +DROP INDEX IF EXISTS rideshare.index_solid_queue_pauses_on_queue_name; +DROP INDEX IF EXISTS rideshare.index_solid_queue_jobs_on_finished_at; +DROP INDEX IF EXISTS rideshare.index_solid_queue_jobs_on_class_name; +DROP INDEX IF EXISTS rideshare.index_solid_queue_jobs_on_active_job_id; +DROP INDEX IF EXISTS rideshare.index_solid_queue_jobs_for_filtering; +DROP INDEX IF EXISTS rideshare.index_solid_queue_jobs_for_alerting; +DROP INDEX IF EXISTS rideshare.index_solid_queue_failed_executions_on_job_id; +DROP INDEX IF EXISTS rideshare.index_solid_queue_dispatch_all; +DROP INDEX IF EXISTS rideshare.index_solid_queue_claimed_executions_on_process_id_and_job_id; +DROP INDEX IF EXISTS rideshare.index_solid_queue_claimed_executions_on_job_id; +DROP INDEX IF EXISTS rideshare.index_solid_queue_blocked_executions_on_job_id; +DROP INDEX IF EXISTS rideshare.index_solid_queue_blocked_executions_for_release; +DROP INDEX IF EXISTS rideshare.index_solid_queue_blocked_executions_for_maintenance; DROP INDEX IF EXISTS rideshare.index_locations_on_address; DROP INDEX IF EXISTS rideshare.index_fast_search_results_on_driver_id; +DROP INDEX IF EXISTS rideshare.idx_users_sin_cov_partial; +DROP INDEX IF EXISTS rideshare.idx_trips_multi; +DROP INDEX IF EXISTS rideshare.idx_trips_driv_rat_completed_cov_part; +DROP INDEX IF EXISTS rideshare.idx_trip_requests_sin_partial; ALTER TABLE IF EXISTS ONLY rideshare.vehicles DROP CONSTRAINT IF EXISTS vehicles_pkey; ALTER TABLE IF EXISTS ONLY rideshare.vehicle_reservations DROP CONSTRAINT IF EXISTS vehicle_reservations_pkey; ALTER TABLE IF EXISTS ONLY rideshare.users DROP CONSTRAINT IF EXISTS users_pkey; ALTER TABLE IF EXISTS ONLY rideshare.trips DROP CONSTRAINT IF EXISTS trips_pkey; ALTER TABLE IF EXISTS ONLY rideshare.trip_requests DROP CONSTRAINT IF EXISTS trip_requests_pkey; ALTER TABLE IF EXISTS ONLY rideshare.trip_positions DROP CONSTRAINT IF EXISTS trip_positions_pkey; +ALTER TABLE IF EXISTS ONLY rideshare.solid_queue_semaphores DROP CONSTRAINT IF EXISTS solid_queue_semaphores_pkey; +ALTER TABLE IF EXISTS ONLY rideshare.solid_queue_scheduled_executions DROP CONSTRAINT IF EXISTS solid_queue_scheduled_executions_pkey; +ALTER TABLE IF EXISTS ONLY rideshare.solid_queue_recurring_tasks DROP CONSTRAINT IF EXISTS solid_queue_recurring_tasks_pkey; +ALTER TABLE IF EXISTS ONLY rideshare.solid_queue_recurring_executions DROP CONSTRAINT IF EXISTS solid_queue_recurring_executions_pkey; +ALTER TABLE IF EXISTS ONLY rideshare.solid_queue_ready_executions DROP CONSTRAINT IF EXISTS solid_queue_ready_executions_pkey; +ALTER TABLE IF EXISTS ONLY rideshare.solid_queue_processes DROP CONSTRAINT IF EXISTS solid_queue_processes_pkey; +ALTER TABLE IF EXISTS ONLY rideshare.solid_queue_pauses DROP CONSTRAINT IF EXISTS solid_queue_pauses_pkey; +ALTER TABLE IF EXISTS ONLY rideshare.solid_queue_jobs DROP CONSTRAINT IF EXISTS solid_queue_jobs_pkey; +ALTER TABLE IF EXISTS ONLY rideshare.solid_queue_failed_executions DROP CONSTRAINT IF EXISTS solid_queue_failed_executions_pkey; +ALTER TABLE IF EXISTS ONLY rideshare.solid_queue_claimed_executions DROP CONSTRAINT IF EXISTS solid_queue_claimed_executions_pkey; +ALTER TABLE IF EXISTS ONLY rideshare.solid_queue_blocked_executions DROP CONSTRAINT IF EXISTS solid_queue_blocked_executions_pkey; ALTER TABLE IF EXISTS ONLY rideshare.schema_migrations DROP CONSTRAINT IF EXISTS schema_migrations_pkey; ALTER TABLE IF EXISTS ONLY rideshare.vehicle_reservations DROP CONSTRAINT IF EXISTS non_overlapping_vehicle_registration; ALTER TABLE IF EXISTS ONLY rideshare.locations DROP CONSTRAINT IF EXISTS locations_pkey; @@ -46,6 +86,17 @@ ALTER TABLE IF EXISTS rideshare.users ALTER COLUMN id DROP DEFAULT; ALTER TABLE IF EXISTS rideshare.trips ALTER COLUMN id DROP DEFAULT; ALTER TABLE IF EXISTS rideshare.trip_requests ALTER COLUMN id DROP DEFAULT; ALTER TABLE IF EXISTS rideshare.trip_positions ALTER COLUMN id DROP DEFAULT; +ALTER TABLE IF EXISTS rideshare.solid_queue_semaphores ALTER COLUMN id DROP DEFAULT; +ALTER TABLE IF EXISTS rideshare.solid_queue_scheduled_executions ALTER COLUMN id DROP DEFAULT; +ALTER TABLE IF EXISTS rideshare.solid_queue_recurring_tasks ALTER COLUMN id DROP DEFAULT; +ALTER TABLE IF EXISTS rideshare.solid_queue_recurring_executions ALTER COLUMN id DROP DEFAULT; +ALTER TABLE IF EXISTS rideshare.solid_queue_ready_executions ALTER COLUMN id DROP DEFAULT; +ALTER TABLE IF EXISTS rideshare.solid_queue_processes ALTER COLUMN id DROP DEFAULT; +ALTER TABLE IF EXISTS rideshare.solid_queue_pauses ALTER COLUMN id DROP DEFAULT; +ALTER TABLE IF EXISTS rideshare.solid_queue_jobs ALTER COLUMN id DROP DEFAULT; +ALTER TABLE IF EXISTS rideshare.solid_queue_failed_executions ALTER COLUMN id DROP DEFAULT; +ALTER TABLE IF EXISTS rideshare.solid_queue_claimed_executions ALTER COLUMN id DROP DEFAULT; +ALTER TABLE IF EXISTS rideshare.solid_queue_blocked_executions ALTER COLUMN id DROP DEFAULT; ALTER TABLE IF EXISTS rideshare.locations ALTER COLUMN id DROP DEFAULT; DROP SEQUENCE IF EXISTS rideshare.vehicles_id_seq; DROP TABLE IF EXISTS rideshare.vehicles; @@ -57,6 +108,28 @@ DROP SEQUENCE IF EXISTS rideshare.trip_requests_id_seq; DROP TABLE IF EXISTS rideshare.trip_requests; DROP SEQUENCE IF EXISTS rideshare.trip_positions_id_seq; DROP TABLE IF EXISTS rideshare.trip_positions; +DROP SEQUENCE IF EXISTS rideshare.solid_queue_semaphores_id_seq; +DROP TABLE IF EXISTS rideshare.solid_queue_semaphores; +DROP SEQUENCE IF EXISTS rideshare.solid_queue_scheduled_executions_id_seq; +DROP TABLE IF EXISTS rideshare.solid_queue_scheduled_executions; +DROP SEQUENCE IF EXISTS rideshare.solid_queue_recurring_tasks_id_seq; +DROP TABLE IF EXISTS rideshare.solid_queue_recurring_tasks; +DROP SEQUENCE IF EXISTS rideshare.solid_queue_recurring_executions_id_seq; +DROP TABLE IF EXISTS rideshare.solid_queue_recurring_executions; +DROP SEQUENCE IF EXISTS rideshare.solid_queue_ready_executions_id_seq; +DROP TABLE IF EXISTS rideshare.solid_queue_ready_executions; +DROP SEQUENCE IF EXISTS rideshare.solid_queue_processes_id_seq; +DROP TABLE IF EXISTS rideshare.solid_queue_processes; +DROP SEQUENCE IF EXISTS rideshare.solid_queue_pauses_id_seq; +DROP TABLE IF EXISTS rideshare.solid_queue_pauses; +DROP SEQUENCE IF EXISTS rideshare.solid_queue_jobs_id_seq; +DROP TABLE IF EXISTS rideshare.solid_queue_jobs; +DROP SEQUENCE IF EXISTS rideshare.solid_queue_failed_executions_id_seq; +DROP TABLE IF EXISTS rideshare.solid_queue_failed_executions; +DROP SEQUENCE IF EXISTS rideshare.solid_queue_claimed_executions_id_seq; +DROP TABLE IF EXISTS rideshare.solid_queue_claimed_executions; +DROP SEQUENCE IF EXISTS rideshare.solid_queue_blocked_executions_id_seq; +DROP TABLE IF EXISTS rideshare.solid_queue_blocked_executions; DROP VIEW IF EXISTS rideshare.search_results; DROP TABLE IF EXISTS rideshare.schema_migrations; DROP SEQUENCE IF EXISTS rideshare.locations_id_seq; @@ -314,6 +387,375 @@ CREATE VIEW rideshare.search_results AS ORDER BY (count(t.rating)) DESC; +-- +-- Name: solid_queue_blocked_executions; Type: TABLE; Schema: rideshare; Owner: - +-- + +CREATE TABLE rideshare.solid_queue_blocked_executions ( + id bigint NOT NULL, + job_id integer NOT NULL, + queue_name character varying NOT NULL, + priority integer DEFAULT 0 NOT NULL, + concurrency_key character varying NOT NULL, + expires_at timestamp(6) without time zone NOT NULL, + created_at timestamp(6) without time zone NOT NULL +); + + +-- +-- Name: solid_queue_blocked_executions_id_seq; Type: SEQUENCE; Schema: rideshare; Owner: - +-- + +CREATE SEQUENCE rideshare.solid_queue_blocked_executions_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +-- +-- Name: solid_queue_blocked_executions_id_seq; Type: SEQUENCE OWNED BY; Schema: rideshare; Owner: - +-- + +ALTER SEQUENCE rideshare.solid_queue_blocked_executions_id_seq OWNED BY rideshare.solid_queue_blocked_executions.id; + + +-- +-- Name: solid_queue_claimed_executions; Type: TABLE; Schema: rideshare; Owner: - +-- + +CREATE TABLE rideshare.solid_queue_claimed_executions ( + id bigint NOT NULL, + job_id integer NOT NULL, + process_id bigint, + created_at timestamp(6) without time zone NOT NULL +); + + +-- +-- Name: solid_queue_claimed_executions_id_seq; Type: SEQUENCE; Schema: rideshare; Owner: - +-- + +CREATE SEQUENCE rideshare.solid_queue_claimed_executions_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +-- +-- Name: solid_queue_claimed_executions_id_seq; Type: SEQUENCE OWNED BY; Schema: rideshare; Owner: - +-- + +ALTER SEQUENCE rideshare.solid_queue_claimed_executions_id_seq OWNED BY rideshare.solid_queue_claimed_executions.id; + + +-- +-- Name: solid_queue_failed_executions; Type: TABLE; Schema: rideshare; Owner: - +-- + +CREATE TABLE rideshare.solid_queue_failed_executions ( + id bigint NOT NULL, + job_id integer NOT NULL, + error text, + created_at timestamp(6) without time zone NOT NULL +); + + +-- +-- Name: solid_queue_failed_executions_id_seq; Type: SEQUENCE; Schema: rideshare; Owner: - +-- + +CREATE SEQUENCE rideshare.solid_queue_failed_executions_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +-- +-- Name: solid_queue_failed_executions_id_seq; Type: SEQUENCE OWNED BY; Schema: rideshare; Owner: - +-- + +ALTER SEQUENCE rideshare.solid_queue_failed_executions_id_seq OWNED BY rideshare.solid_queue_failed_executions.id; + + +-- +-- Name: solid_queue_jobs; Type: TABLE; Schema: rideshare; Owner: - +-- + +CREATE TABLE rideshare.solid_queue_jobs ( + id bigint NOT NULL, + queue_name character varying NOT NULL, + class_name character varying NOT NULL, + arguments text, + priority integer DEFAULT 0 NOT NULL, + active_job_id character varying, + scheduled_at timestamp(6) without time zone, + finished_at timestamp(6) without time zone, + concurrency_key character varying, + created_at timestamp(6) without time zone NOT NULL, + updated_at timestamp(6) without time zone NOT NULL +); + + +-- +-- Name: solid_queue_jobs_id_seq; Type: SEQUENCE; Schema: rideshare; Owner: - +-- + +CREATE SEQUENCE rideshare.solid_queue_jobs_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +-- +-- Name: solid_queue_jobs_id_seq; Type: SEQUENCE OWNED BY; Schema: rideshare; Owner: - +-- + +ALTER SEQUENCE rideshare.solid_queue_jobs_id_seq OWNED BY rideshare.solid_queue_jobs.id; + + +-- +-- Name: solid_queue_pauses; Type: TABLE; Schema: rideshare; Owner: - +-- + +CREATE TABLE rideshare.solid_queue_pauses ( + id bigint NOT NULL, + queue_name character varying NOT NULL, + created_at timestamp(6) without time zone NOT NULL +); + + +-- +-- Name: solid_queue_pauses_id_seq; Type: SEQUENCE; Schema: rideshare; Owner: - +-- + +CREATE SEQUENCE rideshare.solid_queue_pauses_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +-- +-- Name: solid_queue_pauses_id_seq; Type: SEQUENCE OWNED BY; Schema: rideshare; Owner: - +-- + +ALTER SEQUENCE rideshare.solid_queue_pauses_id_seq OWNED BY rideshare.solid_queue_pauses.id; + + +-- +-- Name: solid_queue_processes; Type: TABLE; Schema: rideshare; Owner: - +-- + +CREATE TABLE rideshare.solid_queue_processes ( + id bigint NOT NULL, + kind character varying NOT NULL, + last_heartbeat_at timestamp(6) without time zone NOT NULL, + supervisor_id bigint, + pid integer NOT NULL, + hostname character varying, + metadata text, + created_at timestamp(6) without time zone NOT NULL, + name character varying NOT NULL +); + + +-- +-- Name: solid_queue_processes_id_seq; Type: SEQUENCE; Schema: rideshare; Owner: - +-- + +CREATE SEQUENCE rideshare.solid_queue_processes_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +-- +-- Name: solid_queue_processes_id_seq; Type: SEQUENCE OWNED BY; Schema: rideshare; Owner: - +-- + +ALTER SEQUENCE rideshare.solid_queue_processes_id_seq OWNED BY rideshare.solid_queue_processes.id; + + +-- +-- Name: solid_queue_ready_executions; Type: TABLE; Schema: rideshare; Owner: - +-- + +CREATE TABLE rideshare.solid_queue_ready_executions ( + id bigint NOT NULL, + job_id integer NOT NULL, + queue_name character varying NOT NULL, + priority integer DEFAULT 0 NOT NULL, + created_at timestamp(6) without time zone NOT NULL +); + + +-- +-- Name: solid_queue_ready_executions_id_seq; Type: SEQUENCE; Schema: rideshare; Owner: - +-- + +CREATE SEQUENCE rideshare.solid_queue_ready_executions_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +-- +-- Name: solid_queue_ready_executions_id_seq; Type: SEQUENCE OWNED BY; Schema: rideshare; Owner: - +-- + +ALTER SEQUENCE rideshare.solid_queue_ready_executions_id_seq OWNED BY rideshare.solid_queue_ready_executions.id; + + +-- +-- Name: solid_queue_recurring_executions; Type: TABLE; Schema: rideshare; Owner: - +-- + +CREATE TABLE rideshare.solid_queue_recurring_executions ( + id bigint NOT NULL, + job_id integer NOT NULL, + task_key character varying NOT NULL, + run_at timestamp(6) without time zone NOT NULL, + created_at timestamp(6) without time zone NOT NULL +); + + +-- +-- Name: solid_queue_recurring_executions_id_seq; Type: SEQUENCE; Schema: rideshare; Owner: - +-- + +CREATE SEQUENCE rideshare.solid_queue_recurring_executions_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +-- +-- Name: solid_queue_recurring_executions_id_seq; Type: SEQUENCE OWNED BY; Schema: rideshare; Owner: - +-- + +ALTER SEQUENCE rideshare.solid_queue_recurring_executions_id_seq OWNED BY rideshare.solid_queue_recurring_executions.id; + + +-- +-- Name: solid_queue_recurring_tasks; Type: TABLE; Schema: rideshare; Owner: - +-- + +CREATE TABLE rideshare.solid_queue_recurring_tasks ( + id bigint NOT NULL, + key character varying NOT NULL, + schedule character varying NOT NULL, + command character varying(2048), + class_name character varying, + arguments text, + queue_name character varying, + priority integer DEFAULT 0, + static boolean DEFAULT true NOT NULL, + description text, + created_at timestamp(6) without time zone NOT NULL, + updated_at timestamp(6) without time zone NOT NULL +); + + +-- +-- Name: solid_queue_recurring_tasks_id_seq; Type: SEQUENCE; Schema: rideshare; Owner: - +-- + +CREATE SEQUENCE rideshare.solid_queue_recurring_tasks_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +-- +-- Name: solid_queue_recurring_tasks_id_seq; Type: SEQUENCE OWNED BY; Schema: rideshare; Owner: - +-- + +ALTER SEQUENCE rideshare.solid_queue_recurring_tasks_id_seq OWNED BY rideshare.solid_queue_recurring_tasks.id; + + +-- +-- Name: solid_queue_scheduled_executions; Type: TABLE; Schema: rideshare; Owner: - +-- + +CREATE TABLE rideshare.solid_queue_scheduled_executions ( + id bigint NOT NULL, + job_id integer NOT NULL, + queue_name character varying NOT NULL, + priority integer DEFAULT 0 NOT NULL, + scheduled_at timestamp(6) without time zone NOT NULL, + created_at timestamp(6) without time zone NOT NULL +); + + +-- +-- Name: solid_queue_scheduled_executions_id_seq; Type: SEQUENCE; Schema: rideshare; Owner: - +-- + +CREATE SEQUENCE rideshare.solid_queue_scheduled_executions_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +-- +-- Name: solid_queue_scheduled_executions_id_seq; Type: SEQUENCE OWNED BY; Schema: rideshare; Owner: - +-- + +ALTER SEQUENCE rideshare.solid_queue_scheduled_executions_id_seq OWNED BY rideshare.solid_queue_scheduled_executions.id; + + +-- +-- Name: solid_queue_semaphores; Type: TABLE; Schema: rideshare; Owner: - +-- + +CREATE TABLE rideshare.solid_queue_semaphores ( + id bigint NOT NULL, + key character varying NOT NULL, + value integer DEFAULT 1 NOT NULL, + expires_at timestamp(6) without time zone NOT NULL, + created_at timestamp(6) without time zone NOT NULL, + updated_at timestamp(6) without time zone NOT NULL +); + + +-- +-- Name: solid_queue_semaphores_id_seq; Type: SEQUENCE; Schema: rideshare; Owner: - +-- + +CREATE SEQUENCE rideshare.solid_queue_semaphores_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +-- +-- Name: solid_queue_semaphores_id_seq; Type: SEQUENCE OWNED BY; Schema: rideshare; Owner: - +-- + +ALTER SEQUENCE rideshare.solid_queue_semaphores_id_seq OWNED BY rideshare.solid_queue_semaphores.id; + + -- -- Name: trip_positions; Type: TABLE; Schema: rideshare; Owner: - -- @@ -491,6 +933,83 @@ ALTER SEQUENCE rideshare.vehicles_id_seq OWNED BY rideshare.vehicles.id; ALTER TABLE ONLY rideshare.locations ALTER COLUMN id SET DEFAULT nextval('rideshare.locations_id_seq'::regclass); +-- +-- Name: solid_queue_blocked_executions id; Type: DEFAULT; Schema: rideshare; Owner: - +-- + +ALTER TABLE ONLY rideshare.solid_queue_blocked_executions ALTER COLUMN id SET DEFAULT nextval('rideshare.solid_queue_blocked_executions_id_seq'::regclass); + + +-- +-- Name: solid_queue_claimed_executions id; Type: DEFAULT; Schema: rideshare; Owner: - +-- + +ALTER TABLE ONLY rideshare.solid_queue_claimed_executions ALTER COLUMN id SET DEFAULT nextval('rideshare.solid_queue_claimed_executions_id_seq'::regclass); + + +-- +-- Name: solid_queue_failed_executions id; Type: DEFAULT; Schema: rideshare; Owner: - +-- + +ALTER TABLE ONLY rideshare.solid_queue_failed_executions ALTER COLUMN id SET DEFAULT nextval('rideshare.solid_queue_failed_executions_id_seq'::regclass); + + +-- +-- Name: solid_queue_jobs id; Type: DEFAULT; Schema: rideshare; Owner: - +-- + +ALTER TABLE ONLY rideshare.solid_queue_jobs ALTER COLUMN id SET DEFAULT nextval('rideshare.solid_queue_jobs_id_seq'::regclass); + + +-- +-- Name: solid_queue_pauses id; Type: DEFAULT; Schema: rideshare; Owner: - +-- + +ALTER TABLE ONLY rideshare.solid_queue_pauses ALTER COLUMN id SET DEFAULT nextval('rideshare.solid_queue_pauses_id_seq'::regclass); + + +-- +-- Name: solid_queue_processes id; Type: DEFAULT; Schema: rideshare; Owner: - +-- + +ALTER TABLE ONLY rideshare.solid_queue_processes ALTER COLUMN id SET DEFAULT nextval('rideshare.solid_queue_processes_id_seq'::regclass); + + +-- +-- Name: solid_queue_ready_executions id; Type: DEFAULT; Schema: rideshare; Owner: - +-- + +ALTER TABLE ONLY rideshare.solid_queue_ready_executions ALTER COLUMN id SET DEFAULT nextval('rideshare.solid_queue_ready_executions_id_seq'::regclass); + + +-- +-- Name: solid_queue_recurring_executions id; Type: DEFAULT; Schema: rideshare; Owner: - +-- + +ALTER TABLE ONLY rideshare.solid_queue_recurring_executions ALTER COLUMN id SET DEFAULT nextval('rideshare.solid_queue_recurring_executions_id_seq'::regclass); + + +-- +-- Name: solid_queue_recurring_tasks id; Type: DEFAULT; Schema: rideshare; Owner: - +-- + +ALTER TABLE ONLY rideshare.solid_queue_recurring_tasks ALTER COLUMN id SET DEFAULT nextval('rideshare.solid_queue_recurring_tasks_id_seq'::regclass); + + +-- +-- Name: solid_queue_scheduled_executions id; Type: DEFAULT; Schema: rideshare; Owner: - +-- + +ALTER TABLE ONLY rideshare.solid_queue_scheduled_executions ALTER COLUMN id SET DEFAULT nextval('rideshare.solid_queue_scheduled_executions_id_seq'::regclass); + + +-- +-- Name: solid_queue_semaphores id; Type: DEFAULT; Schema: rideshare; Owner: - +-- + +ALTER TABLE ONLY rideshare.solid_queue_semaphores ALTER COLUMN id SET DEFAULT nextval('rideshare.solid_queue_semaphores_id_seq'::regclass); + + -- -- Name: trip_positions id; Type: DEFAULT; Schema: rideshare; Owner: - -- @@ -573,6 +1092,94 @@ ALTER TABLE ONLY rideshare.schema_migrations ADD CONSTRAINT schema_migrations_pkey PRIMARY KEY (version); +-- +-- Name: solid_queue_blocked_executions solid_queue_blocked_executions_pkey; Type: CONSTRAINT; Schema: rideshare; Owner: - +-- + +ALTER TABLE ONLY rideshare.solid_queue_blocked_executions + ADD CONSTRAINT solid_queue_blocked_executions_pkey PRIMARY KEY (id); + + +-- +-- Name: solid_queue_claimed_executions solid_queue_claimed_executions_pkey; Type: CONSTRAINT; Schema: rideshare; Owner: - +-- + +ALTER TABLE ONLY rideshare.solid_queue_claimed_executions + ADD CONSTRAINT solid_queue_claimed_executions_pkey PRIMARY KEY (id); + + +-- +-- Name: solid_queue_failed_executions solid_queue_failed_executions_pkey; Type: CONSTRAINT; Schema: rideshare; Owner: - +-- + +ALTER TABLE ONLY rideshare.solid_queue_failed_executions + ADD CONSTRAINT solid_queue_failed_executions_pkey PRIMARY KEY (id); + + +-- +-- Name: solid_queue_jobs solid_queue_jobs_pkey; Type: CONSTRAINT; Schema: rideshare; Owner: - +-- + +ALTER TABLE ONLY rideshare.solid_queue_jobs + ADD CONSTRAINT solid_queue_jobs_pkey PRIMARY KEY (id); + + +-- +-- Name: solid_queue_pauses solid_queue_pauses_pkey; Type: CONSTRAINT; Schema: rideshare; Owner: - +-- + +ALTER TABLE ONLY rideshare.solid_queue_pauses + ADD CONSTRAINT solid_queue_pauses_pkey PRIMARY KEY (id); + + +-- +-- Name: solid_queue_processes solid_queue_processes_pkey; Type: CONSTRAINT; Schema: rideshare; Owner: - +-- + +ALTER TABLE ONLY rideshare.solid_queue_processes + ADD CONSTRAINT solid_queue_processes_pkey PRIMARY KEY (id); + + +-- +-- Name: solid_queue_ready_executions solid_queue_ready_executions_pkey; Type: CONSTRAINT; Schema: rideshare; Owner: - +-- + +ALTER TABLE ONLY rideshare.solid_queue_ready_executions + ADD CONSTRAINT solid_queue_ready_executions_pkey PRIMARY KEY (id); + + +-- +-- Name: solid_queue_recurring_executions solid_queue_recurring_executions_pkey; Type: CONSTRAINT; Schema: rideshare; Owner: - +-- + +ALTER TABLE ONLY rideshare.solid_queue_recurring_executions + ADD CONSTRAINT solid_queue_recurring_executions_pkey PRIMARY KEY (id); + + +-- +-- Name: solid_queue_recurring_tasks solid_queue_recurring_tasks_pkey; Type: CONSTRAINT; Schema: rideshare; Owner: - +-- + +ALTER TABLE ONLY rideshare.solid_queue_recurring_tasks + ADD CONSTRAINT solid_queue_recurring_tasks_pkey PRIMARY KEY (id); + + +-- +-- Name: solid_queue_scheduled_executions solid_queue_scheduled_executions_pkey; Type: CONSTRAINT; Schema: rideshare; Owner: - +-- + +ALTER TABLE ONLY rideshare.solid_queue_scheduled_executions + ADD CONSTRAINT solid_queue_scheduled_executions_pkey PRIMARY KEY (id); + + +-- +-- Name: solid_queue_semaphores solid_queue_semaphores_pkey; Type: CONSTRAINT; Schema: rideshare; Owner: - +-- + +ALTER TABLE ONLY rideshare.solid_queue_semaphores + ADD CONSTRAINT solid_queue_semaphores_pkey PRIMARY KEY (id); + + -- -- Name: trip_positions trip_positions_pkey; Type: CONSTRAINT; Schema: rideshare; Owner: - -- @@ -621,6 +1228,34 @@ ALTER TABLE ONLY rideshare.vehicles ADD CONSTRAINT vehicles_pkey PRIMARY KEY (id); +-- +-- Name: idx_trip_requests_sin_partial; Type: INDEX; Schema: rideshare; Owner: - +-- + +CREATE INDEX idx_trip_requests_sin_partial ON rideshare.trip_requests USING btree (id) WHERE (end_location_id = 2); + + +-- +-- Name: idx_trips_driv_rat_completed_cov_part; Type: INDEX; Schema: rideshare; Owner: - +-- + +CREATE INDEX idx_trips_driv_rat_completed_cov_part ON rideshare.trips USING btree (driver_id) INCLUDE (rating) WHERE ((rating IS NOT NULL) AND (completed_at IS NOT NULL)); + + +-- +-- Name: idx_trips_multi; Type: INDEX; Schema: rideshare; Owner: - +-- + +CREATE INDEX idx_trips_multi ON rideshare.trips USING btree (completed_at, trip_request_id, driver_id); + + +-- +-- Name: idx_users_sin_cov_partial; Type: INDEX; Schema: rideshare; Owner: - +-- + +CREATE INDEX idx_users_sin_cov_partial ON rideshare.users USING btree (id) INCLUDE (first_name, last_name) WHERE ((type)::text = 'Driver'::text); + + -- -- Name: index_fast_search_results_on_driver_id; Type: INDEX; Schema: rideshare; Owner: - -- @@ -636,59 +1271,192 @@ CREATE UNIQUE INDEX index_locations_on_address ON rideshare.locations USING btre -- --- Name: index_trip_requests_on_end_location_id; Type: INDEX; Schema: rideshare; Owner: - +-- Name: index_solid_queue_blocked_executions_for_maintenance; Type: INDEX; Schema: rideshare; Owner: - +-- + +CREATE INDEX index_solid_queue_blocked_executions_for_maintenance ON rideshare.solid_queue_blocked_executions USING btree (expires_at, concurrency_key); + + +-- +-- Name: index_solid_queue_blocked_executions_for_release; Type: INDEX; Schema: rideshare; Owner: - +-- + +CREATE INDEX index_solid_queue_blocked_executions_for_release ON rideshare.solid_queue_blocked_executions USING btree (concurrency_key, priority, job_id); + + +-- +-- Name: index_solid_queue_blocked_executions_on_job_id; Type: INDEX; Schema: rideshare; Owner: - +-- + +CREATE UNIQUE INDEX index_solid_queue_blocked_executions_on_job_id ON rideshare.solid_queue_blocked_executions USING btree (job_id); + + +-- +-- Name: index_solid_queue_claimed_executions_on_job_id; Type: INDEX; Schema: rideshare; Owner: - +-- + +CREATE UNIQUE INDEX index_solid_queue_claimed_executions_on_job_id ON rideshare.solid_queue_claimed_executions USING btree (job_id); + + +-- +-- Name: index_solid_queue_claimed_executions_on_process_id_and_job_id; Type: INDEX; Schema: rideshare; Owner: - +-- + +CREATE INDEX index_solid_queue_claimed_executions_on_process_id_and_job_id ON rideshare.solid_queue_claimed_executions USING btree (process_id, job_id); + + +-- +-- Name: index_solid_queue_dispatch_all; Type: INDEX; Schema: rideshare; Owner: - +-- + +CREATE INDEX index_solid_queue_dispatch_all ON rideshare.solid_queue_scheduled_executions USING btree (scheduled_at, priority, job_id); + + +-- +-- Name: index_solid_queue_failed_executions_on_job_id; Type: INDEX; Schema: rideshare; Owner: - +-- + +CREATE UNIQUE INDEX index_solid_queue_failed_executions_on_job_id ON rideshare.solid_queue_failed_executions USING btree (job_id); + + +-- +-- Name: index_solid_queue_jobs_for_alerting; Type: INDEX; Schema: rideshare; Owner: - +-- + +CREATE INDEX index_solid_queue_jobs_for_alerting ON rideshare.solid_queue_jobs USING btree (scheduled_at, finished_at); + + +-- +-- Name: index_solid_queue_jobs_for_filtering; Type: INDEX; Schema: rideshare; Owner: - +-- + +CREATE INDEX index_solid_queue_jobs_for_filtering ON rideshare.solid_queue_jobs USING btree (queue_name, finished_at); + + +-- +-- Name: index_solid_queue_jobs_on_active_job_id; Type: INDEX; Schema: rideshare; Owner: - +-- + +CREATE INDEX index_solid_queue_jobs_on_active_job_id ON rideshare.solid_queue_jobs USING btree (active_job_id); + + +-- +-- Name: index_solid_queue_jobs_on_class_name; Type: INDEX; Schema: rideshare; Owner: - +-- + +CREATE INDEX index_solid_queue_jobs_on_class_name ON rideshare.solid_queue_jobs USING btree (class_name); + + +-- +-- Name: index_solid_queue_jobs_on_finished_at; Type: INDEX; Schema: rideshare; Owner: - +-- + +CREATE INDEX index_solid_queue_jobs_on_finished_at ON rideshare.solid_queue_jobs USING btree (finished_at); + + +-- +-- Name: index_solid_queue_pauses_on_queue_name; Type: INDEX; Schema: rideshare; Owner: - +-- + +CREATE UNIQUE INDEX index_solid_queue_pauses_on_queue_name ON rideshare.solid_queue_pauses USING btree (queue_name); + + +-- +-- Name: index_solid_queue_poll_all; Type: INDEX; Schema: rideshare; Owner: - +-- + +CREATE INDEX index_solid_queue_poll_all ON rideshare.solid_queue_ready_executions USING btree (priority, job_id); + + +-- +-- Name: index_solid_queue_poll_by_queue; Type: INDEX; Schema: rideshare; Owner: - +-- + +CREATE INDEX index_solid_queue_poll_by_queue ON rideshare.solid_queue_ready_executions USING btree (queue_name, priority, job_id); + + +-- +-- Name: index_solid_queue_processes_on_last_heartbeat_at; Type: INDEX; Schema: rideshare; Owner: - +-- + +CREATE INDEX index_solid_queue_processes_on_last_heartbeat_at ON rideshare.solid_queue_processes USING btree (last_heartbeat_at); + + +-- +-- Name: index_solid_queue_processes_on_name_and_supervisor_id; Type: INDEX; Schema: rideshare; Owner: - +-- + +CREATE UNIQUE INDEX index_solid_queue_processes_on_name_and_supervisor_id ON rideshare.solid_queue_processes USING btree (name, supervisor_id); + + +-- +-- Name: index_solid_queue_processes_on_supervisor_id; Type: INDEX; Schema: rideshare; Owner: - +-- + +CREATE INDEX index_solid_queue_processes_on_supervisor_id ON rideshare.solid_queue_processes USING btree (supervisor_id); + + +-- +-- Name: index_solid_queue_ready_executions_on_job_id; Type: INDEX; Schema: rideshare; Owner: - -- -CREATE INDEX index_trip_requests_on_end_location_id ON rideshare.trip_requests USING btree (end_location_id); +CREATE UNIQUE INDEX index_solid_queue_ready_executions_on_job_id ON rideshare.solid_queue_ready_executions USING btree (job_id); -- --- Name: index_trip_requests_on_rider_id; Type: INDEX; Schema: rideshare; Owner: - +-- Name: index_solid_queue_recurring_executions_on_job_id; Type: INDEX; Schema: rideshare; Owner: - -- -CREATE INDEX index_trip_requests_on_rider_id ON rideshare.trip_requests USING btree (rider_id); +CREATE UNIQUE INDEX index_solid_queue_recurring_executions_on_job_id ON rideshare.solid_queue_recurring_executions USING btree (job_id); -- --- Name: index_trip_requests_on_start_location_id; Type: INDEX; Schema: rideshare; Owner: - +-- Name: index_solid_queue_recurring_executions_on_task_key_and_run_at; Type: INDEX; Schema: rideshare; Owner: - -- -CREATE INDEX index_trip_requests_on_start_location_id ON rideshare.trip_requests USING btree (start_location_id); +CREATE UNIQUE INDEX index_solid_queue_recurring_executions_on_task_key_and_run_at ON rideshare.solid_queue_recurring_executions USING btree (task_key, run_at); -- --- Name: index_trips_on_driver_id; Type: INDEX; Schema: rideshare; Owner: - +-- Name: index_solid_queue_recurring_tasks_on_key; Type: INDEX; Schema: rideshare; Owner: - -- -CREATE INDEX index_trips_on_driver_id ON rideshare.trips USING btree (driver_id); +CREATE UNIQUE INDEX index_solid_queue_recurring_tasks_on_key ON rideshare.solid_queue_recurring_tasks USING btree (key); -- --- Name: index_trips_on_rating; Type: INDEX; Schema: rideshare; Owner: - +-- Name: index_solid_queue_recurring_tasks_on_static; Type: INDEX; Schema: rideshare; Owner: - -- -CREATE INDEX index_trips_on_rating ON rideshare.trips USING btree (rating); +CREATE INDEX index_solid_queue_recurring_tasks_on_static ON rideshare.solid_queue_recurring_tasks USING btree (static); -- --- Name: index_trips_on_trip_request_id; Type: INDEX; Schema: rideshare; Owner: - +-- Name: index_solid_queue_scheduled_executions_on_job_id; Type: INDEX; Schema: rideshare; Owner: - -- -CREATE INDEX index_trips_on_trip_request_id ON rideshare.trips USING btree (trip_request_id); +CREATE UNIQUE INDEX index_solid_queue_scheduled_executions_on_job_id ON rideshare.solid_queue_scheduled_executions USING btree (job_id); -- --- Name: index_users_on_email; Type: INDEX; Schema: rideshare; Owner: - +-- Name: index_solid_queue_semaphores_on_expires_at; Type: INDEX; Schema: rideshare; Owner: - -- -CREATE UNIQUE INDEX index_users_on_email ON rideshare.users USING btree (email); +CREATE INDEX index_solid_queue_semaphores_on_expires_at ON rideshare.solid_queue_semaphores USING btree (expires_at); -- --- Name: index_users_on_last_name; Type: INDEX; Schema: rideshare; Owner: - +-- Name: index_solid_queue_semaphores_on_key; Type: INDEX; Schema: rideshare; Owner: - -- -CREATE INDEX index_users_on_last_name ON rideshare.users USING btree (last_name); +CREATE UNIQUE INDEX index_solid_queue_semaphores_on_key ON rideshare.solid_queue_semaphores USING btree (key); + + +-- +-- Name: index_solid_queue_semaphores_on_key_and_value; Type: INDEX; Schema: rideshare; Owner: - +-- + +CREATE INDEX index_solid_queue_semaphores_on_key_and_value ON rideshare.solid_queue_semaphores USING btree (key, value); -- @@ -705,6 +1473,22 @@ CREATE INDEX index_vehicle_reservations_on_vehicle_id ON rideshare.vehicle_reser CREATE UNIQUE INDEX index_vehicles_on_name ON rideshare.vehicles USING btree (name); +-- +-- Name: solid_queue_recurring_executions fk_rails_318a5533ed; Type: FK CONSTRAINT; Schema: rideshare; Owner: - +-- + +ALTER TABLE ONLY rideshare.solid_queue_recurring_executions + ADD CONSTRAINT fk_rails_318a5533ed FOREIGN KEY (job_id) REFERENCES rideshare.solid_queue_jobs(id) ON DELETE CASCADE; + + +-- +-- Name: solid_queue_failed_executions fk_rails_39bbc7a631; Type: FK CONSTRAINT; Schema: rideshare; Owner: - +-- + +ALTER TABLE ONLY rideshare.solid_queue_failed_executions + ADD CONSTRAINT fk_rails_39bbc7a631 FOREIGN KEY (job_id) REFERENCES rideshare.solid_queue_jobs(id) ON DELETE CASCADE; + + -- -- Name: trip_requests fk_rails_3fdebbfaca; Type: FK CONSTRAINT; Schema: rideshare; Owner: - -- @@ -713,6 +1497,14 @@ ALTER TABLE ONLY rideshare.trip_requests ADD CONSTRAINT fk_rails_3fdebbfaca FOREIGN KEY (end_location_id) REFERENCES rideshare.locations(id); +-- +-- Name: solid_queue_blocked_executions fk_rails_4cd34e2228; Type: FK CONSTRAINT; Schema: rideshare; Owner: - +-- + +ALTER TABLE ONLY rideshare.solid_queue_blocked_executions + ADD CONSTRAINT fk_rails_4cd34e2228 FOREIGN KEY (job_id) REFERENCES rideshare.solid_queue_jobs(id) ON DELETE CASCADE; + + -- -- Name: vehicle_reservations fk_rails_59996232fc; Type: FK CONSTRAINT; Schema: rideshare; Owner: - -- @@ -737,6 +1529,14 @@ ALTER TABLE ONLY rideshare.vehicle_reservations ADD CONSTRAINT fk_rails_7edc8e666a FOREIGN KEY (vehicle_id) REFERENCES rideshare.vehicles(id); +-- +-- Name: solid_queue_ready_executions fk_rails_81fcbd66af; Type: FK CONSTRAINT; Schema: rideshare; Owner: - +-- + +ALTER TABLE ONLY rideshare.solid_queue_ready_executions + ADD CONSTRAINT fk_rails_81fcbd66af FOREIGN KEY (job_id) REFERENCES rideshare.solid_queue_jobs(id) ON DELETE CASCADE; + + -- -- Name: trip_positions fk_rails_9688ac8706; Type: FK CONSTRAINT; Schema: rideshare; Owner: - -- @@ -745,6 +1545,14 @@ ALTER TABLE ONLY rideshare.trip_positions ADD CONSTRAINT fk_rails_9688ac8706 FOREIGN KEY (trip_id) REFERENCES rideshare.trips(id); +-- +-- Name: solid_queue_claimed_executions fk_rails_9cfe4d4944; Type: FK CONSTRAINT; Schema: rideshare; Owner: - +-- + +ALTER TABLE ONLY rideshare.solid_queue_claimed_executions + ADD CONSTRAINT fk_rails_9cfe4d4944 FOREIGN KEY (job_id) REFERENCES rideshare.solid_queue_jobs(id) ON DELETE CASCADE; + + -- -- Name: trip_requests fk_rails_c17a139554; Type: FK CONSTRAINT; Schema: rideshare; Owner: - -- @@ -753,6 +1561,14 @@ ALTER TABLE ONLY rideshare.trip_requests ADD CONSTRAINT fk_rails_c17a139554 FOREIGN KEY (rider_id) REFERENCES rideshare.users(id); +-- +-- Name: solid_queue_scheduled_executions fk_rails_c4316f352d; Type: FK CONSTRAINT; Schema: rideshare; Owner: - +-- + +ALTER TABLE ONLY rideshare.solid_queue_scheduled_executions + ADD CONSTRAINT fk_rails_c4316f352d FOREIGN KEY (job_id) REFERENCES rideshare.solid_queue_jobs(id) ON DELETE CASCADE; + + -- -- Name: trips fk_rails_e7560abc33; Type: FK CONSTRAINT; Schema: rideshare; Owner: - -- @@ -776,6 +1592,8 @@ ALTER TABLE ONLY rideshare.trip_requests SET search_path TO rideshare; INSERT INTO "schema_migrations" (version) VALUES +('20240906033935'), +('20240905235053'), ('20231220043547'), ('20231218215836'), ('20231213045957'), diff --git a/erd.pdf b/erd.pdf index cceb3c03256815d06b7cce0821e5bd3b3ba1f760..2a54d7dfa0062d1cf07a92d4f632476c36da1a97 100644 GIT binary patch delta 47143 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 delta 37952 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