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

xid.c: also detect decreasing ranges


diffs (134 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
@@ -161,12 +161,11 @@ p:70
 p:188
 s+:[188] 024
 p:9999
+r:50 49
 p:50
-r:49 50
 p:50
 p:48
-p:1003
-s-:[1003] 016
+r:1003 1000
 p:95
 p:99
 p:96
@@ -187,12 +186,11 @@ p:70
 p:188
 s+:[188] 024
 p:9999
+r:50 49
 p:50
-r:49 50
 p:50
 p:48
-p:1003
-s-:[1003] 016
+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
@@ -26,12 +26,13 @@
 #include "mal_interpreter.h"
 #include "xid.h"
 
-#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 */
+#define XIDBASE     0
+#define XIDSETINC   1
+#define XIDSETDEC   2
+#define XIDRANGEINC 3
+#define XIDRANGEDEC 4
+#define XIDPOINT    5
+#define XIDMASK     7  /* we keep some reserve for runlength compression */
 
 typedef oid xid;
 #define SIZEOF_XID   SIZEOF_OID
@@ -108,7 +109,7 @@ XIDencode(BUN *rtrn, XIDcolumn col, oid 
                                //point++;
                        }
                        break;
-               case XIDRANGE:
+               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);
@@ -121,11 +122,32 @@ XIDencode(BUN *rtrn, XIDcolumn col, oid 
                                //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);
+                       } 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 XIDPOINT:
                        if ( (xid) col[i].value + 1 == v){
-                               /* make a new range */
-                               col[i].tag = XIDRANGE;
-                               col[++i].tag = XIDRANGE;
+                               /* 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);
+                               //range++;
+                       } else
+                       if ( (xid) col[i].value - 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);
                                //range++;
@@ -303,12 +325,18 @@ XIDdecode(BUN *rtrn, XIDcolumn col, oid 
                                cnt++;
                        }
                        break;
-               case XIDRANGE:
+               case XIDRANGEINC:
                        for( j = col[i].value, i++; j <= col[i].value; j++, 
v++){
                                *o++ = v;
                                cnt++;
                        }
                        break;
+               case XIDRANGEDEC:
+                       for( j = col[i].value, i++; j >= col[i].value; j--, 
v--){
+                               *o++ = v;
+                               cnt++;
+                       }
+                       break;
                case XIDPOINT:
                        *o++ = v;
                        cnt++;
@@ -434,7 +462,11 @@ XIDcolumndump(stream *f, XIDcolumn col, 
                case XIDSETDEC:
                        mnstr_printf(f,"s-:[" XIDFMT "] 0%llo",(xid) 
col[i-1].value,(lng)v);
                        break;
-               case XIDRANGE:
+               case XIDRANGEINC:
+                       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);
                        i++;
                        break;
_______________________________________________
Checkin-list mailing list
Checkin-list@monetdb.org
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to