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