X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/b2922040fedaf0e2e15e8bfcbfedc4c252c1cd5d..35db495717a628e0a6ef52a453b8d8ced793c41b:/services/api/db/migrate/20170906224040_materialized_permission_view.rb diff --git a/services/api/db/migrate/20170906224040_materialized_permission_view.rb b/services/api/db/migrate/20170906224040_materialized_permission_view.rb index 704f202bc3..6f4a5b971e 100644 --- a/services/api/db/migrate/20170906224040_materialized_permission_view.rb +++ b/services/api/db/migrate/20170906224040_materialized_permission_view.rb @@ -2,9 +2,9 @@ # # SPDX-License-Identifier: AGPL-3.0 -class MaterializedPermissionView < ActiveRecord::Migration +class MaterializedPermissionView < ActiveRecord::Migration[4.2] - @@idxtables = [:collections, :container_requests, :groups, :jobs, :links, :pipeline_instances, :pipeline_templates, :repositories, :users, :virtual_machines, :workflows] + @@idxtables = [:collections, :container_requests, :groups, :jobs, :links, :pipeline_instances, :pipeline_templates, :repositories, :users, :virtual_machines, :workflows, :logs] def up @@ -56,24 +56,22 @@ perm_edges (tail_uuid, head_uuid, val, follow, trashed) AS ( CASE WHEN trash_at IS NOT NULL and trash_at < clock_timestamp() THEN 1 ELSE 0 END FROM groups ), -perm (val, follow, user_uuid, target_uuid, trashed, startnode) AS ( +perm (val, follow, user_uuid, target_uuid, trashed) AS ( SELECT 3::smallint AS val, - false AS follow, + true AS follow, users.uuid::varchar(32) AS user_uuid, users.uuid::varchar(32) AS target_uuid, - 0::smallint AS trashed, - true AS startnode + 0::smallint AS trashed FROM users UNION SELECT LEAST(perm.val, edges.val)::smallint AS val, edges.follow AS follow, perm.user_uuid::varchar(32) AS user_uuid, edges.head_uuid::varchar(32) AS target_uuid, - GREATEST(perm.trashed, edges.trashed)::smallint AS trashed, - false AS startnode + GREATEST(perm.trashed, edges.trashed)::smallint AS trashed FROM perm INNER JOIN perm_edges edges - ON (perm.startnode or perm.follow) AND edges.tail_uuid = perm.target_uuid + ON perm.follow AND edges.tail_uuid = perm.target_uuid ) SELECT user_uuid, target_uuid, @@ -102,13 +100,17 @@ SELECT user_uuid, @@idxtables.each do |table| ActiveRecord::Base.connection.execute("CREATE INDEX index_#{table.to_s}_on_modified_at_uuid ON #{table.to_s} USING btree (modified_at desc, uuid asc)") end + + create_table :permission_refresh_lock + ActiveRecord::Base.connection.execute("REFRESH MATERIALIZED VIEW materialized_permission_view") end def down + drop_table :permission_refresh_lock remove_index :materialized_permission_view, name: 'permission_target_trashed' remove_index :materialized_permission_view, name: 'permission_target_user_trashed_level' @@idxtables.each do |table| - ActiveRecord::Base.connection.execute("DROP INDEX index_#{table.to_s}_on_modified_at_uuid") + ActiveRecord::Base.connection.execute("DROP INDEX IF EXISTS index_#{table.to_s}_on_modified_at_uuid") end ActiveRecord::Base.connection.execute("DROP MATERIALIZED VIEW IF EXISTS materialized_permission_view") end