aboutsummaryrefslogtreecommitdiff
path: root/priv
diff options
context:
space:
mode:
authorMaksim Pechnikov <parallel588@gmail.com>2020-10-16 22:33:47 +0300
committerAlexander Strizhakov <alex.strizhakov@gmail.com>2021-03-20 08:36:28 +0300
commitc5e0821a12cd26cafa0101be43dc4d0df8cd7e15 (patch)
treed788362d4152c3420ebbc3a6e0c3b82a01696040 /priv
parent34d8ce945f88085c9c199b830eccac3fe3727f56 (diff)
downloadpleroma-c5e0821a12cd26cafa0101be43dc4d0df8cd7e15.tar.gz
added `users_tags` table
Diffstat (limited to 'priv')
-rw-r--r--priv/repo/migrations/20201012093959_create_tags.exs3
-rw-r--r--priv/repo/migrations/20201014064744_create_user_tag.exs74
2 files changed, 76 insertions, 1 deletions
diff --git a/priv/repo/migrations/20201012093959_create_tags.exs b/priv/repo/migrations/20201012093959_create_tags.exs
index 54bf8a2ce..66e26f9a2 100644
--- a/priv/repo/migrations/20201012093959_create_tags.exs
+++ b/priv/repo/migrations/20201012093959_create_tags.exs
@@ -15,12 +15,13 @@ defmodule Pleroma.Repo.Migrations.CreateTags do
def down do
drop_if_exists(table(:tags))
+ drop_if_exists(unique_index(:tags, :name))
end
defp collect_user_tags_query do
"""
INSERT INTO tags(name, inserted_at, updated_at)
- SELECT DISTINCT unnest(tags), now(), now() from users
+ SELECT DISTINCT TRIM(unnest(tags)), now(), now() from users
ON CONFLICT DO NOTHING
"""
end
diff --git a/priv/repo/migrations/20201014064744_create_user_tag.exs b/priv/repo/migrations/20201014064744_create_user_tag.exs
new file mode 100644
index 000000000..d68b3a1cd
--- /dev/null
+++ b/priv/repo/migrations/20201014064744_create_user_tag.exs
@@ -0,0 +1,74 @@
+defmodule Pleroma.Repo.Migrations.CreateUserTag do
+ use Ecto.Migration
+
+ def up 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))
+ end
+
+ 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