Packages
dqe
0.4.15
0.4.15
0.4.14
0.4.13
0.4.12
0.4.11
0.4.10
0.4.9
0.4.8
0.4.7
0.4.6
0.4.5
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.3.25
0.3.24
0.3.23
0.3.22
0.3.21
0.3.20
0.3.19
0.3.18
0.3.17
0.3.16
0.3.15
0.3.14
0.3.13
0.3.12
0.3.11
0.3.10
0.3.9
0.3.8
0.3.7
0.3.6
0.3.5
0.3.4
0.3.3
0.3.2
0.3.1
0.2.2
0.2.1
0.2.0
0.1.36
0.1.35
0.1.34
0.1.33
0.1.22
0.1.21
0.1.20
0.1.10
0.1.9
DalmatinerDB query engine
Current section
Files
Jump to
Current section
Files
src/dql_flatten.erl
%%%-------------------------------------------------------------------
%%% @author Heinz Nikolaus Gies <heinz@project-fifo.net>
%%% @copyright (C) 2016, Heinz Nikolaus Gies
%%% @doc
%%% Flattens a query AST into sub parts.
%%% @end
%%% Created : 2 Aug 2016 by Heinz Nikolaus Gies <heinz@licenser.net>
%%%-------------------------------------------------------------------
-module(dql_flatten).
-export([flatten/1]).
flatten(Qs) ->
[flatten_(Q) || Q <- Qs].
-spec flatten_(dql:dqe_fun_writh_return() | dql:statement()) ->
dql:named().
flatten_(#{op := named, args := [undefined, M, Child]}) ->
N = dql_unparse:unparse(Child),
C = flatten_(Child, []),
R = get_type(C),
#{
op => named,
args => [N, M, C],
signature => [string, R],
return => R
};
flatten_(#{op := named, args := [N, M, Child]}) ->
C = flatten_(Child, []),
R = get_type(C),
#{
op => named,
args => [N, M, C],
signature => [string, R],
return => R
};
flatten_(Child = #{return := R}) ->
N = dql_unparse:unparse(Child),
C = flatten_(Child, []),
#{
op => named,
args => [N, [], C],
signature => [string, R],
return => R
}.
-spec flatten_(dql:dqe_fun_writh_return() | dql:statement(), [dql:dqe_fun()]) ->
dql:flat_stmt().
flatten_(#{op := timeshift, args := [Time, Child]}, Chain) ->
C = flatten_(Child, Chain),
#{op => timeshift, args => [Time, C],
return => get_type(C)};
%% flatten_(#{op := timeshift, args := [_Time, Child]}, []) ->
flatten_(GroupBy = #{op := group_by}, Chain) ->
{calc, Chain, GroupBy};
flatten_(F = #{op := fcall,
args := Args = #{inputs := [Child]}}, Chain) ->
Args1 = maps:remove(inputs, Args),
Args2 = maps:remove(orig_args, Args1),
flatten_(Child, [F#{args => Args2} | Chain]);
flatten_(F = #{op := combine,
args := Args = #{inputs := Children}}, Chain) ->
Args1 = maps:remove(orig_args, Args),
Args2 = maps:remove(inputs, Args1),
Children1 = [flatten_(C, []) || C <- Children],
Comb = {combine, F#{args => Args2}, Children1},
{calc, Chain, Comb};
flatten_(O = #{op := events}, Chain) ->
{calc, Chain, O};
flatten_(Get = #{op := get},
Chain) ->
{calc, Chain, Get};
flatten_(Get = #{op := lookup},
Chain) ->
{calc, Chain, Get};
flatten_(Get = #{op := sget},
Chain) ->
{calc, Chain, Get}.
get_type(#{return := R}) ->
R;
get_type({calc, [], C}) ->
get_type(C);
get_type({calc, L, _}) when is_list(L) ->
get_type(lists:last(L));
get_type({combine, F, _}) ->
get_type(F).