Changeset: 33c7c4e944b0 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=33c7c4e944b0
Modified Files:
monetdb5/modules/mal/xid.c
Branch: xid
Log Message:
xid.c: reduce code redundancy: (re-)use same code for both head & tail column
of BAT
diffs (274 lines):
diff --git a/monetdb5/modules/mal/xid.c b/monetdb5/modules/mal/xid.c
--- a/monetdb5/modules/mal/xid.c
+++ b/monetdb5/modules/mal/xid.c
@@ -213,16 +213,54 @@ XIDencode(BUN *rtrn, XIDcolumn col, oid
*rtrn = i;
return MAL_SUCCEED;
}
+
+static str
+XIDcompressCol( Client cntxt, InstrPtr pci, BAT *b, COLrec *c, BAT *bn, COLrec
*cn, str s, int t, oid *p, oid *q )
+{
+ XIDcolumn col;
+ lng clk;
+ BUN i=0;
+ str msg = MAL_SUCCEED;
+
+ if ( t == TYPE_oid){
+ col = (XIDcolumn) cn->heap.base;
+
+ clk = GDKusec();
+ msg = XIDencode(&i,col,p,q);
+ if (msg != MAL_SUCCEED) {
+ BBPreleaseref(b->batCacheid);
+ BBPreleaseref(bn->batCacheid);
+ return msg;
+ }
+ if (i+1 > XID_VAL_MAX) {
+ BBPreleaseref(b->batCacheid);
+ BBPreleaseref(bn->batCacheid);
+ throw(MAL, "xid.compress", "value too large");
+ }
+ col[0].value = (xid)(i+1); /* keep compression size */
+ mnstr_printf(cntxt->fdout,"#xid, %d, %s compress, " BUNFMT ","
BUNFMT ", %4.2f clk " LLFMT " usec\n",
+ getArg(pci,0), s, BATcount(b), i,
i/(BATcount(b)/100.0), GDKusec()-clk);
+
+ cn->heap.xidcompressed = 1;
+ bn->batDirty =1;
+ }
+ cn->sorted = c->sorted;
+ cn->revsorted = c->revsorted;
+ cn->dense = c->dense;
+ cn->key = c->key;
+ cn->nonil = c->nonil;
+ cn->nil = c->nil;
+ cn->seq = c->seq;
+
+ return MAL_SUCCEED;
+}
+
str
XIDcompress(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
{
bat *ret = (bat*) getArgReference(stk,pci,0);
bat *bid = (bat*) getArgReference(stk,pci,1);
BAT *b, *bn;
- oid *p,*q;
- XIDcolumn col;
- BUN i=0;
- lng clk;
str msg = MAL_SUCCEED;
int ht, tt;
@@ -247,70 +285,19 @@ XIDcompress(Client cntxt, MalBlkPtr mb,
throw(MAL,"xid.compress", MAL_MALLOC_FAIL);
}
- if ( tt == TYPE_oid){
- p = (oid*)Tloc(b,BUNfirst(b));
- q = (oid*)Tloc(b,BUNlast(b));
- col = (XIDcolumn) bn->T->heap.base;
-
- clk = GDKusec();
- msg = XIDencode(&i,col,p,q);
- if (msg != MAL_SUCCEED) {
- BBPreleaseref(b->batCacheid);
- BBPreleaseref(bn->batCacheid);
- return msg;
- }
- if (i+1 > XID_VAL_MAX) {
- BBPreleaseref(b->batCacheid);
- BBPreleaseref(bn->batCacheid);
- throw(MAL, "xid.compress", "value too large");
- }
- col[0].value = (xid)(i+1); /* keep compression size */
- mnstr_printf(cntxt->fdout,"#xid, %d, tail compress, " BUNFMT
"," BUNFMT ", %4.2f clk " LLFMT " usec\n",
- getArg(pci,0), BATcount(b), i, i/(BATcount(b)/100.0),
GDKusec()-clk);
-
- bn->T->heap.xidcompressed = 1;
- bn->batDirty =1;
- }
- bn->T->sorted = b->T->sorted;
- bn->T->revsorted = b->T->revsorted;
- bn->T->dense = b->T->dense;
- bn->T->key = b->T->key;
- bn->T->nonil = b->T->nonil;
- bn->T->nil = b->T->nil;
- bn->T->seq = b->T->seq;
-
- if ( ht == TYPE_oid){
- p = (oid*)Hloc(b,BUNfirst(b));
- q = (oid*)Hloc(b,BUNlast(b));
- col = (XIDcolumn) bn->H->heap.base;
-
- clk = GDKusec();
- msg = XIDencode(&i,col,p,q);
- if (msg != MAL_SUCCEED) {
- BBPreleaseref(b->batCacheid);
- BBPreleaseref(bn->batCacheid);
- return msg;
- }
- if (i+1 > XID_VAL_MAX) {
- BBPreleaseref(b->batCacheid);
- BBPreleaseref(bn->batCacheid);
- throw(MAL, "xid.compress", "value too large");
- }
- col[0].value = (xid)(i+1); /* keep compression size */
- mnstr_printf(cntxt->fdout,"#xid, %d, head compress, " BUNFMT
"," BUNFMT ", %4.2f clk " LLFMT " usec\n",
- getArg(pci,0), BATcount(b), i, i/(BATcount(b)/100.0),
GDKusec()-clk);
-
- bn->H->heap.xidcompressed = 1;
- bn->batDirty =1;
+ msg = XIDcompressCol( cntxt, pci, b, b->H, bn, bn->H, "head", ht,
(oid*)Hloc(b,BUNfirst(b)), (oid*)Hloc(b,BUNlast(b)) );
+ if (msg != MAL_SUCCEED) {
+ BBPreleaseref(b->batCacheid);
+ BBPreleaseref(bn->batCacheid);
+ return msg;
}
- bn->H->sorted = b->H->sorted;
- bn->H->revsorted = b->H->revsorted;
- bn->H->dense = b->H->dense;
- bn->H->key = b->H->key;
- bn->H->nonil = b->H->nonil;
- bn->H->nil = b->H->nil;
- bn->H->seq = b->H->seq;
+ msg = XIDcompressCol( cntxt, pci, b, b->T, bn, bn->T, "tail", tt,
(oid*)Tloc(b,BUNfirst(b)), (oid*)Tloc(b,BUNlast(b)) );
+ if (msg != MAL_SUCCEED) {
+ BBPreleaseref(b->batCacheid);
+ BBPreleaseref(bn->batCacheid);
+ return msg;
+ }
/* don't set the BATcount of bn to avoid property checks */
BBPreleaseref(b->batCacheid);
@@ -375,16 +362,51 @@ XIDdecode(BUN *rtrn, XIDcolumn col, oid
return MAL_SUCCEED;
}
+static str
+XIDdecompressCol( Client cntxt, InstrPtr pci, BAT *b, COLrec *c, BAT *bn,
COLrec *cn, str s, BUN cap, oid *o )
+{
+ BUN cnt = 0, lim;
+ XIDcolumn col;
+ lng clk;
+ str msg = MAL_SUCCEED;
+
+ if ( c->heap.xidcompressed )
+ {
+ col = (XIDcolumn) c->heap.base;
+ lim = (BUN) col[0].value;
+
+ clk = GDKusec();
+ msg = XIDdecode(&cnt,col,o,lim,cap);
+ if (msg != MAL_SUCCEED) {
+ BBPreleaseref(b->batCacheid);
+ BBPreleaseref(bn->batCacheid);
+ return msg;
+ }
+ mnstr_printf(cntxt->fdout,"#xid, %d, %s decompress, " BUNFMT ",
" BUNFMT ", clk " LLFMT " usec\n",
+ getArg(pci,1), s, lim, cnt, GDKusec()-clk);
+
+ BATsetcount(bn, cnt);
+ bn->batDirty =1;
+ }
+ cn->heap.xidcompressed = 0;
+ cn->sorted = c->sorted;
+ cn->revsorted = c->revsorted;
+ cn->dense = c->dense;
+ cn->key = c->key;
+ cn->nonil = c->nonil;
+ cn->nil = c->nil;
+ cn->seq = c->seq;
+
+ return MAL_SUCCEED;
+}
+
str
XIDdecompress(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
{
bat *ret = (bat*) getArgReference(stk,pci,0);
bat *bid = (bat*) getArgReference(stk,pci,1);
BAT *b, *bn;
- BUN cnt, lim, cap;
- XIDcolumn col;
- oid *o;
- lng clk;
+ BUN cap;
str msg = MAL_SUCCEED;
(void) mb;
@@ -408,62 +430,19 @@ XIDdecompress(Client cntxt, MalBlkPtr mb
}
BATsetcount(bn, 0);
- if ( b->T->heap.xidcompressed )
- {
- col = (XIDcolumn) b->T->heap.base;
- lim = (BUN) col[0].value;
- o = (oid*)Tloc(bn,BUNfirst(bn));
+ msg = XIDdecompressCol( cntxt, pci, b, b->H, bn, bn->H, "head", cap,
(oid*)Hloc(bn,BUNfirst(bn)) );
+ if (msg != MAL_SUCCEED) {
+ BBPreleaseref(b->batCacheid);
+ BBPreleaseref(bn->batCacheid);
+ return msg;
+ }
- clk = GDKusec();
- msg = XIDdecode(&cnt,col,o,lim,cap);
- if (msg != MAL_SUCCEED) {
- BBPreleaseref(b->batCacheid);
- BBPreleaseref(bn->batCacheid);
- return msg;
- }
- mnstr_printf(cntxt->fdout,"#xid, %d, decompress, " BUNFMT ", "
BUNFMT ", clk " LLFMT " usec\n",
- getArg(pci,1), lim, cnt, GDKusec()-clk);
-
- BATsetcount(bn, cnt);
- bn->batDirty =1;
+ msg = XIDdecompressCol( cntxt, pci, b, b->T, bn, bn->T, "tail", cap,
(oid*)Tloc(bn,BUNfirst(bn)) );
+ if (msg != MAL_SUCCEED) {
+ BBPreleaseref(b->batCacheid);
+ BBPreleaseref(bn->batCacheid);
+ return msg;
}
- bn->T->heap.xidcompressed = 0;
- bn->T->sorted = b->T->sorted;
- bn->T->revsorted = b->T->revsorted;
- bn->T->dense = b->T->dense;
- bn->T->key = b->T->key;
- bn->T->nonil = b->T->nonil;
- bn->T->nil = b->T->nil;
- bn->T->seq = b->T->seq;
-
- if ( b->H->heap.xidcompressed )
- {
- col = (XIDcolumn) b->H->heap.base;
- lim = (BUN) col[0].value;
- o = (oid*)Hloc(bn,BUNfirst(bn));
-
- clk = GDKusec();
- msg = XIDdecode(&cnt,col,o,lim,cap);
- if (msg != MAL_SUCCEED) {
- BBPreleaseref(b->batCacheid);
- BBPreleaseref(bn->batCacheid);
- return msg;
- }
- mnstr_printf(cntxt->fdout,"#xid, %d, decompress, " BUNFMT ", "
BUNFMT " , clk " LLFMT " usec\n",
- getArg(pci,1), lim, cnt, GDKusec()-clk);
-
- assert(BATcount(bn) == 0 || BATcount(bn) == cnt);
- BATsetcount(bn, cnt);
- bn->batDirty =1;
- }
- bn->H->heap.xidcompressed = 0;
- bn->H->sorted = b->H->sorted;
- bn->H->revsorted = b->H->revsorted;
- bn->H->dense = b->H->dense;
- bn->H->key = b->H->key;
- bn->H->nonil = b->H->nonil;
- bn->H->nil = b->H->nil;
- bn->H->seq = b->H->seq;
BBPreleaseref(b->batCacheid);
BBPkeepref(*ret = bn->batCacheid);
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list