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

Reply via email to