From a1c5c1b997298b1662a3424bb5a4ddd000fa5a5b Mon Sep 17 00:00:00 2001 From: Neil Alexander Date: Thu, 12 May 2022 12:43:55 +0100 Subject: [PATCH] Remove duplicates --- roomserver/internal/input/input_latest_events.go | 6 ++++-- roomserver/types/types.go | 15 +++++++++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/roomserver/internal/input/input_latest_events.go b/roomserver/internal/input/input_latest_events.go index c9d2a4785..b03cceed6 100644 --- a/roomserver/internal/input/input_latest_events.go +++ b/roomserver/internal/input/input_latest_events.go @@ -236,8 +236,10 @@ func (u *latestEventsUpdater) latestState() error { // Get a list of the current latest events. This may or may not // include the new event from the input path, depending on whether // it is a forward extremity or not. - latestStateAtEvents := make([]types.StateAtEvent, len(u.latest)) - for i := range append(u.latest, u.oldLatest...) { + combinedExtremities := types.StateAtEventAndReferences(append(u.latest, u.oldLatest...)) + util.Unique(combinedExtremities) + latestStateAtEvents := make([]types.StateAtEvent, len(combinedExtremities)) + for i := range combinedExtremities { latestStateAtEvents[i] = u.latest[i].StateAtEvent } diff --git a/roomserver/types/types.go b/roomserver/types/types.go index 65fbee04e..ce4e5fd1e 100644 --- a/roomserver/types/types.go +++ b/roomserver/types/types.go @@ -18,6 +18,7 @@ package types import ( "encoding/json" "sort" + "strings" "github.com/matrix-org/gomatrixserverlib" "golang.org/x/crypto/blake2b" @@ -166,6 +167,20 @@ type StateAtEventAndReference struct { gomatrixserverlib.EventReference } +type StateAtEventAndReferences []StateAtEventAndReference + +func (s StateAtEventAndReferences) Less(a, b int) bool { + return strings.Compare(s[a].EventID, s[b].EventID) < 0 +} + +func (s StateAtEventAndReferences) Len() int { + return len(s) +} + +func (s StateAtEventAndReferences) Swap(a, b int) { + s[a], s[b] = s[b], s[a] +} + // An Event is a gomatrixserverlib.Event with the numeric event ID attached. // It is when performing bulk event lookup in the database. type Event struct {