exometer_slide:to_list should realise the last sample
This commit is contained in:
parent
41d507d550
commit
4f4064c589
|
|
@ -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) ->
|
||||
|
|
|
|||
|
|
@ -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},
|
||||
|
|
|
|||
Loading…
Reference in New Issue