summaryrefslogtreecommitdiff
path: root/benchmarks/mix/tasks/pleroma/benchmarks/tags.ex
blob: c051335a5ab644ee738673a347877223d668a128 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
defmodule Mix.Tasks.Pleroma.Benchmarks.Tags do
  use Mix.Task

  import Pleroma.LoadTesting.Helper, only: [clean_tables: 0]
  import Ecto.Query

  alias Pleroma.Repo

  def run(_args) do
    Mix.Pleroma.start_pleroma()
    activities_count = Repo.aggregate(from(a in Pleroma.Activity), :count, :id)

    if activities_count == 0 do
      IO.puts("Did not find any activities, cleaning and generating")
      clean_tables()
      Pleroma.LoadTesting.Users.generate_users(10)
      Pleroma.LoadTesting.Activities.generate_tagged_activities()
    else
      IO.puts("Found #{activities_count} activities, won't generate new ones")
    end

    tags = Enum.map(0..20, fn i -> {"For #tag_#{i}", "tag_#{i}"} end)

    Enum.each(tags, fn {_, tag} ->
      query =
        from(o in Pleroma.Object,
          where: fragment("(?)->'tag' \\? (?)", o.data, ^tag)
        )

      count = Repo.aggregate(query, :count, :id)
      IO.puts("Database contains #{count} posts tagged with #{tag}")
    end)

    user = Repo.all(Pleroma.User) |> List.first()

    Benchee.run(
      %{
        "Hashtag fetching, any" => fn tags ->
          hashtag_fetching(
            %{
              "any" => tags
            },
            user,
            false
          )
        end,
        # Will always return zero results because no overlapping hashtags are generated.
        "Hashtag fetching, all" => fn tags ->
          hashtag_fetching(
            %{
              "all" => tags
            },
            user,
            false
          )
        end
      },
      inputs:
        tags
        |> Enum.map(fn {_, v} -> v end)
        |> Enum.chunk_every(2)
        |> Enum.map(fn tags -> {"For #{inspect(tags)}", tags} end),
      time: 5
    )

    Benchee.run(
      %{
        "Hashtag fetching" => fn tag ->
          hashtag_fetching(
            %{
              "tag" => tag
            },
            user,
            false
          )
        end
      },
      inputs: tags,
      time: 5
    )
  end

  defp hashtag_fetching(params, user, local_only) do
    tags =
      [params["tag"], params["any"]]
      |> List.flatten()
      |> Enum.uniq()
      |> Enum.filter(& &1)
      |> Enum.map(&String.downcase(&1))

    tag_all =
      params
      |> Map.get("all", [])
      |> Enum.map(&String.downcase(&1))

    tag_reject =
      params
      |> Map.get("none", [])
      |> Enum.map(&String.downcase(&1))

    _activities =
      params
      |> Map.put(:type, "Create")
      |> Map.put(:local_only, local_only)
      |> Map.put(:blocking_user, user)
      |> Map.put(:muting_user, user)
      |> Map.put(:user, user)
      |> Map.put(:tag, tags)
      |> Map.put(:tag_all, tag_all)
      |> Map.put(:tag_reject, tag_reject)
      |> Pleroma.Web.ActivityPub.ActivityPub.fetch_public_activities()
  end
end