| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 |
- defmodule Hello.PageController do
- alias Hello.{Fortune, World}
- use Hello.Web, :controller
- @json "application/json"
- @plain "text/plain"
- @random_max 10_000
- def index(conn, _params) do
- conn
- |> put_resp_content_type(@json, nil)
- |> send_resp(200, Jason.encode_to_iodata!(%{"TE Benchmarks\n" => "Started"}))
- end
- # avoid namespace collision
- def _json(conn, _params) do
- conn
- |> put_resp_content_type(@json, nil)
- |> send_resp(200, Jason.encode_to_iodata!(%{"message" => "Hello, world!"}))
- end
- def db(conn, _params) do
- conn
- |> put_resp_content_type(@json, nil)
- |> send_resp(200, Jason.encode_to_iodata!(Repo.get(World, :rand.uniform(@random_max))))
- end
- def queries(conn, params) do
- json =
- params["queries"]
- |> query_range()
- |> parallel(fn _ -> Repo.get(World, :rand.uniform(@random_max)) end)
- |> Jason.encode_to_iodata!()
- conn
- |> put_resp_content_type(@json, nil)
- |> send_resp(200, json)
- end
- def fortunes(conn, _params) do
- additional_fortune = %Fortune{
- id: 0,
- message: "Additional fortune added at request time."
- }
- fortunes = [additional_fortune | Repo.all(Fortune)]
- render(conn, "fortunes.html",
- fortunes: Enum.sort(fortunes, fn f1, f2 -> f1.message < f2.message end)
- )
- end
- def updates(conn, params) do
- json =
- params["queries"]
- |> query_range()
- |> parallel(fn _ ->
- Repo.checkout(fn ->
- world =
- World
- |> Repo.get(:rand.uniform(@random_max))
- world
- |> Ecto.Changeset.change(randomnumber: random_but(world.randomnumber))
- |> Repo.update!()
- end)
- end)
- |> Jason.encode_to_iodata!()
- conn
- |> put_resp_content_type(@json, nil)
- |> send_resp(200, json)
- end
- def plaintext(conn, _params) do
- conn
- |> put_resp_content_type(@plain, nil)
- |> send_resp(200, "Hello, world!")
- end
- defp random_but(not_this_value) do
- case :rand.uniform(@random_max) do
- new_value when new_value == not_this_value ->
- random_but(not_this_value)
- new_value ->
- new_value
- end
- end
- defp parallel(collection, func) do
- collection
- |> Enum.map(&Task.async(fn -> func.(&1) end))
- |> Enum.map(&Task.await(&1))
- end
- defp query_range(queries) do
- try do
- case String.to_integer(queries) do
- x when x < 1 -> 1..1
- x when x > 500 -> 1..500
- x -> 1..x
- end
- rescue
- ArgumentError -> 1..1
- end
- end
- end
|