mirror of
https://github.com/zulip/zulip.git
synced 2025-11-04 14:03:30 +00:00
Speed up user filtering during stream creation.
The old implementation was O(N squared) for N = number of users due to its using an O(N) selector inside of a loop. Now we simply iterate through all the checkboxes and turn them on or off based on a bunch of O(1) operations.
This commit is contained in:
@@ -899,7 +899,6 @@ $(function () {
|
|||||||
|
|
||||||
// Search People or Streams
|
// Search People or Streams
|
||||||
$(document).on('input', '.add-user-list-filter', function (e) {
|
$(document).on('input', '.add-user-list-filter', function (e) {
|
||||||
var users = people.get_rest_of_realm();
|
|
||||||
var streams = stream_data.get_streams_for_settings_page();
|
var streams = stream_data.get_streams_for_settings_page();
|
||||||
|
|
||||||
var user_list = $(".add-user-list-filter");
|
var user_list = $(".add-user-list-filter");
|
||||||
@@ -908,7 +907,6 @@ $(function () {
|
|||||||
}
|
}
|
||||||
var search_term = user_list.expectOne().val().trim();
|
var search_term = user_list.expectOne().val().trim();
|
||||||
var search_terms = search_term.toLowerCase().split(",");
|
var search_terms = search_term.toLowerCase().split(",");
|
||||||
var filtered_users = people.filter_people_by_search_terms(users, search_terms);
|
|
||||||
|
|
||||||
_.each(streams, function (stream) {
|
_.each(streams, function (stream) {
|
||||||
var flag = true;
|
var flag = true;
|
||||||
@@ -927,10 +925,24 @@ $(function () {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// Hide users which aren't in filtered users
|
var users = people.get_rest_of_realm();
|
||||||
_.each(users, function (user) {
|
var filtered_users = people.filter_people_by_search_terms(users, search_terms);
|
||||||
var display_type = filtered_users.hasOwnProperty(user.email)? "block" : "none";
|
var user_labels = $("#user-checkboxes label.add-user-label");
|
||||||
$("label.add-user-label[data-user-id='" + user.user_id + "']").css({display: display_type});
|
|
||||||
|
// Be careful about modifying the follow code. A naive implementation
|
||||||
|
// will work very poorly with a large user population (~1000 users).
|
||||||
|
//
|
||||||
|
// I tested using: `./manage.py populate_db --extra-users 3500`
|
||||||
|
//
|
||||||
|
// This would break the previous implementation, whereas the new
|
||||||
|
// implementation is merely sluggish.
|
||||||
|
user_labels.each(function () {
|
||||||
|
var elem = $(this);
|
||||||
|
var user_id = elem.attr('data-user-id');
|
||||||
|
var user = people.get_person_from_user_id(user_id);
|
||||||
|
var user_checked = filtered_users.hasOwnProperty(user.email);
|
||||||
|
var display = user_checked ? "block" : "none";
|
||||||
|
elem.css({display: display});
|
||||||
});
|
});
|
||||||
|
|
||||||
update_announce_stream_state();
|
update_announce_stream_state();
|
||||||
|
|||||||
Reference in New Issue
Block a user