Changeset: edaf511f333f for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=edaf511f333f Modified Files: monetdb5/modules/mal/Tests/xidlist.stable.out monetdb5/modules/mal/xid.c Branch: xid Log Message:
xid.c: also detect strictly decreasing sets (sequences) diffs (214 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 @@ -152,71 +152,61 @@ end main; [ 77@0, 1270@0 ] [ 78@0, 1280@0 ] [ 79@0, 1290@0 ] -#xid, 83, tail compress, 80,68, clk 3 usec -column first 69, size 69, +#xid, 83, tail compress, 80,56, clk 3 usec +column first 57, size 57, r:0 3 p:5 p:7 p:70 p:188 -s:[188] 024 +s+:[188] 024 p:9999 p:50 r:49 50 p:50 p:48 p:1003 -p:1002 -p:1001 -p:1000 +s-:[1003] 016 p:95 p:99 p:96 p:98 p:97 -p:94 -p:90 +s-:[97] 0210 p:93 -r:91 92 +p:91 +p:92 p:1140 -p:1130 -p:1120 -p:1110 -p:1100 +s-:[1140] 020010004002000 p:1250 -s:[1250] 020010004002000 +s+:[1250] 020010004002000 r:0 3 p:5 p:7 p:70 p:188 -s:[188] 024 +s+:[188] 024 p:9999 p:50 r:49 50 p:50 p:48 p:1003 -p:1002 -p:1001 -p:1000 +s-:[1003] 016 p:95 p:99 p:96 p:98 p:97 -p:94 -p:90 +s-:[97] 0210 p:93 -r:91 92 +p:91 +p:92 p:1140 -p:1130 -p:1120 -p:1110 -p:1100 +s-:[1140] 020010004002000 p:1250 -s:[1250] 020010004002000 -#xid, 83, decompress, 69, 80, clk 2 usec +s+:[1250] 020010004002000 +#xid, 83, decompress, 57, 80, clk 2 usec #-----------------# # h t # name # void oid # type 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 @@ -26,11 +26,12 @@ #include "mal_interpreter.h" #include "xid.h" -#define XIDBASE 0 -#define XIDSET 1 -#define XIDRANGE 2 -#define XIDPOINT 3 -#define XIDMASK 7 /* we keep some reserve for runlength compression */ +#define XIDBASE 0 +#define XIDSETINC 1 +#define XIDSETDEC 2 +#define XIDRANGE 3 +#define XIDPOINT 4 +#define XIDMASK 7 /* we keep some reserve for runlength compression */ typedef oid xid; #define SIZEOF_XID SIZEOF_OID @@ -63,7 +64,7 @@ XIDencode(BUN *rtrn, XIDcolumn col, oid col[i].value = v; //mnstr_printf(GDKout,"xidpoint " BUNFMT " " XIDFMT "\n",i,v); break; - case XIDSET: + case XIDSETINC: /* works only for strictly increasing sets (sequences); * otherwise, we loose order information */ @@ -85,6 +86,28 @@ XIDencode(BUN *rtrn, XIDcolumn col, oid //point++; } break; + case XIDSETDEC: + /* 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)); + scnt++; + prev= v; + //mnstr_printf(GDKout,"xidset " BUNFMT " " XIDFMT "\n",i,(xid) (v - col[i-1].value)); + } else { + if (scnt == 1) { + col[i].tag = XIDPOINT; + col[i].value = prev; + scnt =0; + } + i++; + col[i].tag = XIDPOINT; + col[i].value = v; + //mnstr_printf(GDKout,"xidpoint " BUNFMT " " XIDFMT "\n",i,v); + //point++; + } + break; case XIDRANGE: if ( (xid) col[i].value + 1 == v){ col[i].value = v; @@ -110,12 +133,22 @@ XIDencode(BUN *rtrn, XIDcolumn col, oid if ( v > (xid) col[i].value && v < (xid) col[i].value + XID_VAL_BITS ){ /* make a new set */ i++; - col[i].tag = XIDSET; + col[i].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)); //set++; + } else + if ( v < (xid) col[i].value && v > (xid) col[i].value - XID_VAL_BITS ){ + /* make a new set */ + i++; + col[i].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)); + //set++; } else { i++; col[i].tag = XIDPOINT; @@ -252,7 +285,7 @@ XIDdecode(BUN *rtrn, XIDcolumn col, oid throw(MAL, "xid.decompress", "result BAT capacity exceeded in XIDdecode()"); v = col[i].value; switch ( col[i].tag & XIDMASK ) { - case XIDSET: + case XIDSETINC: v= col[i-1].value; for ( j=0; j< XID_VAL_BITS; j++) if ( col[i].value & (((xid)1)<<j)){ @@ -261,6 +294,15 @@ XIDdecode(BUN *rtrn, XIDcolumn col, oid cnt++; } break; + case XIDSETDEC: + v= col[i-1].value; + for ( j=0; j< XID_VAL_BITS; j++) + if ( col[i].value & (((xid)1)<<j)){ + w= v-j; + *o++ = w; + cnt++; + } + break; case XIDRANGE: for( j = col[i].value, i++; j <= col[i].value; j++, v++){ *o++ = v; @@ -386,8 +428,11 @@ XIDcolumndump(stream *f, XIDcolumn col, case XIDBASE: mnstr_printf(f,"x:" XIDFMT "", v); break; - case XIDSET: - mnstr_printf(f,"s:[" XIDFMT "] 0%llo",(xid) col[i-1].value,(lng)v); + case XIDSETINC: + mnstr_printf(f,"s+:[" XIDFMT "] 0%llo",(xid) col[i-1].value,(lng)v); + break; + case XIDSETDEC: + mnstr_printf(f,"s-:[" XIDFMT "] 0%llo",(xid) col[i-1].value,(lng)v); break; case XIDRANGE: mnstr_printf(f,"r:" XIDFMT " " XIDFMT "", v, (xid) col[i+1].value); _______________________________________________ Checkin-list mailing list Checkin-list@monetdb.org http://mail.monetdb.org/mailman/listinfo/checkin-list