From b7ba9b3c413043ac759aacb15fe6650f2be2a73b Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Thu, 14 May 2020 14:16:26 -0600 Subject: [PATCH] Replace ChaoticAlgorithm with NaturalAlgorithm for list behaviour --- .../list_ordering/ChaoticAlgorithm.ts | 38 ------------- .../list_ordering/NaturalAlgorithm.ts | 56 +++++++++++++++++++ .../algorithms/list_ordering/index.ts | 4 +- 3 files changed, 58 insertions(+), 40 deletions(-) delete mode 100644 src/stores/room-list/algorithms/list_ordering/ChaoticAlgorithm.ts create mode 100644 src/stores/room-list/algorithms/list_ordering/NaturalAlgorithm.ts diff --git a/src/stores/room-list/algorithms/list_ordering/ChaoticAlgorithm.ts b/src/stores/room-list/algorithms/list_ordering/ChaoticAlgorithm.ts deleted file mode 100644 index 185fb606fb..0000000000 --- a/src/stores/room-list/algorithms/list_ordering/ChaoticAlgorithm.ts +++ /dev/null @@ -1,38 +0,0 @@ -/* -Copyright 2020 The Matrix.org Foundation C.I.C. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -import { Algorithm } from "./Algorithm"; -import { ITagMap } from "../models"; - -/** - * A demonstration/temporary algorithm to verify the API surface works. - * TODO: Remove this before shipping - */ -export class ChaoticAlgorithm extends Algorithm { - - constructor() { - super(); - console.log("Constructed a ChaoticAlgorithm"); - } - - protected async generateFreshTags(updatedTagMap: ITagMap): Promise { - return Promise.resolve(); - } - - public async handleRoomUpdate(room, cause): Promise { - return Promise.resolve(false); - } -} diff --git a/src/stores/room-list/algorithms/list_ordering/NaturalAlgorithm.ts b/src/stores/room-list/algorithms/list_ordering/NaturalAlgorithm.ts new file mode 100644 index 0000000000..1265564352 --- /dev/null +++ b/src/stores/room-list/algorithms/list_ordering/NaturalAlgorithm.ts @@ -0,0 +1,56 @@ +/* +Copyright 2020 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import { Algorithm } from "./Algorithm"; +import { ITagMap } from "../models"; +import { sortRoomsWithAlgorithm } from "../tag_sorting"; + +/** + * Uses the natural tag sorting algorithm order to determine tag ordering. No + * additional behavioural changes are present. + */ +export class NaturalAlgorithm extends Algorithm { + + constructor() { + super(); + console.log("Constructed a NaturalAlgorithm"); + } + + protected async generateFreshTags(updatedTagMap: ITagMap): Promise { + for (const tagId of Object.keys(updatedTagMap)) { + const unorderedRooms = updatedTagMap[tagId]; + + const sortBy = this.sortAlgorithms[tagId]; + if (!sortBy) throw new Error(`${tagId} does not have a sorting algorithm`); + + updatedTagMap[tagId] = await sortRoomsWithAlgorithm(unorderedRooms, tagId, sortBy); + } + } + + public async handleRoomUpdate(room, cause): Promise { + const tags = this.roomIdsToTags[room.roomId]; + if (!tags) { + console.warn(`No tags known for "${room.name}" (${room.roomId})`); + return false; + } + for (const tag of tags) { + // TODO: Optimize this loop to avoid useless operations + // For example, we can skip updates to alphabetic (sometimes) and manually ordered tags + this.cached[tag] = await sortRoomsWithAlgorithm(this.cached[tag], tag, this.sortAlgorithms[tag]); + } + return true; // assume we changed something + } +} diff --git a/src/stores/room-list/algorithms/list_ordering/index.ts b/src/stores/room-list/algorithms/list_ordering/index.ts index 35f4af14cf..bcccd150cd 100644 --- a/src/stores/room-list/algorithms/list_ordering/index.ts +++ b/src/stores/room-list/algorithms/list_ordering/index.ts @@ -15,12 +15,12 @@ limitations under the License. */ import { Algorithm } from "./Algorithm"; -import { ChaoticAlgorithm } from "./ChaoticAlgorithm"; import { ImportanceAlgorithm } from "./ImportanceAlgorithm"; import { ListAlgorithm } from "../models"; +import { NaturalAlgorithm } from "./NaturalAlgorithm"; const ALGORITHM_FACTORIES: { [algorithm in ListAlgorithm]: () => Algorithm } = { - [ListAlgorithm.Natural]: () => new ChaoticAlgorithm(), + [ListAlgorithm.Natural]: () => new NaturalAlgorithm(), [ListAlgorithm.Importance]: () => new ImportanceAlgorithm(), };