Compare commits

...

3 Commits

Author SHA1 Message Date
Riccardo Ferretti
764750f591 v0.26.2 2024-11-06 15:29:44 +01:00
Riccardo Ferretti
2686b9a365 Preparation for next release 2024-11-06 15:29:28 +01:00
Paul de Raaij
5a6ef644bd Improve performance via Triemap in workspace (#1406) 2024-10-15 22:52:13 +02:00
7 changed files with 1839 additions and 1849 deletions

View File

@@ -4,5 +4,5 @@
],
"npmClient": "yarn",
"useWorkspaces": true,
"version": "0.26.1"
"version": "0.26.2"
}

16
package-lock.json generated
View File

@@ -24025,6 +24025,14 @@
"node": ">=10"
}
},
"node_modules/mnemonist": {
"version": "0.39.8",
"resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.39.8.tgz",
"integrity": "sha512-vyWo2K3fjrUw8YeeZ1zF0fy6Mu59RHokURlld8ymdUPjMlD9EC9ov1/YPqTgqRvUN9nTr3Gqfz29LYAmu0PHPQ==",
"dependencies": {
"obliterator": "^2.0.1"
}
},
"node_modules/modify-values": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz",
@@ -25025,6 +25033,11 @@
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/obliterator": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.4.tgz",
"integrity": "sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ=="
},
"node_modules/on-finished": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
@@ -29705,7 +29718,7 @@
}
},
"packages/foam-vscode": {
"version": "0.26.0",
"version": "0.26.1",
"license": "MIT",
"dependencies": {
"dateformat": "4.5.1",
@@ -29716,6 +29729,7 @@
"lodash": "^4.17.21",
"lru-cache": "^7.14.1",
"markdown-it-regex": "^0.2.0",
"mnemonist": "^0.39.8",
"path-browserify": "^1.0.1",
"remark-frontmatter": "^2.0.0",
"remark-parse": "^8.0.2",

View File

@@ -4,6 +4,12 @@ All notable changes to the "foam-vscode" extension will be documented in this fi
Check [Keep a Changelog](http://keepachangelog.com/) for recommendations on how to structure this file.
## [0.26.2] - 2024-11-06
Fixes and Improvements:
- Performance improvements (#1406 - thanks @pderaaij)
## [0.26.1] - 2024-10-09
Fixes and Improvements:

View File

@@ -8,7 +8,7 @@
"type": "git"
},
"homepage": "https://github.com/foambubble/foam",
"version": "0.26.1",
"version": "0.26.2",
"license": "MIT",
"publisher": "foam",
"engines": {
@@ -720,6 +720,7 @@
"lodash": "^4.17.21",
"lru-cache": "^7.14.1",
"markdown-it-regex": "^0.2.0",
"mnemonist": "^0.39.8",
"path-browserify": "^1.0.1",
"remark-frontmatter": "^2.0.0",
"remark-parse": "^8.0.2",

View File

@@ -6,6 +6,7 @@ import { Emitter } from '../common/event';
import { ResourceProvider } from './provider';
import { IDisposable } from '../common/lifecycle';
import { IDataStore } from '../services/datastore';
import TrieMap from 'mnemonist/trie-map';
export class FoamWorkspace implements IDisposable {
private onDidAddEmitter = new Emitter<Resource>();
@@ -20,7 +21,7 @@ export class FoamWorkspace implements IDisposable {
/**
* Resources by path
*/
private _resources: Map<string, Resource> = new Map();
private _resources: TrieMap<string, Resource> = new TrieMap();
/**
* @param defaultExtension: The default extension for notes in this workspace (e.g. `.md`)
@@ -33,7 +34,10 @@ export class FoamWorkspace implements IDisposable {
set(resource: Resource) {
const old = this.find(resource.uri);
this._resources.set(normalize(resource.uri.path), resource);
// store resource
this._resources.set(this.getTrieIdentifier(resource.uri.path), resource);
isSome(old)
? this.onDidUpdateEmitter.fire({ old: old, new: resource })
: this.onDidAddEmitter.fire(resource);
@@ -41,8 +45,8 @@ export class FoamWorkspace implements IDisposable {
}
delete(uri: URI) {
const deleted = this._resources.get(normalize(uri.path));
this._resources.delete(normalize(uri.path));
const deleted = this._resources.get(this.getTrieIdentifier(uri));
this._resources.delete(this.getTrieIdentifier(uri));
isSome(deleted) && this.onDidDeleteEmitter.fire(deleted);
return deleted ?? null;
@@ -57,7 +61,11 @@ export class FoamWorkspace implements IDisposable {
}
public resources(): IterableIterator<Resource> {
return this._resources.values();
const resources: Array<Resource> = Array.from(
this._resources.values()
).sort(Resource.sortByPath);
return resources.values();
}
public get(uri: URI): Resource {
@@ -70,17 +78,21 @@ export class FoamWorkspace implements IDisposable {
}
public listByIdentifier(identifier: string): Resource[] {
const needle = normalize('/' + identifier);
let needle = this.getTrieIdentifier(identifier);
const mdNeedle =
getExtension(needle) !== this.defaultExtension
? needle + this.defaultExtension
getExtension(normalize(identifier)) !== this.defaultExtension
? this.getTrieIdentifier(identifier + this.defaultExtension)
: undefined;
const resources: Resource[] = [];
for (const key of this._resources.keys()) {
if (key.endsWith(mdNeedle) || key.endsWith(needle)) {
resources.push(this._resources.get(normalize(key)));
}
this._resources.find(needle).forEach(elm => resources.push(elm[1]));
if (mdNeedle) {
this._resources.find(mdNeedle).forEach(elm => resources.push(elm[1]));
}
return resources.sort(Resource.sortByPath);
}
@@ -119,9 +131,32 @@ export class FoamWorkspace implements IDisposable {
return identifier;
}
/**
* Returns a note identifier in reversed order. Used to optimise the storage of notes in
* the workspace to optimise retrieval of notes.
*
* @param reference the URI path to reverse
*/
private getTrieIdentifier(reference: URI | string): string {
let path: string;
if (reference instanceof URI) {
path = (reference as URI).path;
} else {
path = reference as string;
}
let reversedPath = normalize(path).split('/').reverse().join('/');
if (reversedPath.indexOf('/') < 0) {
reversedPath = reversedPath + '/';
}
return reversedPath;
}
public find(reference: URI | string, baseUri?: URI): Resource | null {
if (reference instanceof URI) {
return this._resources.get(normalize((reference as URI).path)) ?? null;
return this._resources.get(this.getTrieIdentifier(reference)) ?? null;
}
let resource: Resource | null = null;
const [path, fragment] = (reference as string).split('#');
@@ -135,7 +170,7 @@ export class FoamWorkspace implements IDisposable {
: isSome(baseUri)
? baseUri.resolve(candidate).path
: null;
resource = this._resources.get(normalize(searchKey));
resource = this._resources.get(this.getTrieIdentifier(searchKey));
if (resource) {
break;
}

View File

@@ -231,6 +231,10 @@ describe('Document navigation', () => {
doc,
new vscode.Position(0, 26)
);
// Make sure the references are sorted by position, so we match the right expectation
refs.sort((a, b) => a.range.start.character - b.range.start.character);
expect(refs.length).toEqual(2);
expect(refs[0]).toEqual({
uri: toVsCodeUri(fileB.uri),

3594
yarn.lock

File diff suppressed because it is too large Load Diff