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