logo

pleroma

My custom branche(s) on git.pleroma.social/pleroma/pleroma git clone https://hacktivis.me/git/pleroma.git

tags.ex (2741B)


  1. defmodule Mix.Tasks.Pleroma.Benchmarks.Tags do
  2. use Mix.Task
  3. import Pleroma.LoadTesting.Helper, only: [clean_tables: 0]
  4. import Ecto.Query
  5. alias Pleroma.Repo
  6. def run(_args) do
  7. Mix.Pleroma.start_pleroma()
  8. activities_count = Repo.aggregate(from(a in Pleroma.Activity), :count, :id)
  9. if activities_count == 0 do
  10. IO.puts("Did not find any activities, cleaning and generating")
  11. clean_tables()
  12. Pleroma.LoadTesting.Users.generate_users(10)
  13. Pleroma.LoadTesting.Activities.generate_tagged_activities()
  14. else
  15. IO.puts("Found #{activities_count} activities, won't generate new ones")
  16. end
  17. tags = Enum.map(0..20, fn i -> {"For #tag_#{i}", "tag_#{i}"} end)
  18. Enum.each(tags, fn {_, tag} ->
  19. query =
  20. from(o in Pleroma.Object,
  21. where: fragment("(?)->'tag' \\? (?)", o.data, ^tag)
  22. )
  23. count = Repo.aggregate(query, :count, :id)
  24. IO.puts("Database contains #{count} posts tagged with #{tag}")
  25. end)
  26. user = Repo.all(Pleroma.User) |> List.first()
  27. Benchee.run(
  28. %{
  29. "Hashtag fetching, any" => fn tags ->
  30. hashtag_fetching(
  31. %{
  32. "any" => tags
  33. },
  34. user,
  35. false
  36. )
  37. end,
  38. # Will always return zero results because no overlapping hashtags are generated.
  39. "Hashtag fetching, all" => fn tags ->
  40. hashtag_fetching(
  41. %{
  42. "all" => tags
  43. },
  44. user,
  45. false
  46. )
  47. end
  48. },
  49. inputs:
  50. tags
  51. |> Enum.map(fn {_, v} -> v end)
  52. |> Enum.chunk_every(2)
  53. |> Enum.map(fn tags -> {"For #{inspect(tags)}", tags} end),
  54. time: 5
  55. )
  56. Benchee.run(
  57. %{
  58. "Hashtag fetching" => fn tag ->
  59. hashtag_fetching(
  60. %{
  61. "tag" => tag
  62. },
  63. user,
  64. false
  65. )
  66. end
  67. },
  68. inputs: tags,
  69. time: 5
  70. )
  71. end
  72. defp hashtag_fetching(params, user, local_only) do
  73. tags =
  74. [params["tag"], params["any"]]
  75. |> List.flatten()
  76. |> Enum.uniq()
  77. |> Enum.filter(& &1)
  78. |> Enum.map(&String.downcase(&1))
  79. tag_all =
  80. params
  81. |> Map.get("all", [])
  82. |> Enum.map(&String.downcase(&1))
  83. tag_reject =
  84. params
  85. |> Map.get("none", [])
  86. |> Enum.map(&String.downcase(&1))
  87. _activities =
  88. %{
  89. type: "Create",
  90. local_only: local_only,
  91. blocking_user: user,
  92. muting_user: user,
  93. user: user,
  94. tag: tags,
  95. tag_all: tag_all,
  96. tag_reject: tag_reject,
  97. }
  98. |> Pleroma.Web.ActivityPub.ActivityPub.fetch_public_activities()
  99. end
  100. end