- From: Andy Seaborne <andy.seaborne@epimorphics.com>
- Date: Sat, 26 Nov 2011 22:59:59 +0000
- To: sparql Working Group <public-rdf-dawg@w3.org>
Steve, I'm working through the definitions as they are in rq25 at the moment (Nov 26). I see no problem extending to ORDER BY : it works on ?agg_i and they are in-scope. ## are comments ** are suggestions Q = SELECT ?x (1+count(*) as ?y) WHERE { ?x :p ?v } GROUP BY ?x P = BGP({ ?x :p ?v }) > If Q contains GROUP BY exprlist > Let G := Group(exprlist, P) > Else > Let G := Group((1), P) > End ## What about the case of no GROUP BY and no aggregate? This catchall always groups a query ** --------- If Q contains GROUP BY exprlist Let G := Group(exprlist, P) Else If Q contains an aggregate in SELECT, HAVING, ORDER BY Let G := Group((1), P) Else skip the rest of the aggregate step End ** --------- G := Group(?x, BGP({ ?x :p ?v })) i:=1 > For each (X AS Var) in SELECT and each HAVING(X) in Q so X=1+count(*) Var = ?y > If X contains an unaggregated variable V ** s/Var/V/ in the For loop above. > For each aggregate R(args ; scalarvals) now in X aggregate R = count(*) A1 := Aggregation(*, count, {}, Group(?x, BGP({ ?x :p ?v }))) > Replace R(...) with agg_1 in Q Q = SELECT ?x (1+?agg_1 as ?y) WHERE { ?x :p ?v } GROUP BY ?x ## Did you mean Q? ** Replace R(...) with agg_1 in X ## but X never gets mentioned again. ## Text seems to have lost an "extend" or assignment to E ## This does not do anything with (?y, ?agg_1) ** Add E := E append (?y, X) ## Otherwise the connection between A1 and ?agg_1 is lost. E := (?y, 1 + ?agg_1) i = 2 > For each variable V appearing outside of an aggregate V = ?x A2 := Aggregation(?x, Sample, {}, G) E := (?y, 1 + ?agg_1) (?x, ?agg_2) i := 3 P := AggregateJoin(A1, A2) ## Note -- we can do ORDER BY as well because ?agg varaibles never go out of scope and so continue until projection happens. ORDER is before projection. "E is then used in 18.2.4.4" ** Link needed. ---- At this point: P = AggregateJoin(A1, A2) A1 = Aggregation(*, count, {}, Group(?x, BGP({ ?x :p ?v }))) A2 = Aggregation(?x, Sample, {}, G) E = (?y, 1 + ?agg_1) (?x, ?agg_2) # My correction ## Problem: how does A1 get associated with ?agg_1 ## The connection of A1 to ?agg_1 didn't get recorded anywhere. ** add ?agg_i to "Aggregation" e.g. Aggregation(?agg_1, *, count, {}, Group(?x, BGP({ ?x :p ?v }))) Example: Does not mention agg_i There is no E; I think it should be E = [(?sum, ?agg_1) (?count, ?agg_2)] ------------------------------------------------------------------------ 18.2.4.4 SELECT Expressions ** Needs noting it can be set earlier. Let E := [], a list of pairs of the form (variable, expression) ------------------------------------------------------------------------ I'll try look at the evaluation next and also try to come up with definitions for Group, Aggregation, AggregateJoin to go with the eval defns. Also, I think "Aggregation" needs to know the name of the ?agg_i variable it is going to set (see above). One comment for now: "Note that if eval(D(G), Ai) is an error, it is ignored." Does "it" mean the error? And "ignore" mean the (agg_i, v_i) pair not included in the AggregateJoin? I think it needs to say that explicitly. Sorry about the layout - not sure how best to write comments and suggestions while showing the working. Andy
Received on Saturday, 26 November 2011 23:00:33 UTC