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

xid.c: also detect constant/equality ranges, i.e., runlength compression


diffs (131 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
@@ -154,18 +154,17 @@ end main;
 [ 79@0,          1290@0  ]
 #xid, 83, tail compress, 80,56,  clk 3 usec
 column first 57, size 57, 
-r:0 3
+r+:0 3
 p:5
 p:7
 p:70
 p:188
 s+:[188] 024
 p:9999
-r:50 49
-p:50
-p:50
+r-:50 49
+r=:50 2
 p:48
-r:1003 1000
+r-:1003 1000
 p:95
 p:99
 p:96
@@ -179,18 +178,17 @@ p:1140
 s-:[1140] 020010004002000
 p:1250
 s+:[1250] 020010004002000
-r:0 3
+r+:0 3
 p:5
 p:7
 p:70
 p:188
 s+:[188] 024
 p:9999
-r:50 49
-p:50
-p:50
+r-:50 49
+r=:50 2
 p:48
-r:1003 1000
+r-:1003 1000
 p:95
 p:99
 p:96
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,9 +31,9 @@
 #define XIDSETDEC   2
 #define XIDRANGEINC 3
 #define XIDRANGEDEC 4
-#define XIDPOINT    5
+#define XIDRANGEEQ  5
+#define XIDPOINT    6
 /* must be < 2^XID_TAG_BITS i.e. < 1<<XID_TAG_BITS */
-/* we keep some reserve for runlength compression  */
 
 typedef oid xid;
 #define SIZEOF_XID   SIZEOF_OID
@@ -110,6 +110,19 @@ XIDencode(BUN *rtrn, XIDcolumn col, oid 
                                //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);
+                       } else {
+                               /* fall back to point if spread to large */
+                               i++;
+                               col[i].tag = XIDPOINT;
+                               col[i].value = 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;
@@ -137,6 +150,14 @@ XIDencode(BUN *rtrn, XIDcolumn col, oid 
                        }
                        break;
                case XIDPOINT:
+                       if ( (xid) col[i].value == 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);
+                               //range++;
+                       } else
                        if ( (xid) col[i].value + 1 == v){
                                /* make a new inc-range */
                                col[i].tag = XIDRANGEINC;
@@ -326,6 +347,12 @@ XIDdecode(BUN *rtrn, XIDcolumn col, oid 
                                cnt++;
                        }
                        break;
+               case XIDRANGEEQ:
+                       for( j = 0, i++; j < col[i].value; j++){
+                               *o++ = v;
+                               cnt++;
+                       }
+                       break;
                case XIDRANGEINC:
                        for( j = col[i].value, i++; j <= col[i].value; j++, 
v++){
                                *o++ = v;
@@ -463,12 +490,16 @@ XIDcolumndump(stream *f, XIDcolumn col, 
                case XIDSETDEC:
                        mnstr_printf(f,"s-:[" XIDFMT "] 0%llo",(xid) 
col[i-1].value,(lng)v);
                        break;
+               case XIDRANGEEQ:
+                       mnstr_printf(f,"r=:" XIDFMT " " XIDFMT "", v, (xid) 
col[i+1].value);
+                       i++;
+                       break;
                case XIDRANGEINC:
-                       mnstr_printf(f,"r:" XIDFMT " " XIDFMT "", v, (xid) 
col[i+1].value);
+                       mnstr_printf(f,"r+:" XIDFMT " " XIDFMT "", v, (xid) 
col[i+1].value);
                        i++;
                        break;
                case XIDRANGEDEC:
-                       mnstr_printf(f,"r:" XIDFMT " " XIDFMT "", v, (xid) 
col[i+1].value);
+                       mnstr_printf(f,"r-:" XIDFMT " " XIDFMT "", v, (xid) 
col[i+1].value);
                        i++;
                        break;
                case XIDPOINT:
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to