# HG changeset patch # User Adam Chlipala # Date 1268769275 14400 # Node ID ad9829c3c12c350eec98d3da5a7b8f189e69b038 # Parent a4ac900d30855abfe771b6188a29dae1a63dd21f COUNT(col) diff -r a4ac900d3085 -r ad9829c3c12c lib/ur/basis.urs --- a/lib/ur/basis.urs Tue Mar 16 15:39:16 2010 -0400 +++ b/lib/ur/basis.urs Tue Mar 16 15:54:35 2010 -0400 @@ -454,25 +454,27 @@ val sql_count : tables ::: {{Type}} -> agg ::: {{Type}} -> exps ::: {Type} -> sql_exp tables agg exps int -con sql_aggregate :: Type -> Type +con sql_aggregate :: Type -> Type -> Type val sql_aggregate : tables ::: {{Type}} -> agg ::: {{Type}} -> exps ::: {Type} - -> t ::: Type - -> sql_aggregate t -> sql_exp agg agg exps t - -> sql_exp tables agg exps t + -> dom ::: Type -> ran ::: Type + -> sql_aggregate dom ran -> sql_exp agg agg exps dom + -> sql_exp tables agg exps ran + +val sql_count_col : t ::: Type -> sql_aggregate (option t) int class sql_summable val sql_summable_int : sql_summable int val sql_summable_float : sql_summable float -val sql_avg : t ::: Type -> sql_summable t -> sql_aggregate t -val sql_sum : t ::: Type -> sql_summable t -> sql_aggregate t +val sql_avg : t ::: Type -> sql_summable t -> sql_aggregate t t +val sql_sum : t ::: Type -> sql_summable t -> sql_aggregate t t class sql_maxable val sql_maxable_int : sql_maxable int val sql_maxable_float : sql_maxable float val sql_maxable_string : sql_maxable string val sql_maxable_time : sql_maxable time -val sql_max : t ::: Type -> sql_maxable t -> sql_aggregate t -val sql_min : t ::: Type -> sql_maxable t -> sql_aggregate t +val sql_max : t ::: Type -> sql_maxable t -> sql_aggregate t t +val sql_min : t ::: Type -> sql_maxable t -> sql_aggregate t t con sql_nfunc :: Type -> Type val sql_nfunc : tables ::: {{Type}} -> agg ::: {{Type}} -> exps ::: {Type} diff -r a4ac900d3085 -r ad9829c3c12c src/monoize.sml --- a/src/monoize.sml Tue Mar 16 15:39:16 2010 -0400 +++ b/src/monoize.sml Tue Mar 16 15:54:35 2010 -0400 @@ -236,7 +236,7 @@ (L'.TFfi ("Basis", "string"), loc) | L.CApp ((L.CApp ((L.CApp ((L.CFfi ("Basis", "sql_binary"), _), _), _), _), _), _) => (L'.TFfi ("Basis", "string"), loc) - | L.CApp ((L.CFfi ("Basis", "sql_aggregate"), _), _) => + | L.CApp ((L.CApp ((L.CFfi ("Basis", "sql_aggregate"), _), _), _), _) => (L'.TFfi ("Basis", "string"), loc) | L.CApp ((L.CFfi ("Basis", "sql_summable"), _), _) => (L'.TRecord [], loc) @@ -2371,7 +2371,9 @@ (L.ECApp ( (L.ECApp ( (L.ECApp ( - (L.EFfi ("Basis", "sql_aggregate"), _), + (L.ECApp ( + (L.EFfi ("Basis", "sql_aggregate"), _), + _), _), _), _), _), _), _), _), @@ -2401,6 +2403,10 @@ fm) end + | L.ECApp ((L.EFfi ("Basis", "sql_count_col"), _), _) => + ((L'.EPrim (Prim.String "COUNT"), loc), + fm) + | L.EFfi ("Basis", "sql_summable_int") => ((L'.ERecord [], loc), fm) | L.EFfi ("Basis", "sql_summable_float") => ((L'.ERecord [], loc), fm) | L.ECApp ((L.EFfi ("Basis", "sql_avg"), _), _) => diff -r a4ac900d3085 -r ad9829c3c12c src/urweb.grm --- a/src/urweb.grm Tue Mar 16 15:39:16 2010 -0400 +++ b/src/urweb.grm Tue Mar 16 15:54:35 2010 -0400 @@ -1738,6 +1738,15 @@ in (EVar (["Basis"], "sql_count", Infer), loc) end) + | COUNT LPAREN sqlexp RPAREN (let + val loc = s (COUNTleft, RPARENright) + + val e = (EVar (["Basis"], "sql_count_col", Infer), loc) + val e = (EApp ((EVar (["Basis"], "sql_aggregate", Infer), loc), + e), loc) + in + (EApp (e, sqlexp), loc) + end) | sqlagg LPAREN sqlexp RPAREN (let val loc = s (sqlaggleft, RPARENright) diff -r a4ac900d3085 -r ad9829c3c12c tests/agg.ur --- a/tests/agg.ur Tue Mar 16 15:39:16 2010 -0400 +++ b/tests/agg.ur Tue Mar 16 15:54:35 2010 -0400 @@ -1,22 +1,13 @@ table t1 : {A : int, B : string, C : float} -table t2 : {A : float, D : int} +table t2 : {A : float, D : int, E : option string} val q1 = (SELECT COUNT( * ) AS X FROM t1) val q2 = (SELECT AVG(t1.A) AS X FROM t1) val q3 = (SELECT SUM(t1.C) AS X FROM t1) val q4 = (SELECT MIN(t1.B) AS X, MAX(t1.A) AS Y FROM t1) +val q5 = (SELECT SUM(t1.A) AS X FROM t1 GROUP BY t1.B) +val q6 = (SELECT COUNT(t2.E) AS N FROM t2 GROUP BY t2.D) -(*val q5 = (SELECT t1.A FROM t1 GROUP BY t1.B)*) -val q5 = (SELECT SUM(t1.A) AS X FROM t1 GROUP BY t1.B) - - -datatype list a = Nil | Cons of a * list a - -val r1 : transaction (list string) = - query q4 - (fn fs acc => return (Cons (fs.X, acc))) - Nil - -val main : unit -> transaction page = fn () => - n <- r1; - return Nothing to see here! +fun main () : transaction page = + xml <- queryX q6 (fn r => {[r.N]};); + return {xml} diff -r a4ac900d3085 -r ad9829c3c12c tests/agg.urp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/agg.urp Tue Mar 16 15:54:35 2010 -0400 @@ -0,0 +1,4 @@ +database /tmp/test +sql agg.sql + +agg