diff --git a/src/routes/api/autocomplete.js b/src/routes/api/autocomplete.js index 5cb7fdc6a..4f83a5b70 100644 --- a/src/routes/api/autocomplete.js +++ b/src/routes/api/autocomplete.js @@ -3,6 +3,8 @@ const noteCacheService = require('../../services/note_cache'); const repository = require('../../services/repository'); const log = require('../../services/log'); +const utils = require('../../services/utils'); +const optionService = require('../../services/options'); async function getAutocomplete(req) { const query = req.query.query; @@ -16,7 +18,7 @@ async function getAutocomplete(req) { results = await getRecentNotes(currentNoteId); } else { - results = noteCacheService.findNotes(query); + results = await noteCacheService.findNotes(query); } const msTaken = Date.now() - timestampStarted; @@ -29,6 +31,13 @@ async function getAutocomplete(req) { } async function getRecentNotes(currentNoteId) { + let extraCondition = ''; + + const hoistedNoteId = await optionService.getOption('hoistedNoteId'); + if (hoistedNoteId !== 'root') { + extraCondition = `AND recent_notes.notePath LIKE '%${utils.sanitizeSql(hoistedNoteId)}%'`; + } + const recentNotes = await repository.getEntities(` SELECT recent_notes.* @@ -39,6 +48,7 @@ async function getRecentNotes(currentNoteId) { recent_notes.isDeleted = 0 AND branches.isDeleted = 0 AND branches.noteId != ? + ${extraCondition} ORDER BY dateCreated DESC LIMIT 200`, [currentNoteId]); diff --git a/src/routes/api/search.js b/src/routes/api/search.js index a492b1f8f..7e536691d 100644 --- a/src/routes/api/search.js +++ b/src/routes/api/search.js @@ -20,7 +20,7 @@ async function searchNotes(req) { let searchTextResults = null; if (searchText.trim().length > 0) { - searchTextResults = noteCacheService.findNotes(searchText); + searchTextResults = await noteCacheService.findNotes(searchText); let fullTextNoteIds = await getFullTextResults(searchText); diff --git a/src/services/note_cache.js b/src/services/note_cache.js index dd57bad5a..babbae7aa 100644 --- a/src/services/note_cache.js +++ b/src/services/note_cache.js @@ -4,6 +4,7 @@ const eventService = require('./events'); const repository = require('./repository'); const protectedSessionService = require('./protected_session'); const utils = require('./utils'); +const options = require('./options'); let loaded = false; let noteTitles = {}; @@ -63,7 +64,7 @@ function highlightResults(results, allTokens) { } } -function findNotes(query) { +async function findNotes(query) { if (!noteTitles || !query.length) { return []; } @@ -72,7 +73,7 @@ function findNotes(query) { // filtering '/' because it's used as separator const allTokens = query.trim().toLowerCase().split(" ").filter(token => token !== '/'); const tokens = allTokens.slice(); - const results = []; + let results = []; let noteIds = Object.keys(noteTitles); @@ -120,6 +121,12 @@ function findNotes(query) { } } + const hoistedNoteId = await options.getOption('hoistedNoteId'); + + if (hoistedNoteId !== 'root') { + results = results.filter(res => res.pathArray.includes(hoistedNoteId)); + } + // sort results by depth of the note. This is based on the assumption that more important results // are closer to the note root. results.sort((a, b) => {