Current section

Files

Jump to
ex_esdb lib repl event_generator.ex
Raw

lib/repl/event_generator.ex

defmodule ExESDB.Repl.EventGenerator do
@moduledoc false
require UUIDv7
require UUID
@initialized_v1 "initialized:v1"
@greenhouse1 "greenhouse1"
@greenhouse2 "greenhouse2"
@greenhouse3 "greenhouse3"
@greenhouse4 "greenhouse4"
@temperature_measured_v1 "temperature_measured:v1"
@humidity_measured_v1 "humidity_measured:v1"
@light_measured_v1 "light_measured:v1"
@fan_activated_v1 "fan_activated:v1"
@fan_deactivated_v1 "fan_deactivated:v1"
@light_activated_v1 "light_activated:v1"
@light_deactivated_v1 "light_deactivated:v1"
@heater_activated_v1 "heater_activated:v1"
@heater_deactivated_v1 "heater_deactivated:v1"
@sprinkler_activated_v1 "sprinkler_activated:v1"
@sprinkler_deactivated_v1 "sprinkler_deactivated:v1"
@desired_temperature_set_v1 "desired_temperature_set:v1"
@desired_humidity_set_v1 "desired_humidity_set:v1"
@desired_light_set_v1 "desired_light_set:v1"
def streams,
do: [
@greenhouse1,
@greenhouse2,
@greenhouse3,
@greenhouse4
]
def event_types,
do: [
@temperature_measured_v1,
@humidity_measured_v1,
@light_measured_v1,
@desired_temperature_set_v1,
@desired_humidity_set_v1,
@desired_light_set_v1,
@light_activated_v1,
@light_deactivated_v1,
@fan_activated_v1,
@fan_deactivated_v1,
@heater_activated_v1,
@heater_deactivated_v1,
@sprinkler_activated_v1,
@sprinkler_deactivated_v1
]
@operators [
"John",
"Paul",
"George",
"Ringo",
"Jim",
"Laura",
"Peter"
]
# Example content type values
@content_types [1, 2, 3]
def temperature_measured_v1, do: "temperature_measured:v1"
def humidity_measured_v1, do: "humidity_measured:v1"
def light_measured_v1, do: "light_measured:v1"
def desired_temperature_set_v1, do: "desired_temperature_set:v1"
def desired_humidity_set_v1, do: "desired_humidity_set:v1"
def desired_light_set_v1, do: "desired_light_set:v1"
def light_activated_v1, do: "light_activated:v1"
def light_deactivated_v1, do: "light_deactivated:v1"
def fan_activated_v1, do: "fan_activated:v1"
def fan_deactivated_v1, do: "fan_deactivated:v1"
def heater_activated_v1, do: "heater_activated:v1"
def heater_deactivated_v1, do: "heater_deactivated:v1"
def sprinkler_activated_v1, do: "sprinkler_activated:v1"
def sprinkler_deactivated_v1, do: "sprinkler_deactivated:v1"
defp random_operator, do: Enum.random(@operators)
defp random_temperature, do: 5 + :rand.uniform(30)
defp random_humidity, do: :rand.uniform(100)
defp random_light, do: :rand.uniform(100)
defp random_intensity, do: :rand.uniform(100)
defp initialized,
do: %ExESDB.NewEvent{
event_id: generate_uuid(),
event_type: @initialized_v1,
data_content_type: 1,
metadata_content_type: 1,
data: %{
temperature: random_temperature(),
humidity: random_humidity(),
light: random_light()
}
}
def generate_events(start_from, count) when is_integer(count) and count > 0 do
case start_from do
0 ->
[initialized() | generate_events(count - 1)]
_ ->
generate_events(count)
end
end
def generate_events(0), do: []
def generate_events(count)
when is_integer(count) and count > 0,
do:
1..count
|> Enum.map(&generate_event/1)
defp generate_event(_) do
event_id = generate_uuid()
event_type = Enum.random(event_types())
%ExESDB.NewEvent{
event_id: event_id,
event_type: event_type,
data_content_type: Enum.random(@content_types),
metadata_content_type: Enum.random(@content_types),
data: random_payload(event_type),
metadata: generate_optional_metadata()
}
end
defp generate_uuid, do: UUIDv7.generate()
defp random_payload(@temperature_measured_v1),
do: %{
temperature: random_temperature()
}
defp random_payload(@humidity_measured_v1),
do: %{
humidity: random_humidity()
}
defp random_payload(@light_measured_v1),
do: %{
light: random_light()
}
defp random_payload(@desired_temperature_set_v1),
do: %{
temperature: random_temperature(),
operator: random_operator()
}
defp random_payload(@desired_humidity_set_v1),
do: %{
humidity: random_humidity(),
operator: random_operator()
}
defp random_payload(@desired_light_set_v1),
do: %{
light: random_light(),
operator: random_operator()
}
defp random_payload(_),
do: %{
intensity: random_intensity()
}
defp generate_optional_metadata do
# 70% chance of metadata
%{
causation_id: generate_uuid(),
correlation_id: generate_uuid()
}
end
end