diff --git a/app/models/user.rb b/app/models/user.rb index d57db6b9d..d86a1f6aa 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -759,28 +759,33 @@ class User < ActiveRecord::Base q = q.where("id in (?)", params[:id].split(",").map(&:to_i)) end + bitprefs_length = BOOLEAN_ATTRIBUTES.length bitprefs_include = nil bitprefs_exclude = nil - [:can_approve_posts, :can_upload_free, :is_super_voter, :is_banned].each do |x| + [:can_approve_posts, :can_upload_free, :is_super_voter].each do |x| if params[x].present? attr_idx = BOOLEAN_ATTRIBUTES.index(x.to_s) if params[x] == "true" - bitprefs_include ||= [] - bitprefs_include << attr_idx + bitprefs_include ||= "0"*bitprefs_length + bitprefs_include[attr_idx] = '1' elsif params[x] == "false" - bitprefs_exclude ||= 0 - bitprefs_exclude |= (1 << attr_idx) + bitprefs_exclude ||= "0"*bitprefs_length + bitprefs_exclude[attr_idx] = '1' end end end - + if bitprefs_include - q = q.where("bit_position_array(bit_prefs) @> ARRAY[?]::integer[]", bitprefs_include) + bitprefs_include.reverse! + q = q.where("bit_prefs::bit(:len) & :bits::bit(:len) = :bits::bit(:len)", + {:len => bitprefs_length, :bits => bitprefs_include}) end - + if bitprefs_exclude - q = q.where("bit_prefs & ? = 0", bitprefs_exclude) + bitprefs_exclude.reverse! + q = q.where("bit_prefs::bit(:len) & :bits::bit(:len) = 0::bit(:len)", + {:len => bitprefs_length, :bits => bitprefs_exclude}) end if params[:current_user_first] == "true" && !CurrentUser.is_anonymous? diff --git a/app/views/users/search.html.erb b/app/views/users/search.html.erb index 62c66c2bb..d4cb0264c 100644 --- a/app/views/users/search.html.erb +++ b/app/views/users/search.html.erb @@ -18,26 +18,6 @@ <%= select("search", "max_level", [""] + User.level_hash.to_a) %> -
- - <%= select("search", "can_approve_posts", [[""], ["Yes", "true"], ["No", "false"]]) %> -
- -
- - <%= select("search", "can_upload_free", [[""], ["Yes", "true"], ["No", "false"]]) %> -
- -
- - <%= select("search", "is_super_voter", [[""], ["Yes", "true"], ["No", "false"]]) %> -
- -
- - <%= select("search", "is_banned", [[""], ["Yes", "true"], ["No", "false"]]) %> -
-
<%= select("search", "order", [["Join date", "date"], ["Name", "name"], ["Upload count", "post_upload_count"], ["Note count", "note_count"], ["Post update count", "post_update_count"]]) %> diff --git a/db/migrate/20160917180923_add_index_to_users_bit_prefs.rb b/db/migrate/20160917180923_add_index_to_users_bit_prefs.rb deleted file mode 100644 index 5783390b8..000000000 --- a/db/migrate/20160917180923_add_index_to_users_bit_prefs.rb +++ /dev/null @@ -1,24 +0,0 @@ -class AddIndexToUsersBitPrefs < ActiveRecord::Migration - def up - execute "set statement_timeout = 0" - execute <<-'SQL' - CREATE OR REPLACE FUNCTION bit_position_array(x bigint) - RETURNS integer[] AS $BODY$ - select array_agg(i) - from generate_series(0, floor(log(2, x))::integer) i - where (x & (1::bigint << i)) > 0; - $BODY$ LANGUAGE sql IMMUTABLE - SQL - - execute <<-'SQL' - CREATE INDEX index_users_on_bit_prefs_array - ON users USING gin (bit_position_array(bit_prefs) _int4_ops) - SQL - end - - def down - execute "set statement_timeout = 0" - execute "DROP INDEX index_users_on_bit_prefs_array" - execute "DROP FUNCTION bit_position_array(x bigint)" - end -end