refactor(mgmt_api): `select_table`.
This commit is contained in:
parent
b4433f77c8
commit
5daef544a0
|
@ -18,6 +18,8 @@
|
||||||
|
|
||||||
-include_lib("stdlib/include/qlc.hrl").
|
-include_lib("stdlib/include/qlc.hrl").
|
||||||
|
|
||||||
|
-define(FRESH_SELECT, fresh_select).
|
||||||
|
|
||||||
-export([ paginate/3
|
-export([ paginate/3
|
||||||
, paginate/4
|
, paginate/4
|
||||||
]).
|
]).
|
||||||
|
@ -217,32 +219,20 @@ traverse_n_by_one(Tab, K, MatchFun, Start, Limit, Acc) ->
|
||||||
end
|
end
|
||||||
end.
|
end.
|
||||||
|
|
||||||
select_table(Tab, Ms, 0, Limit, FmtFun) ->
|
select_table(Tab, Ms, ?FRESH_SELECT, Limit, FmtFun)
|
||||||
|
when Limit > 0 ->
|
||||||
case ets:select(Tab, Ms, Limit) of
|
case ets:select(Tab, Ms, Limit) of
|
||||||
'$end_of_table' ->
|
'$end_of_table' ->
|
||||||
{0, []};
|
{[], ?FRESH_SELECT};
|
||||||
{Rows, _} ->
|
{RawResult, NContinuation} ->
|
||||||
{0, lists:map(FmtFun, lists:reverse(Rows))}
|
{lists:map(FmtFun, lists:reverse(RawResult)), NContinuation}
|
||||||
end;
|
end;
|
||||||
|
select_table(_Tab, _Ms, Continuation, _Limit, FmtFun) ->
|
||||||
select_table(Tab, Ms, Start, Limit, FmtFun) ->
|
case ets:select(Continuation) of
|
||||||
{NStart, Rows} = select_n_by_one(ets:select(Tab, Ms, Limit), Start, Limit, []),
|
'$end_of_table' ->
|
||||||
{NStart, lists:map(FmtFun, Rows)}.
|
{[], ?FRESH_SELECT};
|
||||||
|
{RawResult, NContinuation} ->
|
||||||
select_n_by_one('$end_of_table', Start, _Limit, Acc) ->
|
{lists:map(FmtFun, lists:reverse(RawResult)), NContinuation}
|
||||||
{Start, lists:flatten(lists:reverse(Acc))};
|
|
||||||
select_n_by_one(_, Start, _Limit = 0, Acc) ->
|
|
||||||
{Start, lists:flatten(lists:reverse(Acc))};
|
|
||||||
|
|
||||||
select_n_by_one({Rows0, Cons}, Start, Limit, Acc) ->
|
|
||||||
Rows = lists:reverse(Rows0),
|
|
||||||
case Start - length(Rows) of
|
|
||||||
N when N > 0 -> %% Skip
|
|
||||||
select_n_by_one(ets:select(Cons), N, Limit, Acc);
|
|
||||||
_ ->
|
|
||||||
Got = lists:sublist(Rows, Start+1, Limit),
|
|
||||||
NLimit = Limit - length(Got),
|
|
||||||
select_n_by_one(ets:select(Cons), 0, NLimit, [Got|Acc])
|
|
||||||
end.
|
end.
|
||||||
|
|
||||||
%%--------------------------------------------------------------------
|
%%--------------------------------------------------------------------
|
||||||
|
|
Loading…
Reference in New Issue