From a4ab42da8a5c9a5dcada28c9423211c4f73d1ec4 Mon Sep 17 00:00:00 2001 From: Cameron Fischer Date: Mon, 21 Feb 2022 10:07:30 -0500 Subject: [PATCH] findListingsOfTiddler should cache results (#6327) * findListingsOfTiddler uses FieldIndexer now * Turns out FieldIndexer can't help listed[] --- core/modules/wiki.js | 25 ++++++++++++++------ editions/test/tiddlers/tests/test-filters.js | 5 ++++ 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/core/modules/wiki.js b/core/modules/wiki.js index 99abe6b47..23d0c0d26 100755 --- a/core/modules/wiki.js +++ b/core/modules/wiki.js @@ -639,14 +639,25 @@ Lookup a given tiddler and return a list of all the tiddlers that include it in */ exports.findListingsOfTiddler = function(targetTitle,fieldName) { fieldName = fieldName || "list"; - var titles = []; - this.each(function(tiddler,title) { - var list = $tw.utils.parseStringArray(tiddler.fields[fieldName]); - if(list && list.indexOf(targetTitle) !== -1) { - titles.push(title); - } + var wiki = this; + var listings = this.getGlobalCache("listings-" + fieldName,function() { + var listings = Object.create(null); + wiki.each(function(tiddler,title) { + var list = $tw.utils.parseStringArray(tiddler.fields[fieldName]); + if(list) { + for(var i = 0; i < list.length; i++) { + var listItem = list[i], + listing = listings[listItem] || []; + if (listing.indexOf(title) === -1) { + listing.push(title); + } + listings[listItem] = listing; + } + } + }); + return listings; }); - return titles; + return listings[targetTitle] || []; }; /* diff --git a/editions/test/tiddlers/tests/test-filters.js b/editions/test/tiddlers/tests/test-filters.js index 12d372a5b..2115e4d7d 100644 --- a/editions/test/tiddlers/tests/test-filters.js +++ b/editions/test/tiddlers/tests/test-filters.js @@ -395,6 +395,11 @@ Tests the filtering mechanism. expect(wiki.filterTiddlers("[list[TiddlerSeventh]sort[title]]").join(",")).toBe("a fourth tiddler,MissingTiddler,Tiddler Three,TiddlerOne"); expect(wiki.filterTiddlers("[tag[one]list[TiddlerSeventh]sort[title]]").join(",")).toBe("a fourth tiddler,MissingTiddler,Tiddler Three,TiddlerOne"); }); + + it("should handle the listed operator", function() { + expect(wiki.filterTiddlers("TiddlerOne MissingTiddler +[listed[]]").join(",")).toBe('one,hasList'); + expect(wiki.filterTiddlers("one two +[listed[tags]]").join(",")).toBe('TiddlerOne,$:/TiddlerTwo,Tiddler Three'); + }); it("should handle the next operator", function() { expect(wiki.filterTiddlers("[[Tiddler Three]next[TiddlerSeventh]]").join(",")).toBe("a fourth tiddler");