Optimize /sync a bit

This commit is contained in:
Till Faelligen 2023-01-02 09:55:39 +01:00
parent e449d174cc
commit c915689d20
No known key found for this signature in database
GPG key ID: ACCDC9606D472758
2 changed files with 9 additions and 3 deletions

View file

@ -137,7 +137,7 @@ const updateEventJSONSQL = "" +
const selectStateInRangeFilteredSQL = "" + const selectStateInRangeFilteredSQL = "" +
"SELECT event_id, id, headered_event_json, exclude_from_sync, add_state_ids, remove_state_ids, history_visibility" + "SELECT event_id, id, headered_event_json, exclude_from_sync, add_state_ids, remove_state_ids, history_visibility" +
" FROM syncapi_output_room_events" + " FROM syncapi_output_room_events" +
" WHERE (id > $1 AND id <= $2) AND (add_state_ids IS NOT NULL OR remove_state_ids IS NOT NULL)" + " WHERE (id > $1 AND id <= $2) AND (cardinality(add_state_ids) > 0 OR cardinality(remove_state_ids) > 0)" +
" AND room_id = ANY($3)" + " AND room_id = ANY($3)" +
" AND ( $4::text[] IS NULL OR sender = ANY($4) )" + " AND ( $4::text[] IS NULL OR sender = ANY($4) )" +
" AND ( $5::text[] IS NULL OR NOT(sender = ANY($5)) )" + " AND ( $5::text[] IS NULL OR NOT(sender = ANY($5)) )" +
@ -150,7 +150,7 @@ const selectStateInRangeFilteredSQL = "" +
const selectStateInRangeSQL = "" + const selectStateInRangeSQL = "" +
"SELECT event_id, id, headered_event_json, exclude_from_sync, add_state_ids, remove_state_ids, history_visibility" + "SELECT event_id, id, headered_event_json, exclude_from_sync, add_state_ids, remove_state_ids, history_visibility" +
" FROM syncapi_output_room_events" + " FROM syncapi_output_room_events" +
" WHERE (id > $1 AND id <= $2) AND (add_state_ids IS NOT NULL OR remove_state_ids IS NOT NULL)" + " WHERE (id > $1 AND id <= $2) AND (cardinality(add_state_ids) > 0 OR cardinality(remove_state_ids) > 0)" +
" AND room_id = ANY($3)" + " AND room_id = ANY($3)" +
" ORDER BY id ASC" " ORDER BY id ASC"

View file

@ -329,7 +329,13 @@ func (d *DatabaseTransaction) GetStateDeltas(
} }
// get all the state events ever (i.e. for all available rooms) between these two positions // get all the state events ever (i.e. for all available rooms) between these two positions
stateNeededFiltered, eventMapFiltered, err := d.OutputEvents.SelectStateInRange(ctx, d.txn, r, stateFilter, allRoomIDs) stateNeededFiltered := stateNeeded
eventMapFiltered := eventMap
// avoid hitting the database if the result would be the same as above
if stateFilter != nil {
stateNeededFiltered, eventMapFiltered, err = d.OutputEvents.SelectStateInRange(ctx, d.txn, r, stateFilter, allRoomIDs)
}
if err != nil { if err != nil {
if err == sql.ErrNoRows { if err == sql.ErrNoRows {
return nil, nil, nil return nil, nil, nil