Changeset: c907ccb28174 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=c907ccb28174
Modified Files:
        monetdb5/modules/mal/Tests/xidlist.stable.out
        monetdb5/modules/mal/xid.c
Branch: xid
Log Message:

xid.c: store both original & compressed counts in compressed column


diffs (truncated from 580 to 300 lines):

diff --git a/monetdb5/modules/mal/Tests/xidlist.stable.out 
b/monetdb5/modules/mal/Tests/xidlist.stable.out
--- a/monetdb5/modules/mal/Tests/xidlist.stable.out
+++ b/monetdb5/modules/mal/Tests/xidlist.stable.out
@@ -153,7 +153,7 @@ end main;
 [ 78@0,          1280@0  ]
 [ 79@0,          1290@0  ]
 #xid, 83, tail compress, 80,56,  clk 3 usec
-column first 57, size 0, 
+column first 56, size 0,
 r+:0 3
 p:5
 p:7
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
@@ -31,25 +31,35 @@
 #define XIDRANGEINC 3
 #define XIDRANGEDEC 4
 #define XIDRANGEEQ  5
-/* must be < 2^XID_TAG_BITS i.e. < 1<<XID_TAG_BITS */
+/* must be <= XID_TAG_MAX */
 
 typedef oid xid;
 #define SIZEOF_XID   SIZEOF_OID
 #define XIDFMT       OIDFMT
 #define XID_TAG_BITS 3
+#define XID_TAG_MAX  ((((xid)1) << XID_TAG_BITS) - 1)
 #define XID_VAL_BITS ((8 * SIZEOF_XID) - XID_TAG_BITS)
 #define XID_VAL_MAX  ((((xid)1) << XID_VAL_BITS) - 1)
+#define XID_CNT_MAX  GDK_oid_max
 
