diff --git a/apps/api/src/db/0025_submission_problem_user_idx.sql b/apps/api/src/db/0025_submission_problem_user_idx.sql
new file mode 100644
index 0000000..f0eae6a
--- /dev/null
+++ b/apps/api/src/db/0025_submission_problem_user_idx.sql
@@ -0,0 +1 @@
+CREATE INDEX "submission_public_problem_user_idx" ON "submission" USING btree ("problem_id","user_id","result") WHERE "submission"."contest_id" is null;
\ No newline at end of file
diff --git a/apps/api/src/db/meta/0025_snapshot.json b/apps/api/src/db/meta/0025_snapshot.json
new file mode 100644
index 0000000..7dd987a
--- /dev/null
+++ b/apps/api/src/db/meta/0025_snapshot.json
@@ -0,0 +1,4134 @@
+{
+ "id": "078927db-9fd3-47c6-973f-b55739842b3e",
+ "prevId": "91d14703-3375-40fb-9726-4923f712876e",
+ "version": "7",
+ "dialect": "postgresql",
+ "tables": {
+ "public.achievement": {
+ "name": "achievement",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "bigint",
+ "primaryKey": true,
+ "notNull": true,
+ "identity": {
+ "type": "byDefault",
+ "name": "achievement_id_seq",
+ "schema": "public",
+ "increment": "1",
+ "startWith": "1",
+ "minValue": "1",
+ "maxValue": "9223372036854775807",
+ "cache": "1",
+ "cycle": false
+ }
+ },
+ "name": {
+ "name": "name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "description": {
+ "name": "description",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "icon": {
+ "name": "icon",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "rarity": {
+ "name": "rarity",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "hidden": {
+ "name": "hidden",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "metric": {
+ "name": "metric",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "operator": {
+ "name": "operator",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "threshold": {
+ "name": "threshold",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "visible": {
+ "name": "visible",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": true
+ },
+ "unlock_count": {
+ "name": "unlock_count",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 0
+ },
+ "order": {
+ "name": "order",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 0
+ },
+ "create_time": {
+ "name": "create_time",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.acm_contest_rank": {
+ "name": "acm_contest_rank",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "serial",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "submission_number": {
+ "name": "submission_number",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 0
+ },
+ "accepted_number": {
+ "name": "accepted_number",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 0
+ },
+ "total_time": {
+ "name": "total_time",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 0
+ },
+ "submission_info": {
+ "name": "submission_info",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'{}'::jsonb"
+ },
+ "contest_id": {
+ "name": "contest_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "user_id": {
+ "name": "user_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {
+ "acm_rank_contest_user_idx": {
+ "name": "acm_rank_contest_user_idx",
+ "columns": [
+ {
+ "expression": "contest_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last",
+ "opclass": "int4_ops"
+ },
+ {
+ "expression": "user_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last",
+ "opclass": "int4_ops"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "acm_rank_order_idx": {
+ "name": "acm_rank_order_idx",
+ "columns": [
+ {
+ "expression": "contest_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last",
+ "opclass": "int4_ops"
+ },
+ {
+ "expression": "accepted_number",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last",
+ "opclass": "int4_ops"
+ },
+ {
+ "expression": "total_time",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last",
+ "opclass": "int4_ops"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "acm_contest_rank_contest_id_21030ccd_fk_contest_id": {
+ "name": "acm_contest_rank_contest_id_21030ccd_fk_contest_id",
+ "tableFrom": "acm_contest_rank",
+ "tableTo": "contest",
+ "columnsFrom": [
+ "contest_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ },
+ "acm_contest_rank_user_id_40391ab2_fk_user_id": {
+ "name": "acm_contest_rank_user_id_40391ab2_fk_user_id",
+ "tableFrom": "acm_contest_rank",
+ "tableTo": "user",
+ "columnsFrom": [
+ "user_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "unique_acm_rank_user_contest": {
+ "name": "unique_acm_rank_user_contest",
+ "nullsNotDistinct": false,
+ "columns": [
+ "contest_id",
+ "user_id"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.ai_analysis": {
+ "name": "ai_analysis",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "bigint",
+ "primaryKey": true,
+ "notNull": true,
+ "identity": {
+ "type": "byDefault",
+ "name": "ai_analysis_id_seq",
+ "schema": "public",
+ "increment": "1",
+ "startWith": "1",
+ "minValue": "1",
+ "maxValue": "9223372036854775807",
+ "cache": "1",
+ "cycle": false
+ }
+ },
+ "provider": {
+ "name": "provider",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "data": {
+ "name": "data",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "system_prompt": {
+ "name": "system_prompt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "user_prompt": {
+ "name": "user_prompt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "analysis": {
+ "name": "analysis",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "create_time": {
+ "name": "create_time",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "user_id": {
+ "name": "user_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "model": {
+ "name": "model",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "is_pinned": {
+ "name": "is_pinned",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {
+ "ai_analysis_user_id_3aa23011": {
+ "name": "ai_analysis_user_id_3aa23011",
+ "columns": [
+ {
+ "expression": "user_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last",
+ "opclass": "int4_ops"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "ai_analysis_user_id_3aa23011_fk_user_id": {
+ "name": "ai_analysis_user_id_3aa23011_fk_user_id",
+ "tableFrom": "ai_analysis",
+ "tableTo": "user",
+ "columnsFrom": [
+ "user_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.ai_hint": {
+ "name": "ai_hint",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "bigint",
+ "primaryKey": true,
+ "notNull": true,
+ "identity": {
+ "type": "byDefault",
+ "name": "ai_hint_id_seq",
+ "schema": "public",
+ "increment": "1",
+ "startWith": "1",
+ "minValue": "1",
+ "maxValue": "9223372036854775807",
+ "cache": "1",
+ "cycle": false
+ }
+ },
+ "submission_id": {
+ "name": "submission_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "model": {
+ "name": "model",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "prompt_version": {
+ "name": "prompt_version",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "content": {
+ "name": "content",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "error": {
+ "name": "error",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "duration_ms": {
+ "name": "duration_ms",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "diagnosis": {
+ "name": "diagnosis",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "diagnosis_error": {
+ "name": "diagnosis_error",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "level": {
+ "name": "level",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "filter_attempt": {
+ "name": "filter_attempt",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "filter_blocked": {
+ "name": "filter_blocked",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "filter_reason": {
+ "name": "filter_reason",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "helpful": {
+ "name": "helpful",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "feedback_time": {
+ "name": "feedback_time",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "create_time": {
+ "name": "create_time",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {
+ "ai_hint_submission_id_idx": {
+ "name": "ai_hint_submission_id_idx",
+ "columns": [
+ {
+ "expression": "submission_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "ai_hint_submission_id_fk_submission_id": {
+ "name": "ai_hint_submission_id_fk_submission_id",
+ "tableFrom": "ai_hint",
+ "tableTo": "submission",
+ "columnsFrom": [
+ "submission_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.announcement": {
+ "name": "announcement",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "serial",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "title": {
+ "name": "title",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "content": {
+ "name": "content",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "create_time": {
+ "name": "create_time",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "last_update_time": {
+ "name": "last_update_time",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "visible": {
+ "name": "visible",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "created_by_id": {
+ "name": "created_by_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "tag": {
+ "name": "tag",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "top": {
+ "name": "top",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {
+ "announcement_created_by_id_359ccf50": {
+ "name": "announcement_created_by_id_359ccf50",
+ "columns": [
+ {
+ "expression": "created_by_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last",
+ "opclass": "int4_ops"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "announcement_list_idx": {
+ "name": "announcement_list_idx",
+ "columns": [
+ {
+ "expression": "visible",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "top",
+ "isExpression": false,
+ "asc": false,
+ "nulls": "first"
+ },
+ {
+ "expression": "create_time",
+ "isExpression": false,
+ "asc": false,
+ "nulls": "first"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "announcement_created_by_id_359ccf50_fk_user_id": {
+ "name": "announcement_created_by_id_359ccf50_fk_user_id",
+ "tableFrom": "announcement",
+ "tableTo": "user",
+ "columnsFrom": [
+ "created_by_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.class_lesson": {
+ "name": "class_lesson",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "integer",
+ "primaryKey": true,
+ "notNull": true,
+ "identity": {
+ "type": "byDefault",
+ "name": "class_lesson_id_seq",
+ "schema": "public",
+ "increment": "1",
+ "startWith": "1",
+ "minValue": "1",
+ "maxValue": "2147483647",
+ "cache": "1",
+ "cycle": false
+ }
+ },
+ "class_name": {
+ "name": "class_name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "day": {
+ "name": "day",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "problem_ids": {
+ "name": "problem_ids",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "language": {
+ "name": "language",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_by": {
+ "name": "created_by",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {
+ "class_lesson_created_by_idx": {
+ "name": "class_lesson_created_by_idx",
+ "columns": [
+ {
+ "expression": "created_by",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "class_lesson_created_by_fk_user_id": {
+ "name": "class_lesson_created_by_fk_user_id",
+ "tableFrom": "class_lesson",
+ "tableTo": "user",
+ "columnsFrom": [
+ "created_by"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "class_lesson_class_day_unique": {
+ "name": "class_lesson_class_day_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "class_name",
+ "day"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.contest": {
+ "name": "contest",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "serial",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "title": {
+ "name": "title",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "description": {
+ "name": "description",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "password": {
+ "name": "password",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "start_time": {
+ "name": "start_time",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "end_time": {
+ "name": "end_time",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "create_time": {
+ "name": "create_time",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "last_update_time": {
+ "name": "last_update_time",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "visible": {
+ "name": "visible",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "created_by_id": {
+ "name": "created_by_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "tag": {
+ "name": "tag",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {
+ "contest_created_by_id_a763ca7e": {
+ "name": "contest_created_by_id_a763ca7e",
+ "columns": [
+ {
+ "expression": "created_by_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last",
+ "opclass": "int4_ops"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "contest_created_by_id_a763ca7e_fk_user_id": {
+ "name": "contest_created_by_id_a763ca7e_fk_user_id",
+ "tableFrom": "contest",
+ "tableTo": "user",
+ "columnsFrom": [
+ "created_by_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.exercise": {
+ "name": "exercise",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "integer",
+ "primaryKey": true,
+ "notNull": true,
+ "identity": {
+ "type": "byDefault",
+ "name": "exercise_id_seq",
+ "schema": "public",
+ "increment": "1",
+ "startWith": "1",
+ "minValue": "1",
+ "maxValue": "2147483647",
+ "cache": "1",
+ "cycle": false
+ }
+ },
+ "type": {
+ "name": "type",
+ "type": "varchar(16)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "data": {
+ "name": "data",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "order": {
+ "name": "order",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "tutorial_id": {
+ "name": "tutorial_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {
+ "exercise_tutorial_id_6fd04055": {
+ "name": "exercise_tutorial_id_6fd04055",
+ "columns": [
+ {
+ "expression": "tutorial_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last",
+ "opclass": "int4_ops"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "exercise_tutorial_id_6fd04055_fk_tutorial_id": {
+ "name": "exercise_tutorial_id_6fd04055_fk_tutorial_id",
+ "tableFrom": "exercise",
+ "tableTo": "tutorial",
+ "columnsFrom": [
+ "tutorial_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.exercise_attempt": {
+ "name": "exercise_attempt",
+ "schema": "",
+ "columns": {
+ "user_id": {
+ "name": "user_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "exercise_id": {
+ "name": "exercise_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "attempts": {
+ "name": "attempts",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 0
+ },
+ "wrong_attempts": {
+ "name": "wrong_attempts",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 0
+ },
+ "solved": {
+ "name": "solved",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "attempts_to_solve": {
+ "name": "attempts_to_solve",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "last_wrong_answer": {
+ "name": "last_wrong_answer",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "first_attempt_at": {
+ "name": "first_attempt_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "last_attempt_at": {
+ "name": "last_attempt_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "solved_at": {
+ "name": "solved_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {
+ "exercise_attempt_exercise_id_idx": {
+ "name": "exercise_attempt_exercise_id_idx",
+ "columns": [
+ {
+ "expression": "exercise_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "exercise_attempt_user_id_fk_user_id": {
+ "name": "exercise_attempt_user_id_fk_user_id",
+ "tableFrom": "exercise_attempt",
+ "tableTo": "user",
+ "columnsFrom": [
+ "user_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "exercise_attempt_exercise_id_fk_exercise_id": {
+ "name": "exercise_attempt_exercise_id_fk_exercise_id",
+ "tableFrom": "exercise_attempt",
+ "tableTo": "exercise",
+ "columnsFrom": [
+ "exercise_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {
+ "exercise_attempt_pkey": {
+ "name": "exercise_attempt_pkey",
+ "columns": [
+ "user_id",
+ "exercise_id"
+ ]
+ }
+ },
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.flowchart_submission": {
+ "name": "flowchart_submission",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "mermaid_code": {
+ "name": "mermaid_code",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "flowchart_data": {
+ "name": "flowchart_data",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "status": {
+ "name": "status",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "create_time": {
+ "name": "create_time",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "ai_score": {
+ "name": "ai_score",
+ "type": "double precision",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "ai_grade": {
+ "name": "ai_grade",
+ "type": "varchar(10)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "ai_feedback": {
+ "name": "ai_feedback",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "ai_suggestions": {
+ "name": "ai_suggestions",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "ai_criteria_details": {
+ "name": "ai_criteria_details",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "ai_provider": {
+ "name": "ai_provider",
+ "type": "varchar(50)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "ai_model": {
+ "name": "ai_model",
+ "type": "varchar(50)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "processing_time": {
+ "name": "processing_time",
+ "type": "double precision",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "evaluation_time": {
+ "name": "evaluation_time",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "problem_id": {
+ "name": "problem_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "user_id": {
+ "name": "user_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {
+ "flowchart_problem_time_idx": {
+ "name": "flowchart_problem_time_idx",
+ "columns": [
+ {
+ "expression": "problem_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last",
+ "opclass": "int4_ops"
+ },
+ {
+ "expression": "create_time",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last",
+ "opclass": "int4_ops"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "flowchart_status_idx": {
+ "name": "flowchart_status_idx",
+ "columns": [
+ {
+ "expression": "status",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last",
+ "opclass": "int4_ops"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "flowchart_create_time_idx": {
+ "name": "flowchart_create_time_idx",
+ "columns": [
+ {
+ "expression": "create_time",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "flowchart_user_time_idx": {
+ "name": "flowchart_user_time_idx",
+ "columns": [
+ {
+ "expression": "user_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last",
+ "opclass": "int4_ops"
+ },
+ {
+ "expression": "create_time",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last",
+ "opclass": "int4_ops"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "flowchart_submission_problem_id_8551edbf_fk_problem_id": {
+ "name": "flowchart_submission_problem_id_8551edbf_fk_problem_id",
+ "tableFrom": "flowchart_submission",
+ "tableTo": "problem",
+ "columnsFrom": [
+ "problem_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "flowchart_submission_user_id_225c83e8_fk_user_id": {
+ "name": "flowchart_submission_user_id_225c83e8_fk_user_id",
+ "tableFrom": "flowchart_submission",
+ "tableTo": "user",
+ "columnsFrom": [
+ "user_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.judge_server": {
+ "name": "judge_server",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "serial",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "hostname": {
+ "name": "hostname",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "ip": {
+ "name": "ip",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "judger_version": {
+ "name": "judger_version",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "cpu_core": {
+ "name": "cpu_core",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "memory_usage": {
+ "name": "memory_usage",
+ "type": "double precision",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "cpu_usage": {
+ "name": "cpu_usage",
+ "type": "double precision",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "last_heartbeat": {
+ "name": "last_heartbeat",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "create_time": {
+ "name": "create_time",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "task_number": {
+ "name": "task_number",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "service_url": {
+ "name": "service_url",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "is_disabled": {
+ "name": "is_disabled",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.message": {
+ "name": "message",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "integer",
+ "primaryKey": true,
+ "notNull": true,
+ "identity": {
+ "type": "byDefault",
+ "name": "message_id_seq",
+ "schema": "public",
+ "increment": "1",
+ "startWith": "1",
+ "minValue": "1",
+ "maxValue": "2147483647",
+ "cache": "1",
+ "cycle": false
+ }
+ },
+ "message": {
+ "name": "message",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "create_time": {
+ "name": "create_time",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "recipient_id": {
+ "name": "recipient_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "sender_id": {
+ "name": "sender_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "submission_id": {
+ "name": "submission_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {
+ "message_recipient_time_idx": {
+ "name": "message_recipient_time_idx",
+ "columns": [
+ {
+ "expression": "recipient_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last",
+ "opclass": "timestamptz_ops"
+ },
+ {
+ "expression": "create_time",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last",
+ "opclass": "int4_ops"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "message_sender_id_a2a2e825": {
+ "name": "message_sender_id_a2a2e825",
+ "columns": [
+ {
+ "expression": "sender_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last",
+ "opclass": "int4_ops"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "message_submission_id_2fdf8a47": {
+ "name": "message_submission_id_2fdf8a47",
+ "columns": [
+ {
+ "expression": "submission_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last",
+ "opclass": "text_ops"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "message_recipient_id_2aa5dd76_fk_user_id": {
+ "name": "message_recipient_id_2aa5dd76_fk_user_id",
+ "tableFrom": "message",
+ "tableTo": "user",
+ "columnsFrom": [
+ "recipient_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ },
+ "message_sender_id_a2a2e825_fk_user_id": {
+ "name": "message_sender_id_a2a2e825_fk_user_id",
+ "tableFrom": "message",
+ "tableTo": "user",
+ "columnsFrom": [
+ "sender_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ },
+ "message_submission_id_2fdf8a47_fk_submission_id": {
+ "name": "message_submission_id_2fdf8a47_fk_submission_id",
+ "tableFrom": "message",
+ "tableTo": "submission",
+ "columnsFrom": [
+ "submission_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.options_sysoptions": {
+ "name": "options_sysoptions",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "serial",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "key": {
+ "name": "key",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "value": {
+ "name": "value",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "options_sysoptions_key_key": {
+ "name": "options_sysoptions_key_key",
+ "nullsNotDistinct": false,
+ "columns": [
+ "key"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.problem": {
+ "name": "problem",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "serial",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "title": {
+ "name": "title",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "description": {
+ "name": "description",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "input_description": {
+ "name": "input_description",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "output_description": {
+ "name": "output_description",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "samples": {
+ "name": "samples",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "test_case_id": {
+ "name": "test_case_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "test_case_score": {
+ "name": "test_case_score",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "hint": {
+ "name": "hint",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "languages": {
+ "name": "languages",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "template": {
+ "name": "template",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "create_time": {
+ "name": "create_time",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "last_update_time": {
+ "name": "last_update_time",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "time_limit": {
+ "name": "time_limit",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "memory_limit": {
+ "name": "memory_limit",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "visible": {
+ "name": "visible",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": true
+ },
+ "difficulty": {
+ "name": "difficulty",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "source": {
+ "name": "source",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "submission_number": {
+ "name": "submission_number",
+ "type": "bigint",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 0
+ },
+ "accepted_number": {
+ "name": "accepted_number",
+ "type": "bigint",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 0
+ },
+ "created_by_id": {
+ "name": "created_by_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "_id": {
+ "name": "_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "statistic_info": {
+ "name": "statistic_info",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'{}'::jsonb"
+ },
+ "contest_id": {
+ "name": "contest_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "is_public": {
+ "name": "is_public",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "share_submission": {
+ "name": "share_submission",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "prompt": {
+ "name": "prompt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "answers": {
+ "name": "answers",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "allow_flowchart": {
+ "name": "allow_flowchart",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "flowchart_data": {
+ "name": "flowchart_data",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'{}'::jsonb"
+ },
+ "flowchart_hint": {
+ "name": "flowchart_hint",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "mermaid_code": {
+ "name": "mermaid_code",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "show_flowchart": {
+ "name": "show_flowchart",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "ast_rules": {
+ "name": "ast_rules",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "sql_config": {
+ "name": "sql_config",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "sql_display": {
+ "name": "sql_display",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {
+ "problem_contest_visible_idx": {
+ "name": "problem_contest_visible_idx",
+ "columns": [
+ {
+ "expression": "contest_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last",
+ "opclass": "bool_ops"
+ },
+ {
+ "expression": "visible",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last",
+ "opclass": "int4_ops"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "problem_created_by_id_cb362143": {
+ "name": "problem_created_by_id_cb362143",
+ "columns": [
+ {
+ "expression": "created_by_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last",
+ "opclass": "int4_ops"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "problem_visible_idx": {
+ "name": "problem_visible_idx",
+ "columns": [
+ {
+ "expression": "visible",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last",
+ "opclass": "bool_ops"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "problem_contest_id_328e013a_fk_contest_id": {
+ "name": "problem_contest_id_328e013a_fk_contest_id",
+ "tableFrom": "problem",
+ "tableTo": "contest",
+ "columnsFrom": [
+ "contest_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ },
+ "problem_created_by_id_cb362143_fk_user_id": {
+ "name": "problem_created_by_id_cb362143_fk_user_id",
+ "tableFrom": "problem",
+ "tableTo": "user",
+ "columnsFrom": [
+ "created_by_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "unique_problem_id_contest": {
+ "name": "unique_problem_id_contest",
+ "nullsNotDistinct": false,
+ "columns": [
+ "_id",
+ "contest_id"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.problem_tag": {
+ "name": "problem_tag",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "serial",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "category": {
+ "name": "category",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'knowledge'"
+ },
+ "category_confirmed": {
+ "name": "category_confirmed",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ }
+ },
+ "indexes": {
+ "problem_tag_name_ci_unique": {
+ "name": "problem_tag_name_ci_unique",
+ "columns": [
+ {
+ "expression": "lower(name)",
+ "asc": true,
+ "isExpression": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.problem_tags": {
+ "name": "problem_tags",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "serial",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "problem_id": {
+ "name": "problem_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "problemtag_id": {
+ "name": "problemtag_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {
+ "problem_tags_problemtag_id_72d20571": {
+ "name": "problem_tags_problemtag_id_72d20571",
+ "columns": [
+ {
+ "expression": "problemtag_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last",
+ "opclass": "int4_ops"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "problem_tags_problem_id_866ecb8d_fk_problem_id": {
+ "name": "problem_tags_problem_id_866ecb8d_fk_problem_id",
+ "tableFrom": "problem_tags",
+ "tableTo": "problem",
+ "columnsFrom": [
+ "problem_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "problem_tags_problemtag_id_72d20571_fk_problem_tag_id": {
+ "name": "problem_tags_problemtag_id_72d20571_fk_problem_tag_id",
+ "tableFrom": "problem_tags",
+ "tableTo": "problem_tag",
+ "columnsFrom": [
+ "problemtag_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "problem_tags_problem_id_problemtag_id_318459d1_uniq": {
+ "name": "problem_tags_problem_id_problemtag_id_318459d1_uniq",
+ "nullsNotDistinct": false,
+ "columns": [
+ "problem_id",
+ "problemtag_id"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.problemset": {
+ "name": "problemset",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "bigint",
+ "primaryKey": true,
+ "notNull": true,
+ "identity": {
+ "type": "byDefault",
+ "name": "problemset_id_seq",
+ "schema": "public",
+ "increment": "1",
+ "startWith": "1",
+ "minValue": "1",
+ "maxValue": "9223372036854775807",
+ "cache": "1",
+ "cycle": false
+ }
+ },
+ "title": {
+ "name": "title",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "description": {
+ "name": "description",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "create_time": {
+ "name": "create_time",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "last_update_time": {
+ "name": "last_update_time",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "visible": {
+ "name": "visible",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "difficulty": {
+ "name": "difficulty",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "status": {
+ "name": "status",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "created_by_id": {
+ "name": "created_by_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "end_time": {
+ "name": "end_time",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {
+ "problemset_created_by_id_01b5197f": {
+ "name": "problemset_created_by_id_01b5197f",
+ "columns": [
+ {
+ "expression": "created_by_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last",
+ "opclass": "int4_ops"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "problemset_created_by_id_01b5197f_fk_user_id": {
+ "name": "problemset_created_by_id_01b5197f_fk_user_id",
+ "tableFrom": "problemset",
+ "tableTo": "user",
+ "columnsFrom": [
+ "created_by_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.problemset_badge": {
+ "name": "problemset_badge",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "bigint",
+ "primaryKey": true,
+ "notNull": true,
+ "identity": {
+ "type": "byDefault",
+ "name": "problemset_badge_id_seq",
+ "schema": "public",
+ "increment": "1",
+ "startWith": "1",
+ "minValue": "1",
+ "maxValue": "9223372036854775807",
+ "cache": "1",
+ "cycle": false
+ }
+ },
+ "name": {
+ "name": "name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "description": {
+ "name": "description",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "icon": {
+ "name": "icon",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "condition_type": {
+ "name": "condition_type",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "condition_value": {
+ "name": "condition_value",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "problemset_id": {
+ "name": "problemset_id",
+ "type": "bigint",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {
+ "problemset_badge_problemset_id_6cb6c74f": {
+ "name": "problemset_badge_problemset_id_6cb6c74f",
+ "columns": [
+ {
+ "expression": "problemset_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last",
+ "opclass": "int8_ops"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "problemset_badge_problemset_id_6cb6c74f_fk_problemset_id": {
+ "name": "problemset_badge_problemset_id_6cb6c74f_fk_problemset_id",
+ "tableFrom": "problemset_badge",
+ "tableTo": "problemset",
+ "columnsFrom": [
+ "problemset_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.problemset_problem": {
+ "name": "problemset_problem",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "bigint",
+ "primaryKey": true,
+ "notNull": true,
+ "identity": {
+ "type": "byDefault",
+ "name": "problemset_problem_id_seq",
+ "schema": "public",
+ "increment": "1",
+ "startWith": "1",
+ "minValue": "1",
+ "maxValue": "9223372036854775807",
+ "cache": "1",
+ "cycle": false
+ }
+ },
+ "order": {
+ "name": "order",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "is_required": {
+ "name": "is_required",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "score": {
+ "name": "score",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "hint": {
+ "name": "hint",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "problem_id": {
+ "name": "problem_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "problemset_id": {
+ "name": "problemset_id",
+ "type": "bigint",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {
+ "problemset_problem_problem_id_fff2d686": {
+ "name": "problemset_problem_problem_id_fff2d686",
+ "columns": [
+ {
+ "expression": "problem_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last",
+ "opclass": "int4_ops"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "problemset_problem_problem_id_fff2d686_fk_problem_id": {
+ "name": "problemset_problem_problem_id_fff2d686_fk_problem_id",
+ "tableFrom": "problemset_problem",
+ "tableTo": "problem",
+ "columnsFrom": [
+ "problem_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "problemset_problem_problemset_id_350d17fb_fk_problemset_id": {
+ "name": "problemset_problem_problemset_id_350d17fb_fk_problemset_id",
+ "tableFrom": "problemset_problem",
+ "tableTo": "problemset",
+ "columnsFrom": [
+ "problemset_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "unique_problemset_problem": {
+ "name": "unique_problemset_problem",
+ "nullsNotDistinct": false,
+ "columns": [
+ "problem_id",
+ "problemset_id"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.problemset_progress": {
+ "name": "problemset_progress",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "bigint",
+ "primaryKey": true,
+ "notNull": true,
+ "identity": {
+ "type": "byDefault",
+ "name": "problemset_progress_id_seq",
+ "schema": "public",
+ "increment": "1",
+ "startWith": "1",
+ "minValue": "1",
+ "maxValue": "9223372036854775807",
+ "cache": "1",
+ "cycle": false
+ }
+ },
+ "join_time": {
+ "name": "join_time",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "complete_time": {
+ "name": "complete_time",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "is_completed": {
+ "name": "is_completed",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "progress_percentage": {
+ "name": "progress_percentage",
+ "type": "double precision",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "completed_problems_count": {
+ "name": "completed_problems_count",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "total_problems_count": {
+ "name": "total_problems_count",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "total_score": {
+ "name": "total_score",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "progress_detail": {
+ "name": "progress_detail",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "problemset_id": {
+ "name": "problemset_id",
+ "type": "bigint",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "user_id": {
+ "name": "user_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {
+ "problemset_progress_user_id_c8041a80": {
+ "name": "problemset_progress_user_id_c8041a80",
+ "columns": [
+ {
+ "expression": "user_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last",
+ "opclass": "int4_ops"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "problemset_progress_problemset_id_20a9632e_fk_problemset_id": {
+ "name": "problemset_progress_problemset_id_20a9632e_fk_problemset_id",
+ "tableFrom": "problemset_progress",
+ "tableTo": "problemset",
+ "columnsFrom": [
+ "problemset_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "problemset_progress_user_id_c8041a80_fk_user_id": {
+ "name": "problemset_progress_user_id_c8041a80_fk_user_id",
+ "tableFrom": "problemset_progress",
+ "tableTo": "user",
+ "columnsFrom": [
+ "user_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "unique_problemset_progress_user": {
+ "name": "unique_problemset_progress_user",
+ "nullsNotDistinct": false,
+ "columns": [
+ "problemset_id",
+ "user_id"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.problemset_submission": {
+ "name": "problemset_submission",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "bigint",
+ "primaryKey": true,
+ "notNull": true,
+ "identity": {
+ "type": "byDefault",
+ "name": "problemset_submission_id_seq",
+ "schema": "public",
+ "increment": "1",
+ "startWith": "1",
+ "minValue": "1",
+ "maxValue": "9223372036854775807",
+ "cache": "1",
+ "cycle": false
+ }
+ },
+ "problem_id": {
+ "name": "problem_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "problemset_id": {
+ "name": "problemset_id",
+ "type": "bigint",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "submission_id": {
+ "name": "submission_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "user_id": {
+ "name": "user_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {
+ "problemset__problem_1f39fa_idx": {
+ "name": "problemset__problem_1f39fa_idx",
+ "columns": [
+ {
+ "expression": "problemset_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last",
+ "opclass": "int4_ops"
+ },
+ {
+ "expression": "user_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last",
+ "opclass": "int4_ops"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "problemset__problem_22f053_idx": {
+ "name": "problemset__problem_22f053_idx",
+ "columns": [
+ {
+ "expression": "problemset_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last",
+ "opclass": "int8_ops"
+ },
+ {
+ "expression": "problem_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last",
+ "opclass": "int8_ops"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "problemset__user_id_2f1501_idx": {
+ "name": "problemset__user_id_2f1501_idx",
+ "columns": [
+ {
+ "expression": "user_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last",
+ "opclass": "int4_ops"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "problemset_submission_problem_id_5629b105": {
+ "name": "problemset_submission_problem_id_5629b105",
+ "columns": [
+ {
+ "expression": "problem_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last",
+ "opclass": "int4_ops"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "problemset_submission_submission_id_78e2b807": {
+ "name": "problemset_submission_submission_id_78e2b807",
+ "columns": [
+ {
+ "expression": "submission_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last",
+ "opclass": "text_ops"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "problemset_submission_problem_id_5629b105_fk_problem_id": {
+ "name": "problemset_submission_problem_id_5629b105_fk_problem_id",
+ "tableFrom": "problemset_submission",
+ "tableTo": "problem",
+ "columnsFrom": [
+ "problem_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "problemset_submission_problemset_id_85290e17_fk_problemset_id": {
+ "name": "problemset_submission_problemset_id_85290e17_fk_problemset_id",
+ "tableFrom": "problemset_submission",
+ "tableTo": "problemset",
+ "columnsFrom": [
+ "problemset_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "problemset_submission_submission_id_78e2b807_fk_submission_id": {
+ "name": "problemset_submission_submission_id_78e2b807_fk_submission_id",
+ "tableFrom": "problemset_submission",
+ "tableTo": "submission",
+ "columnsFrom": [
+ "submission_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "problemset_submission_user_id_915fc9c6_fk_user_id": {
+ "name": "problemset_submission_user_id_915fc9c6_fk_user_id",
+ "tableFrom": "problemset_submission",
+ "tableTo": "user",
+ "columnsFrom": [
+ "user_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.reaction": {
+ "name": "reaction",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "integer",
+ "primaryKey": true,
+ "notNull": true,
+ "identity": {
+ "type": "byDefault",
+ "name": "reaction_id_seq",
+ "schema": "public",
+ "increment": "1",
+ "startWith": "1",
+ "minValue": "1",
+ "maxValue": "2147483647",
+ "cache": "1",
+ "cycle": false
+ }
+ },
+ "type": {
+ "name": "type",
+ "type": "varchar(20)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "create_time": {
+ "name": "create_time",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "problem_id": {
+ "name": "problem_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "user_id": {
+ "name": "user_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {
+ "reaction_problem_type_idx": {
+ "name": "reaction_problem_type_idx",
+ "columns": [
+ {
+ "expression": "problem_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last",
+ "opclass": "int4_ops"
+ },
+ {
+ "expression": "type",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last",
+ "opclass": "int4_ops"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "reaction_user_id_cfa7f469": {
+ "name": "reaction_user_id_cfa7f469",
+ "columns": [
+ {
+ "expression": "user_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last",
+ "opclass": "int4_ops"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "reaction_problem_id_a7f3b9f3_fk_problem_id": {
+ "name": "reaction_problem_id_a7f3b9f3_fk_problem_id",
+ "tableFrom": "reaction",
+ "tableTo": "problem",
+ "columnsFrom": [
+ "problem_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "reaction_user_id_cfa7f469_fk_user_id": {
+ "name": "reaction_user_id_cfa7f469_fk_user_id",
+ "tableFrom": "reaction",
+ "tableTo": "user",
+ "columnsFrom": [
+ "user_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "reaction_problem_user_unique": {
+ "name": "reaction_problem_user_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "problem_id",
+ "user_id"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.submission": {
+ "name": "submission",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "contest_id": {
+ "name": "contest_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "problem_id": {
+ "name": "problem_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "create_time": {
+ "name": "create_time",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "user_id": {
+ "name": "user_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "code": {
+ "name": "code",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "result": {
+ "name": "result",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 6
+ },
+ "info": {
+ "name": "info",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'{}'::jsonb"
+ },
+ "language": {
+ "name": "language",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "shared": {
+ "name": "shared",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "statistic_info": {
+ "name": "statistic_info",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'{}'::jsonb"
+ },
+ "username": {
+ "name": "username",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "problemset_id": {
+ "name": "problemset_id",
+ "type": "bigint",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {
+ "contest_create_time_idx": {
+ "name": "contest_create_time_idx",
+ "columns": [
+ {
+ "expression": "contest_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "create_time",
+ "isExpression": false,
+ "asc": false,
+ "nulls": "first"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "submission_public_create_time_id_idx": {
+ "name": "submission_public_create_time_id_idx",
+ "columns": [
+ {
+ "expression": "create_time",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "where": "\"submission\".\"contest_id\" is null",
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "problem_user_idx": {
+ "name": "problem_user_idx",
+ "columns": [
+ {
+ "expression": "problem_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last",
+ "opclass": "int4_ops"
+ },
+ {
+ "expression": "user_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last",
+ "opclass": "int4_ops"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "submission_result_37e2f67a": {
+ "name": "submission_result_37e2f67a",
+ "columns": [
+ {
+ "expression": "result",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last",
+ "opclass": "int4_ops"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "user_create_time_idx": {
+ "name": "user_create_time_idx",
+ "columns": [
+ {
+ "expression": "user_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last",
+ "opclass": "int4_ops"
+ },
+ {
+ "expression": "create_time",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last",
+ "opclass": "timestamptz_ops"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "submission_language_time_idx": {
+ "name": "submission_language_time_idx",
+ "columns": [
+ {
+ "expression": "language",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "create_time",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "where": "\"submission\".\"contest_id\" is null",
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "submission_result_time_idx": {
+ "name": "submission_result_time_idx",
+ "columns": [
+ {
+ "expression": "result",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "create_time",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "where": "\"submission\".\"contest_id\" is null",
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "submission_public_problem_time_idx": {
+ "name": "submission_public_problem_time_idx",
+ "columns": [
+ {
+ "expression": "problem_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "create_time",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "where": "\"submission\".\"contest_id\" is null",
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "submission_public_username_trgm_idx": {
+ "name": "submission_public_username_trgm_idx",
+ "columns": [
+ {
+ "expression": "username",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last",
+ "opclass": "gin_trgm_ops"
+ }
+ ],
+ "isUnique": false,
+ "where": "\"submission\".\"contest_id\" is null",
+ "concurrently": false,
+ "method": "gin",
+ "with": {}
+ },
+ "submission_public_metrics_idx": {
+ "name": "submission_public_metrics_idx",
+ "columns": [
+ {
+ "expression": "user_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "problem_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "result",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "create_time",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "where": "\"submission\".\"contest_id\" is null",
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "submission_public_problem_user_idx": {
+ "name": "submission_public_problem_user_idx",
+ "columns": [
+ {
+ "expression": "problem_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "user_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "result",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "where": "\"submission\".\"contest_id\" is null",
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "submission_problemset_id_idx": {
+ "name": "submission_problemset_id_idx",
+ "columns": [
+ {
+ "expression": "problemset_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "where": "\"submission\".\"problemset_id\" is not null",
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "submission_contest_id_775716d5_fk_contest_id": {
+ "name": "submission_contest_id_775716d5_fk_contest_id",
+ "tableFrom": "submission",
+ "tableTo": "contest",
+ "columnsFrom": [
+ "contest_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ },
+ "submission_problem_id_76847b55_fk_problem_id": {
+ "name": "submission_problem_id_76847b55_fk_problem_id",
+ "tableFrom": "submission",
+ "tableTo": "problem",
+ "columnsFrom": [
+ "problem_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ },
+ "submission_problemset_id_fk_problemset_id": {
+ "name": "submission_problemset_id_fk_problemset_id",
+ "tableFrom": "submission",
+ "tableTo": "problemset",
+ "columnsFrom": [
+ "problemset_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "set null",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.submission_trace": {
+ "name": "submission_trace",
+ "schema": "",
+ "columns": {
+ "submission_id": {
+ "name": "submission_id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "active_ms": {
+ "name": "active_ms",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "since_open_ms": {
+ "name": "since_open_ms",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "typed_chars": {
+ "name": "typed_chars",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "pasted_chars": {
+ "name": "pasted_chars",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "paste_count": {
+ "name": "paste_count",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "max_paste": {
+ "name": "max_paste",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "deleted_chars": {
+ "name": "deleted_chars",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "blur_count": {
+ "name": "blur_count",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "initial_len": {
+ "name": "initial_len",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "collab": {
+ "name": "collab",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "since_prev_ms": {
+ "name": "since_prev_ms",
+ "type": "bigint",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "submission_trace_submission_id_fk_submission_id": {
+ "name": "submission_trace_submission_id_fk_submission_id",
+ "tableFrom": "submission_trace",
+ "tableTo": "submission",
+ "columnsFrom": [
+ "submission_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.tutorial": {
+ "name": "tutorial",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "integer",
+ "primaryKey": true,
+ "notNull": true,
+ "identity": {
+ "type": "byDefault",
+ "name": "tutorial_id_seq",
+ "schema": "public",
+ "increment": "1",
+ "startWith": "1",
+ "minValue": "1",
+ "maxValue": "2147483647",
+ "cache": "1",
+ "cycle": false
+ }
+ },
+ "title": {
+ "name": "title",
+ "type": "varchar(128)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "content": {
+ "name": "content",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "is_public": {
+ "name": "is_public",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "order": {
+ "name": "order",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "created_by_id": {
+ "name": "created_by_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "code": {
+ "name": "code",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "type": {
+ "name": "type",
+ "type": "varchar(10)",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {
+ "tutorial_created_by_id_07973cab": {
+ "name": "tutorial_created_by_id_07973cab",
+ "columns": [
+ {
+ "expression": "created_by_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last",
+ "opclass": "int4_ops"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "tutorial_created_by_id_07973cab_fk_user_id": {
+ "name": "tutorial_created_by_id_07973cab_fk_user_id",
+ "tableFrom": "tutorial",
+ "tableTo": "user",
+ "columnsFrom": [
+ "created_by_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.tutorial_progress": {
+ "name": "tutorial_progress",
+ "schema": "",
+ "columns": {
+ "user_id": {
+ "name": "user_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "tutorial_id": {
+ "name": "tutorial_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "view_count": {
+ "name": "view_count",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 0
+ },
+ "total_seconds": {
+ "name": "total_seconds",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 0
+ },
+ "first_viewed_at": {
+ "name": "first_viewed_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "last_viewed_at": {
+ "name": "last_viewed_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {
+ "tutorial_progress_tutorial_id_idx": {
+ "name": "tutorial_progress_tutorial_id_idx",
+ "columns": [
+ {
+ "expression": "tutorial_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "tutorial_progress_user_id_fk_user_id": {
+ "name": "tutorial_progress_user_id_fk_user_id",
+ "tableFrom": "tutorial_progress",
+ "tableTo": "user",
+ "columnsFrom": [
+ "user_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "tutorial_progress_tutorial_id_fk_tutorial_id": {
+ "name": "tutorial_progress_tutorial_id_fk_tutorial_id",
+ "tableFrom": "tutorial_progress",
+ "tableTo": "tutorial",
+ "columnsFrom": [
+ "tutorial_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {
+ "tutorial_progress_pkey": {
+ "name": "tutorial_progress_pkey",
+ "columns": [
+ "user_id",
+ "tutorial_id"
+ ]
+ }
+ },
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.user": {
+ "name": "user",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "serial",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "password": {
+ "name": "password",
+ "type": "varchar(128)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "last_login": {
+ "name": "last_login",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "username": {
+ "name": "username",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "email": {
+ "name": "email",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "create_time": {
+ "name": "create_time",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "admin_type": {
+ "name": "admin_type",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "is_disabled": {
+ "name": "is_disabled",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "problem_permission": {
+ "name": "problem_permission",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "raw_password": {
+ "name": "raw_password",
+ "type": "varchar(20)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "class_name": {
+ "name": "class_name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {
+ "user_active_idx": {
+ "name": "user_active_idx",
+ "columns": [
+ {
+ "expression": "is_disabled",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "last_login",
+ "isExpression": false,
+ "asc": false,
+ "nulls": "first"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "user_class_name_idx": {
+ "name": "user_class_name_idx",
+ "columns": [
+ {
+ "expression": "class_name",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "user_username_key": {
+ "name": "user_username_key",
+ "nullsNotDistinct": false,
+ "columns": [
+ "username"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.user_achievement": {
+ "name": "user_achievement",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "bigint",
+ "primaryKey": true,
+ "notNull": true,
+ "identity": {
+ "type": "byDefault",
+ "name": "user_achievement_id_seq",
+ "schema": "public",
+ "increment": "1",
+ "startWith": "1",
+ "minValue": "1",
+ "maxValue": "9223372036854775807",
+ "cache": "1",
+ "cycle": false
+ }
+ },
+ "unlock_time": {
+ "name": "unlock_time",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "backfilled": {
+ "name": "backfilled",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "notified": {
+ "name": "notified",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "achievement_id": {
+ "name": "achievement_id",
+ "type": "bigint",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "user_id": {
+ "name": "user_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {
+ "user_achievement_achievement_id_29db600d": {
+ "name": "user_achievement_achievement_id_29db600d",
+ "columns": [
+ {
+ "expression": "achievement_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last",
+ "opclass": "int8_ops"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "user_achv_notified_idx": {
+ "name": "user_achv_notified_idx",
+ "columns": [
+ {
+ "expression": "user_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last",
+ "opclass": "int4_ops"
+ },
+ {
+ "expression": "notified",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last",
+ "opclass": "bool_ops"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "user_achv_time_idx": {
+ "name": "user_achv_time_idx",
+ "columns": [
+ {
+ "expression": "user_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last",
+ "opclass": "int4_ops"
+ },
+ {
+ "expression": "unlock_time",
+ "isExpression": false,
+ "asc": false,
+ "nulls": "first",
+ "opclass": "timestamptz_ops"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "user_achievement_achievement_id_29db600d_fk_achievement_id": {
+ "name": "user_achievement_achievement_id_29db600d_fk_achievement_id",
+ "tableFrom": "user_achievement",
+ "tableTo": "achievement",
+ "columnsFrom": [
+ "achievement_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "user_achievement_user_id_b8ec7d6a_fk_user_id": {
+ "name": "user_achievement_user_id_b8ec7d6a_fk_user_id",
+ "tableFrom": "user_achievement",
+ "tableTo": "user",
+ "columnsFrom": [
+ "user_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "unique_user_achievement": {
+ "name": "unique_user_achievement",
+ "nullsNotDistinct": false,
+ "columns": [
+ "achievement_id",
+ "user_id"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.user_badge": {
+ "name": "user_badge",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "bigint",
+ "primaryKey": true,
+ "notNull": true,
+ "identity": {
+ "type": "byDefault",
+ "name": "user_badge_id_seq",
+ "schema": "public",
+ "increment": "1",
+ "startWith": "1",
+ "minValue": "1",
+ "maxValue": "9223372036854775807",
+ "cache": "1",
+ "cycle": false
+ }
+ },
+ "earned_time": {
+ "name": "earned_time",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "badge_id": {
+ "name": "badge_id",
+ "type": "bigint",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "user_id": {
+ "name": "user_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {
+ "user_badge_badge_id_92a983e9": {
+ "name": "user_badge_badge_id_92a983e9",
+ "columns": [
+ {
+ "expression": "badge_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last",
+ "opclass": "int8_ops"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "user_badge_badge_id_92a983e9_fk_problemset_badge_id": {
+ "name": "user_badge_badge_id_92a983e9_fk_problemset_badge_id",
+ "tableFrom": "user_badge",
+ "tableTo": "problemset_badge",
+ "columnsFrom": [
+ "badge_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "user_badge_user_id_a286d718_fk_user_id": {
+ "name": "user_badge_user_id_a286d718_fk_user_id",
+ "tableFrom": "user_badge",
+ "tableTo": "user",
+ "columnsFrom": [
+ "user_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "unique_user_badge": {
+ "name": "unique_user_badge",
+ "nullsNotDistinct": false,
+ "columns": [
+ "badge_id",
+ "user_id"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.user_profile": {
+ "name": "user_profile",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "serial",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "acm_problems_status": {
+ "name": "acm_problems_status",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'{}'::jsonb"
+ },
+ "avatar": {
+ "name": "avatar",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "mood": {
+ "name": "mood",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "accepted_number": {
+ "name": "accepted_number",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 0
+ },
+ "submission_number": {
+ "name": "submission_number",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 0
+ },
+ "user_id": {
+ "name": "user_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "real_name": {
+ "name": "real_name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "user_profile_user_id_8fdce8e2_fk_user_id": {
+ "name": "user_profile_user_id_8fdce8e2_fk_user_id",
+ "tableFrom": "user_profile",
+ "tableTo": "user",
+ "columnsFrom": [
+ "user_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "user_profile_user_id_key": {
+ "name": "user_profile_user_id_key",
+ "nullsNotDistinct": false,
+ "columns": [
+ "user_id"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.user_stat": {
+ "name": "user_stat",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "bigint",
+ "primaryKey": true,
+ "notNull": true,
+ "identity": {
+ "type": "byDefault",
+ "name": "user_stat_id_seq",
+ "schema": "public",
+ "increment": "1",
+ "startWith": "1",
+ "minValue": "1",
+ "maxValue": "9223372036854775807",
+ "cache": "1",
+ "cycle": false
+ }
+ },
+ "metrics": {
+ "name": "metrics",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'{}'::jsonb"
+ },
+ "update_time": {
+ "name": "update_time",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "user_id": {
+ "name": "user_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "user_stat_user_id_73337fc0_fk_user_id": {
+ "name": "user_stat_user_id_73337fc0_fk_user_id",
+ "tableFrom": "user_stat",
+ "tableTo": "user",
+ "columnsFrom": [
+ "user_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "user_stat_user_id_key": {
+ "name": "user_stat_user_id_key",
+ "nullsNotDistinct": false,
+ "columns": [
+ "user_id"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ }
+ },
+ "enums": {},
+ "schemas": {},
+ "sequences": {},
+ "roles": {},
+ "policies": {},
+ "views": {},
+ "_meta": {
+ "columns": {},
+ "schemas": {},
+ "tables": {}
+ }
+}
\ No newline at end of file
diff --git a/apps/api/src/db/meta/_journal.json b/apps/api/src/db/meta/_journal.json
index db683c8..09564ac 100644
--- a/apps/api/src/db/meta/_journal.json
+++ b/apps/api/src/db/meta/_journal.json
@@ -176,6 +176,13 @@
"when": 1790732755406,
"tag": "0024_add_class_lesson_language",
"breakpoints": true
+ },
+ {
+ "idx": 25,
+ "version": "7",
+ "when": 1791521256834,
+ "tag": "0025_submission_problem_user_idx",
+ "breakpoints": true
}
]
}
\ No newline at end of file
diff --git a/apps/api/src/db/schema.ts b/apps/api/src/db/schema.ts
index 5310e75..591d808 100644
--- a/apps/api/src/db/schema.ts
+++ b/apps/api/src/db/schema.ts
@@ -906,6 +906,24 @@ export const submission = pgTable(
table.createTime.asc().nullsLast(),
)
.where(sql`${table.contestId} is null`),
+ /**
+ * 题目列表每一页的「做对 / 做过人数」(`services/problem-progress.ts` 的
+ * problemUserCounts):按 problem_id 取一页 30 道题、数 distinct user_id。
+ * 上面那条以 user_id 打头,按题号查只能把整棵索引 11 万行扫一遍再滤,12–18ms 而且
+ * 随提交数线性涨;这条以 problem_id 打头,快照实测 12ms → 3.6ms,「最多人做对」排序
+ * 的全表聚合 85ms → 16ms。
+ *
+ * problem_user_idx 也以 problem_id 打头,但它不是部分索引、也不带 result,规划器
+ * 不选它(还得回表看 contest_id 和 result)。
+ */
+ index("submission_public_problem_user_idx")
+ .using(
+ "btree",
+ table.problemId.asc().nullsLast(),
+ table.userId.asc().nullsLast(),
+ table.result.asc().nullsLast(),
+ )
+ .where(sql`${table.contestId} is null`),
foreignKey({
columns: [table.contestId],
foreignColumns: [contest.id],
diff --git a/apps/web/src/oj/problem/components/ProblemTypeTag.vue b/apps/web/src/oj/problem/components/ProblemTypeTag.vue
index b91c706..f042ccb 100644
--- a/apps/web/src/oj/problem/components/ProblemTypeTag.vue
+++ b/apps/web/src/oj/problem/components/ProblemTypeTag.vue
@@ -1,7 +1,6 @@
-
+
{{ PROBLEM_TYPE_LABEL[props.kind] }}
@@ -64,7 +54,31 @@ const style = computed(() => {
white-space: nowrap;
}
+/* 主题里没有紫色,两套手配的值,字都压到 4.5:1 以上 */
.type-tag.flowchart {
font-weight: 600;
+ color: #5b2fa6;
+ background: #efe8fb;
+ border-color: transparent;
+}
+
+html.dark .type-tag.flowchart {
+ color: #c4adf5;
+ background: rgba(160, 120, 240, 0.18);
+}
+
+.type-tag.ast {
+ color: var(--tag-info);
+ border-color: #b9cdee;
+}
+
+html.dark .type-tag.ast {
+ color: var(--tag-info-dark);
+ border-color: rgba(112, 192, 232, 0.45);
+}
+
+.type-tag.reference {
+ color: var(--tag-muted);
+ border-color: var(--tag-border);
}
diff --git a/apps/web/src/oj/problem/list.vue b/apps/web/src/oj/problem/list.vue
index 0680755..ca5fe89 100644
--- a/apps/web/src/oj/problem/list.vue
+++ b/apps/web/src/oj/problem/list.vue
@@ -110,7 +110,9 @@ async function listProblems() {
total.value = res.total
problems.value = res.results
loaded.value = true
+ // 左栏「全部题目」的题数:没筛的时候这一页的 total 就是;带着筛选进来的才单独数一次
if (!query.tag && !hasExtraFilter.value && !undoneOn.value) allCount.value = res.total
+ else if (!allCount.value) allCount.value = (await getProblemList(0, 1, {})).total
}
async function loadSide() {
@@ -120,7 +122,6 @@ async function loadSide() {
])
tags.value = tagRes
progress.value = progressRes
- if (!allCount.value) allCount.value = (await getProblemList(0, 1, {})).total
}
watchDebounced(() => query.keyword, listProblems, { debounce: 500, maxWait: 1000 })