Skip to content

Commit 978fb0a

Browse files
tallysmartinsPragTob
authored andcommitted
Change mode attribute to array in Measurements (#33)
* Change mode attribute to array in Measurements - closes #32 Signed-off-by: Tallys Martins <tallysmartins@gmail.com> * Adds tests to Measurements module Signed-off-by: Tallys Martins <tallysmartins@gmail.com> * Apply review changes Signed-off-by: Tallys Martins <tallysmartins@gmail.com>
1 parent 8b2b583 commit 978fb0a

5 files changed

Lines changed: 102 additions & 9 deletions

File tree

lib/elixir_bench/benchmarks/measurement.ex

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ defmodule ElixirBench.Benchmarks.Measurement do
88
belongs_to(:job, Job)
99

1010
field :sample_size, :integer
11-
field :mode, :float
11+
field :mode, {:array, :float}
1212
field :minimum, :float
1313
field :median, :float
1414
field :maximum, :float
@@ -27,7 +27,6 @@ defmodule ElixirBench.Benchmarks.Measurement do
2727

2828
@fields [
2929
:sample_size,
30-
:mode,
3130
:minimum,
3231
:median,
3332
:maximum,
@@ -40,10 +39,29 @@ defmodule ElixirBench.Benchmarks.Measurement do
4039
:percentiles
4140
]
4241

42+
@required_fields @fields -- [:mode]
43+
4344
@doc false
4445
def changeset(%Measurement{} = measurement, attrs) do
4546
measurement
4647
|> cast(attrs, @fields)
47-
|> validate_required(@fields)
48+
|> validate_required(@required_fields)
49+
|> set_mode(attrs)
50+
end
51+
52+
# Benchee can return a uniq value for mode so we need to make it an array
53+
defp set_mode(changeset, attrs) do
54+
mode = get_in(attrs, ["mode"])
55+
56+
mode =
57+
cond do
58+
is_integer(mode) or is_float(mode) ->
59+
[mode]
60+
61+
true ->
62+
mode
63+
end
64+
65+
cast(changeset, %{mode: mode}, [:mode])
4866
end
4967
end

lib/elixir_bench_web/schema/content_types.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ defmodule ElixirBenchWeb.Schema.ContentTypes do
9999
field :sample_size, :integer
100100
field :percentiles, list_of(:percentile), resolve: map_to_list(:percentiles, :name, :value)
101101

102-
field :mode, :float
102+
field :mode, list_of(:float)
103103
field :minimum, :float
104104
field :median, :float
105105
field :maximum, :float
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
defmodule ElixirBench.Repo.Migrations.ChangeModeToArray do
2+
use Ecto.Migration
3+
4+
def change do
5+
alter table(:measurements) do
6+
remove :mode
7+
add :mode, {:array, :float}
8+
end
9+
end
10+
end
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
defmodule MeasurementTest do
2+
alias ElixirBench.Benchmarks.Measurement
3+
use ElixirBench.DataCase
4+
5+
@attrs %{
6+
"average" => 465.8669101807624,
7+
"ips" => 2146.5357984150173,
8+
"maximum" => 13092.0,
9+
"median" => 452.0,
10+
"minimum" => 338.0,
11+
"percentiles" => %{"50" => 452.0, "99" => 638.0},
12+
"run_times" => [],
13+
"sample_size" => 10677,
14+
"std_dev" => 199.60367678670747,
15+
"std_dev_ips" => 919.6970816229071,
16+
"std_dev_ratio" => 0.4284564377179282,
17+
"mode" => nil
18+
}
19+
20+
describe "changeset/2" do
21+
test "format and validade mode values" do
22+
changeset = Measurement.changeset(%Measurement{}, %{@attrs | "mode" => ""})
23+
24+
assert changeset.valid?
25+
refute Map.has_key?(changeset.changes, :mode)
26+
27+
changeset = Measurement.changeset(%Measurement{}, %{@attrs | "mode" => nil})
28+
29+
assert changeset.valid?
30+
refute Map.has_key?(changeset.changes, :mode)
31+
32+
changeset = Measurement.changeset(%Measurement{}, %{@attrs | "mode" => 1})
33+
34+
assert changeset.valid?
35+
assert [1.0] = changeset.changes.mode
36+
37+
changeset = Measurement.changeset(%Measurement{}, %{@attrs | "mode" => 1.2})
38+
39+
assert changeset.valid?
40+
assert [1.2] = changeset.changes.mode
41+
42+
changeset = Measurement.changeset(%Measurement{}, %{@attrs | "mode" => [1.2, 1.4]})
43+
44+
assert changeset.valid?
45+
assert [1.2, 1.4] = changeset.changes.mode
46+
47+
changeset = Measurement.changeset(%Measurement{}, %{@attrs | "mode" => [1.2, "1.4"]})
48+
49+
assert changeset.valid?
50+
assert [1.2, 1.4] = changeset.changes.mode
51+
52+
changeset = Measurement.changeset(%Measurement{}, %{@attrs | "mode" => "str"})
53+
54+
refute changeset.valid?
55+
refute Map.has_key?(changeset.changes, :mode)
56+
assert [mode: {"is invalid", _}] = changeset.errors
57+
58+
changeset = Measurement.changeset(%Measurement{}, %{@attrs | "mode" => ["str"]})
59+
60+
refute changeset.valid?
61+
refute Map.has_key?(changeset.changes, :mode)
62+
assert [mode: {"is invalid", _}] = changeset.errors
63+
end
64+
end
65+
end

test/support/factory/elixir_bench_factory.ex

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ defmodule ElixirBench.Factory do
5656
benchmark: build(:benchmark, repo: repo),
5757
job: build(:job, job_attrs),
5858
sample_size: 12630,
59-
mode: 369.0,
59+
mode: [369.0],
6060
minimum: 306.0,
6161
median: 377.0,
6262
maximum: 12453.0,
@@ -90,7 +90,7 @@ defmodule ElixirBench.Factory do
9090
"maximum" => 12453.0,
9191
"median" => 377.0,
9292
"minimum" => 306.0,
93-
"mode" => 369.0,
93+
"mode" => nil,
9494
"percentiles" => %{"50" => 377.0, "99" => 578.6900000000005},
9595
"sample_size" => 12630,
9696
"std_dev" => 209.33476197004862,
@@ -104,7 +104,7 @@ defmodule ElixirBench.Factory do
104104
"maximum" => 32412.0,
105105
"median" => 397.0,
106106
"minimum" => 301.0,
107-
"mode" => 378.0,
107+
"mode" => [378.0, 379.0],
108108
"percentiles" => %{"50" => 397.0, "99" => 1003.3999999999942},
109109
"sample_size" => 11044,
110110
"std_dev" => 573.9417528830307,
@@ -118,7 +118,7 @@ defmodule ElixirBench.Factory do
118118
"maximum" => 13241.0,
119119
"median" => 450.0,
120120
"minimum" => 338.0,
121-
"mode" => 442.0,
121+
"mode" => [442.1],
122122
"percentiles" => %{"50" => 450.0, "99" => 727.0},
123123
"sample_size" => 10516,
124124
"std_dev" => 273.63253429178945,
@@ -132,7 +132,7 @@ defmodule ElixirBench.Factory do
132132
"maximum" => 13092.0,
133133
"median" => 452.0,
134134
"minimum" => 338.0,
135-
"mode" => 440.0,
135+
"mode" => [440.0],
136136
"percentiles" => %{"50" => 452.0, "99" => 638.0},
137137
"sample_size" => 10677,
138138
"std_dev" => 199.60367678670747,

0 commit comments

Comments
 (0)