tags.ex (2741B)
- 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 =
- %{
- type: "Create",
- local_only: local_only,
- blocking_user: user,
- muting_user: user,
- user: user,
- tag: tags,
- tag_all: tag_all,
- tag_reject: tag_reject,
- }
- |> Pleroma.Web.ActivityPub.ActivityPub.fetch_public_activities()
- end
- end