-typedef struct XIDCOLUMN{
-        xid tag:XID_TAG_BITS, value:XID_VAL_BITS;
+typedef union XIDCOLUMN{
+       struct {
+               xid tag:XID_TAG_BITS,
+                   val:XID_VAL_BITS;
+       } x;
+       xid count;
 } *XIDcolumn;
 
+#define XID_IDX_ORIG 0
+#define XID_IDX_COMP 1
+#define XID_IDX_BASE 2
+
 static str
 XIDencode(BUN *rtrn, XIDcolumn col, oid *p, oid *q)
 {
        oid o;
        xid v, prev=0;
-       BUN i=1,scnt =0; 
+       BUN i=XID_IDX_BASE, scnt=0;
        //xid point=0, range=0,set=0;
 
        o = *(oid*) p++;
@@ -59,8 +69,8 @@ XIDencode(BUN *rtrn, XIDcolumn col, oid 
        if (o > XID_VAL_MAX)
                throw(MAL, "xid.compress", "value too large in XIDencode()");
        v = (xid) o;
-       col[i].value = v;
-       col[i].tag = XIDPOINT;
+       col[i].x.val = v;
+       col[i].x.tag = XIDPOINT;
        //mnstr_printf(GDKout,"xidpoint " BUNFMT " " XIDFMT "\n",i,v);
        
        for ( ; p<q ; p++) {
@@ -70,25 +80,25 @@ XIDencode(BUN *rtrn, XIDcolumn col, oid 
                if (o > XID_VAL_MAX)
                        throw(MAL, "xid.compress", "value too large in 
XIDencode()");
                v = (xid) o;
-               switch ( col[i].tag ) {
+               switch ( col[i].x.tag ) {
                case XIDSETINC:
                        /* works only for strictly increasing sets (sequences);
                         * otherwise, we loose order information
                         */
-                       if ( v > prev && v < (xid) col[i-1].value + 
XID_VAL_BITS ) {
-                               col[i].value |=  ( ((xid)1)<< (v - 
col[i-1].value));
+                       if ( v > prev && v < (xid) col[i-1].x.val + 
XID_VAL_BITS ) {
+                               col[i].x.val |=  ( ((xid)1)<< (v - 
col[i-1].x.val));
                                scnt++;
                                prev= v;
-                               //mnstr_printf(GDKout,"xidset " BUNFMT " " 
XIDFMT "\n",i,(xid) (v - col[i-1].value));
+                               //mnstr_printf(GDKout,"xidset " BUNFMT " " 
XIDFMT "\n",i,(xid) (v - col[i-1].x.val));
                        } else {
                                if (scnt == 1) { 
-                                       col[i].tag = XIDPOINT;
-                                       col[i].value = prev;
+                                       col[i].x.tag = XIDPOINT;
+                                       col[i].x.val = prev;
                                        scnt =0;
                                }
                                i++;
-                               col[i].tag = XIDPOINT;
-                               col[i].value = v;
+                               col[i].x.tag = XIDPOINT;
+                               col[i].x.val = v;
                                //mnstr_printf(GDKout,"xidpoint " BUNFMT " " 
XIDFMT "\n",i,v);
                                //point++;
                        }
@@ -97,125 +107,125 @@ XIDencode(BUN *rtrn, XIDcolumn col, oid 
                        /* works only for strictly decreasing sets (sequences);
                         * otherwise, we loose order information
                         */
-                       if ( v < prev && v > (xid) col[i-1].value - 
XID_VAL_BITS ) {
-                               col[i].value |=  ( ((xid)1)<< (col[i-1].value - 
v));
+                       if ( v < prev && v > (xid) col[i-1].x.val - 
XID_VAL_BITS ) {
+                               col[i].x.val |=  ( ((xid)1)<< (col[i-1].x.val - 
v));
                                scnt++;
                                prev= v;
-                               //mnstr_printf(GDKout,"xidset " BUNFMT " " 
XIDFMT "\n",i,(xid) (v - col[i-1].value));
+                               //mnstr_printf(GDKout,"xidset " BUNFMT " " 
XIDFMT "\n",i,(xid) (v - col[i-1].x.val));
                        } else {
                                if (scnt == 1) { 
-                                       col[i].tag = XIDPOINT;
-                                       col[i].value = prev;
+                                       col[i].x.tag = XIDPOINT;
+                                       col[i].x.val = prev;
                                        scnt =0;
                                }
                                i++;
-                               col[i].tag = XIDPOINT;
-                               col[i].value = v;
+                               col[i].x.tag = XIDPOINT;
+                               col[i].x.val = v;
                                //mnstr_printf(GDKout,"xidpoint " BUNFMT " " 
XIDFMT "\n",i,v);
                                //point++;
                        }
                        break;
                case XIDRANGEEQ:
-                       if ( (xid) col[i-1].value == v && col[i].value < 
XID_VAL_MAX){
-                               col[i].value++;
-                               //mnstr_printf(GDKout,"xidrange " BUNFMT " " 
XIDFMT " " XIDFMT "\n",i, (xid) col[i-1].value, v);
+                       if ( (xid) col[i-1].x.val == v && col[i].x.val < 
XID_VAL_MAX){
+                               col[i].x.val++;
+                               //mnstr_printf(GDKout,"xidrange " BUNFMT " " 
XIDFMT " " XIDFMT "\n",i, (xid) col[i-1].x.val, v);
                        } else {
                                /* fall back to point if spread to large */
                                i++;
-                               col[i].tag = XIDPOINT;
-                               col[i].value = v;
+                               col[i].x.tag = XIDPOINT;
+                               col[i].x.val = v;
                                //mnstr_printf(GDKout,"xidpoint " BUNFMT " " 
XIDFMT "\n",i,v);
                                //point++;
                        }
                        break;
                case XIDRANGEINC:
-                       if ( (xid) col[i].value + 1 == v){
-                               col[i].value = v;
-                               //mnstr_printf(GDKout,"xidrange " BUNFMT " " 
XIDFMT " " XIDFMT "\n",i, (xid) col[i-1].value, v);
+                       if ( (xid) col[i].x.val + 1 == v){
+                               col[i].x.val = v;
+                               //mnstr_printf(GDKout,"xidrange " BUNFMT " " 
XIDFMT " " XIDFMT "\n",i, (xid) col[i-1].x.val, v);
                        } else {
                                /* fall back to point if spread to large */
                                i++;
-                               col[i].tag = XIDPOINT;
-                               col[i].value = v;
+                               col[i].x.tag = XIDPOINT;
+                               col[i].x.val = v;
                                //mnstr_printf(GDKout,"xidpoint " BUNFMT " " 
XIDFMT "\n",i,v);
                                //point++;
                        }
                        break;
                case XIDRANGEDEC:
-                       if ( (xid) col[i].value - 1 == v){
-                               col[i].value = v;
-                               //mnstr_printf(GDKout,"xidrange " BUNFMT " " 
XIDFMT " " XIDFMT "\n",i, (xid) col[i-1].value, v);
+                       if ( (xid) col[i].x.val - 1 == v){
+                               col[i].x.val = v;
+                               //mnstr_printf(GDKout,"xidrange " BUNFMT " " 
XIDFMT " " XIDFMT "\n",i, (xid) col[i-1].x.val, v);
                        } else {
                                /* fall back to point if spread to large */
                                i++;
-                               col[i].tag = XIDPOINT;
-                               col[i].value = v;
+                               col[i].x.tag = XIDPOINT;
+                               col[i].x.val = v;
                                //mnstr_printf(GDKout,"xidpoint " BUNFMT " " 
XIDFMT "\n",i,v);
                                //point++;
                        }
                        break;
                case XIDPOINT:
