diff options
author | Maksim Pechnikov <parallel588@gmail.com> | 2020-10-22 10:44:00 +0300 |
---|---|---|
committer | Alexander Strizhakov <alex.strizhakov@gmail.com> | 2021-03-20 08:36:28 +0300 |
commit | f0eb5cf5b2a849bd4971eaec633557b82c6fc27a (patch) | |
tree | 8a88599bb4b2ce076239c8a3b3d37fd445975859 /priv | |
parent | c5e0821a12cd26cafa0101be43dc4d0df8cd7e15 (diff) | |
download | pleroma-f0eb5cf5b2a849bd4971eaec633557b82c6fc27a.tar.gz |
updated user tags
Diffstat (limited to 'priv')
-rw-r--r-- | priv/repo/migrations/20201014064744_create_user_tag.exs | 62 | ||||
-rw-r--r-- | priv/repo/migrations/20201021180413_import_legacy_tags_to_users_tags.exs | 55 |
2 files changed, 56 insertions, 61 deletions
diff --git a/priv/repo/migrations/20201014064744_create_user_tag.exs b/priv/repo/migrations/20201014064744_create_user_tag.exs index d68b3a1cd..af8fa0952 100644 --- a/priv/repo/migrations/20201014064744_create_user_tag.exs +++ b/priv/repo/migrations/20201014064744_create_user_tag.exs @@ -1,7 +1,7 @@ defmodule Pleroma.Repo.Migrations.CreateUserTag do use Ecto.Migration - def up do + def change do create_if_not_exists table(:users_tags, primary_key: false) do add(:tag_id, references(:tags, on_delete: :delete_all)) add(:user_id, references(:users, type: :uuid, on_delete: :delete_all)) @@ -10,65 +10,5 @@ defmodule Pleroma.Repo.Migrations.CreateUserTag do create_if_not_exists(index(:users_tags, [:tag_id])) create_if_not_exists(index(:users_tags, [:user_id])) create_if_not_exists(unique_index(:users_tags, [:user_id, :tag_id])) - - flush() - - execute(import_user_tags()) - - alter table(:users) do - remove_if_exists(:tags, {:array, :string}) - end - - drop_if_exists(index(:users, [:tags])) - end - - def down do - alter table(:users) do - add_if_not_exists(:tags, {:array, :string}, default: [], null: false) - end - - create_if_not_exists(index(:users, [:tags], using: :gin)) - - flush() - - execute(restore_tags_column()) - - drop_if_exists(table(:users_tags)) - drop_if_exists(index(:users_tags, [:tag_id])) - drop_if_exists(index(:users_tags, [:user_id])) - - drop_if_exists( - unique_index(:users_tags, [:user_id, :tag_id], name: :user_id_tag_id_unique_index) - ) - end - - defp import_user_tags do - """ - INSERT INTO users_tags(user_id, tag_id) - SELECT user_tags.user_id, tags.id - FROM ( - SELECT DISTINCT TRIM(unnest(tags)) as "tag", id as "user_id" - FROM users ) as "user_tags" - INNER JOIN tags as tags on tags.name = user_tags."tag" - ON CONFLICT DO NOTHING - """ - end - - defp restore_tags_column do - """ - UPDATE - users - SET - tags = tags_query.tags_array, - updated_at = now() - FROM ( - SELECT user_id, array_agg(tags.name) as tags_array - FROM users_tags - INNER JOIN users ON users.id = user_id - INNER JOIN tags ON tags.id = tag_id - GROUP BY user_id - ) as tags_query - WHERE tags_query.user_id = users.id - """ end end diff --git a/priv/repo/migrations/20201021180413_import_legacy_tags_to_users_tags.exs b/priv/repo/migrations/20201021180413_import_legacy_tags_to_users_tags.exs new file mode 100644 index 000000000..0cdcc5c19 --- /dev/null +++ b/priv/repo/migrations/20201021180413_import_legacy_tags_to_users_tags.exs @@ -0,0 +1,55 @@ +defmodule Pleroma.Repo.Migrations.ImportLegacyTagsToUsersTags do + use Ecto.Migration + + def up do + execute(import_user_tags()) + + alter table(:users) do + remove_if_exists(:tags, {:array, :string}) + end + + drop_if_exists(index(:users, [:tags])) + end + + def down do + alter table(:users) do + add_if_not_exists(:tags, {:array, :string}, default: [], null: false) + end + + create_if_not_exists(index(:users, [:tags], using: :gin)) + + flush() + + execute(restore_tags_column()) + end + + defp import_user_tags do + """ + INSERT INTO users_tags(user_id, tag_id) + SELECT user_tags.user_id, tags.id + FROM ( + SELECT DISTINCT TRIM(unnest(tags)) as "tag", id as "user_id" + FROM users ) as "user_tags" + INNER JOIN tags as tags on tags.name = user_tags."tag" + ON CONFLICT DO NOTHING + """ + end + + defp restore_tags_column do + """ + UPDATE + users + SET + tags = tags_query.tags_array, + updated_at = now() + FROM ( + SELECT user_id, array_agg(tags.name) as tags_array + FROM users_tags + INNER JOIN users ON users.id = user_id + INNER JOIN tags ON tags.id = tag_id + GROUP BY user_id + ) as tags_query + WHERE tags_query.user_id = users.id + """ + end +end |