summaryrefslogtreecommitdiff
path: root/priv/repo/migrations/20190109152453_add_visibility_function.exs
diff options
context:
space:
mode:
authorkaniini <nenolod@gmail.com>2019-01-10 02:31:29 +0000
committerkaniini <nenolod@gmail.com>2019-01-10 02:31:29 +0000
commitd203b0b4d3fdae60c5b61df7d239004735206e1c (patch)
tree0dc44f57a213f776600d1230a8e24fcf290f49ae /priv/repo/migrations/20190109152453_add_visibility_function.exs
parentbe92edcb29494d12896983a1dcb39ea8359d2c68 (diff)
parent04735db193978f05d2731878896fa70172f2fb11 (diff)
downloadpleroma-d203b0b4d3fdae60c5b61df7d239004735206e1c.tar.gz
pleroma-d203b0b4d3fdae60c5b61df7d239004735206e1c.zip
Merge branch 'dm-optimizations' into 'develop'
Add activity visibility index. See merge request pleroma/pleroma!646
Diffstat (limited to 'priv/repo/migrations/20190109152453_add_visibility_function.exs')
-rw-r--r--priv/repo/migrations/20190109152453_add_visibility_function.exs48
1 files changed, 48 insertions, 0 deletions
diff --git a/priv/repo/migrations/20190109152453_add_visibility_function.exs b/priv/repo/migrations/20190109152453_add_visibility_function.exs
new file mode 100644
index 000000000..3aadabcd7
--- /dev/null
+++ b/priv/repo/migrations/20190109152453_add_visibility_function.exs
@@ -0,0 +1,48 @@
+defmodule Pleroma.Repo.Migrations.AddVisibilityFunction do
+ use Ecto.Migration
+ @disable_ddl_transaction true
+
+ def up do
+ definition = """
+ create or replace function activity_visibility(actor varchar, recipients varchar[], data jsonb) returns varchar as $$
+ DECLARE
+ fa varchar;
+ public varchar := 'https://www.w3.org/ns/activitystreams#Public';
+ BEGIN
+ SELECT COALESCE(users.follower_address, '') into fa from users where users.ap_id = actor;
+
+ IF data->'to' ? public THEN
+ RETURN 'public';
+ ELSIF data->'cc' ? public THEN
+ RETURN 'unlisted';
+ ELSIF ARRAY[fa] && recipients THEN
+ RETURN 'private';
+ ELSIF not(ARRAY[fa, public] && recipients) THEN
+ RETURN 'direct';
+ ELSE
+ RETURN 'unknown';
+ END IF;
+ END;
+ $$ LANGUAGE plpgsql IMMUTABLE;
+ """
+
+ execute(definition)
+
+ create(
+ index(:activities, ["activity_visibility(actor, recipients, data)"],
+ name: :activities_visibility_index,
+ concurrently: true
+ )
+ )
+ end
+
+ def down do
+ drop(
+ index(:activities, ["activity_visibility(actor, recipients, data)"],
+ name: :activities_visibility_index
+ )
+ )
+
+ execute("drop function activity_visibility(actor varchar, recipients varchar[], data jsonb)")
+ end
+end