Notes/src/share/shaca/shaca_loader.js

87 lines
2.4 KiB
JavaScript
Raw Normal View History

2021-10-16 22:13:34 +02:00
"use strict";
2021-10-17 14:44:59 +02:00
const sql = require('../sql');
2022-01-10 17:09:20 +01:00
const shaca = require('./shaca');
2021-10-17 14:44:59 +02:00
const log = require('../../services/log');
2021-10-16 22:13:34 +02:00
const Note = require('./entities/note');
const Branch = require('./entities/branch');
const Attribute = require('./entities/attribute');
2021-10-17 14:44:59 +02:00
const shareRoot = require('../share_root');
2021-12-07 23:03:49 +01:00
const eventService = require("../../services/events");
2021-10-16 22:13:34 +02:00
function load() {
const start = Date.now();
shaca.reset();
// using raw query and passing arrays to avoid allocating new objects
2021-10-17 14:44:59 +02:00
const noteIds = sql.getColumn(`
WITH RECURSIVE
tree(noteId) AS (
SELECT ?
UNION
SELECT branches.noteId FROM branches
JOIN tree ON branches.parentNoteId = tree.noteId
2021-10-17 14:44:59 +02:00
WHERE branches.isDeleted = 0
)
SELECT noteId FROM tree`, [shareRoot.SHARE_ROOT_NOTE_ID]);
2021-10-16 22:13:34 +02:00
2021-10-17 14:44:59 +02:00
if (noteIds.length === 0) {
shaca.loaded = true;
2021-10-16 22:13:34 +02:00
return;
}
2021-10-17 14:44:59 +02:00
const noteIdStr = noteIds.map(noteId => `'${noteId}'`).join(",");
2021-10-16 22:13:34 +02:00
2021-12-23 12:54:21 +01:00
const rawNoteRows = sql.getRawRows(`
SELECT noteId, title, type, mime, utcDateModified, isProtected
2021-12-23 12:54:21 +01:00
FROM notes
WHERE isDeleted = 0
AND noteId IN (${noteIdStr})`);
for (const row of rawNoteRows) {
2021-10-17 14:44:59 +02:00
new Note(row);
2021-10-16 22:13:34 +02:00
}
2021-12-23 12:54:21 +01:00
const rawBranchRows = sql.getRawRows(`
SELECT branchId, noteId, parentNoteId, prefix, isExpanded, utcDateModified
FROM branches
WHERE isDeleted = 0
AND parentNoteId IN (${noteIdStr})
ORDER BY notePosition`);
for (const row of rawBranchRows) {
2021-10-17 14:44:59 +02:00
new Branch(row);
2021-10-16 22:13:34 +02:00
}
2021-12-23 12:54:21 +01:00
const rawAttributeRows = sql.getRawRows(`
2021-12-07 23:03:49 +01:00
SELECT attributeId, noteId, type, name, value, isInheritable, position, utcDateModified
FROM attributes
WHERE isDeleted = 0
AND noteId IN (${noteIdStr})`);
2021-12-07 23:03:49 +01:00
2021-12-23 12:54:21 +01:00
for (const row of rawAttributeRows) {
2021-10-17 14:44:59 +02:00
new Attribute(row);
2021-10-16 22:13:34 +02:00
}
2021-10-17 14:44:59 +02:00
shaca.loaded = true;
2021-10-16 22:13:34 +02:00
2021-12-23 12:54:21 +01:00
log.info(`Shaca loaded ${rawNoteRows.length} notes, ${rawBranchRows.length} branches, ${rawAttributeRows.length} attributes took ${Date.now() - start}ms`);
2021-10-16 22:13:34 +02:00
}
2021-10-17 14:44:59 +02:00
function ensureLoad() {
if (!shaca.loaded) {
load();
2021-10-16 22:13:34 +02:00
}
}
2021-12-07 23:03:49 +01:00
eventService.subscribe([ eventService.ENTITY_CREATED, eventService.ENTITY_CHANGED, eventService.ENTITY_DELETED, eventService.ENTITY_CHANGE_SYNCED, eventService.ENTITY_DELETE_SYNCED ], ({ entityName, entity }) => {
shaca.reset();
});
2021-10-16 22:13:34 +02:00
module.exports = {
load,
2021-10-17 14:44:59 +02:00
ensureLoad
2021-10-16 22:13:34 +02:00
};