page_controller.ex 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. defmodule Hello.PageController do
  2. alias Hello.{Fortune, World}
  3. use Hello.Web, :controller
  4. @json "application/json"
  5. @plain "text/plain"
  6. @random_max 10_000
  7. def index(conn, _params) do
  8. conn
  9. |> put_resp_content_type(@json, nil)
  10. |> send_resp(200, Jason.encode_to_iodata!(%{"TE Benchmarks\n" => "Started"}))
  11. end
  12. # avoid namespace collision
  13. def _json(conn, _params) do
  14. conn
  15. |> put_resp_content_type(@json, nil)
  16. |> send_resp(200, Jason.encode_to_iodata!(%{"message" => "Hello, world!"}))
  17. end
  18. def db(conn, _params) do
  19. conn
  20. |> put_resp_content_type(@json, nil)
  21. |> send_resp(200, Jason.encode_to_iodata!(Repo.get(World, :rand.uniform(@random_max))))
  22. end
  23. def queries(conn, params) do
  24. json =
  25. params["queries"]
  26. |> query_range()
  27. |> parallel(fn _ -> Repo.get(World, :rand.uniform(@random_max)) end)
  28. |> Jason.encode_to_iodata!()
  29. conn
  30. |> put_resp_content_type(@json, nil)
  31. |> send_resp(200, json)
  32. end
  33. def fortunes(conn, _params) do
  34. additional_fortune = %Fortune{
  35. id: 0,
  36. message: "Additional fortune added at request time."
  37. }
  38. fortunes = [additional_fortune | Repo.all(Fortune)]
  39. render(conn, "fortunes.html",
  40. fortunes: Enum.sort(fortunes, fn f1, f2 -> f1.message < f2.message end)
  41. )
  42. end
  43. def updates(conn, params) do
  44. json =
  45. params["queries"]
  46. |> query_range()
  47. |> parallel(fn _ ->
  48. Repo.checkout(fn ->
  49. world =
  50. World
  51. |> Repo.get(:rand.uniform(@random_max))
  52. world
  53. |> Ecto.Changeset.change(randomnumber: random_but(world.randomnumber))
  54. |> Repo.update!()
  55. end)
  56. end)
  57. |> Jason.encode_to_iodata!()
  58. conn
  59. |> put_resp_content_type(@json, nil)
  60. |> send_resp(200, json)
  61. end
  62. def plaintext(conn, _params) do
  63. conn
  64. |> put_resp_content_type(@plain, nil)
  65. |> send_resp(200, "Hello, world!")
  66. end
  67. defp random_but(not_this_value) do
  68. case :rand.uniform(@random_max) do
  69. new_value when new_value == not_this_value ->
  70. random_but(not_this_value)
  71. new_value ->
  72. new_value
  73. end
  74. end
  75. defp parallel(collection, func) do
  76. collection
  77. |> Enum.map(&Task.async(fn -> func.(&1) end))
  78. |> Enum.map(&Task.await(&1))
  79. end
  80. defp query_range(queries) do
  81. try do
  82. case String.to_integer(queries) do
  83. x when x < 1 -> 1..1
  84. x when x > 500 -> 1..500
  85. x -> 1..x
  86. end
  87. rescue
  88. ArgumentError -> 1..1
  89. end
  90. end
  91. end