Changeset: 45073848c164 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=45073848c164
Modified Files:
        clients/Tests/exports.stable.out
        monetdb5/modules/kernel/aggr.c
        monetdb5/modules/kernel/aggr.mal
        sql/backends/monet5/sql.mx
Branch: default
Log Message:

Use new median implementation also for old interface.


diffs (189 lines):

diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out
--- a/clients/Tests/exports.stable.out
+++ b/clients/Tests/exports.stable.out
@@ -597,6 +597,7 @@ str AGGRcount3nonils(bat *retval, bat *b
 str AGGRmax2(bat *retval, bat *bid, bat *eid);
 str AGGRmax3(bat *retval, bat *bid, bat *gid, bat *eid);
 str AGGRmedian(bat *retval, bat *bid, int *skip_nils);
+str AGGRmedian3(bat *retval, bat *bid, bat *gid, bat *eid);
 str AGGRmin2(bat *retval, bat *bid, bat *eid);
 str AGGRmin3(bat *retval, bat *bid, bat *gid, bat *eid);
 str AGGRprod2_bte(bat *retval, bat *bid, bat *eid);
diff --git a/monetdb5/modules/kernel/aggr.c b/monetdb5/modules/kernel/aggr.c
--- a/monetdb5/modules/kernel/aggr.c
+++ b/monetdb5/modules/kernel/aggr.c
@@ -51,6 +51,8 @@ AGGRgrouped(bat *retval, BAT *b, BAT *g,
                        BBPreleaseref(e->batCacheid);
                throw(MAL, malfunc, RUNTIME_OBJECT_MISSING);
        }
+       if (tp == TYPE_any && grpfunc == BATgroupmedian)
+               tp = b->ttype;
        if (!BAThdense(b) || !BAThdense(g)) {
                /* if b or g don't have a dense head, replace the head with a
                 * dense sequence */
@@ -488,6 +490,14 @@ AGGRmax2(bat *retval, bat *bid, bat *eid
        return AGGRgrouped2(retval, bid, eid, TYPE_oid, BATgroupmax, 0, 
"aggr.max");
 }
 
+aggr_export str AGGRmedian3(bat *retval, bat *bid, bat *gid, bat *eid);
+str
+AGGRmedian3(bat *retval, bat *bid, bat *gid, bat *eid)
+{
+       return AGGRgrouped3(retval, bid, gid, eid, TYPE_any,
+                                               BATgroupmedian, 0, 
"aggr.median");
+}
+
 static str
 AGGRsubgrouped(bat *retval, bat *bid, bat *gid, bat *eid, bat *sid,
                           int skip_nils, int abort_on_error, int tp,
diff --git a/monetdb5/modules/kernel/aggr.mal b/monetdb5/modules/kernel/aggr.mal
--- a/monetdb5/modules/kernel/aggr.mal
+++ b/monetdb5/modules/kernel/aggr.mal
@@ -846,6 +846,15 @@ command subcount(b:bat[:oid,:any_1],g:ba
 address AGGRsubcountcand
 comment "Grouped count aggregate with candidates list";
 
+command median(b:bat[:oid,:any_1],g:bat[:oid,:oid],e:bat[:oid,:any_2]) 
:bat[:oid,:any_1]
+address AGGRmedian3
+comment "Grouped median aggregate";
+
+function median(b:bat[:oid,:any_1]) :any_1;
+       bn := submedian(b, 0);
+       return algebra.fetch(bn, 0);
+end aggr.median;
+
 command submedian(b:bat[:oid,:any_1],skip_nils:int) :bat[:oid,:any_1]
 address AGGRmedian
 comment "Median aggregate";
diff --git a/sql/backends/monet5/sql.mx b/sql/backends/monet5/sql.mx
--- a/sql/backends/monet5/sql.mx
+++ b/sql/backends/monet5/sql.mx
@@ -7354,128 +7354,7 @@ freeVariables(Client c, MalBlkPtr mb, Ma
        mb->ptop = j;
 }
 
-/*
- * Compute the median.
- * Assume val is id,oid sorted. 
- */
-@h
-sql5_export str SQLmiddle_val(Client cntxt, MalBlkPtr mb, MalStkPtr stk, 
InstrPtr pci);
-@c
-str
-SQLmiddle_val(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
-{
-       BAT *v;
-       BUN cnt = 0, pos;
-       ValPtr res = getArgReference(stk, pci, 0);
-       int *type = (int*) getArgReference(stk, pci, 0);
-       bat valid = *(bat*) getArgReference(stk, pci, 1);
-       BATiter vi;
-
-       (void)cntxt;
-       (void)mb;
-       if( (v = BATdescriptor(valid)) == NULL ) 
-               throw(SQL, "sql.middle", "Cannot access descriptor");
-
-       *type = v->ttype;
-       cnt = BATcount(v);
-       if (cnt == 0) {
-               VALset(res, v->ttype, ATOMnilptr(v->ttype));
-               BBPunfix(v->batCacheid);
-               return MAL_SUCCEED;
-       }
-       pos = cnt/2;
-       vi = bat_iterator(v);
-       VALset(res, v->ttype, BUNtail(vi, pos));
-       BBPunfix(v->batCacheid);
-       return MAL_SUCCEED;
-}
 @mal
-pattern sql.middle_val( val:bat[:any_1,:any_2]):any_2
-address SQLmiddle_val;
-
-@h
-/*
- * Compute the median.
- * Assume val is id,oid sorted. 
- */
-sql5_export str SQLmiddle(bat *res,  bat *val, bat *hist);
-@c
-str
-SQLmiddle(bat *res,  bat *val, bat *hist)
-{
-       BAT *r,*v,*h;
-       wrd *sz;
-       BUN cnt, i;
-       oid *gid;
-
-       if( (h = BATdescriptor(*hist)) == NULL )
-               throw(SQL, "sql.middle", "Cannot access descriptor");
-       if( (v = BATdescriptor(*val)) == NULL ) {
-               BBPunfix(h->batCacheid);
-               throw(SQL, "sql.middle", "Cannot access descriptor");
-       }
-       r = BATnew(TYPE_oid, v->ttype, cnt=BATcount(h));
-       if (!r) {
-               BBPunfix(h->batCacheid);
-               BBPunfix(v->batCacheid);
-               throw(SQL, "sql.middle", "Cannot create bat");
-       }
-       sz = (wrd*)Tloc(h,0);
-       gid = (oid*)Tloc(v,0);
-
-       if (v->htype == TYPE_void) {
-               oid id = v->hseqbase;
-
-               for(i=0;i<cnt;i++) {
-                       BUN p = BUNfnd(h, gid);
-                       oid s = (oid) sz[p];
-                       oid nid = id + (s-1)/2;
-       
-                       BUNins(r, gid, &nid, FALSE);
-                       gid += s;
-                       id += s;
-               }
-       } else {
-               oid *id = (oid*)Hloc(v,0);
-
-               for(i=0;i<cnt;i++) {
-                       BUN p = BUNfnd(h, gid);
-                       wrd s = sz[p];
-       
-                       BUNins(r, gid, id+((s-1)/2), FALSE);
-                       gid += s;
-                       id += s;
-               }
-       }
-
-       BBPunfix(h->batCacheid);
-       BBPunfix(v->batCacheid);
-       BBPkeepref(r->batCacheid);
-       *res = r->batCacheid;
-       return MAL_SUCCEED;
-}
-
-@mal
-command sql.middle( val:bat[:oid,:oid], hist:bat[:oid,:wrd] ):bat[:oid,:oid]
-address SQLmiddle;
-
-function aggr.median(a:bat[:oid,:any_1]):any_1;
-       v := algebra.sortTail(a);
-       return sql.middle_val(v);
-end aggr.median;
-
-function 
aggr.median(a:bat[:oid,:any_1],g:bat[:oid,:oid],e:bat[:oid,:any_2]):bat[:oid,:any_1];
-       ng := algebra.sortTail(g);
-       v := group.refine(ng,a);
-       vm := algebra.markT(v, 0:oid);
-       mv := bat.reverse(vm);
-       h := aggr.count(a,g,e);
-       s := algebra.leftjoin(mv,g);
-       id := sql.middle(s,h);
-       sid := algebra.leftjoin(id, mv);
-       return algebra.leftjoin(sid, a);
-end aggr.median;
-
 # assume nil's are removed
 # (sum (e1 * e2) - (sum(e1) * sum(e2)/count(e1))) / count(e1)
 
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to