mirror of
				https://github.com/zadam/trilium.git
				synced 2025-10-31 02:16:05 +01:00 
			
		
		
		
	changes in retrieval of initial note tree and then updates
This commit is contained in:
		| @@ -7,8 +7,16 @@ const noteCacheService = require('../../services/note_cache'); | ||||
|  | ||||
| async function getNotes(noteIds) { | ||||
|     const notes = await sql.getManyRows(` | ||||
|       SELECT noteId, title, isProtected, type, mime | ||||
|       FROM notes WHERE isDeleted = 0 AND noteId IN (???)`, noteIds); | ||||
|       SELECT  | ||||
|              noteId,  | ||||
|              title,  | ||||
|              isProtected,  | ||||
|              type,  | ||||
|              mime | ||||
|       FROM  | ||||
|            notes  | ||||
|       WHERE isDeleted = 0  | ||||
|         AND noteId IN (???)`, noteIds); | ||||
|  | ||||
|     const cssClassLabels = await sql.getManyRows(` | ||||
|       SELECT noteId, value FROM attributes WHERE isDeleted = 0 AND type = 'label'  | ||||
| @@ -40,19 +48,31 @@ async function getNotes(noteIds) { | ||||
|     return notes; | ||||
| } | ||||
|  | ||||
| async function getRelations(noteIds) { | ||||
|     // we need to fetch both parentNoteId and noteId matches because we can have loaded child | ||||
|     // of which only some of the parents has been loaded. | ||||
|     // also now with note hoisting, it is possible to have the note displayed without its parent chain being loaded | ||||
| async function getNotesAndBranches(noteIds) { | ||||
|     noteIds = Array.from(new Set(noteIds)); | ||||
|     const notes = await getNotes(noteIds); | ||||
|  | ||||
|     const relations = await sql.getManyRows(`SELECT branchId, noteId AS 'childNoteId', parentNoteId, notePosition FROM branches WHERE isDeleted = 0  | ||||
|          AND (parentNoteId IN (???) OR noteId IN (???))`, noteIds); | ||||
|     noteIds = notes.map(n => n.noteId); | ||||
|  | ||||
|     // although we're fetching relations for multiple notes, ordering will stay correct for single note as well - relations are being added into tree cache in the order they were returned | ||||
|     // cannot use ORDER BY because of usage of getManyRows which is not a single SQL query | ||||
|     relations.sort((a, b) => a.notePosition > b.notePosition ? 1 : -1); | ||||
|     const branches = await sql.getManyRows(`  | ||||
|         SELECT  | ||||
|             branches.branchId, | ||||
|             branches.noteId, | ||||
|             branches.parentNoteId, | ||||
|             branches.notePosition, | ||||
|             branches.prefix, | ||||
|             branches.isExpanded | ||||
|         FROM branches | ||||
|         WHERE branches.isDeleted = 0 | ||||
|           AND (branches.noteId IN (???) OR parentNoteId IN (???))`, noteIds); | ||||
|  | ||||
|     return relations; | ||||
|     // sorting in memory is faster | ||||
|     branches.sort((a, b) => a.notePosition - b.notePosition < 0 ? -1 : 1); | ||||
|  | ||||
|     return { | ||||
|         branches, | ||||
|         notes | ||||
|     }; | ||||
| } | ||||
|  | ||||
| async function getTree() { | ||||
| @@ -60,7 +80,7 @@ async function getTree() { | ||||
|  | ||||
|     // we fetch all branches of notes, even if that particular branch isn't visible | ||||
|     // this allows us to e.g. detect and properly display clones | ||||
|     const branches = await sql.getRows(` | ||||
|     let noteIds = await sql.getColumn(` | ||||
|         WITH RECURSIVE | ||||
|             tree(branchId, noteId, isExpanded) AS ( | ||||
|             SELECT branchId, noteId, isExpanded FROM branches WHERE noteId = ?  | ||||
| @@ -69,22 +89,11 @@ async function getTree() { | ||||
|               JOIN tree ON branches.parentNoteId = tree.noteId | ||||
|               WHERE tree.isExpanded = 1 AND branches.isDeleted = 0 | ||||
|           ) | ||||
|         SELECT branches.* FROM tree JOIN branches USING(noteId) WHERE branches.isDeleted = 0 ORDER BY branches.notePosition`, [hoistedNoteId]); | ||||
|         SELECT noteId FROM tree`, [hoistedNoteId]); | ||||
|  | ||||
|     // we also want root branch in there because all the paths start with root | ||||
|     branches.push(await sql.getRow(`SELECT * FROM branches WHERE branchId = 'root'`)); | ||||
|     noteIds.push('root'); | ||||
|  | ||||
|     const noteIds = Array.from(new Set(branches.map(b => b.noteId))); | ||||
|  | ||||
|     const notes = await getNotes(noteIds); | ||||
|  | ||||
|     const relations = await getRelations(noteIds); | ||||
|  | ||||
|     return { | ||||
|         branches, | ||||
|         notes, | ||||
|         relations | ||||
|     }; | ||||
|     return await getNotesAndBranches(noteIds); | ||||
| } | ||||
|  | ||||
| async function load(req) { | ||||
| @@ -96,21 +105,7 @@ async function load(req) { | ||||
|             .map(note => note.noteId); | ||||
|     } | ||||
|  | ||||
|     const branches = (await sql.getManyRows(`SELECT * FROM branches WHERE isDeleted = 0 AND noteId IN (???)`, noteIds)) | ||||
|         .concat((await sql.getManyRows(`SELECT * FROM branches WHERE isDeleted = 0 AND parentNoteId IN (???)`, noteIds))); | ||||
|  | ||||
|     // sort branches so they are filled sorted in the cache as well | ||||
|     branches.sort((a, b) => a.notePosition < b.notePosition ? -1 : 1); | ||||
|  | ||||
|     const notes = await getNotes(noteIds); | ||||
|  | ||||
|     const relations = await getRelations(noteIds); | ||||
|  | ||||
|     return { | ||||
|         branches, | ||||
|         notes, | ||||
|         relations | ||||
|     }; | ||||
|     return await getNotesAndBranches(noteIds); | ||||
| } | ||||
|  | ||||
| module.exports = { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user