Preserve order jeezo this is messy

This commit is contained in:
Neil Alexander 2022-06-15 10:00:27 +01:00
parent e979667952
commit 0be9c6bb7e
No known key found for this signature in database
GPG key ID: A02A2019A2BB0944

View file

@ -435,28 +435,32 @@ func (d *Database) Events(
func (d *Database) events( func (d *Database) events(
ctx context.Context, txn *sql.Tx, inputEventNIDs []types.EventNID, ctx context.Context, txn *sql.Tx, inputEventNIDs []types.EventNID,
) ([]types.Event, error) { ) ([]types.Event, error) {
results := make([]types.Event, 0, len(inputEventNIDs)) results := make([]types.Event, len(inputEventNIDs))
eventNIDs := make([]types.EventNID, 0, len(results)) positions := make(map[types.EventNID]int, len(inputEventNIDs))
for _, nid := range inputEventNIDs { inCache := make([]bool, len(inputEventNIDs))
inDatabase := make([]types.EventNID, 0, len(results))
for i, nid := range inputEventNIDs {
positions[nid] = i
if event, ok := d.Cache.GetRoomServerEvent(nid); ok && event != nil { if event, ok := d.Cache.GetRoomServerEvent(nid); ok && event != nil {
results = append(results, types.Event{ results[i] = types.Event{
EventNID: nid, EventNID: nid,
Event: event, Event: event,
}) }
inCache[i] = true
} else { } else {
eventNIDs = append(eventNIDs, nid) inDatabase = append(inDatabase, nid)
} }
} }
eventJSONs, err := d.EventJSONTable.BulkSelectEventJSON(ctx, txn, eventNIDs) eventJSONs, err := d.EventJSONTable.BulkSelectEventJSON(ctx, txn, inDatabase)
if err != nil { if err != nil {
return nil, err return nil, err
} }
eventIDs, _ := d.EventsTable.BulkSelectEventID(ctx, txn, eventNIDs) eventIDs, _ := d.EventsTable.BulkSelectEventID(ctx, txn, inDatabase)
if err != nil { if err != nil {
eventIDs = map[types.EventNID]string{} eventIDs = map[types.EventNID]string{}
} }
var roomNIDs map[types.EventNID]types.RoomNID var roomNIDs map[types.EventNID]types.RoomNID
roomNIDs, err = d.EventsTable.SelectRoomNIDsForEventNIDs(ctx, txn, eventNIDs) roomNIDs, err = d.EventsTable.SelectRoomNIDsForEventNIDs(ctx, txn, inDatabase)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -483,18 +487,19 @@ func (d *Database) events(
roomVersions[n] = v roomVersions[n] = v
} }
for _, eventJSON := range eventJSONs { for _, eventJSON := range eventJSONs {
roomNID := roomNIDs[eventJSON.EventNID] eventNID := eventJSON.EventNID
roomNID := roomNIDs[eventNID]
roomVersion := roomVersions[roomNID] roomVersion := roomVersions[roomNID]
event, err := gomatrixserverlib.NewEventFromTrustedJSONWithEventID( event, err := gomatrixserverlib.NewEventFromTrustedJSONWithEventID(
eventIDs[eventJSON.EventNID], eventJSON.EventJSON, false, roomVersion, eventIDs[eventNID], eventJSON.EventJSON, false, roomVersion,
) )
if err != nil { if err != nil {
return nil, err return nil, err
} }
results = append(results, types.Event{ results[positions[eventNID]] = types.Event{
EventNID: eventJSON.EventNID, EventNID: eventJSON.EventNID,
Event: event, Event: event,
}) }
if event != nil { if event != nil {
d.Cache.StoreRoomServerEvent(eventJSON.EventNID, event) d.Cache.StoreRoomServerEvent(eventJSON.EventNID, event)
} }
@ -992,10 +997,10 @@ func (d *Database) GetStateEvent(ctx context.Context, roomID, evType, stateKey s
if err != nil { if err != nil {
return nil, err return nil, err
} }
var eventNIDs []types.EventNID var inDatabase []types.EventNID
for _, e := range entries { for _, e := range entries {
if e.EventTypeNID == eventTypeNID && e.EventStateKeyNID == stateKeyNID { if e.EventTypeNID == eventTypeNID && e.EventStateKeyNID == stateKeyNID {
eventNIDs = append(eventNIDs, e.EventNID) inDatabase = append(inDatabase, e.EventNID)
} }
} }
eventIDs, _ := d.EventsTable.BulkSelectEventID(ctx, nil, eventNIDs) eventIDs, _ := d.EventsTable.BulkSelectEventID(ctx, nil, eventNIDs)
@ -1049,10 +1054,10 @@ func (d *Database) GetStateEventsWithEventType(ctx context.Context, roomID, evTy
if err != nil { if err != nil {
return nil, err return nil, err
} }
var eventNIDs []types.EventNID var inDatabase []types.EventNID
for _, e := range entries { for _, e := range entries {
if e.EventTypeNID == eventTypeNID { if e.EventTypeNID == eventTypeNID {
eventNIDs = append(eventNIDs, e.EventNID) inDatabase = append(inDatabase, e.EventNID)
} }
} }
eventIDs, _ := d.EventsTable.BulkSelectEventID(ctx, nil, eventNIDs) eventIDs, _ := d.EventsTable.BulkSelectEventID(ctx, nil, eventNIDs)
@ -1060,7 +1065,7 @@ func (d *Database) GetStateEventsWithEventType(ctx context.Context, roomID, evTy
eventIDs = map[types.EventNID]string{} eventIDs = map[types.EventNID]string{}
} }
// return the events requested // return the events requested
eventPairs, err := d.EventJSONTable.BulkSelectEventJSON(ctx, nil, eventNIDs) eventPairs, err := d.EventJSONTable.BulkSelectEventJSON(ctx, nil, inDatabase)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -1153,7 +1158,7 @@ func (d *Database) GetBulkStateContent(ctx context.Context, roomIDs []string, tu
stateKeyNIDSet[nid] = true stateKeyNIDSet[nid] = true
} }
var eventNIDs []types.EventNID var inDatabase []types.EventNID
eventNIDToVer := make(map[types.EventNID]gomatrixserverlib.RoomVersion) eventNIDToVer := make(map[types.EventNID]gomatrixserverlib.RoomVersion)
// TODO: This feels like this is going to be really slow... // TODO: This feels like this is going to be really slow...
for _, roomID := range roomIDs { for _, roomID := range roomIDs {
@ -1172,7 +1177,7 @@ func (d *Database) GetBulkStateContent(ctx context.Context, roomIDs []string, tu
for _, entry := range entries { for _, entry := range entries {
if typeNIDSet[entry.EventTypeNID] { if typeNIDSet[entry.EventTypeNID] {
if allowWildcard[entry.EventTypeNID] || stateKeyNIDSet[entry.EventStateKeyNID] { if allowWildcard[entry.EventTypeNID] || stateKeyNIDSet[entry.EventStateKeyNID] {
eventNIDs = append(eventNIDs, entry.EventNID) inDatabase = append(inDatabase, entry.EventNID)
eventNIDToVer[entry.EventNID] = roomInfo.RoomVersion eventNIDToVer[entry.EventNID] = roomInfo.RoomVersion
} }
} }
@ -1182,7 +1187,7 @@ func (d *Database) GetBulkStateContent(ctx context.Context, roomIDs []string, tu
if err != nil { if err != nil {
eventIDs = map[types.EventNID]string{} eventIDs = map[types.EventNID]string{}
} }
events, err := d.EventJSONTable.BulkSelectEventJSON(ctx, nil, eventNIDs) events, err := d.EventJSONTable.BulkSelectEventJSON(ctx, nil, inDatabase)
if err != nil { if err != nil {
return nil, fmt.Errorf("GetBulkStateContent: failed to load event JSON for event nids: %w", err) return nil, fmt.Errorf("GetBulkStateContent: failed to load event JSON for event nids: %w", err)
} }