From 15d4d8300f0aeb614305320918edf23901667668 Mon Sep 17 00:00:00 2001 From: Type-kun Date: Sat, 17 Sep 2016 23:59:08 +0500 Subject: [PATCH] Create array index on bit_prefs (#2644) --- ...0917180923_add_index_to_users_bit_prefs.rb | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 db/migrate/20160917180923_add_index_to_users_bit_prefs.rb diff --git a/db/migrate/20160917180923_add_index_to_users_bit_prefs.rb b/db/migrate/20160917180923_add_index_to_users_bit_prefs.rb new file mode 100644 index 000000000..5783390b8 --- /dev/null +++ b/db/migrate/20160917180923_add_index_to_users_bit_prefs.rb @@ -0,0 +1,24 @@ +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