diff --git a/common/db.js b/common/db.js index d6f0b3ad90978e8706be5407b78b6b27a304e1c7..21ae66ef180501f60da3a0893adbae94c6c44291 100644 --- a/common/db.js +++ b/common/db.js @@ -1,5 +1,6 @@ const logger = require.main.require('./common/logger.js'); const config = require.main.require('./common/config.js'); +const MiniSearch = require("minisearch") var sqlite3 = require.main.require('sqlite3').verbose(); /* The kara table is defined as follows: @@ -48,6 +49,26 @@ class KaraDatabase { this.m_karaPath = config.content.database.path; this.m_db = new sqlite3.Database(this.m_karaPath); this.m_db.configure('busyTimeout', 50000); + this.m_search_engine = new MiniSearch({ + fields: [ + "id", + "cat", + "type", + "language", + "author", + "title", + "source" + ], // fields to index for full-text search + storeFields: [ + "id", + "cat", + "type", + "language", + "author", + "title", + "source" + ] // fields to return with search results + }) logger.info('db', 'Create database from file ' + config.content.database.path); } @@ -64,7 +85,7 @@ class KaraDatabase { * - offset: Int | null -> offset in the search * => a promize, callback with [(id: Int, string, cat, type, language, author, title, source)] */ search(queryString, offset = null, limit = null) { - var __ret = []; + /*var __ret = []; var __sqlQuery = `SELECT id, string, category AS cat, (song_type || song_number) AS type, @@ -84,28 +105,30 @@ class KaraDatabase { rows.forEach(row => { __ret.push(row); }); - resolv(__ret); + resolv([{id:0, string:"a", cat:"cat", type:"type", language:"language", author:"author", title:"title", source:"source"}]); }); }); - } - - return __getRecords(this.m_db); + }*/ + let searchResult = this.m_search_engine.search(queryString, { + prefix: term => term.length > 3, + fuzzy: term => term.length > 3 ? 0.2 : null, + combineWith: 'AND' + }) + return searchResult; } /* List all the kara in the db. * - limit: Int | null -> maximal number of results * - offset: Int | null -> offset in the search * => a promize, callback with [(id: Int, string, cat, type, language, author, title, source)] */ - all(offset = null, limit = null) { + setup_search_engine() { var __ret = []; - var __sqlQuery = `SELECT id, string, + var __sqlQuery = `SELECT id, category AS cat, (song_type || song_number) AS type, language, author_name AS author, - song_name AS title, source_name AS source, available + song_name AS title, source_name AS source FROM kara`; - if (offset != null && limit != null) __sqlQuery += ` LIMIT ${offset}, ${limit}`; - function __getRecords(db) { return new Promise(resolv => { db.all(__sqlQuery, [], (err, rows) => { @@ -121,7 +144,14 @@ class KaraDatabase { }); } - return __getRecords(this.m_db); + function __SetupSE(karas, search_engine = db.m_search_engine){ + search_engine.removeAll() + logger.info("db", karas.length) + search_engine.addAll(karas) + logger.info("db", search_engine.documentCount) + } + + return __getRecords(this.m_db).then(__SetupSE); } /* List all the next karas in the queue. diff --git a/main.js b/main.js index 45c7018cd331419d8512ebf0a5eaaa7d310fb2ba..c347745272d87cf1ee217a5f89053295c8eca1e5 100644 --- a/main.js +++ b/main.js @@ -165,6 +165,10 @@ function createKurisuWindow() { kurisu.once('ready-to-show', () => kurisu.show()); } +function setupKaraDB(){ + db.setup_search_engine() +} + /****************************** * The end of the application * ******************************/ @@ -244,13 +248,15 @@ ipcMain.on('reload-db-request', (event, arg) => { if (arg && arg.search && arg.search !== '') { __lastFilter = arg.search; logger.debug('main', `Reload DB with search '${arg}'`); - db.search(__lastFilter, 0, 100).then(callback); + karas = db.search(__lastFilter, 0, 150); + callback(karas); } else if ((arg && arg.search === '') || __lastFilter === '') { __lastFilter = ''; callback([]); } else { logger.debug('main', `Reload DB with last filter '${__lastFilter}'`); - db.search(__lastFilter, 0, 100).then(callback); + karas = db.search(__lastFilter, 0, 150); + callback(karas); } }); @@ -344,6 +350,7 @@ ipcMain.on('verify-lektord', (event, arg) => { }); lkt.reloadState(); + setupKaraDB(); loopTimeouts.concat([ setTimeout(() => lkt.idleActualisation(), 1000), diff --git a/package.json b/package.json index 7f30cae9ca6ba6a74ea4fcda8d54333b95f55218..463d2f6ca9db057719a1ba49d8d65855c63a6558 100644 --- a/package.json +++ b/package.json @@ -12,22 +12,22 @@ ], "license": "ISC", "scripts": { - "start": "electron -- --trace-uncaught . --trace-uncaught" + "start": "electron --no-sandbox -- --trace-uncaught . --trace-uncaught" }, "dependencies": { "ejs": "^3.1.5", - "electron": "^10.1.1", + "electron": "^26.1.1", "electron-ejs": "^1.2.1", + "electron-prompt": "^1.6.2", "express": "^4.17.1", "ini": "^2.0.0", - "node": "<14.0.0 ", + "minisearch": "^6.1.0", + "node": ">14.0.0 ", "sqlite3": "5.0.0", "tail": "^2.0.4", - "winston": "^3.3.3", - "electron-prompt": "^1.6.2" + "winston": "^3.3.3" }, "config": { - "port": "8080", "kurisu": "https://kurisu.iiens.net/" }, "devDependencies": {