Powered by AppSignal & Oban Pro
Would you like to see your link here? Contact us

Elixir lab 1

lab5/lab5.livemd

Elixir lab 1

Parsing

defmodule Parser do
  def parseLine(raw_line) do
    [date, time, location1, location2, pollution_level] = String.split(raw_line, ",")

    %{
      :datetime => {date |> parseDate, time |> parseTime},
      :location => {location1 |> String.to_float(), location2 |> String.to_float()},
      :pollutionLevel => pollution_level |> String.to_integer()
    }
  end

  def identifyStations(data) do
    data
    |> Enum.map(fn record -> record.location end)
    |> Enum.uniq_by(fn x -> x end)
  end

  defp parseDate(date) do
    [day, month, year] = date |> String.split("-")

    [year, month, day]
    |> Enum.map(fn x -> x |> String.to_integer() end)
    |> List.to_tuple()
  end

  defp parseTime(time) do
    [hour, minutes] = time |> String.split(":")

    [hour, minutes, "00"]
    |> Enum.map(fn x -> x |> String.to_integer() end)
    |> List.to_tuple()
  end
end
raw_lines =
  "C:\\Users\\pawel\\Downloads\\pollution.csv"
  |> File.read!()
  |> String.split("\r\n")

data =
  for line <- raw_lines do
    line |> Parser.parseLine()
  end

stations = Parser.identifyStations(data)

"Number of stations: #{stations |> length |> Integer.to_string()}"

Using Erlang Pollution module

Empty Monitor

Code.append_path(
  "C:\\Users\\pawel\\rebar3\\pollution_server\\" <>
    "_build\\default\\lib\\pollution_server\\ebin"
)

Application.stop(:pollution_server)
Application.start(:pollution_server)

:pollution_gen_server.get()
insert_stations = fn ->
  for station_location <- stations do
    :pollution_gen_server.add_station(station_location, station_location)
  end
end

insert_data = fn ->
  for record <- data do
    :pollution_gen_server.add_value(
      record.location,
      record.datetime,
      "PM10",
      record.pollutionLevel
    )
  end
end
defmodule Timer do
  def get_time_in_sec_and_result(function) do
    {time_micro_s, result} = function |> :timer.tc()
    {time_micro_s * 10 ** -6, result}
  end

  def measure_time_in_sec(function) do
    function |> get_time_in_sec_and_result |> elem(0)
  end
end
insert_stations |> Timer.measure_time_in_sec()
insert_data |> Timer.measure_time_in_sec()
:pollution_gen_server.get()
fn ->
  :pollution_gen_server.get_station_mean({20.06, 49.986}, "PM10")
end
|> Timer.get_time_in_sec_and_result()
fn ->
  :pollution_gen_server.get_daily_mean({2017, 5, 3}, "PM10")
end
|> Timer.get_time_in_sec_and_result()