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

Reply via email to