This commit is contained in:
Till Faelligen 2023-07-11 11:42:44 +02:00
parent bb3566a649
commit 1bc7faf63c
No known key found for this signature in database
GPG key ID: ACCDC9606D472758
4 changed files with 22 additions and 4 deletions

View file

@ -336,7 +336,15 @@ func (r *messagesReq) retrieveEvents(ctx context.Context, rsAPI api.SyncRoomserv
// removed all of them. This means there are no events for this user
// anymore. Let them know.
if errors.Is(err, shared.ErrNoEventsForFilter) {
return []synctypes.ClientEvent{}, *r.from, emptyToken, nil
if len(streamEvents) == 0 {
return []synctypes.ClientEvent{}, *r.from, emptyToken, nil
}
// We possibly received events, try to get start/end from them
start, end, err = r.getStartEnd(r.snapshot.StreamEventsToEvents(ctx, r.device, streamEvents, rsAPI))
if err != nil {
return []synctypes.ClientEvent{}, *r.from, *r.to, err
}
return []synctypes.ClientEvent{}, start, end, nil
}
err = fmt.Errorf("GetEventsInRange: %w", err)
return []synctypes.ClientEvent{}, *r.from, emptyToken, err

View file

@ -81,7 +81,10 @@ type DatabaseTransaction interface {
// If no data is retrieved, returns an empty map
// If there was an issue with the retrieval, returns an error
GetAccountDataInRange(ctx context.Context, userID string, r types.Range, accountDataFilterPart *synctypes.EventFilter) (map[string][]string, types.StreamPosition, error)
// GetEventsInTopologicalRange retrieves all of the events on a given ordering using the given extremities and limit. If backwardsOrdering is true, the most recent event must be first, else last.
// GetEventsInTopologicalRange retrieves all of the events on a given ordering using the given extremities and limit.
// If backwardsOrdering is true, the most recent event must be first, else last.
// Returns the filtered StreamEvents on success. Returns **unfiltered** StreamEvents and ErrNoEventsForFilter if
// the provided filter removed all events, this can be used to still calculate the start/end position. (e.g for `/messages`)
GetEventsInTopologicalRange(ctx context.Context, from, to *types.TopologyToken, roomID string, filter *synctypes.RoomEventFilter, backwardOrdering bool) (events []types.StreamEvent, err error)
// EventPositionInTopology returns the depth and stream position of the given event.
EventPositionInTopology(ctx context.Context, eventID string) (types.TopologyToken, error)

View file

@ -273,7 +273,13 @@ func (d *DatabaseTransaction) GetEventsInTopologicalRange(
// Check if we should be able to return events.
// If we received 0 events, this most likely means that the provided filter removed them.
if len(eIDs) > 0 && len(events) == 0 {
return nil, ErrNoEventsForFilter
// We try to fetch the events without a filter, so we can tell the client if there
// are more events earlier than the requested and filtered.
events, err = d.OutputEvents.SelectEvents(ctx, d.txn, eIDs, nil, true)
if err != nil {
return
}
return events, ErrNoEventsForFilter
}
return

View file

@ -250,7 +250,8 @@ func TestGetEventsInRangeWithTopologyTokenNoEventsForFilter(t *testing.T) {
filter := &synctypes.RoomEventFilter{Limit: 20, NotTypes: &notTypes, Senders: &senders}
paginatedEvents, err := snapshot.GetEventsInTopologicalRange(ctx, &from, &to, r.ID, filter, true)
assert.Equal(t, shared.ErrNoEventsForFilter, err)
assert.Nil(t, paginatedEvents)
gots := snapshot.StreamEventsToEvents(context.Background(), nil, paginatedEvents, nil)
test.AssertEventsEqual(t, gots, test.Reversed(events[len(events)-15:]))
})
})
}