mirror of
https://github.com/zadam/trilium.git
synced 2025-11-13 00:35:50 +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