% % Data Cube Aggregates % % Haixun Wang, hxwang@cs.ucla.edu %% database( { sales(Year:integer, Quarter:integer, Month:integer, Day:integer, S:integer) } ). %% export p(P). %% p(cube<(mysum, S, [Y,Q,M,D])>)<-sales(Y,Q,M,D,S). single(cube, (Agg, C, X), (Agg, X, V)) <- init_cube(Agg, C, X, V). init_cube(Agg, C, [_|XT], [YH|YT]) <- single(Agg, C, YH), init_cube(Agg, C, XT, YT). init_cube(Agg, C, [], []). multi(cube, (Agg, C, [XsH|XsT]), (Agg, [XoH|XoT], [YoH|YoT]), (Agg, [XsH|XT], [YH|YT])) <- XsH=XoH, multi(Agg, C, YoH, YH), multi(cube, (Agg, C, XsT), (Agg, XoT, YoT), (Agg, XT, YT)). multi(cube, (Agg, C, [XsH|XsT]), (Agg, [XoH|_], _), (Agg, [XsH|XsT], Y)) <- XsH~=XoH, init_cube(Agg, C, [XsH|XsT], Y). multi(cube, (Agg, _, []), _, (Agg, [], [])). return(cube, nil, (_, Xo, Yo), (Xo, Yo)). return(cube, (_, C, X), (_, Xo, Yo), (Xo, Y))<- Xo~=X, blankequals(Xo, X, Yo, Y). blankequals([XoH|XoT], [XsH|XsT], [YoH|YoT], ['?'|YT])<- XoH=XsH, blankequals(XoT, XsT, YoT, YT). blankequals([XoH|XoT], [XsH|XsT], Yo, Y)<- XoH~=XsH, Y=Yo. blankequals([],[],Y,Y). single(mysum, X, X). multi(mysum, Xs, Xo, X)<-X=Xs+Xo.