-                       if ( (xid) col[i].value == v){
+                       if ( (xid) col[i].x.val == v){
                                /* make a new inc-range */
-                               col[i].tag = XIDRANGEEQ;
-                               col[++i].tag = XIDRANGEEQ;
-                               col[i].value = 2;
-                               //mnstr_printf(GDKout,"xidrange " BUNFMT " " 
XIDFMT " " XIDFMT "\n",i, (xid) col[i-1].value, v);
+                               col[i].x.tag = XIDRANGEEQ;
+                               col[++i].x.tag = XIDRANGEEQ;
+                               col[i].x.val = 2;
+                               //mnstr_printf(GDKout,"xidrange " BUNFMT " " 
XIDFMT " " XIDFMT "\n",i, (xid) col[i-1].x.val, v);
                                //range++;
                        } else
-                       if ( (xid) col[i].value + 1 == v){
+                       if ( (xid) col[i].x.val + 1 == v){
                                /* make a new inc-range */
-                               col[i].tag = XIDRANGEINC;
-                               col[++i].tag = XIDRANGEINC;
-                               col[i].value = v;
-                               //mnstr_printf(GDKout,"xidrange " BUNFMT " " 
XIDFMT " " XIDFMT "\n",i, (xid) col[i-1].value, v);
+                               col[i].x.tag = XIDRANGEINC;
+                               col[++i].x.tag = XIDRANGEINC;
+                               col[i].x.val = v;
+                               //mnstr_printf(GDKout,"xidrange " BUNFMT " " 
XIDFMT " " XIDFMT "\n",i, (xid) col[i-1].x.val, v);
                                //range++;
                        } else
-                       if ( (xid) col[i].value - 1 == v){
+                       if ( (xid) col[i].x.val - 1 == v){
                                /* make a new dec-range */
-                               col[i].tag = XIDRANGEDEC;
-                               col[++i].tag = XIDRANGEDEC;
-                               col[i].value = v;
-                               //mnstr_printf(GDKout,"xidrange " BUNFMT " " 
XIDFMT " " XIDFMT "\n",i, (xid) col[i-1].value, v);
+                               col[i].x.tag = XIDRANGEDEC;
+                               col[++i].x.tag = XIDRANGEDEC;
+                               col[i].x.val = v;
+                               //mnstr_printf(GDKout,"xidrange " BUNFMT " " 
XIDFMT " " XIDFMT "\n",i, (xid) col[i-1].x.val, v);
                                //range++;
                        } else
