exometer_slide:to_list should realise the last sample

This commit is contained in:
kjnilsson 2016-11-14 15:38:35 +00:00
parent 41d507d550
commit 4f4064c589
2 changed files with 32 additions and 25 deletions

View File

@ -289,13 +289,14 @@ optimize(Slide) -> Slide.
to_list(_Now, #slide{size = Sz}) when Sz == 0 ->
[];
to_list(Now, #slide{size = Sz} = Slide) ->
to_list_from(Now - Sz, Slide).
to_list_from(Now, Now - Sz, Slide).
to_list_from(From, #slide{n = N, max_n = MaxN, buf1 = Buf1, buf2 = Buf2,
first = FirstTS, interval = Interval}) ->
to_list_from(Now, From, #slide{max_n = MaxN, buf2 = Buf2, first = FirstTS,
interval = Interval} = Slide) ->
{NewN, Buf1} = maybe_add_last_sample(Now, Slide),
Start = first_max(FirstTS, From),
Buf1_1 = take_since(Buf1, Start, N, [], Interval),
take_since(Buf2, Start, n_diff(MaxN, N), Buf1_1, Interval).
Buf1_1 = take_since(Buf1, Start, NewN, [], Interval),
take_since(Buf2, Start, n_diff(MaxN, NewN), Buf1_1, Interval).
first_max(undefined, X) -> X;
first_max(F, X) -> max(F, X).
@ -375,8 +376,8 @@ maybe_add_last_sample(Now, #slide{total = T,
buf2 = [{TS, _} | _]})
when T =/= undefined andalso Now >= (TS + I) ->
{N + 1, [{TS + I, T}]};
maybe_add_last_sample(Now, #slide{total = T, buf1 = [], buf2 = [], n = N})
when T =/= undefined ->
maybe_add_last_sample(Now, #slide{total = T, interval = I, buf1 = [], buf2 = [], n = N, last = Last})
when T =/= undefined andalso Now > Last + I ->
{N + 1, [{Now, T}]};
maybe_add_last_sample(_Now, #slide{buf1 = Buf1, n = N}) ->
{N, Buf1}.
@ -386,7 +387,7 @@ maybe_add_last_sample(_Now, #slide{buf1 = Buf1, n = N}) ->
to_normalized_list(Now, Start, Interval, #slide{first = FirstTS0,
total = Total,
last = _LastTS0} = Slide, Empty) ->
Samples = to_list_from(Start, Slide),
Samples = to_list_from(Now, Start, Slide),
Lookup = lists:foldl(fun({TS, Value}, Dict) when TS - Start >= 0 ->
NewTS = map_timestamp(TS, Start, Interval),
orddict:update(NewTS, fun({T, V}) when T > TS ->
@ -462,9 +463,9 @@ sum(Now, [Slide = #slide{interval = Interval, size = Size, incremental = true} |
Value, Dict)
end,
Dict = lists:foldl(fun(S, Acc) ->
Normalized = normalize_incremental_slide(Now, Interval, S),
N = normalize_incremental_slide(Now, Interval, S),
%% Unwanted last sample here
foldl(Start, Fun, Acc, Normalized#slide{total = undefined})
foldl(Start, Fun, Acc, N#slide{total = undefined})
end, orddict:new(), All),
Buffer = lists:reverse(orddict:to_list(Dict)),
Total = lists:foldl(fun(#slide{total = T}, Acc) ->

View File

@ -306,30 +306,36 @@ sum_single(_Config) ->
to_normalized_list(_Config) ->
Interval = 5,
Tests = [ % {input, expected, query range}
{[],
{[], % zero pad when slide has never seen any samples
[{10, {0}}, {5, {0}}, {0, {0}}],
{0, 10}},
{[{5, 1}],
{[{5, 1}], % zero pad before first known sample
[{5, {1}}, {0, {0}}],
{0, 5}},
{[{5, 1}, {15, 1}],
[{15, {2}}, {10, {1}}, {5, {1}}],
{5, 15}},
{[{6, 1}, {11, 1}, {16, 1}],
[{15, {2}}, {10, {1}}, {5, {0}}, {0, {0}}],
{0, 15}},
{[{5, 1}, {10, 1}, {15, 1}, {20, 1}, {25, 1}, {30, 1}],
[{30, {6}}, {25, {5}}, {20, {4}}, {15, {3}}], % we cannot possibly deduce what 10 should be
{10, 30}},
{[{10, 1}, {15, 1}],
{[{10, 1}, {15, 1}], % zero pad before last know sample
[{15, {2}}, {10, {1}}, {5, {0}}],
{5, 15}},
{[{5, 1}, {20, 1}],
{[{5, 1}, {15, 1}], % insert missing sample using previous total
[{15, {2}}, {10, {1}}, {5, {1}}],
{5, 15}},
{[{6, 1}, {11, 1}, {16, 1}], % align timestamps with query
[{15, {2}}, {10, {1}}, {5, {0}}, {0, {0}}],
{0, 15}},
{[{5, 1}, {10, 1}, {15, 1}, {20, 1}, {25, 1}, {30, 1}], % ???
[{30, {6}}, {25, {5}}, {20, {4}}, {15, {3}}], % we cannot possibly deduce what 10 should be
{10, 30}},
{[{5, 1}, {20, 1}], % unable to pad as we've seen samples in the past but don't know them
[{20, {2}}],
{10, 20}},
{[{5, 1}, {10, 1}],
{[{5, 1}, {10, 1}], % pad based on total
[{35, {2}}, {30, {2}}],
{30, 35}}
{30, 35}},
% {[{5, 1}], % don't make up future values TODO: fix
% [{5, {1}}],
% {5, 10}},
{[{5, 1}, {7, 1}], % realise last sample
[{10, {2}}, {5, {1}}],
{5, 10}}
],
Slide = exometer_slide:new(0, 20, [{interval, 5},