From 6eed519407a3ad60f4e535dba3126c8950c94b98 Mon Sep 17 00:00:00 2001 From: undefined Date: Sun, 6 Sep 2020 12:12:54 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=B8=AD=E6=96=87=E6=90=9C?= =?UTF-8?q?=E7=B4=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/better-search/model.ts | 23 +++++++++++++++++++++++ packages/better-search/package.json | 20 ++++++++++++++++++++ packages/better-search/script.ts | 16 ++++++++++++++++ packages/better-search/tsconfig.json | 19 +++++++++++++++++++ packages/hydrojudge/src/service.ts | 2 +- packages/hydrooj/package.json | 2 +- packages/hydrooj/src/handler/manage.ts | 3 ++- packages/hydrooj/src/model/document.ts | 7 ++++--- packages/hydrooj/src/service/bus.ts | 5 +++-- packages/login-with-qq/service.ts | 2 +- tsconfig.json | 1 + 11 files changed, 91 insertions(+), 9 deletions(-) create mode 100644 packages/better-search/model.ts create mode 100644 packages/better-search/package.json create mode 100644 packages/better-search/script.ts create mode 100644 packages/better-search/tsconfig.json diff --git a/packages/better-search/model.ts b/packages/better-search/model.ts new file mode 100644 index 000000000..cca194ee0 --- /dev/null +++ b/packages/better-search/model.ts @@ -0,0 +1,23 @@ +import nodejieba from 'nodejieba'; +import { Pdoc } from 'hydrooj'; +import * as document from 'hydrooj/dist/model/document'; +import * as bus from 'hydrooj/dist/service/bus'; + +declare module 'hydrooj' { + interface Pdoc { + search?: string + } +} + +bus.on('document/add', async (doc) => { + if (doc.type !== document.TYPE_PROBLEM) return; + const pdoc = doc as Pdoc; + const segments = nodejieba.cut(pdoc.title); + pdoc.search = segments.join(' '); +}); + +bus.on('document/set', async (domainId, docType, docId, $set) => { + if (docType !== document.TYPE_PROBLEM || !$set.title) return; + const segments = nodejieba.cut($set.title); + $set.search = segments.join(' '); +}); diff --git a/packages/better-search/package.json b/packages/better-search/package.json new file mode 100644 index 000000000..ea6a9e0e2 --- /dev/null +++ b/packages/better-search/package.json @@ -0,0 +1,20 @@ +{ + "name": "@hydrooj/better-search", + "version": "1.0.1", + "description": "Enhance Problem Search", + "main": "package.json", + "repository": "https://github.com/hydro-dev/Hydro.git", + "author": "undefined ", + "license": "AGPL-3.0-only", + "dependencies": { + "nodejieba": "^2.4.1" + }, + "devDependencies": {}, + "peerDependencies": { + "hydrooj": "^2.13.2" + }, + "scripts": { + "build": "tsc", + "lint": "eslint . --ext ts --fix" + } +} \ No newline at end of file diff --git a/packages/better-search/script.ts b/packages/better-search/script.ts new file mode 100644 index 000000000..efacdb71c --- /dev/null +++ b/packages/better-search/script.ts @@ -0,0 +1,16 @@ +import nodejieba from 'nodejieba'; +import { Pdoc } from 'hydrooj'; +import * as document from 'hydrooj/dist/model/document'; + +export const description = 'Ensure index for peoblem search'; + +export async function run() { + await document.coll.find({ docType: document.TYPE_PROBLEM }).forEach(async (doc: Pdoc) => { + const segments = nodejieba.cut(doc.title); + await document.coll.updateOne({ _id: doc._id }, { $set: { search: segments.join(' ') } }); + }); +} + +export const validate = {}; + +global.Hydro.script.ensureSearch = { run, description, validate }; diff --git a/packages/better-search/tsconfig.json b/packages/better-search/tsconfig.json new file mode 100644 index 000000000..aa7d73857 --- /dev/null +++ b/packages/better-search/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "target": "es2019", + "module": "commonjs", + "esModuleInterop": true, + "moduleResolution": "node", + "declaration": true, + "sourceMap": true, + "composite": true, + "strictBindCallApply": true, + "experimentalDecorators": true, + "outDir": ".", + "rootDir": "." + }, + "include": [ + "*.ts" + ], + "exclude": [] +} \ No newline at end of file diff --git a/packages/hydrojudge/src/service.ts b/packages/hydrojudge/src/service.ts index a727e5b2c..0794449b3 100644 --- a/packages/hydrojudge/src/service.ts +++ b/packages/hydrojudge/src/service.ts @@ -252,4 +252,4 @@ async function postInit() { task.consume({ type: 'judge' }, (t) => (new JudgeTask(t)).handle().catch(console.error)); } -global.Hydro.postInit.push(postInit); +global.Hydro.service.bus.once('app/started', postInit); diff --git a/packages/hydrooj/package.json b/packages/hydrooj/package.json index 95e6ed9fc..50cfe751e 100644 --- a/packages/hydrooj/package.json +++ b/packages/hydrooj/package.json @@ -1,6 +1,6 @@ { "name": "hydrooj", - "version": "2.13.1", + "version": "2.13.2", "bin": "bin/hydrooj.js", "main": "dist/loader.js", "typings": "dist/loader.d.ts", diff --git a/packages/hydrooj/src/handler/manage.ts b/packages/hydrooj/src/handler/manage.ts index 5edf4f3ca..876b535b4 100644 --- a/packages/hydrooj/src/handler/manage.ts +++ b/packages/hydrooj/src/handler/manage.ts @@ -1,3 +1,4 @@ +import { inspect } from 'util'; import * as judge from './judge'; import { ValidationError } from '../error'; import * as check from '../check'; @@ -108,7 +109,7 @@ class SystemScriptHandler extends SystemHandler { domainId, rid, status: STATUS.STATUS_ACCEPTED, - message: ret.toString(), + message: inspect(ret, false, 10, true), judger: 1, time, memory: 0, diff --git a/packages/hydrooj/src/model/document.ts b/packages/hydrooj/src/model/document.ts index 9dd70141c..c9a155280 100644 --- a/packages/hydrooj/src/model/document.ts +++ b/packages/hydrooj/src/model/document.ts @@ -61,10 +61,11 @@ export function get(domainId: string, docType: number, docId: DocID) { return coll.findOne({ domainId, docType, docId }); } -export async function set(domainId: string, docType: number, docId: DocID, args: any) { +export async function set(domainId: string, docType: number, docId: DocID, $set: any) { + await bus.parallel('document/set', domainId, docType, docId, $set); const res = await coll.findOneAndUpdate( { domainId, docType, docId }, - { $set: args }, + { $set }, { returnOriginal: false, upsert: true }, ); return res.value; @@ -339,7 +340,7 @@ async function ensureIndexes() { await ic({ domainId: 1, docType: 1, docId: 1 }, u); await ic({ domainId: 1, docType: 1, owner: 1, docId: -1 }); // For problem - await ic({ domainId: 1, docType: 1, title: 'text' }, s); + await ic({ domainId: 1, docType: 1, search: 'text', title: 'text' }, s); await ic({ domainId: 1, docType: 1, category: 1, docId: 1 }, s); await ic({ domainId: 1, docType: 1, hidden: 1, category: 1, docId: 1 }, s); await ic({ domainId: 1, docType: 1, tag: 1, docId: 1 }, s); diff --git a/packages/hydrooj/src/service/bus.ts b/packages/hydrooj/src/service/bus.ts index 587b41de5..73fb324b1 100644 --- a/packages/hydrooj/src/service/bus.ts +++ b/packages/hydrooj/src/service/bus.ts @@ -1,6 +1,6 @@ /* eslint-disable no-await-in-loop */ import cluster from 'cluster'; -import { Db } from 'mongodb'; +import { Db, ObjectID } from 'mongodb'; import { Mdoc, Rdoc, User } from '../interface'; const _hooks: Record any>> = {}; @@ -21,7 +21,8 @@ interface EventMap { 'user/message': (uid: number, mdoc: Mdoc, udoc: User) => void - 'document/add': (doc: any) => string | void + 'document/add': (doc: any) => Promise | string | void + 'document/set': (domainId: string, docType: number, docId: ObjectID | string | number, args: any) => Promise | string | void 'record/change': (rdoc: Rdoc, $set?: any, $push?: any) => void } diff --git a/packages/login-with-qq/service.ts b/packages/login-with-qq/service.ts index 62a9606e9..52673605f 100644 --- a/packages/login-with-qq/service.ts +++ b/packages/login-with-qq/service.ts @@ -33,4 +33,4 @@ export async function postInit() { }); } -bus.subscribe(['app/started'], postInit); +bus.once('app/started', postInit); diff --git a/tsconfig.json b/tsconfig.json index 65c42ebb3..1ee9215de 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -15,6 +15,7 @@ { "path": "packages/hydrojudge" }, { "path": "packages/geoip" }, { "path": "packages/html2md" }, + { "path": "packages/better-search" }, { "path": "packages/fps-importer" }, { "path": "packages/login-with-github" }, { "path": "packages/login-with-google" },