-                       if ( v > (xid) col[i].value && v < (xid) col[i].value + 
XID_VAL_BITS ){
+                       if ( v > (xid) col[i].x.val && v < (xid) col[i].x.val + 
XID_VAL_BITS ){
                                /* make a new set */
                                i++;
-                               col[i].tag = XIDSETINC;
+                               col[i].x.tag = XIDSETINC;
                                scnt = 1;
                                prev = v;
-                               col[i].value = ((xid)1) << (v -col[i-1].value);
-                               //mnstr_printf(GDKout,"xidset " BUNFMT " " 
XIDFMT "\n",i,(xid) (v- col[i-1].value));
+                               col[i].x.val = ((xid)1) << (v -col[i-1].x.val);
+                               //mnstr_printf(GDKout,"xidset " BUNFMT " " 
XIDFMT "\n",i,(xid) (v- col[i-1].x.val));
                                //set++;
                        } else
-                       if ( v < (xid) col[i].value && v > (xid) col[i].value - 
XID_VAL_BITS ){
+                       if ( v < (xid) col[i].x.val && v > (xid) col[i].x.val - 
XID_VAL_BITS ){
                                /* make a new set */
                                i++;
-                               col[i].tag = XIDSETDEC;
+                               col[i].x.tag = XIDSETDEC;
                                scnt = 1;
                                prev = v;
-                               col[i].value = ((xid)1) << (col[i-1].value - v);
-                               //mnstr_printf(GDKout,"xidset " BUNFMT " " 
XIDFMT "\n",i,(xid) (v- col[i-1].value));
+                               col[i].x.val = ((xid)1) << (col[i-1].x.val - v);
+                               //mnstr_printf(GDKout,"xidset " BUNFMT " " 
XIDFMT "\n",i,(xid) (v- col[i-1].x.val));
                                //set++;
                        } else {
                                i++;
-                               col[i].tag = XIDPOINT;
-                               col[i].value = v;
+                               col[i].x.tag = XIDPOINT;
+                               col[i].x.val = v;
                                //mnstr_printf(GDKout,"xidpoint " BUNFMT " " 
XIDFMT "\n",i,v);
                        }
                        break;
                default:
-                       throw(MAL, "xid.compress", "unknown col.tag in 
XIDencode()");
+                       throw(MAL, "xid.compress", "unknown col.x.tag in 
XIDencode()");
                }
        }
        //mnstr_printf(GDKout,"stats point " XIDFMT " range " XIDFMT " set " 
XIDFMT "\n",point,range,set);
-       *rtrn = i;
+       *rtrn = i - XID_IDX_BASE;
        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 )
+XIDcompressCol( Client cntxt, InstrPtr pci, COLrec *c, COLrec *cn, BUN cnt, 
str s, int t, oid *p, oid *q )
 {
        XIDcolumn col;
        lng clk;
@@ -229,14 +239,12 @@ XIDcompressCol( Client cntxt, InstrPtr p
                msg = XIDencode(&i,col,p,q);
                if (msg != MAL_SUCCEED)
                        return msg;
-               if (i+1 > XID_VAL_MAX)
-                       throw(MAL, "xid.compress", "value too large");
-               col[0].value = (xid)(i+1); /* keep compression size */
+               col[XID_IDX_ORIG].count = (xid)cnt; /* keep original size */
+               col[XID_IDX_COMP].count = (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);
+                       getArg(pci,0), s, cnt, i, i/(cnt/100.0), GDKusec()-clk);
 
                cn->heap.xidcompressed = 1;
-               bn->batDirty =1;
        }
        cn->sorted = c->sorted;
        cn->revsorted = c->revsorted;
@@ -255,47 +263,60 @@ XIDcompress(Client cntxt, MalBlkPtr mb, 
        bat *ret = (bat*) getArgReference(stk,pci,0);
        bat *bid = (bat*) getArgReference(stk,pci,1);
        BAT *b, *bn;
+       BUN cnt;
        str msg = MAL_SUCCEED;
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to