From c9a8f928b68adf8defcbbcb94b2fe7cf852ab57b Mon Sep 17 00:00:00 2001 From: undefined Date: Thu, 10 Aug 2023 01:41:11 +0800 Subject: [PATCH] core: support search by difficulty --- packages/hydrooj/package.json | 1 + packages/hydrooj/src/handler/problem.ts | 17 ++++++++++++----- packages/ui-default/templates/problem_main.html | 3 --- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/packages/hydrooj/package.json b/packages/hydrooj/package.json index f3d4b8fb..6e429796 100644 --- a/packages/hydrooj/package.json +++ b/packages/hydrooj/package.json @@ -49,6 +49,7 @@ "require-resolve-hook": "^1.1.0", "saslprep": "^1.0.3", "schemastery": "^3.11.1", + "search-query-parser": "^1.6.0", "semver": "^7.5.4", "serialize-javascript": "^6.0.1", "superagent": "^8.0.9", diff --git a/packages/hydrooj/src/handler/problem.ts b/packages/hydrooj/src/handler/problem.ts index 417561d4..14dcd7db 100644 --- a/packages/hydrooj/src/handler/problem.ts +++ b/packages/hydrooj/src/handler/problem.ts @@ -5,6 +5,7 @@ import { } from 'lodash'; import { Filter, ObjectId } from 'mongodb'; import { nanoid } from 'nanoid'; +import parser from 'search-query-parser'; import { sortFiles, streamToBuffer } from '@hydrooj/utils/lib/utils'; import { BadRequestError, ContestNotAttendedError, ContestNotEndedError, ContestNotFoundError, ContestNotLiveError, @@ -144,10 +145,17 @@ export class ProblemMainHandler extends Handler { let sort: string[]; let fail = false; let pcountRelation = 'eq'; - const category = flattenDeep(q.split(' ') - .filter((i) => i.startsWith('category:')) - .map((i) => i.split('category:')[1]?.split(','))); - const text = q.split(' ').filter((i) => !i.startsWith('category:')).join(' '); + const parsed = parser.parse(q, { + keywords: ['category', 'difficulty'], + offsets: false, + alwaysArray: true, + tokenize: true, + }); + const category = parsed.category || []; + const text = (parsed.text || []).join(' '); + if (parsed.difficulty?.every((i) => Number.isSafeInteger(+i))) { + query.difficulty = { $in: parsed.difficulty.map(Number) }; + } if (category.length) query.$and = category.map((tag) => ({ tag })); if (text) category.push(text); if (category.length) this.UiContext.extraTitleContent = category.join(','); @@ -214,7 +222,6 @@ export class ProblemMainHandler extends Handler { pcountRelation, pdocs, psdict, - category: category.join(','), qs: q, }; } diff --git a/packages/ui-default/templates/problem_main.html b/packages/ui-default/templates/problem_main.html index 0343b477..3d870c29 100644 --- a/packages/ui-default/templates/problem_main.html +++ b/packages/ui-default/templates/problem_main.html @@ -2,9 +2,6 @@ {% import "components/problem.html" as problem with context %} {% extends "layout/basic.html" %} {% block content %} - {{ set(UiContext, { - currentCategory: category - }) }}