Skip to content

Commit

Permalink
Optimize BeatmapLibrary.GetMapByHash, replace beatmapHashSet with bea…
Browse files Browse the repository at this point in the history
…tmapHashMap
  • Loading branch information
ibillingsley committed Aug 19, 2023
1 parent b6423d7 commit 66893f4
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 28 deletions.
2 changes: 1 addition & 1 deletion src/components/services/TypescriptServicesLauncher.vue
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ export default Vue.extend({
async LaunchServices() {
await store.restored;
BeatmapLibrary.GenerateBeatmapHashSet();
BeatmapLibrary.GenerateBeatmapHashMap();
this.DiscordRichPresence();
const serverUrl = this.BeatsaverServerUrl();
const cdnHost = await this.GetCdnHost(serverUrl);
Expand Down
25 changes: 13 additions & 12 deletions src/libraries/beatmap/BeatmapLibrary.ts
Original file line number Diff line number Diff line change
Expand Up @@ -261,37 +261,38 @@ export default class BeatmapLibrary {
}

public static GetMapByHash(hash: string): BeatmapLocal | undefined {
return this.GetAllValidMap().find(
(beatmap: BeatmapLocal) => beatmap.hash === hash.toUpperCase()
);
const hashmap: Map<string, BeatmapLocal> =
store.getters["beatmap/beatmapHashMap"];
return hashmap.get(hash.toUpperCase());
}

public static HasBeatmap(beatmap: BeatsaverBeatmap): boolean {
const hashset = store.getters["beatmap/beatmapHashSet"] as Set<string>;
return hashset.has(beatmap.hash.toUpperCase());
const hashmap: Map<string, BeatmapLocal> =
store.getters["beatmap/beatmapHashMap"];
return hashmap.has(beatmap.hash.toUpperCase());
}

public static GetLastScanDate(): Date {
return store.getters["beatmap/lastScan"];
}

public static GenerateBeatmapHashSet() {
store.commit("beatmap/generateBeatmapHashSet");
public static GenerateBeatmapHashMap() {
store.commit("beatmap/generateBeatmapHashMap");
}

public static UpdateAllMaps(beatmaps: BeatmapLocal[]) {
store.commit("beatmap/SET_LAST_SCAN", new Date());
store.commit("beatmap/SET_BEATMAPS", beatmaps);
// SET_BEATMAPS を呼んだあとは SET_BEATMAP_HASH_SET も必要 (beatlist 再起動すれば不整合はなくなるはずではあるが)
store.commit("beatmap/SET_BEATMAP_HASH_SET", new Set());
store.commit("beatmap/generateBeatmapHashSet");
// SET_BEATMAPS を呼んだあとは SET_BEATMAP_HASH_MAP も必要 (beatlist 再起動すれば不整合はなくなるはずではあるが)
store.commit("beatmap/SET_BEATMAP_HASH_MAP", new Map());
store.commit("beatmap/generateBeatmapHashMap");
}

public static ClearCache() {
store.commit("beatmap/SET_LAST_SCAN", undefined);
store.commit("beatmap/SET_BEATMAPS", []);
// SET_BEATMAPS を呼んだあとは SET_BEATMAP_HASH_SET も必要 (beatlist 再起動すれば不整合はなくなるはずではあるが)
store.commit("beatmap/SET_BEATMAP_HASH_SET", new Set());
// SET_BEATMAPS を呼んだあとは SET_BEATMAP_HASH_MAP も必要 (beatlist 再起動すれば不整合はなくなるはずではあるが)
store.commit("beatmap/SET_BEATMAP_HASH_MAP", new Map());
}

public static AddBeatmap(beatmap: BeatmapLocal) {
Expand Down
2 changes: 1 addition & 1 deletion src/plugins/store.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ const vuexLocalCachedData = new VuexPersistence<StoreState>({
beatmap: {
lastScan: state.beatmap.lastScan,
beatmaps: state.beatmap.beatmaps,
// beatmapHashSet は除外
// beatmapHashMap は除外
beatsaverCached: state.beatmap.beatsaverCached,
beatsaverFailCached: state.beatmap.beatsaverFailCached,
beatsaverKeyToHashIndex: state.beatmap.beatsaverKeyToHashIndex,
Expand Down
31 changes: 17 additions & 14 deletions src/store/beatmap.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ import BeatmapHashComputer from "@/libraries/beatmap/BeatmapHashComputer";
export interface BeatmapStoreState {
lastScan: Date;
beatmaps: BeatmapLocal[];
beatmapHashSet: Set<string>; // hash のみ保持
beatmapHashMap: Map<string, BeatmapLocal>; // hash のみ保持
beatsaverCached: Map<string, BeatsaverItemValid>;
beatsaverFailCached: Map<string, BeatsaverItemInvalid>;
beatsaverKeyToHashIndex: Map<string, string>;
Expand All @@ -27,7 +27,7 @@ export interface BeatmapStoreState {
const state = {
lastScan: undefined,
beatmaps: [],
beatmapHashSet: new Set<string>(),
beatmapHashMap: new Map<string, BeatmapLocal>(),
beatsaverCached: new Map<string, BeatsaverItemInvalid>(),
beatsaverFailCached: new Map<string, BeatsaverItemInvalid>(),
beatsaverKeyToHashIndex: new Map<string, string>(),
Expand All @@ -44,7 +44,10 @@ const mutations = {
context.beatmaps.push(payload.beatmap);
if (payload.beatmap.hash != null) {
// null になるのは invalid な map だけ
context.beatmapHashSet.add(payload.beatmap.hash.toUpperCase());
context.beatmapHashMap.set(
payload.beatmap.hash.toUpperCase(),
payload.beatmap
);
}
},
addBeatmaps(
Expand All @@ -55,7 +58,7 @@ const mutations = {
context.beatmaps.push(beatmap);
if (beatmap.hash != null) {
// null になるのは invalid な map だけ
context.beatmapHashSet.add(beatmap.hash.toUpperCase());
context.beatmapHashMap.set(beatmap.hash.toUpperCase(), beatmap);
}
}
},
Expand All @@ -66,13 +69,13 @@ const mutations = {
context.beatmaps = context.beatmaps.filter(
(value: BeatmapLocal) => value.hash !== payload.beatmap.hash // BeatmapLocal どうしのhash比較
);
const hashset = new Set<string>();
const hashmap = new Map<string, BeatmapLocal>();
context.beatmaps.forEach((value) => {
if (value.hash != null) {
hashset.add(value.hash.toUpperCase());
hashmap.set(value.hash.toUpperCase(), value);
}
});
context.beatmapHashSet = hashset;
context.beatmapHashMap = hashmap;
},
// removeBeatmapByPath(context: BeatmapStoreState, payload: { path: string }) {
// context.beatmaps = context.beatmaps.filter(
Expand All @@ -88,22 +91,22 @@ const mutations = {
context.beatmaps = context.beatmaps.filter(
(value: BeatmapLocal) => !pathSet.has(value.folderPath.toLowerCase())
);
const hashset = new Set<string>();
const hashmap = new Map<string, BeatmapLocal>();
context.beatmaps.forEach((value) => {
if (value.hash != null) {
hashset.add(value.hash.toUpperCase());
hashmap.set(value.hash.toUpperCase(), value);
}
});
context.beatmapHashSet = hashset;
context.beatmapHashMap = hashmap;
},
generateBeatmapHashSet(context: BeatmapStoreState) {
const hashset = new Set<string>();
generateBeatmapHashMap(context: BeatmapStoreState) {
const hashmap = new Map<string, BeatmapLocal>();
context.beatmaps.forEach((value) => {
if (value.hash != null) {
hashset.add(value.hash.toUpperCase());
hashmap.set(value.hash.toUpperCase(), value);
}
});
context.beatmapHashSet = hashset;
context.beatmapHashMap = hashmap;
},
updateDownloadDate(
context: BeatmapStoreState,
Expand Down

0 comments on commit 66893f4

Please sign in to comment.